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

Artifact 6b7dc899b3980d4236bffa5048218f8dba85ac0a:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 41 75 67 75 73  /*.** 2014 Augus
0010: 74 20 33 30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  t 30.**.** The a
0020: 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20  uthor disclaims 
0030: 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69  copyright to thi
0040: 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20  s source code.  
0050: 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61  In place of.** a
0060: 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68   legal notice, h
0070: 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e  ere is a blessin
0080: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20  g:.**.**    May 
0090: 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20  you do good and 
00a0: 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20  not evil..**    
00b0: 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72  May you find for
00c0: 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75  giveness for you
00d0: 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76  rself and forgiv
00e0: 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20  e others..**    
00f0: 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72  May you share fr
0100: 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69  eely, never taki
0110: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75  ng more than you
0120: 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   give..**.******
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 56 45  ***.**.**.** OVE
0180: 52 56 49 45 57 20 0a 2a 2a 0a 2a 2a 20 20 54 68  RVIEW .**.**  Th
0190: 65 20 52 42 55 20 65 78 74 65 6e 73 69 6f 6e 20  e RBU extension 
01a0: 72 65 71 75 69 72 65 73 20 74 68 61 74 20 74 68  requires that th
01b0: 65 20 52 42 55 20 75 70 64 61 74 65 20 62 65 20  e RBU update be 
01c0: 70 61 63 6b 61 67 65 64 20 61 73 20 61 6e 0a 2a  packaged as an.*
01d0: 2a 20 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  *  SQLite databa
01e0: 73 65 2e 20 54 68 65 20 74 61 62 6c 65 73 20 69  se. The tables i
01f0: 74 20 65 78 70 65 63 74 73 20 74 6f 20 66 69 6e  t expects to fin
0200: 64 20 61 72 65 20 64 65 73 63 72 69 62 65 64 20  d are described 
0210: 69 6e 0a 2a 2a 20 20 73 71 6c 69 74 65 33 72 62  in.**  sqlite3rb
0220: 75 2e 68 2e 20 20 45 73 73 65 6e 74 69 61 6c 6c  u.h.  Essentiall
0230: 79 2c 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c  y, for each tabl
0240: 65 20 78 79 7a 20 69 6e 20 74 68 65 20 74 61 72  e xyz in the tar
0250: 67 65 74 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  get database.** 
0260: 20 74 68 61 74 20 74 68 65 20 75 73 65 72 20 77   that the user w
0270: 69 73 68 65 73 20 74 6f 20 77 72 69 74 65 20 74  ishes to write t
0280: 6f 2c 20 61 20 63 6f 72 72 65 73 70 6f 6e 64 69  o, a correspondi
0290: 6e 67 20 64 61 74 61 5f 78 79 7a 20 74 61 62 6c  ng data_xyz tabl
02a0: 65 20 69 73 0a 2a 2a 20 20 63 72 65 61 74 65 64  e is.**  created
02b0: 20 69 6e 20 74 68 65 20 52 42 55 20 64 61 74 61   in the RBU data
02c0: 62 61 73 65 20 61 6e 64 20 70 6f 70 75 6c 61 74  base and populat
02d0: 65 64 20 77 69 74 68 20 6f 6e 65 20 72 6f 77 20  ed with one row 
02e0: 66 6f 72 20 65 61 63 68 20 72 6f 77 20 74 6f 0a  for each row to.
02f0: 2a 2a 20 20 75 70 64 61 74 65 2c 20 69 6e 73 65  **  update, inse
0300: 72 74 20 6f 72 20 64 65 6c 65 74 65 20 66 72 6f  rt or delete fro
0310: 6d 20 74 68 65 20 74 61 72 67 65 74 20 74 61 62  m the target tab
0320: 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 20 54 68 65 20  le..** .**  The 
0330: 75 70 64 61 74 65 20 70 72 6f 63 65 65 64 73 20  update proceeds 
0340: 69 6e 20 74 68 72 65 65 20 73 74 61 67 65 73 3a  in three stages:
0350: 0a 2a 2a 20 0a 2a 2a 20 20 31 29 20 54 68 65 20  .** .**  1) The 
0360: 64 61 74 61 62 61 73 65 20 69 73 20 75 70 64 61  database is upda
0370: 74 65 64 2e 20 54 68 65 20 6d 6f 64 69 66 69 65  ted. The modifie
0380: 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 73  d database pages
0390: 20 61 72 65 20 77 72 69 74 74 65 6e 0a 2a 2a 20   are written.** 
03a0: 20 20 20 20 74 6f 20 61 20 2a 2d 6f 61 6c 20 66      to a *-oal f
03b0: 69 6c 65 2e 20 41 20 2a 2d 6f 61 6c 20 66 69 6c  ile. A *-oal fil
03c0: 65 20 69 73 20 6a 75 73 74 20 6c 69 6b 65 20 61  e is just like a
03d0: 20 2a 2d 77 61 6c 20 66 69 6c 65 2c 20 65 78 63   *-wal file, exc
03e0: 65 70 74 0a 2a 2a 20 20 20 20 20 74 68 61 74 20  ept.**     that 
03f0: 69 74 20 69 73 20 6e 61 6d 65 64 20 22 3c 64 61  it is named "<da
0400: 74 61 62 61 73 65 3e 2d 6f 61 6c 22 20 69 6e 73  tabase>-oal" ins
0410: 74 65 61 64 20 6f 66 20 22 3c 64 61 74 61 62 61  tead of "<databa
0420: 73 65 3e 2d 77 61 6c 22 2e 0a 2a 2a 20 20 20 20  se>-wal"..**    
0430: 20 42 65 63 61 75 73 65 20 72 65 67 75 6c 61 72   Because regular
0440: 20 53 51 4c 69 74 65 20 63 6c 69 65 6e 74 73 20   SQLite clients 
0450: 64 6f 20 6e 6f 74 20 6c 6f 6f 6b 20 66 6f 72 20  do not look for 
0460: 66 69 6c 65 20 6e 61 6d 65 64 0a 2a 2a 20 20 20  file named.**   
0470: 20 20 22 3c 64 61 74 61 62 61 73 65 3e 2d 6f 61    "<database>-oa
0480: 6c 22 2c 20 74 68 65 79 20 67 6f 20 6f 6e 20 75  l", they go on u
0490: 73 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61  sing the origina
04a0: 6c 20 64 61 74 61 62 61 73 65 20 69 6e 0a 2a 2a  l database in.**
04b0: 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f       rollback mo
04c0: 64 65 20 77 68 69 6c 65 20 74 68 65 20 2a 2d 6f  de while the *-o
04d0: 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67  al file is being
04e0: 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2a 20 0a   generated..** .
04f0: 2a 2a 20 20 20 20 20 44 75 72 69 6e 67 20 74 68  **     During th
0500: 69 73 20 73 74 61 67 65 20 52 42 55 20 64 6f 65  is stage RBU doe
0510: 73 20 6e 6f 74 20 75 70 64 61 74 65 20 74 68 65  s not update the
0520: 20 64 61 74 61 62 61 73 65 20 62 79 20 77 72 69   database by wri
0530: 74 69 6e 67 0a 2a 2a 20 20 20 20 20 64 69 72 65  ting.**     dire
0540: 63 74 6c 79 20 74 6f 20 74 68 65 20 74 61 72 67  ctly to the targ
0550: 65 74 20 74 61 62 6c 65 73 2e 20 49 6e 73 74 65  et tables. Inste
0560: 61 64 20 69 74 20 63 72 65 61 74 65 73 20 22 69  ad it creates "i
0570: 6d 70 6f 73 74 65 72 22 0a 2a 2a 20 20 20 20 20  mposter".**     
0580: 74 61 62 6c 65 73 20 75 73 69 6e 67 20 74 68 65  tables using the
0590: 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
05a0: 5f 49 4d 50 4f 53 54 45 52 20 69 6e 74 65 72 66  _IMPOSTER interf
05b0: 61 63 65 20 74 68 61 74 20 69 74 20 75 73 65 73  ace that it uses
05c0: 0a 2a 2a 20 20 20 20 20 74 6f 20 75 70 64 61 74  .**     to updat
05d0: 65 20 65 61 63 68 20 62 2d 74 72 65 65 20 69 6e  e each b-tree in
05e0: 64 69 76 69 64 75 61 6c 6c 79 2e 20 41 6c 6c 20  dividually. All 
05f0: 75 70 64 61 74 65 73 20 72 65 71 75 69 72 65 64  updates required
0600: 20 62 79 20 65 61 63 68 0a 2a 2a 20 20 20 20 20   by each.**     
0610: 62 2d 74 72 65 65 20 61 72 65 20 63 6f 6d 70 6c  b-tree are compl
0620: 65 74 65 64 20 62 65 66 6f 72 65 20 6d 6f 76 69  eted before movi
0630: 6e 67 20 6f 6e 20 74 6f 20 74 68 65 20 6e 65 78  ng on to the nex
0640: 74 2c 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 20 20  t, and all.**   
0650: 20 20 75 70 64 61 74 65 73 20 61 72 65 20 64 6f    updates are do
0660: 6e 65 20 69 6e 20 73 6f 72 74 65 64 20 6b 65 79  ne in sorted key
0670: 20 6f 72 64 65 72 2e 0a 2a 2a 20 0a 2a 2a 20 20   order..** .**  
0680: 32 29 20 54 68 65 20 22 3c 64 61 74 61 62 61 73  2) The "<databas
0690: 65 3e 2d 6f 61 6c 22 20 66 69 6c 65 20 69 73 20  e>-oal" file is 
06a0: 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 65 71 75  moved to the equ
06b0: 69 76 61 6c 65 6e 74 20 22 3c 64 61 74 61 62 61  ivalent "<databa
06c0: 73 65 3e 2d 77 61 6c 22 0a 2a 2a 20 20 20 20 20  se>-wal".**     
06d0: 6c 6f 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 61  location using a
06e0: 20 63 61 6c 6c 20 74 6f 20 72 65 6e 61 6d 65 28   call to rename(
06f0: 32 29 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67  2). Before doing
0700: 20 74 68 69 73 20 74 68 65 20 52 42 55 0a 2a 2a   this the RBU.**
0710: 20 20 20 20 20 6d 6f 64 75 6c 65 20 74 61 6b 65       module take
0720: 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  s an EXCLUSIVE l
0730: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
0740: 61 73 65 20 66 69 6c 65 2c 20 65 6e 73 75 72 69  ase file, ensuri
0750: 6e 67 0a 2a 2a 20 20 20 20 20 74 68 61 74 20 74  ng.**     that t
0760: 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 74 68 65  here are no othe
0770: 72 20 61 63 74 69 76 65 20 72 65 61 64 65 72 73  r active readers
0780: 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 4f 6e 63  ..** .**     Onc
0790: 65 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20  e the EXCLUSIVE 
07a0: 6c 6f 63 6b 20 69 73 20 72 65 6c 65 61 73 65 64  lock is released
07b0: 2c 20 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61  , any other data
07c0: 62 61 73 65 20 72 65 61 64 65 72 73 0a 2a 2a 20  base readers.** 
07d0: 20 20 20 20 64 65 74 65 63 74 20 74 68 65 20 6e      detect the n
07e0: 65 77 20 2a 2d 77 61 6c 20 66 69 6c 65 20 61 6e  ew *-wal file an
07f0: 64 20 72 65 61 64 20 74 68 65 20 64 61 74 61 62  d read the datab
0800: 61 73 65 20 69 6e 20 77 61 6c 20 6d 6f 64 65 2e  ase in wal mode.
0810: 20 41 74 0a 2a 2a 20 20 20 20 20 74 68 69 73 20   At.**     this 
0820: 70 6f 69 6e 74 20 74 68 65 79 20 73 65 65 20 74  point they see t
0830: 68 65 20 6e 65 77 20 76 65 72 73 69 6f 6e 20 6f  he new version o
0840: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2d  f the database -
0850: 20 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20   including.**   
0860: 20 20 74 68 65 20 75 70 64 61 74 65 73 20 6d 61    the updates ma
0870: 64 65 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  de as part of th
0880: 65 20 52 42 55 20 75 70 64 61 74 65 2e 0a 2a 2a  e RBU update..**
0890: 20 0a 2a 2a 20 20 33 29 20 54 68 65 20 6e 65 77   .**  3) The new
08a0: 20 2a 2d 77 61 6c 20 66 69 6c 65 20 69 73 20 63   *-wal file is c
08b0: 68 65 63 6b 70 6f 69 6e 74 65 64 2e 20 54 68 69  heckpointed. Thi
08c0: 73 20 70 72 6f 63 65 65 64 73 20 69 6e 20 74 68  s proceeds in th
08d0: 65 20 73 61 6d 65 20 77 61 79 20 0a 2a 2a 20 20  e same way .**  
08e0: 20 20 20 61 73 20 61 20 72 65 67 75 6c 61 72 20     as a regular 
08f0: 64 61 74 61 62 61 73 65 20 63 68 65 63 6b 70 6f  database checkpo
0900: 69 6e 74 2c 20 65 78 63 65 70 74 20 74 68 61 74  int, except that
0910: 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20   a single frame 
0920: 69 73 0a 2a 2a 20 20 20 20 20 63 68 65 63 6b 70  is.**     checkp
0930: 6f 69 6e 74 65 64 20 65 61 63 68 20 74 69 6d 65  ointed each time
0940: 20 73 71 6c 69 74 65 33 72 62 75 5f 73 74 65 70   sqlite3rbu_step
0950: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 49 66  () is called. If
0960: 20 74 68 65 20 52 42 55 0a 2a 2a 20 20 20 20 20   the RBU.**     
0970: 68 61 6e 64 6c 65 20 69 73 20 63 6c 6f 73 65 64  handle is closed
0980: 20 62 65 66 6f 72 65 20 74 68 65 20 65 6e 74 69   before the enti
0990: 72 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 69 73  re *-wal file is
09a0: 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2c 0a 2a   checkpointed,.*
09b0: 2a 20 20 20 20 20 74 68 65 20 63 68 65 63 6b 70  *     the checkp
09c0: 6f 69 6e 74 20 70 72 6f 67 72 65 73 73 20 69 73  oint progress is
09d0: 20 73 61 76 65 64 20 69 6e 20 74 68 65 20 52 42   saved in the RB
09e0: 55 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  U database and t
09f0: 68 65 0a 2a 2a 20 20 20 20 20 63 68 65 63 6b 70  he.**     checkp
0a00: 6f 69 6e 74 20 63 61 6e 20 62 65 20 72 65 73 75  oint can be resu
0a10: 6d 65 64 20 62 79 20 61 6e 6f 74 68 65 72 20 52  med by another R
0a20: 42 55 20 63 6c 69 65 6e 74 20 61 74 20 73 6f 6d  BU client at som
0a30: 65 20 70 6f 69 6e 74 20 69 6e 0a 2a 2a 20 20 20  e point in.**   
0a40: 20 20 74 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a    the future..**
0a50: 0a 2a 2a 20 50 4f 54 45 4e 54 49 41 4c 20 50 52  .** POTENTIAL PR
0a60: 4f 42 4c 45 4d 53 0a 2a 2a 20 0a 2a 2a 20 20 54  OBLEMS.** .**  T
0a70: 68 65 20 72 65 6e 61 6d 65 28 29 20 63 61 6c 6c  he rename() call
0a80: 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 70 6f   might not be po
0a90: 72 74 61 62 6c 65 2e 20 41 6e 64 20 52 42 55 20  rtable. And RBU 
0aa0: 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
0ab0: 0a 2a 2a 20 20 73 79 6e 63 69 6e 67 20 74 68 65  .**  syncing the
0ac0: 20 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72   directory after
0ad0: 20 72 65 6e 61 6d 69 6e 67 20 74 68 65 20 66 69   renaming the fi
0ae0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 57 68 65 6e 20  le..**.**  When 
0af0: 73 74 61 74 65 20 69 73 20 73 61 76 65 64 2c 20  state is saved, 
0b00: 61 6e 79 20 63 6f 6d 6d 69 74 20 74 6f 20 74 68  any commit to th
0b10: 65 20 2a 2d 6f 61 6c 20 66 69 6c 65 20 61 6e 64  e *-oal file and
0b20: 20 74 68 65 20 63 6f 6d 6d 69 74 20 74 6f 0a 2a   the commit to.*
0b30: 2a 20 20 74 68 65 20 52 42 55 20 75 70 64 61 74  *  the RBU updat
0b40: 65 20 64 61 74 61 62 61 73 65 20 61 72 65 20 6e  e database are n
0b50: 6f 74 20 61 74 6f 6d 69 63 2e 20 53 6f 20 69 66  ot atomic. So if
0b60: 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73   the power fails
0b70: 20 61 74 20 74 68 65 0a 2a 2a 20 20 77 72 6f 6e   at the.**  wron
0b80: 67 20 6d 6f 6d 65 6e 74 20 74 68 65 79 20 6d 69  g moment they mi
0b90: 67 68 74 20 67 65 74 20 6f 75 74 20 6f 66 20 73  ght get out of s
0ba0: 79 6e 63 2e 20 41 73 20 74 68 65 20 6d 61 69 6e  ync. As the main
0bb0: 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62   database will b
0bc0: 65 0a 2a 2a 20 20 63 6f 6d 6d 69 74 74 65 64 20  e.**  committed 
0bd0: 62 65 66 6f 72 65 20 74 68 65 20 52 42 55 20 75  before the RBU u
0be0: 70 64 61 74 65 20 64 61 74 61 62 61 73 65 20 74  pdate database t
0bf0: 68 69 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  his will likely 
0c00: 65 69 74 68 65 72 20 6a 75 73 74 0a 2a 2a 20 20  either just.**  
0c10: 70 61 73 73 20 75 6e 6e 6f 74 69 63 65 64 2c 20  pass unnoticed, 
0c20: 6f 72 20 72 65 73 75 6c 74 20 69 6e 20 53 51 4c  or result in SQL
0c30: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65  ITE_CONSTRAINT e
0c40: 72 72 6f 72 73 20 28 64 75 65 20 74 6f 20 55 4e  rrors (due to UN
0c50: 49 51 55 45 0a 2a 2a 20 20 63 6f 6e 73 74 72 61  IQUE.**  constra
0c60: 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 29 2e  int violations).
0c70: 0a 2a 2a 0a 2a 2a 20 20 49 66 20 73 6f 6d 65 20  .**.**  If some 
0c80: 63 6c 69 65 6e 74 20 64 6f 65 73 20 6d 6f 64 69  client does modi
0c90: 66 79 20 74 68 65 20 74 61 72 67 65 74 20 64 61  fy the target da
0ca0: 74 61 62 61 73 65 20 6d 69 64 20 52 42 55 20 75  tabase mid RBU u
0cb0: 70 64 61 74 65 2c 20 6f 72 20 73 6f 6d 65 0a 2a  pdate, or some.*
0cc0: 2a 20 20 6f 74 68 65 72 20 65 72 72 6f 72 20 6f  *  other error o
0cd0: 63 63 75 72 73 2c 20 74 68 65 20 52 42 55 20 65  ccurs, the RBU e
0ce0: 78 74 65 6e 73 69 6f 6e 20 77 69 6c 6c 20 6b 65  xtension will ke
0cf0: 65 70 20 74 68 72 6f 77 69 6e 67 20 65 72 72 6f  ep throwing erro
0d00: 72 73 2e 20 49 74 27 73 0a 2a 2a 20 20 6e 6f 74  rs. It's.**  not
0d10: 20 72 65 61 6c 6c 79 20 63 6c 65 61 72 20 68 6f   really clear ho
0d20: 77 20 74 6f 20 67 65 74 20 6f 75 74 20 6f 66 20  w to get out of 
0d30: 74 68 69 73 20 73 74 61 74 65 2e 20 54 68 65 20  this state. The 
0d40: 73 79 73 74 65 6d 20 63 6f 75 6c 64 20 6a 75 73  system could jus
0d50: 74 0a 2a 2a 20 20 62 79 20 64 65 6c 65 74 65 20  t.**  by delete 
0d60: 74 68 65 20 52 42 55 20 75 70 64 61 74 65 20 64  the RBU update d
0d70: 61 74 61 62 61 73 65 20 61 6e 64 20 2a 2d 6f 61  atabase and *-oa
0d80: 6c 20 66 69 6c 65 20 61 6e 64 20 68 61 76 65 20  l file and have 
0d90: 74 68 65 20 64 65 76 69 63 65 0a 2a 2a 20 20 64  the device.**  d
0da0: 6f 77 6e 6c 6f 61 64 20 74 68 65 20 75 70 64 61  ownload the upda
0db0: 74 65 20 61 67 61 69 6e 20 61 6e 64 20 73 74 61  te again and sta
0dc0: 72 74 20 6f 76 65 72 2e 0a 2a 2a 0a 2a 2a 20 20  rt over..**.**  
0dd0: 41 74 20 70 72 65 73 65 6e 74 2c 20 66 6f 72 20  At present, for 
0de0: 61 6e 20 55 50 44 41 54 45 2c 20 62 6f 74 68 20  an UPDATE, both 
0df0: 74 68 65 20 6e 65 77 2e 2a 20 61 6e 64 20 6f 6c  the new.* and ol
0e00: 64 2e 2a 20 72 65 63 6f 72 64 73 20 61 72 65 0a  d.* records are.
0e10: 2a 2a 20 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e  **  collected in
0e20: 20 74 68 65 20 72 62 75 5f 78 79 7a 20 74 61 62   the rbu_xyz tab
0e30: 6c 65 2e 20 41 6e 64 20 66 6f 72 20 62 6f 74 68  le. And for both
0e40: 20 55 50 44 41 54 45 73 20 61 6e 64 20 44 45 4c   UPDATEs and DEL
0e50: 45 54 45 73 20 61 6c 6c 0a 2a 2a 20 20 66 69 65  ETEs all.**  fie
0e60: 6c 64 73 20 61 72 65 20 63 6f 6c 6c 65 63 74 65  lds are collecte
0e70: 64 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20 77  d.  This means w
0e80: 65 27 72 65 20 70 72 6f 62 61 62 6c 79 20 77 72  e're probably wr
0e90: 69 74 69 6e 67 20 61 20 6c 6f 74 20 6d 6f 72 65  iting a lot more
0ea0: 0a 2a 2a 20 20 64 61 74 61 20 74 6f 20 64 69 73  .**  data to dis
0eb0: 6b 20 77 68 65 6e 20 73 61 76 69 6e 67 20 74 68  k when saving th
0ec0: 65 20 73 74 61 74 65 20 6f 66 20 61 6e 20 6f 6e  e state of an on
0ed0: 67 6f 69 6e 67 20 75 70 64 61 74 65 20 74 6f 20  going update to 
0ee0: 74 68 65 20 52 42 55 0a 2a 2a 20 20 75 70 64 61  the RBU.**  upda
0ef0: 74 65 20 64 61 74 61 62 61 73 65 20 74 68 61 6e  te database than
0f00: 20 69 73 20 73 74 72 69 63 74 6c 79 20 6e 65 63   is strictly nec
0f10: 65 73 73 61 72 79 2e 0a 2a 2a 20 0a 2a 2f 0a 0a  essary..** .*/..
0f20: 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74  #include <assert
0f30: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
0f40: 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ring.h>.#include
0f50: 20 3c 73 74 64 69 6f 2e 68 3e 0a 0a 23 69 6e 63   <stdio.h>..#inc
0f60: 6c 75 64 65 20 22 73 71 6c 69 74 65 33 2e 68 22  lude "sqlite3.h"
0f70: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
0f80: 51 4c 49 54 45 5f 43 4f 52 45 29 20 7c 7c 20 64  QLITE_CORE) || d
0f90: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
0fa0: 41 42 4c 45 5f 52 42 55 29 0a 23 69 6e 63 6c 75  ABLE_RBU).#inclu
0fb0: 64 65 20 22 73 71 6c 69 74 65 33 72 62 75 2e 68  de "sqlite3rbu.h
0fc0: 22 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  "..#if defined(_
0fd0: 57 49 4e 33 32 5f 57 43 45 29 0a 23 69 6e 63 6c  WIN32_WCE).#incl
0fe0: 75 64 65 20 22 77 69 6e 64 6f 77 73 2e 68 22 0a  ude "windows.h".
0ff0: 23 65 6e 64 69 66 0a 0a 2f 2a 20 4d 61 78 69 6d  #endif../* Maxim
1000: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 72 65  um number of pre
1010: 70 61 72 65 64 20 55 50 44 41 54 45 20 73 74 61  pared UPDATE sta
1020: 74 65 6d 65 6e 74 73 20 68 65 6c 64 20 62 79 20  tements held by 
1030: 74 68 69 73 20 6d 6f 64 75 6c 65 20 2a 2f 0a 23  this module */.#
1040: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 52 42  define SQLITE_RB
1050: 55 5f 55 50 44 41 54 45 5f 43 41 43 48 45 53 49  U_UPDATE_CACHESI
1060: 5a 45 20 31 36 0a 0a 2f 2a 0a 2a 2a 20 53 77 61  ZE 16../*.** Swa
1070: 70 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66  p two objects of
1080: 20 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f 0a 23   type TYPE..*/.#
1090: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
10a0: 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 29  TE_AMALGAMATION)
10b0: 0a 23 20 64 65 66 69 6e 65 20 53 57 41 50 28 54  .# define SWAP(T
10c0: 59 50 45 2c 41 2c 42 29 20 7b 54 59 50 45 20 74  YPE,A,B) {TYPE t
10d0: 3d 41 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 23  =A; A=B; B=t;}.#
10e0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
10f0: 20 72 62 75 5f 73 74 61 74 65 20 74 61 62 6c 65   rbu_state table
1100: 20 69 73 20 75 73 65 64 20 74 6f 20 73 61 76 65   is used to save
1110: 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 20   the state of a 
1120: 70 61 72 74 69 61 6c 6c 79 20 61 70 70 6c 69 65  partially applie
1130: 64 0a 2a 2a 20 75 70 64 61 74 65 20 73 6f 20 74  d.** update so t
1140: 68 61 74 20 69 74 20 63 61 6e 20 62 65 20 72 65  hat it can be re
1150: 73 75 6d 65 64 20 6c 61 74 65 72 2e 20 54 68 65  sumed later. The
1160: 20 74 61 62 6c 65 20 63 6f 6e 73 69 73 74 73 20   table consists 
1170: 6f 66 20 69 6e 74 65 67 65 72 0a 2a 2a 20 6b 65  of integer.** ke
1180: 79 73 20 6d 61 70 70 65 64 20 74 6f 20 76 61 6c  ys mapped to val
1190: 75 65 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ues as follows:.
11a0: 2a 2a 0a 2a 2a 20 52 42 55 5f 53 54 41 54 45 5f  **.** RBU_STATE_
11b0: 53 54 41 47 45 3a 0a 2a 2a 20 20 20 4d 61 79 20  STAGE:.**   May 
11c0: 62 65 20 73 65 74 20 74 6f 20 69 6e 74 65 67 65  be set to intege
11d0: 72 20 76 61 6c 75 65 73 20 31 2c 20 32 2c 20 34  r values 1, 2, 4
11e0: 20 6f 72 20 35 2e 20 41 73 20 66 6f 6c 6c 6f 77   or 5. As follow
11f0: 73 3a 0a 2a 2a 20 20 20 20 20 20 20 31 3a 20 74  s:.**       1: t
1200: 68 65 20 2a 2d 72 62 75 20 66 69 6c 65 20 69 73  he *-rbu file is
1210: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
1220: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
1230: 2a 20 20 20 20 20 20 20 32 3a 20 74 68 65 20 2a  *       2: the *
1240: 2d 72 62 75 20 66 69 6c 65 20 68 61 73 20 62 65  -rbu file has be
1250: 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 2c 20  en constructed, 
1260: 62 75 74 20 6e 6f 74 20 79 65 74 20 6d 6f 76 65  but not yet move
1270: 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74  d .**          t
1280: 6f 20 74 68 65 20 2a 2d 77 61 6c 20 70 61 74 68  o the *-wal path
1290: 2e 0a 2a 2a 20 20 20 20 20 20 20 34 3a 20 74 68  ..**       4: th
12a0: 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20  e checkpoint is 
12b0: 75 6e 64 65 72 77 61 79 2e 0a 2a 2a 20 20 20 20  underway..**    
12c0: 20 20 20 35 3a 20 74 68 65 20 72 62 75 20 75 70     5: the rbu up
12d0: 64 61 74 65 20 68 61 73 20 62 65 65 6e 20 63 68  date has been ch
12e0: 65 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2a 0a 2a  eckpointed..**.*
12f0: 2a 20 52 42 55 5f 53 54 41 54 45 5f 54 42 4c 3a  * RBU_STATE_TBL:
1300: 0a 2a 2a 20 20 20 4f 6e 6c 79 20 76 61 6c 69 64  .**   Only valid
1310: 20 69 66 20 53 54 41 47 45 3d 3d 31 2e 20 54 68   if STAGE==1. Th
1320: 65 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73  e target databas
1330: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
1340: 62 6c 65 20 0a 2a 2a 20 20 20 63 75 72 72 65 6e  ble .**   curren
1350: 74 6c 79 20 62 65 69 6e 67 20 77 72 69 74 74 65  tly being writte
1360: 6e 2e 0a 2a 2a 0a 2a 2a 20 52 42 55 5f 53 54 41  n..**.** RBU_STA
1370: 54 45 5f 49 44 58 3a 0a 2a 2a 20 20 20 4f 6e 6c  TE_IDX:.**   Onl
1380: 79 20 76 61 6c 69 64 20 69 66 20 53 54 41 47 45  y valid if STAGE
1390: 3d 3d 31 2e 20 54 68 65 20 74 61 72 67 65 74 20  ==1. The target 
13a0: 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 6f 66  database name of
13b0: 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 20   the index .**  
13c0: 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
13d0: 20 77 72 69 74 74 65 6e 2c 20 6f 72 20 4e 55 4c   written, or NUL
13e0: 4c 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 61  L if the main ta
13f0: 62 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ble is currently
1400: 20 62 65 69 6e 67 0a 2a 2a 20 20 20 75 70 64 61   being.**   upda
1410: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 42 55 5f 53  ted..**.** RBU_S
1420: 54 41 54 45 5f 52 4f 57 3a 0a 2a 2a 20 20 20 4f  TATE_ROW:.**   O
1430: 6e 6c 79 20 76 61 6c 69 64 20 69 66 20 53 54 41  nly valid if STA
1440: 47 45 3d 3d 31 2e 20 4e 75 6d 62 65 72 20 6f 66  GE==1. Number of
1450: 20 72 6f 77 73 20 61 6c 72 65 61 64 79 20 70 72   rows already pr
1460: 6f 63 65 73 73 65 64 20 66 6f 72 20 74 68 65 20  ocessed for the 
1470: 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20 74 61 62  current.**   tab
1480: 6c 65 2f 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20  le/index..**.** 
1490: 52 42 55 5f 53 54 41 54 45 5f 50 52 4f 47 52 45  RBU_STATE_PROGRE
14a0: 53 53 3a 0a 2a 2a 20 20 20 54 72 62 75 6c 20 6e  SS:.**   Trbul n
14b0: 75 6d 62 65 72 20 6f 66 20 73 71 6c 69 74 65 33  umber of sqlite3
14c0: 72 62 75 5f 73 74 65 70 28 29 20 63 61 6c 6c 73  rbu_step() calls
14d0: 20 6d 61 64 65 20 73 6f 20 66 61 72 20 61 73 20   made so far as 
14e0: 70 61 72 74 20 6f 66 20 74 68 69 73 0a 2a 2a 20  part of this.** 
14f0: 20 20 72 62 75 20 75 70 64 61 74 65 2e 0a 2a 2a    rbu update..**
1500: 0a 2a 2a 20 52 42 55 5f 53 54 41 54 45 5f 43 4b  .** RBU_STATE_CK
1510: 50 54 3a 0a 2a 2a 20 20 20 56 61 6c 69 64 20 69  PT:.**   Valid i
1520: 66 20 53 54 41 47 45 3d 3d 34 2e 20 54 68 65 20  f STAGE==4. The 
1530: 36 34 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20  64-bit checksum 
1540: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1550: 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 0a 2a 2a  the wal-index.**
1560: 20 20 20 68 65 61 64 65 72 20 63 72 65 61 74 65     header create
1570: 64 20 62 79 20 72 65 63 6f 76 65 72 69 6e 67 20  d by recovering 
1580: 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 2e 20  the *-wal file. 
1590: 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
15a0: 64 65 74 65 63 74 0a 2a 2a 20 20 20 63 61 73 65  detect.**   case
15b0: 73 20 77 68 65 6e 20 61 6e 6f 74 68 65 72 20 63  s when another c
15c0: 6c 69 65 6e 74 20 61 70 70 65 6e 64 73 20 66 72  lient appends fr
15d0: 61 6d 65 73 20 74 6f 20 74 68 65 20 2a 2d 77 61  ames to the *-wa
15e0: 6c 20 66 69 6c 65 20 69 6e 20 74 68 65 0a 2a 2a  l file in the.**
15f0: 20 20 20 6d 69 64 64 6c 65 20 6f 66 20 61 6e 20     middle of an 
1600: 69 6e 63 72 65 6d 65 6e 74 61 6c 20 63 68 65 63  incremental chec
1610: 6b 70 6f 69 6e 74 20 28 61 6e 20 69 6e 63 72 65  kpoint (an incre
1620: 6d 65 6e 74 61 6c 20 63 68 65 63 6b 70 6f 69 6e  mental checkpoin
1630: 74 20 63 61 6e 6e 6f 74 0a 2a 2a 20 20 20 62 65  t cannot.**   be
1640: 20 63 6f 6e 74 69 6e 75 65 64 20 69 66 20 74 68   continued if th
1650: 69 73 20 68 61 70 70 65 6e 73 29 2e 0a 2a 2a 0a  is happens)..**.
1660: 2a 2a 20 52 42 55 5f 53 54 41 54 45 5f 43 4f 4f  ** RBU_STATE_COO
1670: 4b 49 45 3a 0a 2a 2a 20 20 20 56 61 6c 69 64 20  KIE:.**   Valid 
1680: 69 66 20 53 54 41 47 45 3d 3d 31 2e 20 54 68 65  if STAGE==1. The
1690: 20 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 2d   current change-
16a0: 63 6f 75 6e 74 65 72 20 63 6f 6f 6b 69 65 20 76  counter cookie v
16b0: 61 6c 75 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  alue in the .** 
16c0: 20 20 74 61 72 67 65 74 20 64 62 20 66 69 6c 65    target db file
16d0: 2e 0a 2a 2a 0a 2a 2a 20 52 42 55 5f 53 54 41 54  ..**.** RBU_STAT
16e0: 45 5f 4f 41 4c 53 5a 3a 0a 2a 2a 20 20 20 56 61  E_OALSZ:.**   Va
16f0: 6c 69 64 20 69 66 20 53 54 41 47 45 3d 3d 31 2e  lid if STAGE==1.
1700: 20 54 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74   The size in byt
1710: 65 73 20 6f 66 20 74 68 65 20 2a 2d 6f 61 6c 20  es of the *-oal 
1720: 66 69 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  file..*/.#define
1730: 20 52 42 55 5f 53 54 41 54 45 5f 53 54 41 47 45   RBU_STATE_STAGE
1740: 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e          1.#defin
1750: 65 20 52 42 55 5f 53 54 41 54 45 5f 54 42 4c 20  e RBU_STATE_TBL 
1760: 20 20 20 20 20 20 20 20 20 32 0a 23 64 65 66 69           2.#defi
1770: 6e 65 20 52 42 55 5f 53 54 41 54 45 5f 49 44 58  ne RBU_STATE_IDX
1780: 20 20 20 20 20 20 20 20 20 20 33 0a 23 64 65 66            3.#def
1790: 69 6e 65 20 52 42 55 5f 53 54 41 54 45 5f 52 4f  ine RBU_STATE_RO
17a0: 57 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  W          4.#de
17b0: 66 69 6e 65 20 52 42 55 5f 53 54 41 54 45 5f 50  fine RBU_STATE_P
17c0: 52 4f 47 52 45 53 53 20 20 20 20 20 35 0a 23 64  ROGRESS     5.#d
17d0: 65 66 69 6e 65 20 52 42 55 5f 53 54 41 54 45 5f  efine RBU_STATE_
17e0: 43 4b 50 54 20 20 20 20 20 20 20 20 20 36 0a 23  CKPT         6.#
17f0: 64 65 66 69 6e 65 20 52 42 55 5f 53 54 41 54 45  define RBU_STATE
1800: 5f 43 4f 4f 4b 49 45 20 20 20 20 20 20 20 37 0a  _COOKIE       7.
1810: 23 64 65 66 69 6e 65 20 52 42 55 5f 53 54 41 54  #define RBU_STAT
1820: 45 5f 4f 41 4c 53 5a 20 20 20 20 20 20 20 20 38  E_OALSZ        8
1830: 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53 54 41  .#define RBU_STA
1840: 54 45 5f 50 48 41 53 45 4f 4e 45 53 54 45 50 20  TE_PHASEONESTEP 
1850: 39 0a 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53  9..#define RBU_S
1860: 54 41 47 45 5f 4f 41 4c 20 20 20 20 20 20 20 20  TAGE_OAL        
1870: 20 31 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53   1.#define RBU_S
1880: 54 41 47 45 5f 4d 4f 56 45 20 20 20 20 20 20 20  TAGE_MOVE       
1890: 20 32 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53   2.#define RBU_S
18a0: 54 41 47 45 5f 43 41 50 54 55 52 45 20 20 20 20  TAGE_CAPTURE    
18b0: 20 33 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53   3.#define RBU_S
18c0: 54 41 47 45 5f 43 4b 50 54 20 20 20 20 20 20 20  TAGE_CKPT       
18d0: 20 34 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53   4.#define RBU_S
18e0: 54 41 47 45 5f 44 4f 4e 45 20 20 20 20 20 20 20  TAGE_DONE       
18f0: 20 35 0a 0a 0a 23 64 65 66 69 6e 65 20 52 42 55   5...#define RBU
1900: 5f 43 52 45 41 54 45 5f 53 54 41 54 45 20 5c 0a  _CREATE_STATE \.
1910: 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
1920: 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 25 73  IF NOT EXISTS %s
1930: 2e 72 62 75 5f 73 74 61 74 65 28 6b 20 49 4e 54  .rbu_state(k INT
1940: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
1950: 2c 20 76 29 22 0a 0a 74 79 70 65 64 65 66 20 73  , v)"..typedef s
1960: 74 72 75 63 74 20 52 62 75 46 72 61 6d 65 20 52  truct RbuFrame R
1970: 62 75 46 72 61 6d 65 3b 0a 74 79 70 65 64 65 66  buFrame;.typedef
1980: 20 73 74 72 75 63 74 20 52 62 75 4f 62 6a 49 74   struct RbuObjIt
1990: 65 72 20 52 62 75 4f 62 6a 49 74 65 72 3b 0a 74  er RbuObjIter;.t
19a0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 52 62  ypedef struct Rb
19b0: 75 53 74 61 74 65 20 52 62 75 53 74 61 74 65 3b  uState RbuState;
19c0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
19d0: 72 62 75 5f 76 66 73 20 72 62 75 5f 76 66 73 3b  rbu_vfs rbu_vfs;
19e0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
19f0: 72 62 75 5f 66 69 6c 65 20 72 62 75 5f 66 69 6c  rbu_file rbu_fil
1a00: 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  e;.typedef struc
1a10: 74 20 52 62 75 55 70 64 61 74 65 53 74 6d 74 20  t RbuUpdateStmt 
1a20: 52 62 75 55 70 64 61 74 65 53 74 6d 74 3b 0a 0a  RbuUpdateStmt;..
1a30: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
1a40: 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e  ITE_AMALGAMATION
1a50: 29 0a 74 79 70 65 64 65 66 20 75 6e 73 69 67 6e  ).typedef unsign
1a60: 65 64 20 69 6e 74 20 75 33 32 3b 0a 74 79 70 65  ed int u32;.type
1a70: 64 65 66 20 75 6e 73 69 67 6e 65 64 20 63 68 61  def unsigned cha
1a80: 72 20 75 38 3b 0a 74 79 70 65 64 65 66 20 73 71  r u8;.typedef sq
1a90: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 36 34 3b  lite3_int64 i64;
1aa0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
1ab0: 68 65 73 65 20 76 61 6c 75 65 73 20 6d 75 73 74  hese values must
1ac0: 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65   match the value
1ad0: 73 20 64 65 66 69 6e 65 64 20 69 6e 20 77 61 6c  s defined in wal
1ae0: 2e 63 20 66 6f 72 20 74 68 65 20 65 71 75 69 76  .c for the equiv
1af0: 61 6c 65 6e 74 0a 2a 2a 20 6c 6f 63 6b 73 2e 20  alent.** locks. 
1b00: 54 68 65 73 65 20 61 72 65 20 6e 6f 74 20 6d 61  These are not ma
1b10: 67 69 63 20 6e 75 6d 62 65 72 73 20 61 73 20 74  gic numbers as t
1b20: 68 65 79 20 61 72 65 20 70 61 72 74 20 6f 66 20  hey are part of 
1b30: 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c 65 0a  the SQLite file.
1b40: 2a 2a 20 66 6f 72 6d 61 74 2e 0a 2a 2f 0a 23 64  ** format..*/.#d
1b50: 65 66 69 6e 65 20 57 41 4c 5f 4c 4f 43 4b 5f 57  efine WAL_LOCK_W
1b60: 52 49 54 45 20 20 30 0a 23 64 65 66 69 6e 65 20  RITE  0.#define 
1b70: 57 41 4c 5f 4c 4f 43 4b 5f 43 4b 50 54 20 20 20  WAL_LOCK_CKPT   
1b80: 31 0a 23 64 65 66 69 6e 65 20 57 41 4c 5f 4c 4f  1.#define WAL_LO
1b90: 43 4b 5f 52 45 41 44 30 20 20 33 0a 0a 2f 2a 0a  CK_READ0  3../*.
1ba0: 2a 2a 20 41 20 73 74 72 75 63 74 75 72 65 20 74  ** A structure t
1bb0: 6f 20 73 74 6f 72 65 20 76 61 6c 75 65 73 20 72  o store values r
1bc0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 72 62 75  ead from the rbu
1bd0: 5f 73 74 61 74 65 20 74 61 62 6c 65 20 69 6e 20  _state table in 
1be0: 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 72 75 63  memory..*/.struc
1bf0: 74 20 52 62 75 53 74 61 74 65 20 7b 0a 20 20 69  t RbuState {.  i
1c00: 6e 74 20 65 53 74 61 67 65 3b 0a 20 20 63 68 61  nt eStage;.  cha
1c10: 72 20 2a 7a 54 62 6c 3b 0a 20 20 63 68 61 72 20  r *zTbl;.  char 
1c20: 2a 7a 49 64 78 3b 0a 20 20 69 36 34 20 69 57 61  *zIdx;.  i64 iWa
1c30: 6c 43 6b 73 75 6d 3b 0a 20 20 69 6e 74 20 6e 52  lCksum;.  int nR
1c40: 6f 77 3b 0a 20 20 69 36 34 20 6e 50 72 6f 67 72  ow;.  i64 nProgr
1c50: 65 73 73 3b 0a 20 20 75 33 32 20 69 43 6f 6f 6b  ess;.  u32 iCook
1c60: 69 65 3b 0a 20 20 69 36 34 20 69 4f 61 6c 53 7a  ie;.  i64 iOalSz
1c70: 3b 0a 20 20 69 36 34 20 6e 50 68 61 73 65 4f 6e  ;.  i64 nPhaseOn
1c80: 65 53 74 65 70 3b 0a 7d 3b 0a 0a 73 74 72 75 63  eStep;.};..struc
1c90: 74 20 52 62 75 55 70 64 61 74 65 53 74 6d 74 20  t RbuUpdateStmt 
1ca0: 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 6b 3b  {.  char *zMask;
1cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc0: 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 75      /* Copy of u
1cd0: 70 64 61 74 65 20 6d 61 73 6b 20 75 73 65 64 20  pdate mask used 
1ce0: 77 69 74 68 20 70 55 70 64 61 74 65 20 2a 2f 0a  with pUpdate */.
1cf0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1d00: 70 55 70 64 61 74 65 3b 20 20 20 20 20 20 20 20  pUpdate;        
1d10: 20 20 2f 2a 20 4c 61 73 74 20 75 70 64 61 74 65    /* Last update
1d20: 20 73 74 61 74 65 6d 65 6e 74 20 28 6f 72 20 4e   statement (or N
1d30: 55 4c 4c 29 20 2a 2f 0a 20 20 52 62 75 55 70 64  ULL) */.  RbuUpd
1d40: 61 74 65 53 74 6d 74 20 2a 70 4e 65 78 74 3b 0a  ateStmt *pNext;.
1d50: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 74 65  };../*.** An ite
1d60: 72 61 74 6f 72 20 6f 66 20 74 68 69 73 20 74 79  rator of this ty
1d70: 70 65 20 69 73 20 75 73 65 64 20 74 6f 20 69 74  pe is used to it
1d80: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 6c  erate through al
1d90: 6c 20 6f 62 6a 65 63 74 73 20 69 6e 0a 2a 2a 20  l objects in.** 
1da0: 74 68 65 20 74 61 72 67 65 74 20 64 61 74 61 62  the target datab
1db0: 61 73 65 20 74 68 61 74 20 72 65 71 75 69 72 65  ase that require
1dc0: 20 75 70 64 61 74 69 6e 67 2e 20 46 6f 72 20 65   updating. For e
1dd0: 61 63 68 20 73 75 63 68 20 74 61 62 6c 65 2c 20  ach such table, 
1de0: 74 68 65 0a 2a 2a 20 69 74 65 72 61 74 6f 72 20  the.** iterator 
1df0: 76 69 73 69 74 73 2c 20 69 6e 20 6f 72 64 65 72  visits, in order
1e00: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 74 68  :.**.**     * th
1e10: 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66 2c 20  e table itself, 
1e20: 0a 2a 2a 20 20 20 20 20 2a 20 65 61 63 68 20 69  .**     * each i
1e30: 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c  ndex of the tabl
1e40: 65 20 28 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  e (zero or more 
1e50: 70 6f 69 6e 74 73 20 74 6f 20 76 69 73 69 74 29  points to visit)
1e60: 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 2a 20 61  , and.**     * a
1e70: 20 73 70 65 63 69 61 6c 20 22 63 6c 65 61 6e 75   special "cleanu
1e80: 70 20 74 61 62 6c 65 22 20 73 74 61 74 65 2e 0a  p table" state..
1e90: 2a 2a 0a 2a 2a 20 61 62 49 6e 64 65 78 65 64 3a  **.** abIndexed:
1ea0: 0a 2a 2a 20 20 20 49 66 20 74 68 65 20 74 61 62  .**   If the tab
1eb0: 6c 65 20 68 61 73 20 6e 6f 20 69 6e 64 65 78 65  le has no indexe
1ec0: 73 20 6f 6e 20 69 74 2c 20 61 62 49 6e 64 65 78  s on it, abIndex
1ed0: 65 64 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ed is set to NUL
1ee0: 4c 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a  L. Otherwise,.**
1ef0: 20 20 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20     it points to 
1f00: 61 6e 20 61 72 72 61 79 20 6f 66 20 66 6c 61 67  an array of flag
1f10: 73 20 6e 54 62 6c 43 6f 6c 20 65 6c 65 6d 65 6e  s nTblCol elemen
1f20: 74 73 20 69 6e 20 73 69 7a 65 2e 20 54 68 65 20  ts in size. The 
1f30: 66 6c 61 67 20 69 73 0a 2a 2a 20 20 20 73 65 74  flag is.**   set
1f40: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
1f50: 20 74 68 61 74 20 69 73 20 65 69 74 68 65 72 20   that is either 
1f60: 61 20 70 61 72 74 20 6f 66 20 74 68 65 20 50 4b  a part of the PK
1f70: 20 6f 72 20 61 20 70 61 72 74 20 6f 66 20 61 6e   or a part of an
1f80: 0a 2a 2a 20 20 20 69 6e 64 65 78 2e 20 4f 72 20  .**   index. Or 
1f90: 63 6c 65 61 72 20 6f 74 68 65 72 77 69 73 65 2e  clear otherwise.
1fa0: 0a 2a 2a 20 20 20 0a 2a 2f 0a 73 74 72 75 63 74  .**   .*/.struct
1fb0: 20 52 62 75 4f 62 6a 49 74 65 72 20 7b 0a 20 20   RbuObjIter {.  
1fc0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 54  sqlite3_stmt *pT
1fd0: 62 6c 49 74 65 72 3b 20 20 20 20 20 20 20 20 20  blIter;         
1fe0: 2f 2a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75  /* Iterate throu
1ff0: 67 68 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 73  gh tables */.  s
2000: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 64  qlite3_stmt *pId
2010: 78 49 74 65 72 3b 20 20 20 20 20 20 20 20 20 2f  xIter;         /
2020: 2a 20 49 6e 64 65 78 20 69 74 65 72 61 74 6f 72  * Index iterator
2030: 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 62 6c 43 6f   */.  int nTblCo
2040: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
2050: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
2060: 20 61 7a 54 62 6c 43 6f 6c 5b 5d 20 61 72 72 61   azTblCol[] arra
2070: 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a  y */.  char **az
2080: 54 62 6c 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  TblCol;         
2090: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
20a0: 6f 66 20 75 6e 71 75 6f 74 65 64 20 74 61 72 67  of unquoted targ
20b0: 65 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  et column names 
20c0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 54 62  */.  char **azTb
20d0: 6c 54 79 70 65 3b 20 20 20 20 20 20 20 20 20 20  lType;          
20e0: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
20f0: 20 74 61 72 67 65 74 20 63 6f 6c 75 6d 6e 20 74   target column t
2100: 79 70 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  ypes */.  int *a
2110: 69 53 72 63 4f 72 64 65 72 3b 20 20 20 20 20 20  iSrcOrder;      
2120: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 72 63            /* src
2130: 20 74 61 62 6c 65 20 63 6f 6c 20 2d 3e 20 74 61   table col -> ta
2140: 72 67 65 74 20 74 61 62 6c 65 20 63 6f 6c 20 2a  rget table col *
2150: 2f 0a 20 20 75 38 20 2a 61 62 54 62 6c 50 6b 3b  /.  u8 *abTblPk;
2160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2170: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
2180: 66 6c 61 67 73 2c 20 73 65 74 20 6f 6e 20 74 61  flags, set on ta
2190: 72 67 65 74 20 50 4b 20 63 6f 6c 75 6d 6e 73 20  rget PK columns 
21a0: 2a 2f 0a 20 20 75 38 20 2a 61 62 4e 6f 74 4e 75  */.  u8 *abNotNu
21b0: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
21c0: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
21d0: 20 66 6c 61 67 73 2c 20 73 65 74 20 6f 6e 20 4e   flags, set on N
21e0: 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20  OT NULL columns 
21f0: 2a 2f 0a 20 20 75 38 20 2a 61 62 49 6e 64 65 78  */.  u8 *abIndex
2200: 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
2210: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
2220: 20 66 6c 61 67 73 2c 20 73 65 74 20 6f 6e 20 69   flags, set on i
2230: 6e 64 65 78 65 64 20 26 20 50 4b 20 63 6f 6c 73  ndexed & PK cols
2240: 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 3b   */.  int eType;
2250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2260: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
2270: 79 70 65 20 2d 20 61 6e 20 52 42 55 5f 50 4b 5f  ype - an RBU_PK_
2280: 58 58 58 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20  XXX value */..  
2290: 2f 2a 20 4f 75 74 70 75 74 20 76 61 72 69 61 62  /* Output variab
22a0: 6c 65 73 2e 20 7a 54 62 6c 3d 3d 30 20 69 6d 70  les. zTbl==0 imp
22b0: 6c 69 65 73 20 45 4f 46 2e 20 2a 2f 0a 20 20 69  lies EOF. */.  i
22c0: 6e 74 20 62 43 6c 65 61 6e 75 70 3b 20 20 20 20  nt bCleanup;    
22d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22e0: 2a 20 54 72 75 65 20 69 6e 20 22 63 6c 65 61 6e  * True in "clean
22f0: 75 70 22 20 73 74 61 74 65 20 2a 2f 0a 20 20 63  up" state */.  c
2300: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c 3b  onst char *zTbl;
2310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2320: 2a 20 4e 61 6d 65 20 6f 66 20 74 61 72 67 65 74  * Name of target
2330: 20 64 62 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63   db table */.  c
2340: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61  onst char *zData
2350: 54 62 6c 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Tbl;           /
2360: 2a 20 4e 61 6d 65 20 6f 66 20 72 62 75 20 64 62  * Name of rbu db
2370: 20 74 61 62 6c 65 20 28 6f 72 20 6e 75 6c 6c 29   table (or null)
2380: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2390: 20 2a 7a 49 64 78 3b 20 20 20 20 20 20 20 20 20   *zIdx;         
23a0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
23b0: 20 74 61 72 67 65 74 20 64 62 20 69 6e 64 65 78   target db index
23c0: 20 28 6f 72 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20   (or null) */.  
23d0: 69 6e 74 20 69 54 6e 75 6d 3b 20 20 20 20 20 20  int iTnum;      
23e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f0: 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
2400: 63 75 72 72 65 6e 74 20 6f 62 6a 65 63 74 20 2a  current object *
2410: 2f 0a 20 20 69 6e 74 20 69 50 6b 54 6e 75 6d 3b  /.  int iPkTnum;
2420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2430: 20 20 20 20 2f 2a 20 49 66 20 65 54 79 70 65 3d      /* If eType=
2440: 3d 45 58 54 45 52 4e 41 4c 2c 20 72 6f 6f 74 20  =EXTERNAL, root 
2450: 6f 66 20 50 4b 20 69 6e 64 65 78 20 2a 2f 0a 20  of PK index */. 
2460: 20 69 6e 74 20 62 55 6e 69 71 75 65 3b 20 20 20   int bUnique;   
2470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2480: 20 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 64 65   /* Current inde
2490: 78 20 69 73 20 75 6e 69 71 75 65 20 2a 2f 0a 20  x is unique */. 
24a0: 20 69 6e 74 20 6e 49 6e 64 65 78 3b 20 20 20 20   int nIndex;    
24b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 75   /* Number of au
24d0: 78 2e 20 69 6e 64 65 78 65 73 20 6f 6e 20 74 61  x. indexes on ta
24e0: 62 6c 65 20 7a 54 62 6c 20 2a 2f 0a 0a 20 20 2f  ble zTbl */..  /
24f0: 2a 20 53 74 61 74 65 6d 65 6e 74 73 20 63 72 65  * Statements cre
2500: 61 74 65 64 20 62 79 20 72 62 75 4f 62 6a 49 74  ated by rbuObjIt
2510: 65 72 50 72 65 70 61 72 65 41 6c 6c 28 29 20 2a  erPrepareAll() *
2520: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20  /.  int nCol;   
2530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2540: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2550: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 63 75 72 72   columns in curr
2560: 65 6e 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ent object */.  
2570: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
2580: 65 6c 65 63 74 3b 20 20 20 20 20 20 20 20 20 20  elect;          
2590: 2f 2a 20 53 6f 75 72 63 65 20 64 61 74 61 20 2a  /* Source data *
25a0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
25b0: 20 2a 70 49 6e 73 65 72 74 3b 20 20 20 20 20 20   *pInsert;      
25c0: 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74      /* Statement
25d0: 20 66 6f 72 20 49 4e 53 45 52 54 20 6f 70 65 72   for INSERT oper
25e0: 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 73 71 6c 69  ations */.  sqli
25f0: 74 65 33 5f 73 74 6d 74 20 2a 70 44 65 6c 65 74  te3_stmt *pDelet
2600: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  e;          /* S
2610: 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 44 45 4c  tatement for DEL
2620: 45 54 45 20 6f 70 73 20 2a 2f 0a 20 20 73 71 6c  ETE ops */.  sql
2630: 69 74 65 33 5f 73 74 6d 74 20 2a 70 54 6d 70 49  ite3_stmt *pTmpI
2640: 6e 73 65 72 74 3b 20 20 20 20 20 20 20 2f 2a 20  nsert;       /* 
2650: 49 6e 73 65 72 74 20 69 6e 74 6f 20 72 62 75 5f  Insert into rbu_
2660: 74 6d 70 5f 24 7a 44 61 74 61 54 62 6c 20 2a 2f  tmp_$zDataTbl */
2670: 0a 0a 20 20 2f 2a 20 4c 61 73 74 20 55 50 44 41  ..  /* Last UPDA
2680: 54 45 20 75 73 65 64 20 28 66 6f 72 20 50 4b 20  TE used (for PK 
2690: 62 2d 74 72 65 65 20 75 70 64 61 74 65 73 20 6f  b-tree updates o
26a0: 6e 6c 79 29 2c 20 6f 72 20 4e 55 4c 4c 2e 20 2a  nly), or NULL. *
26b0: 2f 0a 20 20 52 62 75 55 70 64 61 74 65 53 74 6d  /.  RbuUpdateStm
26c0: 74 20 2a 70 52 62 75 55 70 64 61 74 65 3b 0a 7d  t *pRbuUpdate;.}
26d0: 3b 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 75 65 73 20  ;../*.** Values 
26e0: 66 6f 72 20 52 62 75 4f 62 6a 49 74 65 72 2e 65  for RbuObjIter.e
26f0: 54 79 70 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20 30  Type.**.**     0
2700: 3a 20 54 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74  : Table does not
2710: 20 65 78 69 73 74 20 28 65 72 72 6f 72 29 0a 2a   exist (error).*
2720: 2a 20 20 20 20 20 31 3a 20 54 61 62 6c 65 20 68  *     1: Table h
2730: 61 73 20 61 6e 20 69 6d 70 6c 69 63 69 74 20 72  as an implicit r
2740: 6f 77 69 64 2e 0a 2a 2a 20 20 20 20 20 32 3a 20  owid..**     2: 
2750: 54 61 62 6c 65 20 68 61 73 20 61 6e 20 65 78 70  Table has an exp
2760: 6c 69 63 69 74 20 49 50 4b 20 63 6f 6c 75 6d 6e  licit IPK column
2770: 2e 0a 2a 2a 20 20 20 20 20 33 3a 20 54 61 62 6c  ..**     3: Tabl
2780: 65 20 68 61 73 20 61 6e 20 65 78 74 65 72 6e 61  e has an externa
2790: 6c 20 50 4b 20 69 6e 64 65 78 2e 0a 2a 2a 20 20  l PK index..**  
27a0: 20 20 20 34 3a 20 54 61 62 6c 65 20 69 73 20 57     4: Table is W
27b0: 49 54 48 4f 55 54 20 52 4f 57 49 44 2e 0a 2a 2a  ITHOUT ROWID..**
27c0: 20 20 20 20 20 35 3a 20 54 61 62 6c 65 20 69 73       5: Table is
27d0: 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
27e0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 52 42 55  ..*/.#define RBU
27f0: 5f 50 4b 5f 4e 4f 54 41 42 4c 45 20 20 20 20 20  _PK_NOTABLE     
2800: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 52 42 55     0.#define RBU
2810: 5f 50 4b 5f 4e 4f 4e 45 20 20 20 20 20 20 20 20  _PK_NONE        
2820: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 52 42 55     1.#define RBU
2830: 5f 50 4b 5f 49 50 4b 20 20 20 20 20 20 20 20 20  _PK_IPK         
2840: 20 20 20 32 0a 23 64 65 66 69 6e 65 20 52 42 55     2.#define RBU
2850: 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 20 20 20  _PK_EXTERNAL    
2860: 20 20 20 33 0a 23 64 65 66 69 6e 65 20 52 42 55     3.#define RBU
2870: 5f 50 4b 5f 57 49 54 48 4f 55 54 5f 52 4f 57 49  _PK_WITHOUT_ROWI
2880: 44 20 20 34 0a 23 64 65 66 69 6e 65 20 52 42 55  D  4.#define RBU
2890: 5f 50 4b 5f 56 54 41 42 20 20 20 20 20 20 20 20  _PK_VTAB        
28a0: 20 20 20 35 0a 0a 0a 2f 2a 0a 2a 2a 20 57 69 74     5.../*.** Wit
28b0: 68 69 6e 20 74 68 65 20 52 42 55 5f 53 54 41 47  hin the RBU_STAG
28c0: 45 5f 4f 41 4c 20 73 74 61 67 65 2c 20 65 61 63  E_OAL stage, eac
28d0: 68 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  h call to sqlite
28e0: 33 72 62 75 5f 73 74 65 70 28 29 20 70 65 72 66  3rbu_step() perf
28f0: 6f 72 6d 73 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74  orms.** one of t
2900: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65  he following ope
2910: 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 23 64 65 66  rations..*/.#def
2920: 69 6e 65 20 52 42 55 5f 49 4e 53 45 52 54 20 20  ine RBU_INSERT  
2930: 20 20 20 31 20 20 20 20 20 20 20 20 20 20 2f 2a     1          /*
2940: 20 49 6e 73 65 72 74 20 6f 6e 20 61 20 6d 61 69   Insert on a mai
2950: 6e 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 2a  n table b-tree *
2960: 2f 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 44 45  /.#define RBU_DE
2970: 4c 45 54 45 20 20 20 20 20 32 20 20 20 20 20 20  LETE     2      
2980: 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 20      /* Delete a 
2990: 72 6f 77 20 66 72 6f 6d 20 61 20 6d 61 69 6e 20  row from a main 
29a0: 74 61 62 6c 65 20 62 2d 74 72 65 65 20 2a 2f 0a  table b-tree */.
29b0: 23 64 65 66 69 6e 65 20 52 42 55 5f 52 45 50 4c  #define RBU_REPL
29c0: 41 43 45 20 20 20 20 33 20 20 20 20 20 20 20 20  ACE    3        
29d0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 64 20    /* Delete and 
29e0: 74 68 65 6e 20 69 6e 73 65 72 74 20 61 20 72 6f  then insert a ro
29f0: 77 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52 42 55  w */.#define RBU
2a00: 5f 49 44 58 5f 44 45 4c 45 54 45 20 34 20 20 20  _IDX_DELETE 4   
2a10: 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65         /* Delete
2a20: 20 61 20 72 6f 77 20 66 72 6f 6d 20 61 6e 20 61   a row from an a
2a30: 75 78 2e 20 69 6e 64 65 78 20 62 2d 74 72 65 65  ux. index b-tree
2a40: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52 42 55 5f   */.#define RBU_
2a50: 49 44 58 5f 49 4e 53 45 52 54 20 35 20 20 20 20  IDX_INSERT 5    
2a60: 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20        /* Insert 
2a70: 6f 6e 20 61 6e 20 61 75 78 2e 20 69 6e 64 65 78  on an aux. index
2a80: 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 23 64 65 66   b-tree */..#def
2a90: 69 6e 65 20 52 42 55 5f 55 50 44 41 54 45 20 20  ine RBU_UPDATE  
2aa0: 20 20 20 36 20 20 20 20 20 20 20 20 20 20 2f 2a     6          /*
2ab0: 20 55 70 64 61 74 65 20 61 20 72 6f 77 20 69 6e   Update a row in
2ac0: 20 61 20 6d 61 69 6e 20 74 61 62 6c 65 20 62 2d   a main table b-
2ad0: 74 72 65 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  tree */../*.** A
2ae0: 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20   single step of 
2af0: 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 63  an incremental c
2b00: 68 65 63 6b 70 6f 69 6e 74 20 2d 20 66 72 61 6d  heckpoint - fram
2b10: 65 20 69 57 61 6c 46 72 61 6d 65 20 6f 66 20 74  e iWalFrame of t
2b20: 68 65 20 77 61 6c 0a 2a 2a 20 66 69 6c 65 20 73  he wal.** file s
2b30: 68 6f 75 6c 64 20 62 65 20 63 6f 70 69 65 64 20  hould be copied 
2b40: 74 6f 20 70 61 67 65 20 69 44 62 50 61 67 65 20  to page iDbPage 
2b50: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2b60: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  file..*/.struct 
2b70: 52 62 75 46 72 61 6d 65 20 7b 0a 20 20 75 33 32  RbuFrame {.  u32
2b80: 20 69 44 62 50 61 67 65 3b 0a 20 20 75 33 32 20   iDbPage;.  u32 
2b90: 69 57 61 6c 46 72 61 6d 65 3b 0a 7d 3b 0a 0a 2f  iWalFrame;.};../
2ba0: 2a 0a 2a 2a 20 52 42 55 20 68 61 6e 64 6c 65 2e  *.** RBU handle.
2bb0: 0a 2a 2a 0a 2a 2a 20 6e 50 68 61 73 65 4f 6e 65  .**.** nPhaseOne
2bc0: 53 74 65 70 3a 0a 2a 2a 20 20 20 49 66 20 74 68  Step:.**   If th
2bd0: 65 20 52 42 55 20 64 61 74 61 62 61 73 65 20 63  e RBU database c
2be0: 6f 6e 74 61 69 6e 73 20 61 6e 20 72 62 75 5f 63  ontains an rbu_c
2bf0: 6f 75 6e 74 20 74 61 62 6c 65 2c 20 74 68 69 73  ount table, this
2c00: 20 76 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f   value is set to
2c10: 0a 2a 2a 20 20 20 61 20 72 75 6e 6e 69 6e 67 20  .**   a running 
2c20: 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
2c30: 6e 75 6d 62 65 72 20 6f 66 20 62 2d 74 72 65 65  number of b-tree
2c40: 20 6f 70 65 72 61 74 69 6f 6e 73 20 72 65 71 75   operations requ
2c50: 69 72 65 64 20 74 6f 20 0a 2a 2a 20 20 20 66 69  ired to .**   fi
2c60: 6e 69 73 68 20 70 6f 70 75 6c 61 74 69 6e 67 20  nish populating 
2c70: 74 68 65 20 2a 2d 6f 61 6c 20 66 69 6c 65 2e 20  the *-oal file. 
2c80: 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20  This allows the 
2c90: 73 71 6c 69 74 65 33 5f 62 70 5f 70 72 6f 67 72  sqlite3_bp_progr
2ca0: 65 73 73 28 29 0a 2a 2a 20 20 20 41 50 49 20 74  ess().**   API t
2cb0: 6f 20 63 61 6c 63 75 6c 61 74 65 20 74 68 65 20  o calculate the 
2cc0: 70 65 72 6d 79 72 69 61 64 61 67 65 20 70 72 6f  permyriadage pro
2cd0: 67 72 65 73 73 20 6f 66 20 70 6f 70 75 6c 61 74  gress of populat
2ce0: 69 6e 67 20 74 68 65 20 2a 2d 6f 61 6c 20 66 69  ing the *-oal fi
2cf0: 6c 65 0a 2a 2a 20 20 20 75 73 69 6e 67 20 74 68  le.**   using th
2d00: 65 20 66 6f 72 6d 75 6c 61 3a 0a 2a 2a 0a 2a 2a  e formula:.**.**
2d10: 20 20 20 20 20 70 65 72 6d 79 72 69 61 64 61 67       permyriadag
2d20: 65 20 3d 20 28 31 30 30 30 30 20 2a 20 6e 50 72  e = (10000 * nPr
2d30: 6f 67 72 65 73 73 29 20 2f 20 6e 50 68 61 73 65  ogress) / nPhase
2d40: 4f 6e 65 53 74 65 70 0a 2a 2a 0a 2a 2a 20 20 20  OneStep.**.**   
2d50: 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20 69 73  nPhaseOneStep is
2d60: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
2d70: 74 68 65 20 73 75 6d 20 6f 66 3a 0a 2a 2a 0a 2a  the sum of:.**.*
2d80: 2a 20 20 20 20 20 6e 52 6f 77 20 2a 20 28 6e 49  *     nRow * (nI
2d90: 6e 64 65 78 20 2b 20 31 29 0a 2a 2a 0a 2a 2a 20  ndex + 1).**.** 
2da0: 20 20 66 6f 72 20 61 6c 6c 20 73 6f 75 72 63 65    for all source
2db0: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 52   tables in the R
2dc0: 42 55 20 64 61 74 61 62 61 73 65 2c 20 77 68 65  BU database, whe
2dd0: 72 65 20 6e 52 6f 77 20 69 73 20 74 68 65 20 6e  re nRow is the n
2de0: 75 6d 62 65 72 0a 2a 2a 20 20 20 6f 66 20 72 6f  umber.**   of ro
2df0: 77 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65  ws in the source
2e00: 20 74 61 62 6c 65 20 61 6e 64 20 6e 49 6e 64 65   table and nInde
2e10: 78 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  x the number of 
2e20: 69 6e 64 65 78 65 73 20 6f 6e 20 74 68 65 0a 2a  indexes on the.*
2e30: 2a 20 20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  *   correspondin
2e40: 67 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73  g target databas
2e50: 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20  e table..**.**  
2e60: 20 54 68 69 73 20 65 73 74 69 6d 61 74 65 20 69   This estimate i
2e70: 73 20 61 63 63 75 72 61 74 65 20 69 66 20 74 68  s accurate if th
2e80: 65 20 52 42 55 20 75 70 64 61 74 65 20 63 6f 6e  e RBU update con
2e90: 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f  sists entirely o
2ea0: 66 0a 2a 2a 20 20 20 49 4e 53 45 52 54 20 6f 70  f.**   INSERT op
2eb0: 65 72 61 74 69 6f 6e 73 2e 20 48 6f 77 65 76 65  erations. Howeve
2ec0: 72 2c 20 69 74 20 69 73 20 69 6e 61 63 63 75 72  r, it is inaccur
2ed0: 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  ate if:.**.**   
2ee0: 20 20 2a 20 74 68 65 20 52 42 55 20 75 70 64 61    * the RBU upda
2ef0: 74 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20  te contains any 
2f00: 55 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e  UPDATE operation
2f10: 73 2e 20 49 66 20 74 68 65 20 50 4b 20 73 70 65  s. If the PK spe
2f20: 63 69 66 69 65 64 0a 2a 2a 20 20 20 20 20 20 20  cified.**       
2f30: 66 6f 72 20 61 6e 20 55 50 44 41 54 45 20 6f 70  for an UPDATE op
2f40: 65 72 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  eration does not
2f50: 20 65 78 69 73 74 20 69 6e 20 74 68 65 20 74 61   exist in the ta
2f60: 72 67 65 74 20 74 61 62 6c 65 2c 20 74 68 65 6e  rget table, then
2f70: 0a 2a 2a 20 20 20 20 20 20 20 6e 6f 20 62 2d 74  .**       no b-t
2f80: 72 65 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 61  ree operations a
2f90: 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e 20 69  re required on i
2fa0: 6e 64 65 78 20 62 2d 74 72 65 65 73 2e 20 4f 72  ndex b-trees. Or
2fb0: 20 69 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20   if the .**     
2fc0: 20 20 73 70 65 63 69 66 69 65 64 20 50 4b 20 64    specified PK d
2fd0: 6f 65 73 20 65 78 69 73 74 2c 20 74 68 65 6e 20  oes exist, then 
2fe0: 28 6e 49 6e 64 65 78 2a 32 29 20 73 75 63 68 20  (nIndex*2) such 
2ff0: 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65 0a 2a  operations are.*
3000: 2a 20 20 20 20 20 20 20 72 65 71 75 69 72 65 64  *       required
3010: 20 28 6f 6e 65 20 64 65 6c 65 74 65 20 61 6e 64   (one delete and
3020: 20 6f 6e 65 20 69 6e 73 65 72 74 20 6f 6e 20 65   one insert on e
3030: 61 63 68 20 69 6e 64 65 78 20 62 2d 74 72 65 65  ach index b-tree
3040: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 74  )..**.**     * t
3050: 68 65 20 52 42 55 20 75 70 64 61 74 65 20 63 6f  he RBU update co
3060: 6e 74 61 69 6e 73 20 61 6e 79 20 44 45 4c 45 54  ntains any DELET
3070: 45 20 6f 70 65 72 61 74 69 6f 6e 73 20 66 6f 72  E operations for
3080: 20 77 68 69 63 68 20 74 68 65 20 73 70 65 63 69   which the speci
3090: 66 69 65 64 0a 2a 2a 20 20 20 20 20 20 20 50 4b  fied.**       PK
30a0: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
30b0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6e 6f   In this case no
30c0: 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20   operations are 
30d0: 72 65 71 75 69 72 65 64 20 6f 6e 20 69 6e 64 65  required on inde
30e0: 78 0a 2a 2a 20 20 20 20 20 20 20 62 2d 74 72 65  x.**       b-tre
30f0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  es..**.**     * 
3100: 74 68 65 20 52 42 55 20 75 70 64 61 74 65 20 63  the RBU update c
3110: 6f 6e 74 61 69 6e 73 20 52 45 50 4c 41 43 45 20  ontains REPLACE 
3120: 6f 70 65 72 61 74 69 6f 6e 73 2e 20 54 68 65 73  operations. Thes
3130: 65 20 61 72 65 20 73 69 6d 69 6c 61 72 20 74 6f  e are similar to
3140: 0a 2a 2a 20 20 20 20 20 20 20 55 50 44 41 54 45  .**       UPDATE
3150: 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a   operations..**.
3160: 2a 2a 20 20 20 6e 50 68 61 73 65 4f 6e 65 53 74  **   nPhaseOneSt
3170: 65 70 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  ep is updated to
3180: 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65   account for the
3190: 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76   conditions abov
31a0: 65 20 64 75 72 69 6e 67 20 74 68 65 0a 2a 2a 20  e during the.** 
31b0: 20 20 66 69 72 73 74 20 70 61 73 73 20 6f 66 20    first pass of 
31c0: 65 61 63 68 20 73 6f 75 72 63 65 20 74 61 62 6c  each source tabl
31d0: 65 2e 20 54 68 65 20 75 70 64 61 74 65 64 20 6e  e. The updated n
31e0: 50 68 61 73 65 4f 6e 65 53 74 65 70 20 76 61 6c  PhaseOneStep val
31f0: 75 65 20 69 73 0a 2a 2a 20 20 20 73 74 6f 72 65  ue is.**   store
3200: 64 20 69 6e 20 74 68 65 20 72 62 75 5f 73 74 61  d in the rbu_sta
3210: 74 65 20 74 61 62 6c 65 20 69 66 20 74 68 65 20  te table if the 
3220: 52 42 55 20 75 70 64 61 74 65 20 69 73 20 73 75  RBU update is su
3230: 73 70 65 6e 64 65 64 2e 0a 2a 2f 0a 73 74 72 75  spended..*/.stru
3240: 63 74 20 73 71 6c 69 74 65 33 72 62 75 20 7b 0a  ct sqlite3rbu {.
3250: 20 20 69 6e 74 20 65 53 74 61 67 65 3b 20 20 20    int eStage;   
3260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3270: 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 52 42    /* Value of RB
3280: 55 5f 53 54 41 54 45 5f 53 54 41 47 45 20 66 69  U_STATE_STAGE fi
3290: 65 6c 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  eld */.  sqlite3
32a0: 20 2a 64 62 4d 61 69 6e 3b 20 20 20 20 20 20 20   *dbMain;       
32b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 61 72 67           /* targ
32c0: 65 74 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  et database hand
32d0: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  le */.  sqlite3 
32e0: 2a 64 62 52 62 75 3b 20 20 20 20 20 20 20 20 20  *dbRbu;         
32f0: 20 20 20 20 20 20 20 20 2f 2a 20 72 62 75 20 64          /* rbu d
3300: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
3310: 2f 0a 20 20 63 68 61 72 20 2a 7a 54 61 72 67 65  /.  char *zTarge
3320: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
3330: 20 20 20 20 2f 2a 20 50 61 74 68 20 74 6f 20 74      /* Path to t
3340: 61 72 67 65 74 20 64 62 20 2a 2f 0a 20 20 63 68  arget db */.  ch
3350: 61 72 20 2a 7a 52 62 75 3b 20 20 20 20 20 20 20  ar *zRbu;       
3360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3370: 20 50 61 74 68 20 74 6f 20 72 62 75 20 64 62 20   Path to rbu db 
3380: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 74 61 74  */.  char *zStat
3390: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
33a0: 20 20 20 20 20 2f 2a 20 50 61 74 68 20 74 6f 20       /* Path to 
33b0: 73 74 61 74 65 20 64 62 20 28 6f 72 20 4e 55 4c  state db (or NUL
33c0: 4c 20 69 66 20 7a 52 62 75 29 20 2a 2f 0a 20 20  L if zRbu) */.  
33d0: 63 68 61 72 20 7a 53 74 61 74 65 44 62 5b 35 5d  char zStateDb[5]
33e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
33f0: 2f 2a 20 44 62 20 6e 61 6d 65 20 66 6f 72 20 73  /* Db name for s
3400: 74 61 74 65 20 28 22 73 74 61 74 22 20 6f 72 20  tate ("stat" or 
3410: 22 6d 61 69 6e 22 29 20 2a 2f 0a 20 20 69 6e 74  "main") */.  int
3420: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
3430: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3440: 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
3450: 79 20 6c 61 73 74 20 72 62 75 5f 73 74 65 70 28  y last rbu_step(
3460: 29 20 63 61 6c 6c 20 2a 2f 0a 20 20 63 68 61 72  ) call */.  char
3470: 20 2a 7a 45 72 72 6d 73 67 3b 20 20 20 20 20 20   *zErrmsg;      
3480: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
3490: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66 20  rror message if 
34a0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 2a 2f  rc!=SQLITE_OK */
34b0: 0a 20 20 69 6e 74 20 6e 53 74 65 70 3b 20 20 20  .  int nStep;   
34c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34d0: 20 20 20 2f 2a 20 52 6f 77 73 20 70 72 6f 63 65     /* Rows proce
34e0: 73 73 65 64 20 66 6f 72 20 63 75 72 72 65 6e 74  ssed for current
34f0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
3500: 20 6e 50 72 6f 67 72 65 73 73 3b 20 20 20 20 20   nProgress;     
3510: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3520: 52 6f 77 73 20 70 72 6f 63 65 73 73 65 64 20 66  Rows processed f
3530: 6f 72 20 61 6c 6c 20 6f 62 6a 65 63 74 73 20 2a  or all objects *
3540: 2f 0a 20 20 52 62 75 4f 62 6a 49 74 65 72 20 6f  /.  RbuObjIter o
3550: 62 6a 69 74 65 72 3b 20 20 20 20 20 20 20 20 20  bjiter;         
3560: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
3570: 66 6f 72 20 73 6b 69 70 70 69 6e 67 20 74 68 72  for skipping thr
3580: 6f 75 67 68 20 74 62 6c 2f 69 64 78 20 2a 2f 0a  ough tbl/idx */.
3590: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56    const char *zV
35a0: 66 73 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  fsName;         
35b0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 75 74    /* Name of aut
35c0: 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74  omatically creat
35d0: 65 64 20 72 62 75 20 76 66 73 20 2a 2f 0a 20 20  ed rbu vfs */.  
35e0: 72 62 75 5f 66 69 6c 65 20 2a 70 54 61 72 67 65  rbu_file *pTarge
35f0: 74 46 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  tFd;            
3600: 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 6f  /* File handle o
3610: 70 65 6e 20 6f 6e 20 74 61 72 67 65 74 20 64 62  pen on target db
3620: 20 2a 2f 0a 20 20 69 36 34 20 69 4f 61 6c 53 7a   */.  i64 iOalSz
3630: 3b 0a 20 20 69 36 34 20 6e 50 68 61 73 65 4f 6e  ;.  i64 nPhaseOn
3640: 65 53 74 65 70 3b 0a 0a 20 20 2f 2a 20 54 68 65  eStep;..  /* The
3650: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65   following state
3660: 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 75   variables are u
3670: 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  sed as part of t
3680: 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 20  he incremental. 
3690: 20 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 20 73   ** checkpoint s
36a0: 74 61 67 65 20 28 65 53 74 61 67 65 3d 3d 52 42  tage (eStage==RB
36b0: 55 5f 53 54 41 47 45 5f 43 4b 50 54 29 2e 20 53  U_STAGE_CKPT). S
36c0: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 73 75 72 72  ee comments surr
36d0: 6f 75 6e 64 69 6e 67 0a 20 20 2a 2a 20 66 75 6e  ounding.  ** fun
36e0: 63 74 69 6f 6e 20 72 62 75 53 65 74 75 70 43 68  ction rbuSetupCh
36f0: 65 63 6b 70 6f 69 6e 74 28 29 20 66 6f 72 20 64  eckpoint() for d
3700: 65 74 61 69 6c 73 2e 20 20 2a 2f 0a 20 20 75 33  etails.  */.  u3
3710: 32 20 69 4d 61 78 46 72 61 6d 65 3b 20 20 20 20  2 iMaxFrame;    
3720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3730: 20 4c 61 72 67 65 73 74 20 69 57 61 6c 46 72 61   Largest iWalFra
3740: 6d 65 20 76 61 6c 75 65 20 69 6e 20 61 46 72 61  me value in aFra
3750: 6d 65 5b 5d 20 2a 2f 0a 20 20 75 33 32 20 6d 4c  me[] */.  u32 mL
3760: 6f 63 6b 3b 0a 20 20 69 6e 74 20 6e 46 72 61 6d  ock;.  int nFram
3770: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
3780: 20 20 20 20 20 20 20 2f 2a 20 45 6e 74 72 69 65         /* Entrie
3790: 73 20 69 6e 20 61 46 72 61 6d 65 5b 5d 20 61 72  s in aFrame[] ar
37a0: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72  ray */.  int nFr
37b0: 61 6d 65 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20  ameAlloc;       
37c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
37d0: 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 46  cated size of aF
37e0: 72 61 6d 65 5b 5d 20 61 72 72 61 79 20 2a 2f 0a  rame[] array */.
37f0: 20 20 52 62 75 46 72 61 6d 65 20 2a 61 46 72 61    RbuFrame *aFra
3800: 6d 65 3b 0a 20 20 69 6e 74 20 70 67 73 7a 3b 0a  me;.  int pgsz;.
3810: 20 20 75 38 20 2a 61 42 75 66 3b 0a 20 20 69 36    u8 *aBuf;.  i6
3820: 34 20 69 57 61 6c 43 6b 73 75 6d 3b 0a 7d 3b 0a  4 iWalCksum;.};.
3830: 0a 2f 2a 0a 2a 2a 20 41 6e 20 72 62 75 20 56 46  ./*.** An rbu VF
3840: 53 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  S is implemented
3850: 20 75 73 69 6e 67 20 61 6e 20 69 6e 73 74 61 6e   using an instan
3860: 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
3870: 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ture..*/.struct 
3880: 72 62 75 5f 76 66 73 20 7b 0a 20 20 73 71 6c 69  rbu_vfs {.  sqli
3890: 74 65 33 5f 76 66 73 20 62 61 73 65 3b 20 20 20  te3_vfs base;   
38a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72              /* r
38b0: 62 75 20 56 46 53 20 73 68 69 6d 20 6d 65 74 68  bu VFS shim meth
38c0: 6f 64 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ods */.  sqlite3
38d0: 5f 76 66 73 20 2a 70 52 65 61 6c 56 66 73 3b 20  _vfs *pRealVfs; 
38e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 64 65           /* Unde
38f0: 72 6c 79 69 6e 67 20 56 46 53 20 2a 2f 0a 20 20  rlying VFS */.  
3900: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
3910: 75 74 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  utex;           
3920: 2f 2a 20 4d 75 74 65 78 20 74 6f 20 70 72 6f 74  /* Mutex to prot
3930: 65 63 74 20 70 4d 61 69 6e 20 2a 2f 0a 20 20 72  ect pMain */.  r
3940: 62 75 5f 66 69 6c 65 20 2a 70 4d 61 69 6e 3b 20  bu_file *pMain; 
3950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3960: 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  * Linked list of
3970: 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 73 20 2a   main db files *
3980: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68  /.};../*.** Each
3990: 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 62 79 20   file opened by 
39a0: 61 6e 20 72 62 75 20 56 46 53 20 69 73 20 72 65  an rbu VFS is re
39b0: 70 72 65 73 65 6e 74 65 64 20 62 79 20 61 6e 20  presented by an 
39c0: 69 6e 73 74 61 6e 63 65 20 6f 66 0a 2a 2a 20 74  instance of.** t
39d0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
39e0: 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63  ucture..*/.struc
39f0: 74 20 72 62 75 5f 66 69 6c 65 20 7b 0a 20 20 73  t rbu_file {.  s
3a00: 71 6c 69 74 65 33 5f 66 69 6c 65 20 62 61 73 65  qlite3_file base
3a10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
3a20: 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d  * sqlite3_file m
3a30: 65 74 68 6f 64 73 20 2a 2f 0a 20 20 73 71 6c 69  ethods */.  sqli
3a40: 74 65 33 5f 66 69 6c 65 20 2a 70 52 65 61 6c 3b  te3_file *pReal;
3a50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
3a60: 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 68  nderlying file h
3a70: 61 6e 64 6c 65 20 2a 2f 0a 20 20 72 62 75 5f 76  andle */.  rbu_v
3a80: 66 73 20 2a 70 52 62 75 56 66 73 3b 20 20 20 20  fs *pRbuVfs;    
3a90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
3aa0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72 62 75  inter to the rbu
3ab0: 5f 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  _vfs object */. 
3ac0: 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 52 62   sqlite3rbu *pRb
3ad0: 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
3ae0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 72   /* Pointer to r
3af0: 62 75 20 6f 62 6a 65 63 74 20 28 72 62 75 20 74  bu object (rbu t
3b00: 61 72 67 65 74 20 6f 6e 6c 79 29 20 2a 2f 0a 0a  arget only) */..
3b10: 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 3b    int openFlags;
3b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b30: 20 20 2f 2a 20 46 6c 61 67 73 20 74 68 69 73 20    /* Flags this 
3b40: 66 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20  file was opened 
3b50: 77 69 74 68 20 2a 2f 0a 20 20 75 33 32 20 69 43  with */.  u32 iC
3b60: 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20 20 20 20  ookie;          
3b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6f            /* Coo
3b80: 6b 69 65 20 76 61 6c 75 65 20 66 6f 72 20 6d 61  kie value for ma
3b90: 69 6e 20 64 62 20 66 69 6c 65 73 20 2a 2f 0a 20  in db files */. 
3ba0: 20 75 38 20 69 57 72 69 74 65 56 65 72 3b 20 20   u8 iWriteVer;  
3bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3bc0: 20 2f 2a 20 22 77 72 69 74 65 2d 76 65 72 73 69   /* "write-versi
3bd0: 6f 6e 22 20 76 61 6c 75 65 20 66 6f 72 20 6d 61  on" value for ma
3be0: 69 6e 20 64 62 20 66 69 6c 65 73 20 2a 2f 0a 0a  in db files */..
3bf0: 20 20 69 6e 74 20 6e 53 68 6d 3b 20 20 20 20 20    int nShm;     
3c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c10: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
3c20: 6e 74 72 69 65 73 20 69 6e 20 61 70 53 68 6d 5b  ntries in apShm[
3c30: 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 63 68 61  ] array */.  cha
3c40: 72 20 2a 2a 61 70 53 68 6d 3b 20 20 20 20 20 20  r **apShm;      
3c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3c60: 41 72 72 61 79 20 6f 66 20 6d 6d 61 70 27 64 20  Array of mmap'd 
3c70: 2a 2d 73 68 6d 20 72 65 67 69 6f 6e 73 20 2a 2f  *-shm regions */
3c80: 0a 20 20 63 68 61 72 20 2a 7a 44 65 6c 3b 20 20  .  char *zDel;  
3c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ca0: 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 69     /* Delete thi
3cb0: 73 20 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20 66  s when closing f
3cc0: 69 6c 65 20 2a 2f 0a 0a 20 20 63 6f 6e 73 74 20  ile */..  const 
3cd0: 63 68 61 72 20 2a 7a 57 61 6c 3b 20 20 20 20 20  char *zWal;     
3ce0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 61 6c            /* Wal
3cf0: 20 66 69 6c 65 6e 61 6d 65 20 66 6f 72 20 74 68   filename for th
3d00: 69 73 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20  is main db file 
3d10: 2a 2f 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70  */.  rbu_file *p
3d20: 57 61 6c 46 64 3b 20 20 20 20 20 20 20 20 20 20  WalFd;          
3d30: 20 20 20 20 20 2f 2a 20 57 61 6c 20 66 69 6c 65       /* Wal file
3d40: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
3d50: 74 68 69 73 20 6d 61 69 6e 20 64 62 20 2a 2f 0a  this main db */.
3d60: 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 4d 61 69    rbu_file *pMai
3d70: 6e 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  nNext;          
3d80: 20 20 2f 2a 20 4e 65 78 74 20 4d 41 49 4e 5f 44    /* Next MAIN_D
3d90: 42 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 0a 2f  B file */.};.../
3da0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3db0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3dc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3dd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3de0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65  *********.** The
3df0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65   following three
3e00: 20 66 75 6e 63 74 69 6f 6e 73 2c 20 66 6f 75 6e   functions, foun
3e10: 64 20 62 65 6c 6f 77 3a 0a 2a 2a 0a 2a 2a 20 20  d below:.**.**  
3e20: 20 72 62 75 44 65 6c 74 61 47 65 74 49 6e 74 28   rbuDeltaGetInt(
3e30: 29 0a 2a 2a 20 20 20 72 62 75 44 65 6c 74 61 43  ).**   rbuDeltaC
3e40: 68 65 63 6b 73 75 6d 28 29 0a 2a 2a 20 20 20 72  hecksum().**   r
3e50: 62 75 44 65 6c 74 61 41 70 70 6c 79 28 29 0a 2a  buDeltaApply().*
3e60: 2a 0a 2a 2a 20 61 72 65 20 6c 69 66 74 65 64 20  *.** are lifted 
3e70: 66 72 6f 6d 20 74 68 65 20 66 6f 73 73 69 6c 20  from the fossil 
3e80: 73 6f 75 72 63 65 20 63 6f 64 65 20 28 68 74 74  source code (htt
3e90: 70 3a 2f 2f 66 6f 73 73 69 6c 2d 73 63 6d 2e 6f  p://fossil-scm.o
3ea0: 72 67 29 2e 20 54 68 65 79 0a 2a 2a 20 61 72 65  rg). They.** are
3eb0: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
3ec0: 6e 74 20 74 68 65 20 73 63 61 6c 61 72 20 53 51  nt the scalar SQ
3ed0: 4c 20 66 75 6e 63 74 69 6f 6e 20 72 62 75 5f 66  L function rbu_f
3ee0: 6f 73 73 69 6c 5f 64 65 6c 74 61 28 29 2e 0a 2a  ossil_delta()..*
3ef0: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 62 79  /../*.** Read by
3f00: 74 65 73 20 66 72 6f 6d 20 2a 70 7a 20 61 6e 64  tes from *pz and
3f10: 20 63 6f 6e 76 65 72 74 20 74 68 65 6d 20 69 6e   convert them in
3f20: 74 6f 20 61 20 70 6f 73 69 74 69 76 65 20 69 6e  to a positive in
3f30: 74 65 67 65 72 2e 20 20 57 68 65 6e 0a 2a 2a 20  teger.  When.** 
3f40: 66 69 6e 69 73 68 65 64 2c 20 6c 65 61 76 65 20  finished, leave 
3f50: 2a 70 7a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  *pz pointing to 
3f60: 74 68 65 20 66 69 72 73 74 20 63 68 61 72 61 63  the first charac
3f70: 74 65 72 20 70 61 73 74 20 74 68 65 20 65 6e 64  ter past the end
3f80: 20 6f 66 0a 2a 2a 20 74 68 65 20 69 6e 74 65 67   of.** the integ
3f90: 65 72 2e 20 20 54 68 65 20 2a 70 4c 65 6e 20 70  er.  The *pLen p
3fa0: 61 72 61 6d 65 74 65 72 20 68 6f 6c 64 73 20 74  arameter holds t
3fb0: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
3fc0: 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20 2a 70   string.** in *p
3fd0: 7a 20 61 6e 64 20 69 73 20 64 65 63 72 65 6d 65  z and is decreme
3fe0: 6e 74 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61  nted once for ea
3ff0: 63 68 20 63 68 61 72 61 63 74 65 72 20 69 6e 20  ch character in 
4000: 74 68 65 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a  the integer..*/.
4010: 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20  static unsigned 
4020: 69 6e 74 20 72 62 75 44 65 6c 74 61 47 65 74 49  int rbuDeltaGetI
4030: 6e 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  nt(const char **
4040: 70 7a 2c 20 69 6e 74 20 2a 70 4c 65 6e 29 7b 0a  pz, int *pLen){.
4050: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
4060: 69 67 6e 65 64 20 63 68 61 72 20 7a 56 61 6c 75  igned char zValu
4070: 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 2d 31 2c 20  e[] = {.    -1, 
4080: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
4090: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 20 20 2d 31  -1, -1, -1,   -1
40a0: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  , -1, -1, -1, -1
40b0: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 0a 20 20  , -1, -1, -1,.  
40c0: 20 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31    -1, -1, -1, -1
40d0: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  , -1, -1, -1, -1
40e0: 2c 20 20 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  ,   -1, -1, -1, 
40f0: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
4100: 2d 31 2c 0a 20 20 20 20 2d 31 2c 20 2d 31 2c 20  -1,.    -1, -1, 
4110: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
4120: 2d 31 2c 20 2d 31 2c 20 20 20 2d 31 2c 20 2d 31  -1, -1,   -1, -1
4130: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  , -1, -1, -1, -1
4140: 2c 20 2d 31 2c 20 2d 31 2c 0a 20 20 20 20 20 30  , -1, -1,.     0
4150: 2c 20 20 31 2c 20 20 32 2c 20 20 33 2c 20 20 34  ,  1,  2,  3,  4
4160: 2c 20 20 35 2c 20 20 36 2c 20 20 37 2c 20 20 20  ,  5,  6,  7,   
4170: 20 38 2c 20 20 39 2c 20 2d 31 2c 20 2d 31 2c 20   8,  9, -1, -1, 
4180: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 0a  -1, -1, -1, -1,.
4190: 20 20 20 20 2d 31 2c 20 31 30 2c 20 31 31 2c 20      -1, 10, 11, 
41a0: 31 32 2c 20 31 33 2c 20 31 34 2c 20 31 35 2c 20  12, 13, 14, 15, 
41b0: 31 36 2c 20 20 20 31 37 2c 20 31 38 2c 20 31 39  16,   17, 18, 19
41c0: 2c 20 32 30 2c 20 32 31 2c 20 32 32 2c 20 32 33  , 20, 21, 22, 23
41d0: 2c 20 32 34 2c 0a 20 20 20 20 32 35 2c 20 32 36  , 24,.    25, 26
41e0: 2c 20 32 37 2c 20 32 38 2c 20 32 39 2c 20 33 30  , 27, 28, 29, 30
41f0: 2c 20 33 31 2c 20 33 32 2c 20 20 20 33 33 2c 20  , 31, 32,   33, 
4200: 33 34 2c 20 33 35 2c 20 2d 31 2c 20 2d 31 2c 20  34, 35, -1, -1, 
4210: 2d 31 2c 20 2d 31 2c 20 33 36 2c 0a 20 20 20 20  -1, -1, 36,.    
4220: 2d 31 2c 20 33 37 2c 20 33 38 2c 20 33 39 2c 20  -1, 37, 38, 39, 
4230: 34 30 2c 20 34 31 2c 20 34 32 2c 20 34 33 2c 20  40, 41, 42, 43, 
4240: 20 20 34 34 2c 20 34 35 2c 20 34 36 2c 20 34 37    44, 45, 46, 47
4250: 2c 20 34 38 2c 20 34 39 2c 20 35 30 2c 20 35 31  , 48, 49, 50, 51
4260: 2c 0a 20 20 20 20 35 32 2c 20 35 33 2c 20 35 34  ,.    52, 53, 54
4270: 2c 20 35 35 2c 20 35 36 2c 20 35 37 2c 20 35 38  , 55, 56, 57, 58
4280: 2c 20 35 39 2c 20 20 20 36 30 2c 20 36 31 2c 20  , 59,   60, 61, 
4290: 36 32 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  62, -1, -1, -1, 
42a0: 36 33 2c 20 2d 31 2c 0a 20 20 7d 3b 0a 20 20 75  63, -1,.  };.  u
42b0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 76 20 3d 20  nsigned int v = 
42c0: 30 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 75 6e  0;.  int c;.  un
42d0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 20 3d  signed char *z =
42e0: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
42f0: 29 2a 70 7a 3b 0a 20 20 75 6e 73 69 67 6e 65 64  )*pz;.  unsigned
4300: 20 63 68 61 72 20 2a 7a 53 74 61 72 74 20 3d 20   char *zStart = 
4310: 7a 3b 0a 20 20 77 68 69 6c 65 28 20 28 63 20 3d  z;.  while( (c =
4320: 20 7a 56 61 6c 75 65 5b 30 78 37 66 26 2a 28 7a   zValue[0x7f&*(z
4330: 2b 2b 29 5d 29 3e 3d 30 20 29 7b 0a 20 20 20 20  ++)])>=0 ){.    
4340: 20 76 20 3d 20 28 76 3c 3c 36 29 20 2b 20 63 3b   v = (v<<6) + c;
4350: 0a 20 20 7d 0a 20 20 7a 2d 2d 3b 0a 20 20 2a 70  .  }.  z--;.  *p
4360: 4c 65 6e 20 2d 3d 20 7a 20 2d 20 7a 53 74 61 72  Len -= z - zStar
4370: 74 3b 0a 20 20 2a 70 7a 20 3d 20 28 63 68 61 72  t;.  *pz = (char
4380: 2a 29 7a 3b 0a 20 20 72 65 74 75 72 6e 20 76 3b  *)z;.  return v;
4390: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  .}../*.** Comput
43a0: 65 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b  e a 32-bit check
43b0: 73 75 6d 20 6f 6e 20 74 68 65 20 4e 2d 62 79 74  sum on the N-byt
43c0: 65 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72  e buffer.  Retur
43d0: 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2f  n the result..*/
43e0: 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64  .static unsigned
43f0: 20 69 6e 74 20 72 62 75 44 65 6c 74 61 43 68 65   int rbuDeltaChe
4400: 63 6b 73 75 6d 28 63 6f 6e 73 74 20 63 68 61 72  cksum(const char
4410: 20 2a 7a 49 6e 2c 20 73 69 7a 65 5f 74 20 4e 29   *zIn, size_t N)
4420: 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  {.  const unsign
4430: 65 64 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f  ed char *z = (co
4440: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
4450: 72 20 2a 29 7a 49 6e 3b 0a 20 20 75 6e 73 69 67  r *)zIn;.  unsig
4460: 6e 65 64 20 73 75 6d 30 20 3d 20 30 3b 0a 20 20  ned sum0 = 0;.  
4470: 75 6e 73 69 67 6e 65 64 20 73 75 6d 31 20 3d 20  unsigned sum1 = 
4480: 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 73 75  0;.  unsigned su
4490: 6d 32 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e  m2 = 0;.  unsign
44a0: 65 64 20 73 75 6d 33 20 3d 20 30 3b 0a 20 20 77  ed sum3 = 0;.  w
44b0: 68 69 6c 65 28 4e 20 3e 3d 20 31 36 29 7b 0a 20  hile(N >= 16){. 
44c0: 20 20 20 73 75 6d 30 20 2b 3d 20 28 28 75 6e 73     sum0 += ((uns
44d0: 69 67 6e 65 64 29 7a 5b 30 5d 20 2b 20 7a 5b 34  igned)z[0] + z[4
44e0: 5d 20 2b 20 7a 5b 38 5d 20 2b 20 7a 5b 31 32 5d  ] + z[8] + z[12]
44f0: 29 3b 0a 20 20 20 20 73 75 6d 31 20 2b 3d 20 28  );.    sum1 += (
4500: 28 75 6e 73 69 67 6e 65 64 29 7a 5b 31 5d 20 2b  (unsigned)z[1] +
4510: 20 7a 5b 35 5d 20 2b 20 7a 5b 39 5d 20 2b 20 7a   z[5] + z[9] + z
4520: 5b 31 33 5d 29 3b 0a 20 20 20 20 73 75 6d 32 20  [13]);.    sum2 
4530: 2b 3d 20 28 28 75 6e 73 69 67 6e 65 64 29 7a 5b  += ((unsigned)z[
4540: 32 5d 20 2b 20 7a 5b 36 5d 20 2b 20 7a 5b 31 30  2] + z[6] + z[10
4550: 5d 2b 20 7a 5b 31 34 5d 29 3b 0a 20 20 20 20 73  ]+ z[14]);.    s
4560: 75 6d 33 20 2b 3d 20 28 28 75 6e 73 69 67 6e 65  um3 += ((unsigne
4570: 64 29 7a 5b 33 5d 20 2b 20 7a 5b 37 5d 20 2b 20  d)z[3] + z[7] + 
4580: 7a 5b 31 31 5d 2b 20 7a 5b 31 35 5d 29 3b 0a 20  z[11]+ z[15]);. 
4590: 20 20 20 7a 20 2b 3d 20 31 36 3b 0a 20 20 20 20     z += 16;.    
45a0: 4e 20 2d 3d 20 31 36 3b 0a 20 20 7d 0a 20 20 77  N -= 16;.  }.  w
45b0: 68 69 6c 65 28 4e 20 3e 3d 20 34 29 7b 0a 20 20  hile(N >= 4){.  
45c0: 20 20 73 75 6d 30 20 2b 3d 20 7a 5b 30 5d 3b 0a    sum0 += z[0];.
45d0: 20 20 20 20 73 75 6d 31 20 2b 3d 20 7a 5b 31 5d      sum1 += z[1]
45e0: 3b 0a 20 20 20 20 73 75 6d 32 20 2b 3d 20 7a 5b  ;.    sum2 += z[
45f0: 32 5d 3b 0a 20 20 20 20 73 75 6d 33 20 2b 3d 20  2];.    sum3 += 
4600: 7a 5b 33 5d 3b 0a 20 20 20 20 7a 20 2b 3d 20 34  z[3];.    z += 4
4610: 3b 0a 20 20 20 20 4e 20 2d 3d 20 34 3b 0a 20 20  ;.    N -= 4;.  
4620: 7d 0a 20 20 73 75 6d 33 20 2b 3d 20 28 73 75 6d  }.  sum3 += (sum
4630: 32 20 3c 3c 20 38 29 20 2b 20 28 73 75 6d 31 20  2 << 8) + (sum1 
4640: 3c 3c 20 31 36 29 20 2b 20 28 73 75 6d 30 20 3c  << 16) + (sum0 <
4650: 3c 20 32 34 29 3b 0a 20 20 73 77 69 74 63 68 28  < 24);.  switch(
4660: 4e 29 7b 0a 20 20 20 20 63 61 73 65 20 33 3a 20  N){.    case 3: 
4670: 20 20 73 75 6d 33 20 2b 3d 20 28 7a 5b 32 5d 20    sum3 += (z[2] 
4680: 3c 3c 20 38 29 3b 0a 20 20 20 20 63 61 73 65 20  << 8);.    case 
4690: 32 3a 20 20 20 73 75 6d 33 20 2b 3d 20 28 7a 5b  2:   sum3 += (z[
46a0: 31 5d 20 3c 3c 20 31 36 29 3b 0a 20 20 20 20 63  1] << 16);.    c
46b0: 61 73 65 20 31 3a 20 20 20 73 75 6d 33 20 2b 3d  ase 1:   sum3 +=
46c0: 20 28 7a 5b 30 5d 20 3c 3c 20 32 34 29 3b 0a 20   (z[0] << 24);. 
46d0: 20 20 20 64 65 66 61 75 6c 74 3a 20 20 3b 0a 20     default:  ;. 
46e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 75 6d 33   }.  return sum3
46f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79  ;.}../*.** Apply
4700: 20 61 20 64 65 6c 74 61 2e 0a 2a 2a 0a 2a 2a 20   a delta..**.** 
4710: 54 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  The output buffe
4720: 72 20 73 68 6f 75 6c 64 20 62 65 20 62 69 67 20  r should be big 
4730: 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74  enough to hold t
4740: 68 65 20 77 68 6f 6c 65 20 6f 75 74 70 75 74 0a  he whole output.
4750: 2a 2a 20 66 69 6c 65 20 61 6e 64 20 61 20 4e 55  ** file and a NU
4760: 4c 20 74 65 72 6d 69 6e 61 74 6f 72 20 61 74 20  L terminator at 
4770: 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20 64 65  the end.  The de
4780: 6c 74 61 5f 6f 75 74 70 75 74 5f 73 69 7a 65 28  lta_output_size(
4790: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c  ).** routine wil
47a0: 6c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 69 73  l determine this
47b0: 20 73 69 7a 65 20 66 6f 72 20 79 6f 75 2e 0a 2a   size for you..*
47c0: 2a 0a 2a 2a 20 54 68 65 20 64 65 6c 74 61 20 73  *.** The delta s
47d0: 74 72 69 6e 67 20 73 68 6f 75 6c 64 20 62 65 20  tring should be 
47e0: 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64 2e  null-terminated.
47f0: 20 20 42 75 74 20 74 68 65 20 64 65 6c 74 61 20    But the delta 
4800: 73 74 72 69 6e 67 0a 2a 2a 20 6d 61 79 20 63 6f  string.** may co
4810: 6e 74 61 69 6e 20 65 6d 62 65 64 64 65 64 20 4e  ntain embedded N
4820: 55 4c 20 63 68 61 72 61 63 74 65 72 73 20 28 69  UL characters (i
4830: 66 20 74 68 65 20 69 6e 70 75 74 20 61 6e 64 20  f the input and 
4840: 6f 75 74 70 75 74 20 61 72 65 0a 2a 2a 20 62 69  output are.** bi
4850: 6e 61 72 79 20 66 69 6c 65 73 29 20 73 6f 20 77  nary files) so w
4860: 65 20 61 6c 73 6f 20 68 61 76 65 20 74 6f 20 70  e also have to p
4870: 61 73 73 20 69 6e 20 74 68 65 20 6c 65 6e 67 74  ass in the lengt
4880: 68 20 6f 66 20 74 68 65 20 64 65 6c 74 61 20 69  h of the delta i
4890: 6e 0a 2a 2a 20 74 68 65 20 6c 65 6e 44 65 6c 74  n.** the lenDelt
48a0: 61 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a  a parameter..**.
48b0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
48c0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 69 7a   returns the siz
48d0: 65 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 20  e of the output 
48e0: 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 28 65  file in bytes (e
48f0: 78 63 6c 75 64 69 6e 67 0a 2a 2a 20 74 68 65 20  xcluding.** the 
4900: 66 69 6e 61 6c 20 4e 55 4c 20 74 65 72 6d 69 6e  final NUL termin
4910: 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 29 2e  ator character).
4920: 20 20 45 78 63 65 70 74 2c 20 69 66 20 74 68 65    Except, if the
4930: 20 64 65 6c 74 61 20 73 74 72 69 6e 67 20 69 73   delta string is
4940: 0a 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 6f 72  .** malformed or
4950: 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 75 73   intended for us
4960: 65 20 77 69 74 68 20 61 20 73 6f 75 72 63 65 20  e with a source 
4970: 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20  file other than 
4980: 7a 53 72 63 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  zSrc,.** then th
4990: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
49a0: 6e 73 20 2d 31 2e 0a 2a 2a 0a 2a 2a 20 52 65 66  ns -1..**.** Ref
49b0: 65 72 20 74 6f 20 74 68 65 20 64 65 6c 74 61 5f  er to the delta_
49c0: 63 72 65 61 74 65 28 29 20 64 6f 63 75 6d 65 6e  create() documen
49d0: 74 61 74 69 6f 6e 20 61 62 6f 76 65 20 66 6f 72  tation above for
49e0: 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 0a 2a   a description.*
49f0: 2a 20 6f 66 20 74 68 65 20 64 65 6c 74 61 20 66  * of the delta f
4a00: 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2f 0a 73  ile format..*/.s
4a10: 74 61 74 69 63 20 69 6e 74 20 72 62 75 44 65 6c  tatic int rbuDel
4a20: 74 61 41 70 70 6c 79 28 0a 20 20 63 6f 6e 73 74  taApply(.  const
4a30: 20 63 68 61 72 20 2a 7a 53 72 63 2c 20 20 20 20   char *zSrc,    
4a40: 20 20 2f 2a 20 54 68 65 20 73 6f 75 72 63 65 20    /* The source 
4a50: 6f 72 20 70 61 74 74 65 72 6e 20 66 69 6c 65 20  or pattern file 
4a60: 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 53 72 63 2c  */.  int lenSrc,
4a70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
4a80: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73 6f 75  ength of the sou
4a90: 72 63 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 6f  rce file */.  co
4aa0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 6c 74 61  nst char *zDelta
4ab0: 2c 20 20 20 20 2f 2a 20 44 65 6c 74 61 20 74 6f  ,    /* Delta to
4ac0: 20 61 70 70 6c 79 20 74 6f 20 74 68 65 20 70 61   apply to the pa
4ad0: 74 74 65 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6c  ttern */.  int l
4ae0: 65 6e 44 65 6c 74 61 2c 20 20 20 20 20 20 20 20  enDelta,        
4af0: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74    /* Length of t
4b00: 68 65 20 64 65 6c 74 61 20 2a 2f 0a 20 20 63 68  he delta */.  ch
4b10: 61 72 20 2a 7a 4f 75 74 20 20 20 20 20 20 20 20  ar *zOut        
4b20: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
4b30: 65 20 6f 75 74 70 75 74 20 69 6e 74 6f 20 74 68  e output into th
4b40: 69 73 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20  is preallocated 
4b50: 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 75  buffer */.){.  u
4b60: 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 69 6d 69  nsigned int limi
4b70: 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  t;.  unsigned in
4b80: 74 20 74 6f 74 61 6c 20 3d 20 30 3b 0a 23 69 66  t total = 0;.#if
4b90: 6e 64 65 66 20 46 4f 53 53 49 4c 5f 4f 4d 49 54  ndef FOSSIL_OMIT
4ba0: 5f 44 45 4c 54 41 5f 43 4b 53 55 4d 5f 54 45 53  _DELTA_CKSUM_TES
4bb0: 54 0a 20 20 63 68 61 72 20 2a 7a 4f 72 69 67 4f  T.  char *zOrigO
4bc0: 75 74 20 3d 20 7a 4f 75 74 3b 0a 23 65 6e 64 69  ut = zOut;.#endi
4bd0: 66 0a 0a 20 20 6c 69 6d 69 74 20 3d 20 72 62 75  f..  limit = rbu
4be0: 44 65 6c 74 61 47 65 74 49 6e 74 28 26 7a 44 65  DeltaGetInt(&zDe
4bf0: 6c 74 61 2c 20 26 6c 65 6e 44 65 6c 74 61 29 3b  lta, &lenDelta);
4c00: 0a 20 20 69 66 28 20 2a 7a 44 65 6c 74 61 21 3d  .  if( *zDelta!=
4c10: 27 5c 6e 27 20 29 7b 0a 20 20 20 20 2f 2a 20 45  '\n' ){.    /* E
4c20: 52 52 4f 52 3a 20 73 69 7a 65 20 69 6e 74 65 67  RROR: size integ
4c30: 65 72 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65  er not terminate
4c40: 64 20 62 79 20 22 5c 6e 22 20 2a 2f 0a 20 20 20  d by "\n" */.   
4c50: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
4c60: 20 20 7a 44 65 6c 74 61 2b 2b 3b 20 6c 65 6e 44    zDelta++; lenD
4c70: 65 6c 74 61 2d 2d 3b 0a 20 20 77 68 69 6c 65 28  elta--;.  while(
4c80: 20 2a 7a 44 65 6c 74 61 20 26 26 20 6c 65 6e 44   *zDelta && lenD
4c90: 65 6c 74 61 3e 30 20 29 7b 0a 20 20 20 20 75 6e  elta>0 ){.    un
4ca0: 73 69 67 6e 65 64 20 69 6e 74 20 63 6e 74 2c 20  signed int cnt, 
4cb0: 6f 66 73 74 3b 0a 20 20 20 20 63 6e 74 20 3d 20  ofst;.    cnt = 
4cc0: 72 62 75 44 65 6c 74 61 47 65 74 49 6e 74 28 26  rbuDeltaGetInt(&
4cd0: 7a 44 65 6c 74 61 2c 20 26 6c 65 6e 44 65 6c 74  zDelta, &lenDelt
4ce0: 61 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20  a);.    switch( 
4cf0: 7a 44 65 6c 74 61 5b 30 5d 20 29 7b 0a 20 20 20  zDelta[0] ){.   
4d00: 20 20 20 63 61 73 65 20 27 40 27 3a 20 7b 0a 20     case '@': {. 
4d10: 20 20 20 20 20 20 20 7a 44 65 6c 74 61 2b 2b 3b         zDelta++;
4d20: 20 6c 65 6e 44 65 6c 74 61 2d 2d 3b 0a 20 20 20   lenDelta--;.   
4d30: 20 20 20 20 20 6f 66 73 74 20 3d 20 72 62 75 44       ofst = rbuD
4d40: 65 6c 74 61 47 65 74 49 6e 74 28 26 7a 44 65 6c  eltaGetInt(&zDel
4d50: 74 61 2c 20 26 6c 65 6e 44 65 6c 74 61 29 3b 0a  ta, &lenDelta);.
4d60: 20 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 44          if( lenD
4d70: 65 6c 74 61 3e 30 20 26 26 20 7a 44 65 6c 74 61  elta>0 && zDelta
4d80: 5b 30 5d 21 3d 27 2c 27 20 29 7b 0a 20 20 20 20  [0]!=',' ){.    
4d90: 20 20 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20        /* ERROR: 
4da0: 63 6f 70 79 20 63 6f 6d 6d 61 6e 64 20 6e 6f 74  copy command not
4db0: 20 74 65 72 6d 69 6e 61 74 65 64 20 62 79 20 27   terminated by '
4dc0: 2c 27 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ,' */.          
4dd0: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
4de0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 44 65     }.        zDe
4df0: 6c 74 61 2b 2b 3b 20 6c 65 6e 44 65 6c 74 61 2d  lta++; lenDelta-
4e00: 2d 3b 0a 20 20 20 20 20 20 20 20 74 6f 74 61 6c  -;.        total
4e10: 20 2b 3d 20 63 6e 74 3b 0a 20 20 20 20 20 20 20   += cnt;.       
4e20: 20 69 66 28 20 74 6f 74 61 6c 3e 6c 69 6d 69 74   if( total>limit
4e30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
4e40: 20 45 52 52 4f 52 3a 20 63 6f 70 79 20 65 78 63   ERROR: copy exc
4e50: 65 65 64 73 20 6f 75 74 70 75 74 20 66 69 6c 65  eeds output file
4e60: 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 20   size */.       
4e70: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
4e80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4e90: 69 66 28 20 28 69 6e 74 29 28 6f 66 73 74 2b 63  if( (int)(ofst+c
4ea0: 6e 74 29 20 3e 20 6c 65 6e 53 72 63 20 29 7b 0a  nt) > lenSrc ){.
4eb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 52 52            /* ERR
4ec0: 4f 52 3a 20 63 6f 70 79 20 65 78 74 65 6e 64 73  OR: copy extends
4ed0: 20 70 61 73 74 20 65 6e 64 20 6f 66 20 69 6e 70   past end of inp
4ee0: 75 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ut */.          
4ef0: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
4f00: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d     }.        mem
4f10: 63 70 79 28 7a 4f 75 74 2c 20 26 7a 53 72 63 5b  cpy(zOut, &zSrc[
4f20: 6f 66 73 74 5d 2c 20 63 6e 74 29 3b 0a 20 20 20  ofst], cnt);.   
4f30: 20 20 20 20 20 7a 4f 75 74 20 2b 3d 20 63 6e 74       zOut += cnt
4f40: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
4f50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
4f60: 61 73 65 20 27 3a 27 3a 20 7b 0a 20 20 20 20 20  ase ':': {.     
4f70: 20 20 20 7a 44 65 6c 74 61 2b 2b 3b 20 6c 65 6e     zDelta++; len
4f80: 44 65 6c 74 61 2d 2d 3b 0a 20 20 20 20 20 20 20  Delta--;.       
4f90: 20 74 6f 74 61 6c 20 2b 3d 20 63 6e 74 3b 0a 20   total += cnt;. 
4fa0: 20 20 20 20 20 20 20 69 66 28 20 74 6f 74 61 6c         if( total
4fb0: 3e 6c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  >limit ){.      
4fc0: 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20 20 69      /* ERROR:  i
4fd0: 6e 73 65 72 74 20 63 6f 6d 6d 61 6e 64 20 67 69  nsert command gi
4fe0: 76 65 73 20 61 6e 20 6f 75 74 70 75 74 20 6c 61  ves an output la
4ff0: 72 67 65 72 20 74 68 61 6e 20 70 72 65 64 69 63  rger than predic
5000: 74 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ted */.         
5010: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
5020: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
5030: 28 20 28 69 6e 74 29 63 6e 74 3e 6c 65 6e 44 65  ( (int)cnt>lenDe
5040: 6c 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20  lta ){.         
5050: 20 2f 2a 20 45 52 52 4f 52 3a 20 69 6e 73 65 72   /* ERROR: inser
5060: 74 20 63 6f 75 6e 74 20 65 78 63 65 65 64 73 20  t count exceeds 
5070: 73 69 7a 65 20 6f 66 20 64 65 6c 74 61 20 2a 2f  size of delta */
5080: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
5090: 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n -1;.        }.
50a0: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a          memcpy(z
50b0: 4f 75 74 2c 20 7a 44 65 6c 74 61 2c 20 63 6e 74  Out, zDelta, cnt
50c0: 29 3b 0a 20 20 20 20 20 20 20 20 7a 4f 75 74 20  );.        zOut 
50d0: 2b 3d 20 63 6e 74 3b 0a 20 20 20 20 20 20 20 20  += cnt;.        
50e0: 7a 44 65 6c 74 61 20 2b 3d 20 63 6e 74 3b 0a 20  zDelta += cnt;. 
50f0: 20 20 20 20 20 20 20 6c 65 6e 44 65 6c 74 61 20         lenDelta 
5100: 2d 3d 20 63 6e 74 3b 0a 20 20 20 20 20 20 20 20  -= cnt;.        
5110: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
5120: 20 20 20 20 20 63 61 73 65 20 27 3b 27 3a 20 7b       case ';': {
5130: 0a 20 20 20 20 20 20 20 20 7a 44 65 6c 74 61 2b  .        zDelta+
5140: 2b 3b 20 6c 65 6e 44 65 6c 74 61 2d 2d 3b 0a 20  +; lenDelta--;. 
5150: 20 20 20 20 20 20 20 7a 4f 75 74 5b 30 5d 20 3d         zOut[0] =
5160: 20 30 3b 0a 23 69 66 6e 64 65 66 20 46 4f 53 53   0;.#ifndef FOSS
5170: 49 4c 5f 4f 4d 49 54 5f 44 45 4c 54 41 5f 43 4b  IL_OMIT_DELTA_CK
5180: 53 55 4d 5f 54 45 53 54 0a 20 20 20 20 20 20 20  SUM_TEST.       
5190: 20 69 66 28 20 63 6e 74 21 3d 72 62 75 44 65 6c   if( cnt!=rbuDel
51a0: 74 61 43 68 65 63 6b 73 75 6d 28 7a 4f 72 69 67  taChecksum(zOrig
51b0: 4f 75 74 2c 20 74 6f 74 61 6c 29 20 29 7b 0a 20  Out, total) ){. 
51c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 52 52 4f           /* ERRO
51d0: 52 3a 20 20 62 61 64 20 63 68 65 63 6b 73 75 6d  R:  bad checksum
51e0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65   */.          re
51f0: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20  turn -1;.       
5200: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
5210: 20 20 69 66 28 20 74 6f 74 61 6c 21 3d 6c 69 6d    if( total!=lim
5220: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  it ){.          
5230: 2f 2a 20 45 52 52 4f 52 3a 20 67 65 6e 65 72 61  /* ERROR: genera
5240: 74 65 64 20 73 69 7a 65 20 64 6f 65 73 20 6e 6f  ted size does no
5250: 74 20 6d 61 74 63 68 20 70 72 65 64 69 63 74 65  t match predicte
5260: 64 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20  d size */.      
5270: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
5280: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5290: 20 72 65 74 75 72 6e 20 74 6f 74 61 6c 3b 0a 20   return total;. 
52a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66       }.      def
52b0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  ault: {.        
52c0: 2f 2a 20 45 52 52 4f 52 3a 20 75 6e 6b 6e 6f 77  /* ERROR: unknow
52d0: 6e 20 64 65 6c 74 61 20 6f 70 65 72 61 74 6f 72  n delta operator
52e0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75   */.        retu
52f0: 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20  rn -1;.      }. 
5300: 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 45 52     }.  }.  /* ER
5310: 52 4f 52 3a 20 75 6e 74 65 72 6d 69 6e 61 74 65  ROR: unterminate
5320: 64 20 64 65 6c 74 61 20 2a 2f 0a 20 20 72 65 74  d delta */.  ret
5330: 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 73 74 61 74 69  urn -1;.}..stati
5340: 63 20 69 6e 74 20 72 62 75 44 65 6c 74 61 4f 75  c int rbuDeltaOu
5350: 74 70 75 74 53 69 7a 65 28 63 6f 6e 73 74 20 63  tputSize(const c
5360: 68 61 72 20 2a 7a 44 65 6c 74 61 2c 20 69 6e 74  har *zDelta, int
5370: 20 6c 65 6e 44 65 6c 74 61 29 7b 0a 20 20 69 6e   lenDelta){.  in
5380: 74 20 73 69 7a 65 3b 0a 20 20 73 69 7a 65 20 3d  t size;.  size =
5390: 20 72 62 75 44 65 6c 74 61 47 65 74 49 6e 74 28   rbuDeltaGetInt(
53a0: 26 7a 44 65 6c 74 61 2c 20 26 6c 65 6e 44 65 6c  &zDelta, &lenDel
53b0: 74 61 29 3b 0a 20 20 69 66 28 20 2a 7a 44 65 6c  ta);.  if( *zDel
53c0: 74 61 21 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20  ta!='\n' ){.    
53d0: 2f 2a 20 45 52 52 4f 52 3a 20 73 69 7a 65 20 69  /* ERROR: size i
53e0: 6e 74 65 67 65 72 20 6e 6f 74 20 74 65 72 6d 69  nteger not termi
53f0: 6e 61 74 65 64 20 62 79 20 22 5c 6e 22 20 2a 2f  nated by "\n" */
5400: 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
5410: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 69 7a    }.  return siz
5420: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20  e;.}../*.** End 
5430: 6f 66 20 63 6f 64 65 20 74 61 6b 65 6e 20 66 72  of code taken fr
5440: 6f 6d 20 66 6f 73 73 69 6c 2e 0a 2a 2a 2a 2a 2a  om fossil..*****
5450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5480: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5490: 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  ****/../*.** Imp
54a0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 53  lementation of S
54b0: 51 4c 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69  QL scalar functi
54c0: 6f 6e 20 72 62 75 5f 66 6f 73 73 69 6c 5f 64 65  on rbu_fossil_de
54d0: 6c 74 61 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  lta()..**.** Thi
54e0: 73 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 6c 69  s function appli
54f0: 65 73 20 61 20 66 6f 73 73 69 6c 20 64 65 6c 74  es a fossil delt
5500: 61 20 70 61 74 63 68 20 74 6f 20 61 20 62 6c 6f  a patch to a blo
5510: 62 2e 20 45 78 61 63 74 6c 79 20 74 77 6f 0a 2a  b. Exactly two.*
5520: 2a 20 61 72 67 75 6d 65 6e 74 73 20 6d 75 73 74  * arguments must
5530: 20 62 65 20 70 61 73 73 65 64 20 74 6f 20 74 68   be passed to th
5540: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65  is function. The
5550: 20 66 69 72 73 74 20 69 73 20 74 68 65 20 62 6c   first is the bl
5560: 6f 62 20 74 6f 0a 2a 2a 20 70 61 74 63 68 20 61  ob to.** patch a
5570: 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 74 68  nd the second th
5580: 65 20 70 61 74 63 68 20 74 6f 20 61 70 70 6c 79  e patch to apply
5590: 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  . If no error oc
55a0: 63 75 72 73 2c 20 74 68 69 73 0a 2a 2a 20 66 75  curs, this.** fu
55b0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
55c0: 68 65 20 70 61 74 63 68 65 64 20 62 6c 6f 62 2e  he patched blob.
55d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
55e0: 72 62 75 46 6f 73 73 69 6c 44 65 6c 74 61 46 75  rbuFossilDeltaFu
55f0: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
5600: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
5610: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
5620: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
5630: 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  gv.){.  const ch
5640: 61 72 20 2a 61 44 65 6c 74 61 3b 0a 20 20 69 6e  ar *aDelta;.  in
5650: 74 20 6e 44 65 6c 74 61 3b 0a 20 20 63 6f 6e 73  t nDelta;.  cons
5660: 74 20 63 68 61 72 20 2a 61 4f 72 69 67 3b 0a 20  t char *aOrig;. 
5670: 20 69 6e 74 20 6e 4f 72 69 67 3b 0a 0a 20 20 69   int nOrig;..  i
5680: 6e 74 20 6e 4f 75 74 3b 0a 20 20 69 6e 74 20 6e  nt nOut;.  int n
5690: 4f 75 74 32 3b 0a 20 20 63 68 61 72 20 2a 61 4f  Out2;.  char *aO
56a0: 75 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61  ut;..  assert( a
56b0: 72 67 63 3d 3d 32 20 29 3b 0a 0a 20 20 6e 4f 72  rgc==2 );..  nOr
56c0: 69 67 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ig = sqlite3_val
56d0: 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d  ue_bytes(argv[0]
56e0: 29 3b 0a 20 20 61 4f 72 69 67 20 3d 20 28 63 6f  );.  aOrig = (co
56f0: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
5700: 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67  3_value_blob(arg
5710: 76 5b 30 5d 29 3b 0a 20 20 6e 44 65 6c 74 61 20  v[0]);.  nDelta 
5720: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
5730: 62 79 74 65 73 28 61 72 67 76 5b 31 5d 29 3b 0a  bytes(argv[1]);.
5740: 20 20 61 44 65 6c 74 61 20 3d 20 28 63 6f 6e 73    aDelta = (cons
5750: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
5760: 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b  value_blob(argv[
5770: 31 5d 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72  1]);..  /* Figur
5780: 65 20 6f 75 74 20 74 68 65 20 73 69 7a 65 20 6f  e out the size o
5790: 66 20 74 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a  f the output */.
57a0: 20 20 6e 4f 75 74 20 3d 20 72 62 75 44 65 6c 74    nOut = rbuDelt
57b0: 61 4f 75 74 70 75 74 53 69 7a 65 28 61 44 65 6c  aOutputSize(aDel
57c0: 74 61 2c 20 6e 44 65 6c 74 61 29 3b 0a 20 20 69  ta, nDelta);.  i
57d0: 66 28 20 6e 4f 75 74 3c 30 20 29 7b 0a 20 20 20  f( nOut<0 ){.   
57e0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
57f0: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22  error(context, "
5800: 63 6f 72 72 75 70 74 20 66 6f 73 73 69 6c 20 64  corrupt fossil d
5810: 65 6c 74 61 22 2c 20 2d 31 29 3b 0a 20 20 20 20  elta", -1);.    
5820: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 61  return;.  }..  a
5830: 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Out = sqlite3_ma
5840: 6c 6c 6f 63 28 6e 4f 75 74 2b 31 29 3b 0a 20 20  lloc(nOut+1);.  
5850: 69 66 28 20 61 4f 75 74 3d 3d 30 20 29 7b 0a 20  if( aOut==0 ){. 
5860: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
5870: 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f  t_error_nomem(co
5880: 6e 74 65 78 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  ntext);.  }else{
5890: 0a 20 20 20 20 6e 4f 75 74 32 20 3d 20 72 62 75  .    nOut2 = rbu
58a0: 44 65 6c 74 61 41 70 70 6c 79 28 61 4f 72 69 67  DeltaApply(aOrig
58b0: 2c 20 6e 4f 72 69 67 2c 20 61 44 65 6c 74 61 2c  , nOrig, aDelta,
58c0: 20 6e 44 65 6c 74 61 2c 20 61 4f 75 74 29 3b 0a   nDelta, aOut);.
58d0: 20 20 20 20 69 66 28 20 6e 4f 75 74 32 21 3d 6e      if( nOut2!=n
58e0: 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Out ){.      sql
58f0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
5900: 72 28 63 6f 6e 74 65 78 74 2c 20 22 63 6f 72 72  r(context, "corr
5910: 75 70 74 20 66 6f 73 73 69 6c 20 64 65 6c 74 61  upt fossil delta
5920: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 65 6c 73  ", -1);.    }els
5930: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
5940: 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e  _result_blob(con
5950: 74 65 78 74 2c 20 61 4f 75 74 2c 20 6e 4f 75 74  text, aOut, nOut
5960: 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b  , sqlite3_free);
5970: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f  .    }.  }.}.../
5980: 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 74 68 65  *.** Prepare the
5990: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69   SQL statement i
59a0: 6e 20 62 75 66 66 65 72 20 7a 53 71 6c 20 61 67  n buffer zSql ag
59b0: 61 69 6e 73 74 20 64 61 74 61 62 61 73 65 20 68  ainst database h
59c0: 61 6e 64 6c 65 20 64 62 2e 0a 2a 2a 20 49 66 20  andle db..** If 
59d0: 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20  successful, set 
59e0: 2a 70 70 53 74 6d 74 20 74 6f 20 70 6f 69 6e 74  *ppStmt to point
59f0: 20 74 6f 20 74 68 65 20 6e 65 77 20 73 74 61 74   to the new stat
5a00: 65 6d 65 6e 74 20 61 6e 64 20 72 65 74 75 72 6e  ement and return
5a10: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a  .** SQLITE_OK. .
5a20: 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
5a30: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65   if an error doe
5a40: 73 20 6f 63 63 75 72 2c 20 73 65 74 20 2a 70 70  s occur, set *pp
5a50: 53 74 6d 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64  Stmt to NULL and
5a60: 20 72 65 74 75 72 6e 0a 2a 2a 20 61 6e 20 53 51   return.** an SQ
5a70: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
5a80: 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 73   Additionally, s
5a90: 65 74 20 6f 75 74 70 75 74 20 76 61 72 69 61 62  et output variab
5aa0: 6c 65 20 2a 70 7a 45 72 72 6d 73 67 20 74 6f 0a  le *pzErrmsg to.
5ab0: 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  ** point to a bu
5ac0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
5ad0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
5ae0: 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  . It is the resp
5af0: 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 6f 66  onsibility.** of
5b00: 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 28   the caller to (
5b10: 65 76 65 6e 74 75 61 6c 6c 79 29 20 66 72 65 65  eventually) free
5b20: 20 74 68 69 73 20 62 75 66 66 65 72 20 75 73 69   this buffer usi
5b30: 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  ng sqlite3_free(
5b40: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
5b50: 20 70 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65   prepareAndColle
5b60: 63 74 45 72 72 6f 72 28 0a 20 20 73 71 6c 69 74  ctError(.  sqlit
5b70: 65 33 20 2a 64 62 2c 20 0a 20 20 73 71 6c 69 74  e3 *db, .  sqlit
5b80: 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74  e3_stmt **ppStmt
5b90: 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72  ,.  char **pzErr
5ba0: 6d 73 67 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  msg,.  const cha
5bb0: 72 20 2a 7a 53 71 6c 0a 29 7b 0a 20 20 69 6e 74  r *zSql.){.  int
5bc0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
5bd0: 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71  epare_v2(db, zSq
5be0: 6c 2c 20 2d 31 2c 20 70 70 53 74 6d 74 2c 20 30  l, -1, ppStmt, 0
5bf0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
5c00: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
5c10: 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65  zErrmsg = sqlite
5c20: 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
5c30: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
5c40: 62 29 29 3b 0a 20 20 20 20 2a 70 70 53 74 6d 74  b));.    *ppStmt
5c50: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
5c60: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5c70: 52 65 73 65 74 20 74 68 65 20 53 51 4c 20 73 74  Reset the SQL st
5c80: 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61  atement passed a
5c90: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
5ca0: 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 61 20 63  ment. Return a c
5cb0: 6f 70 79 0a 2a 2a 20 6f 66 20 74 68 65 20 76 61  opy.** of the va
5cc0: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
5cd0: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 29 2e  sqlite3_reset().
5ce0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
5cf0: 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c  or has occurred,
5d00: 20 74 68 65 6e 20 73 65 74 20 2a 70 7a 45 72 72   then set *pzErr
5d10: 6d 73 67 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  msg to point to 
5d20: 61 20 62 75 66 66 65 72 0a 2a 2a 20 63 6f 6e 74  a buffer.** cont
5d30: 61 69 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20  aining an error 
5d40: 6d 65 73 73 61 67 65 2e 20 49 74 20 69 73 20 74  message. It is t
5d50: 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
5d60: 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 0a  y of the caller.
5d70: 2a 2a 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  ** to eventually
5d80: 20 66 72 65 65 20 74 68 69 73 20 62 75 66 66 65   free this buffe
5d90: 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f  r using sqlite3_
5da0: 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  free()..*/.stati
5db0: 63 20 69 6e 74 20 72 65 73 65 74 41 6e 64 43 6f  c int resetAndCo
5dc0: 6c 6c 65 63 74 45 72 72 6f 72 28 73 71 6c 69 74  llectError(sqlit
5dd0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 2c 20  e3_stmt *pStmt, 
5de0: 63 68 61 72 20 2a 2a 70 7a 45 72 72 6d 73 67 29  char **pzErrmsg)
5df0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  {.  int rc = sql
5e00: 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
5e10: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
5e20: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
5e30: 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65  zErrmsg = sqlite
5e40: 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
5e50: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 73  sqlite3_errmsg(s
5e60: 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c 65  qlite3_db_handle
5e70: 28 70 53 74 6d 74 29 29 29 3b 0a 20 20 7d 0a 20  (pStmt)));.  }. 
5e80: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
5e90: 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 69 74 20 69  *.** Unless it i
5ea0: 73 20 4e 55 4c 4c 2c 20 61 72 67 75 6d 65 6e 74  s NULL, argument
5eb0: 20 7a 53 71 6c 20 70 6f 69 6e 74 73 20 74 6f 20   zSql points to 
5ec0: 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74  a buffer allocat
5ed0: 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69  ed using.** sqli
5ee0: 74 65 33 5f 6d 61 6c 6c 6f 63 20 63 6f 6e 74 61  te3_malloc conta
5ef0: 69 6e 69 6e 67 20 61 6e 20 53 51 4c 20 73 74 61  ining an SQL sta
5f00: 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 66 75 6e  tement. This fun
5f10: 63 74 69 6f 6e 20 70 72 65 70 61 72 65 73 20 74  ction prepares t
5f20: 68 65 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d  he SQL.** statem
5f30: 65 6e 74 20 61 67 61 69 6e 73 74 20 64 61 74 61  ent against data
5f40: 62 61 73 65 20 64 62 20 61 6e 64 20 66 72 65 65  base db and free
5f50: 73 20 74 68 65 20 62 75 66 66 65 72 2e 20 49 66  s the buffer. If
5f60: 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a 20 63   statement .** c
5f70: 6f 6d 70 69 6c 61 74 69 6f 6e 20 69 73 20 73 75  ompilation is su
5f80: 63 63 65 73 73 66 75 6c 2c 20 2a 70 70 53 74 6d  ccessful, *ppStm
5f90: 74 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  t is set to poin
5fa0: 74 20 74 6f 20 74 68 65 20 6e 65 77 20 73 74 61  t to the new sta
5fb0: 74 65 6d 65 6e 74 20 0a 2a 2a 20 68 61 6e 64 6c  tement .** handl
5fc0: 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  e and SQLITE_OK 
5fd0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a  is returned. .**
5fe0: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
5ff0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
6000: 73 2c 20 2a 70 70 53 74 6d 74 20 69 73 20 73 65  s, *ppStmt is se
6010: 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 61 6e  t to NULL and an
6020: 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 72   error code.** r
6030: 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73  eturned. In this
6040: 20 63 61 73 65 2c 20 2a 70 7a 45 72 72 6d 73 67   case, *pzErrmsg
6050: 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 73 65 74   may also be set
6060: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20   to point to an 
6070: 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65  error.** message
6080: 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  . It is the resp
6090: 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
60a0: 65 20 63 61 6c 6c 65 72 20 74 6f 20 66 72 65 65  e caller to free
60b0: 20 74 68 69 73 20 65 72 72 6f 72 20 6d 65 73 73   this error mess
60c0: 61 67 65 0a 2a 2a 20 62 75 66 66 65 72 20 75 73  age.** buffer us
60d0: 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ing sqlite3_free
60e0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67  ()..**.** If arg
60f0: 75 6d 65 6e 74 20 7a 53 71 6c 20 69 73 20 4e 55  ument zSql is NU
6100: 4c 4c 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  LL, this functio
6110: 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 61  n assumes that a
6120: 6e 20 4f 4f 4d 20 68 61 73 20 6f 63 63 75 72 72  n OOM has occurr
6130: 65 64 2e 0a 2a 2a 20 49 6e 20 74 68 69 73 20 63  ed..** In this c
6140: 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ase SQLITE_NOMEM
6150: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
6160: 20 2a 70 70 53 74 6d 74 20 73 65 74 20 74 6f 20   *ppStmt set to 
6170: 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  NULL..*/.static 
6180: 69 6e 74 20 70 72 65 70 61 72 65 46 72 65 65 41  int prepareFreeA
6190: 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 0a  ndCollectError(.
61a0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a    sqlite3 *db, .
61b0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
61c0: 2a 70 70 53 74 6d 74 2c 0a 20 20 63 68 61 72 20  *ppStmt,.  char 
61d0: 2a 2a 70 7a 45 72 72 6d 73 67 2c 0a 20 20 63 68  **pzErrmsg,.  ch
61e0: 61 72 20 2a 7a 53 71 6c 0a 29 7b 0a 20 20 69 6e  ar *zSql.){.  in
61f0: 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
6200: 2a 70 7a 45 72 72 6d 73 67 3d 3d 30 20 29 3b 0a  *pzErrmsg==0 );.
6210: 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b    if( zSql==0 ){
6220: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
6230: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 2a 70 70 53  _NOMEM;.    *ppS
6240: 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  tmt = 0;.  }else
6250: 7b 0a 20 20 20 20 72 63 20 3d 20 70 72 65 70 61  {.    rc = prepa
6260: 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f  reAndCollectErro
6270: 72 28 64 62 2c 20 70 70 53 74 6d 74 2c 20 70 7a  r(db, ppStmt, pz
6280: 45 72 72 6d 73 67 2c 20 7a 53 71 6c 29 3b 0a 20  Errmsg, zSql);. 
6290: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
62a0: 7a 53 71 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 74  zSql);.  }.  ret
62b0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
62c0: 20 46 72 65 65 20 74 68 65 20 52 62 75 4f 62 6a   Free the RbuObj
62d0: 49 74 65 72 2e 61 7a 54 62 6c 43 6f 6c 5b 5d 20  Iter.azTblCol[] 
62e0: 61 6e 64 20 52 62 75 4f 62 6a 49 74 65 72 2e 61  and RbuObjIter.a
62f0: 62 54 62 6c 50 6b 5b 5d 20 61 72 72 61 79 73 20  bTblPk[] arrays 
6300: 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20  allocated.** by 
6310: 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20  an earlier call 
6320: 74 6f 20 72 62 75 4f 62 6a 49 74 65 72 43 61 63  to rbuObjIterCac
6330: 68 65 54 61 62 6c 65 49 6e 66 6f 28 29 2e 0a 2a  heTableInfo()..*
6340: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62  /.static void rb
6350: 75 4f 62 6a 49 74 65 72 46 72 65 65 43 6f 6c 73  uObjIterFreeCols
6360: 28 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74  (RbuObjIter *pIt
6370: 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  er){.  int i;.  
6380: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72  for(i=0; i<pIter
6390: 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69 2b 2b 29 7b  ->nTblCol; i++){
63a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
63b0: 65 28 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f  e(pIter->azTblCo
63c0: 6c 5b 69 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74  l[i]);.    sqlit
63d0: 65 33 5f 66 72 65 65 28 70 49 74 65 72 2d 3e 61  e3_free(pIter->a
63e0: 7a 54 62 6c 54 79 70 65 5b 69 5d 29 3b 0a 20 20  zTblType[i]);.  
63f0: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
6400: 28 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c  (pIter->azTblCol
6410: 29 3b 0a 20 20 70 49 74 65 72 2d 3e 61 7a 54 62  );.  pIter->azTb
6420: 6c 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 49 74 65  lCol = 0;.  pIte
6430: 72 2d 3e 61 7a 54 62 6c 54 79 70 65 20 3d 20 30  r->azTblType = 0
6440: 3b 0a 20 20 70 49 74 65 72 2d 3e 61 69 53 72 63  ;.  pIter->aiSrc
6450: 4f 72 64 65 72 20 3d 20 30 3b 0a 20 20 70 49 74  Order = 0;.  pIt
6460: 65 72 2d 3e 61 62 54 62 6c 50 6b 20 3d 20 30 3b  er->abTblPk = 0;
6470: 0a 20 20 70 49 74 65 72 2d 3e 61 62 4e 6f 74 4e  .  pIter->abNotN
6480: 75 6c 6c 20 3d 20 30 3b 0a 20 20 70 49 74 65 72  ull = 0;.  pIter
6490: 2d 3e 6e 54 62 6c 43 6f 6c 20 3d 20 30 3b 0a 20  ->nTblCol = 0;. 
64a0: 20 70 49 74 65 72 2d 3e 65 54 79 70 65 20 3d 20   pIter->eType = 
64b0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
64c0: 20 2f 2a 20 49 6e 76 61 6c 69 64 20 76 61 6c 75   /* Invalid valu
64d0: 65 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  e */.}../*.** Fi
64e0: 6e 61 6c 69 7a 65 20 61 6c 6c 20 73 74 61 74 65  nalize all state
64f0: 6d 65 6e 74 73 20 61 6e 64 20 66 72 65 65 20 61  ments and free a
6500: 6c 6c 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 74  ll allocations t
6510: 68 61 74 20 61 72 65 20 73 70 65 63 69 66 69 63  hat are specific
6520: 20 74 6f 0a 2a 2a 20 74 68 65 20 63 75 72 72 65   to.** the curre
6530: 6e 74 20 6f 62 6a 65 63 74 20 28 74 61 62 6c 65  nt object (table
6540: 2f 69 6e 64 65 78 20 70 61 69 72 29 2e 0a 2a 2f  /index pair)..*/
6550: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
6560: 4f 62 6a 49 74 65 72 43 6c 65 61 72 53 74 61 74  ObjIterClearStat
6570: 65 6d 65 6e 74 73 28 52 62 75 4f 62 6a 49 74 65  ements(RbuObjIte
6580: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 52 62 75  r *pIter){.  Rbu
6590: 55 70 64 61 74 65 53 74 6d 74 20 2a 70 55 70 3b  UpdateStmt *pUp;
65a0: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  ..  sqlite3_fina
65b0: 6c 69 7a 65 28 70 49 74 65 72 2d 3e 70 53 65 6c  lize(pIter->pSel
65c0: 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ect);.  sqlite3_
65d0: 66 69 6e 61 6c 69 7a 65 28 70 49 74 65 72 2d 3e  finalize(pIter->
65e0: 70 49 6e 73 65 72 74 29 3b 0a 20 20 73 71 6c 69  pInsert);.  sqli
65f0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 49 74  te3_finalize(pIt
6600: 65 72 2d 3e 70 44 65 6c 65 74 65 29 3b 0a 20 20  er->pDelete);.  
6610: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
6620: 28 70 49 74 65 72 2d 3e 70 54 6d 70 49 6e 73 65  (pIter->pTmpInse
6630: 72 74 29 3b 0a 20 20 70 55 70 20 3d 20 70 49 74  rt);.  pUp = pIt
6640: 65 72 2d 3e 70 52 62 75 55 70 64 61 74 65 3b 0a  er->pRbuUpdate;.
6650: 20 20 77 68 69 6c 65 28 20 70 55 70 20 29 7b 0a    while( pUp ){.
6660: 20 20 20 20 52 62 75 55 70 64 61 74 65 53 74 6d      RbuUpdateStm
6670: 74 20 2a 70 54 6d 70 20 3d 20 70 55 70 2d 3e 70  t *pTmp = pUp->p
6680: 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  Next;.    sqlite
6690: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 55 70 2d 3e  3_finalize(pUp->
66a0: 70 55 70 64 61 74 65 29 3b 0a 20 20 20 20 73 71  pUpdate);.    sq
66b0: 6c 69 74 65 33 5f 66 72 65 65 28 70 55 70 29 3b  lite3_free(pUp);
66c0: 0a 20 20 20 20 70 55 70 20 3d 20 70 54 6d 70 3b  .    pUp = pTmp;
66d0: 0a 20 20 7d 0a 20 20 0a 20 20 70 49 74 65 72 2d  .  }.  .  pIter-
66e0: 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20  >pSelect = 0;.  
66f0: 70 49 74 65 72 2d 3e 70 49 6e 73 65 72 74 20 3d  pIter->pInsert =
6700: 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e 70 44 65   0;.  pIter->pDe
6710: 6c 65 74 65 20 3d 20 30 3b 0a 20 20 70 49 74 65  lete = 0;.  pIte
6720: 72 2d 3e 70 52 62 75 55 70 64 61 74 65 20 3d 20  r->pRbuUpdate = 
6730: 30 3b 0a 20 20 70 49 74 65 72 2d 3e 70 54 6d 70  0;.  pIter->pTmp
6740: 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20 20 70 49  Insert = 0;.  pI
6750: 74 65 72 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d  ter->nCol = 0;.}
6760: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70  ../*.** Clean up
6770: 20 61 6e 79 20 72 65 73 6f 75 72 63 65 73 20 61   any resources a
6780: 6c 6c 6f 63 61 74 65 64 20 61 73 20 70 61 72 74  llocated as part
6790: 20 6f 66 20 74 68 65 20 69 74 65 72 61 74 6f 72   of the iterator
67a0: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 0a 2a   object passed.*
67b0: 2a 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  * as the only ar
67c0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
67d0: 63 20 76 6f 69 64 20 72 62 75 4f 62 6a 49 74 65  c void rbuObjIte
67e0: 72 46 69 6e 61 6c 69 7a 65 28 52 62 75 4f 62 6a  rFinalize(RbuObj
67f0: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
6800: 72 62 75 4f 62 6a 49 74 65 72 43 6c 65 61 72 53  rbuObjIterClearS
6810: 74 61 74 65 6d 65 6e 74 73 28 70 49 74 65 72 29  tatements(pIter)
6820: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  ;.  sqlite3_fina
6830: 6c 69 7a 65 28 70 49 74 65 72 2d 3e 70 54 62 6c  lize(pIter->pTbl
6840: 49 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Iter);.  sqlite3
6850: 5f 66 69 6e 61 6c 69 7a 65 28 70 49 74 65 72 2d  _finalize(pIter-
6860: 3e 70 49 64 78 49 74 65 72 29 3b 0a 20 20 72 62  >pIdxIter);.  rb
6870: 75 4f 62 6a 49 74 65 72 46 72 65 65 43 6f 6c 73  uObjIterFreeCols
6880: 28 70 49 74 65 72 29 3b 0a 20 20 6d 65 6d 73 65  (pIter);.  memse
6890: 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65  t(pIter, 0, size
68a0: 6f 66 28 52 62 75 4f 62 6a 49 74 65 72 29 29 3b  of(RbuObjIter));
68b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
68c0: 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 74  e the iterator t
68d0: 6f 20 74 68 65 20 6e 65 78 74 20 70 6f 73 69 74  o the next posit
68e0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  ion..**.** If no
68f0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53   error occurs, S
6900: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
6910: 72 6e 65 64 20 61 6e 64 20 74 68 65 20 69 74 65  rned and the ite
6920: 72 61 74 6f 72 20 69 73 20 6c 65 66 74 20 0a 2a  rator is left .*
6930: 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  * pointing to th
6940: 65 20 6e 65 78 74 20 65 6e 74 72 79 2e 20 4f 74  e next entry. Ot
6950: 68 65 72 77 69 73 65 2c 20 61 6e 20 65 72 72 6f  herwise, an erro
6960: 72 20 63 6f 64 65 20 61 6e 64 20 6d 65 73 73 61  r code and messa
6970: 67 65 20 69 73 20 0a 2a 2a 20 6c 65 66 74 20 69  ge is .** left i
6980: 6e 20 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65  n the RBU handle
6990: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
69a0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 41  irst argument. A
69b0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 0a 2a 2a   copy of the .**
69c0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
69d0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
69e0: 69 63 20 69 6e 74 20 72 62 75 4f 62 6a 49 74 65  ic int rbuObjIte
69f0: 72 4e 65 78 74 28 73 71 6c 69 74 65 33 72 62 75  rNext(sqlite3rbu
6a00: 20 2a 70 2c 20 52 62 75 4f 62 6a 49 74 65 72 20   *p, RbuObjIter 
6a10: 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  *pIter){.  int r
6a20: 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28  c = p->rc;.  if(
6a30: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
6a40: 7b 0a 0a 20 20 20 20 2f 2a 20 46 72 65 65 20 61  {..    /* Free a
6a50: 6e 79 20 53 51 4c 69 74 65 20 73 74 61 74 65 6d  ny SQLite statem
6a60: 65 6e 74 73 20 75 73 65 64 20 77 68 69 6c 65 20  ents used while 
6a70: 70 72 6f 63 65 73 73 69 6e 67 20 74 68 65 20 70  processing the p
6a80: 72 65 76 69 6f 75 73 20 6f 62 6a 65 63 74 20 2a  revious object *
6a90: 2f 20 0a 20 20 20 20 72 62 75 4f 62 6a 49 74 65  / .    rbuObjIte
6aa0: 72 43 6c 65 61 72 53 74 61 74 65 6d 65 6e 74 73  rClearStatements
6ab0: 28 70 49 74 65 72 29 3b 0a 20 20 20 20 69 66 28  (pIter);.    if(
6ac0: 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d 30 20   pIter->zIdx==0 
6ad0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
6ae0: 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
6af0: 4d 61 69 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  Main,.          
6b00: 22 44 52 4f 50 20 54 52 49 47 47 45 52 20 49 46  "DROP TRIGGER IF
6b10: 20 45 58 49 53 54 53 20 74 65 6d 70 2e 72 62 75   EXISTS temp.rbu
6b20: 5f 69 6e 73 65 72 74 5f 74 72 3b 22 0a 20 20 20  _insert_tr;".   
6b30: 20 20 20 20 20 20 20 22 44 52 4f 50 20 54 52 49         "DROP TRI
6b40: 47 47 45 52 20 49 46 20 45 58 49 53 54 53 20 74  GGER IF EXISTS t
6b50: 65 6d 70 2e 72 62 75 5f 75 70 64 61 74 65 31 5f  emp.rbu_update1_
6b60: 74 72 3b 22 0a 20 20 20 20 20 20 20 20 20 20 22  tr;".          "
6b70: 44 52 4f 50 20 54 52 49 47 47 45 52 20 49 46 20  DROP TRIGGER IF 
6b80: 45 58 49 53 54 53 20 74 65 6d 70 2e 72 62 75 5f  EXISTS temp.rbu_
6b90: 75 70 64 61 74 65 32 5f 74 72 3b 22 0a 20 20 20  update2_tr;".   
6ba0: 20 20 20 20 20 20 20 22 44 52 4f 50 20 54 52 49         "DROP TRI
6bb0: 47 47 45 52 20 49 46 20 45 58 49 53 54 53 20 74  GGER IF EXISTS t
6bc0: 65 6d 70 2e 72 62 75 5f 64 65 6c 65 74 65 5f 74  emp.rbu_delete_t
6bd0: 72 3b 22 0a 20 20 20 20 20 20 20 20 20 20 2c 20  r;".          , 
6be0: 30 2c 20 30 2c 20 26 70 2d 3e 7a 45 72 72 6d 73  0, 0, &p->zErrms
6bf0: 67 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  g.      );.    }
6c00: 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
6c10: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
6c20: 20 69 66 28 20 70 49 74 65 72 2d 3e 62 43 6c 65   if( pIter->bCle
6c30: 61 6e 75 70 20 29 7b 0a 20 20 20 20 20 20 20 20  anup ){.        
6c40: 72 62 75 4f 62 6a 49 74 65 72 46 72 65 65 43 6f  rbuObjIterFreeCo
6c50: 6c 73 28 70 49 74 65 72 29 3b 0a 20 20 20 20 20  ls(pIter);.     
6c60: 20 20 20 70 49 74 65 72 2d 3e 62 43 6c 65 61 6e     pIter->bClean
6c70: 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  up = 0;.        
6c80: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
6c90: 70 28 70 49 74 65 72 2d 3e 70 54 62 6c 49 74 65  p(pIter->pTblIte
6ca0: 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
6cb0: 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  rc!=SQLITE_ROW )
6cc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
6cd0: 20 72 65 73 65 74 41 6e 64 43 6f 6c 6c 65 63 74   resetAndCollect
6ce0: 45 72 72 6f 72 28 70 49 74 65 72 2d 3e 70 54 62  Error(pIter->pTb
6cf0: 6c 49 74 65 72 2c 20 26 70 2d 3e 7a 45 72 72 6d  lIter, &p->zErrm
6d00: 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  sg);.          p
6d10: 49 74 65 72 2d 3e 7a 54 62 6c 20 3d 20 30 3b 0a  Iter->zTbl = 0;.
6d20: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
6d30: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
6d40: 7a 54 62 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68  zTbl = (const ch
6d50: 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
6d60: 6d 6e 5f 74 65 78 74 28 70 49 74 65 72 2d 3e 70  mn_text(pIter->p
6d70: 54 62 6c 49 74 65 72 2c 20 30 29 3b 0a 20 20 20  TblIter, 0);.   
6d80: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 7a 44         pIter->zD
6d90: 61 74 61 54 62 6c 20 3d 20 28 63 6f 6e 73 74 20  ataTbl = (const 
6da0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
6db0: 6c 75 6d 6e 5f 74 65 78 74 28 70 49 74 65 72 2d  lumn_text(pIter-
6dc0: 3e 70 54 62 6c 49 74 65 72 2c 31 29 3b 0a 20 20  >pTblIter,1);.  
6dd0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 28 70 49          rc = (pI
6de0: 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 20 26 26  ter->zDataTbl &&
6df0: 20 70 49 74 65 72 2d 3e 7a 54 62 6c 29 20 3f 20   pIter->zTbl) ? 
6e00: 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49  SQLITE_OK : SQLI
6e10: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
6e20: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
6e30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74  .        if( pIt
6e40: 65 72 2d 3e 7a 49 64 78 3d 3d 30 20 29 7b 0a 20  er->zIdx==0 ){. 
6e50: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
6e60: 5f 73 74 6d 74 20 2a 70 49 64 78 20 3d 20 70 49  _stmt *pIdx = pI
6e70: 74 65 72 2d 3e 70 49 64 78 49 74 65 72 3b 0a 20  ter->pIdxIter;. 
6e80: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
6e90: 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
6ea0: 70 49 64 78 2c 20 31 2c 20 70 49 74 65 72 2d 3e  pIdx, 1, pIter->
6eb0: 7a 54 62 6c 2c 20 2d 31 2c 20 53 51 4c 49 54 45  zTbl, -1, SQLITE
6ec0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
6ed0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
6ee0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
6ef0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
6f00: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 49 74  sqlite3_step(pIt
6f10: 65 72 2d 3e 70 49 64 78 49 74 65 72 29 3b 0a 20  er->pIdxIter);. 
6f20: 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
6f30: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
6f40: 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
6f50: 72 65 73 65 74 41 6e 64 43 6f 6c 6c 65 63 74 45  resetAndCollectE
6f60: 72 72 6f 72 28 70 49 74 65 72 2d 3e 70 49 64 78  rror(pIter->pIdx
6f70: 49 74 65 72 2c 20 26 70 2d 3e 7a 45 72 72 6d 73  Iter, &p->zErrms
6f80: 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  g);.            
6f90: 70 49 74 65 72 2d 3e 62 43 6c 65 61 6e 75 70 20  pIter->bCleanup 
6fa0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
6fb0: 20 70 49 74 65 72 2d 3e 7a 49 64 78 20 3d 20 30   pIter->zIdx = 0
6fc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
6fd0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
6fe0: 49 74 65 72 2d 3e 7a 49 64 78 20 3d 20 28 63 6f  Iter->zIdx = (co
6ff0: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
7000: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 49  3_column_text(pI
7010: 74 65 72 2d 3e 70 49 64 78 49 74 65 72 2c 20 30  ter->pIdxIter, 0
7020: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
7030: 49 74 65 72 2d 3e 69 54 6e 75 6d 20 3d 20 73 71  Iter->iTnum = sq
7040: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
7050: 28 70 49 74 65 72 2d 3e 70 49 64 78 49 74 65 72  (pIter->pIdxIter
7060: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
7070: 20 20 70 49 74 65 72 2d 3e 62 55 6e 69 71 75 65    pIter->bUnique
7080: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
7090: 6e 5f 69 6e 74 28 70 49 74 65 72 2d 3e 70 49 64  n_int(pIter->pId
70a0: 78 49 74 65 72 2c 20 32 29 3b 0a 20 20 20 20 20  xIter, 2);.     
70b0: 20 20 20 20 20 20 20 72 63 20 3d 20 70 49 74 65         rc = pIte
70c0: 72 2d 3e 7a 49 64 78 20 3f 20 53 51 4c 49 54 45  r->zIdx ? SQLITE
70d0: 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d  _OK : SQLITE_NOM
70e0: 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  EM;.          }.
70f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7100: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
7110: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
7120: 20 29 7b 0a 20 20 20 20 72 62 75 4f 62 6a 49 74   ){.    rbuObjIt
7130: 65 72 46 69 6e 61 6c 69 7a 65 28 70 49 74 65 72  erFinalize(pIter
7140: 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 72  );.    p->rc = r
7150: 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  c;.  }.  return 
7160: 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
7170: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
7180: 20 6f 66 20 74 68 65 20 72 62 75 5f 74 61 72 67   of the rbu_targ
7190: 65 74 5f 6e 61 6d 65 28 29 20 53 51 4c 20 66 75  et_name() SQL fu
71a0: 6e 63 74 69 6f 6e 2e 20 54 68 69 73 20 66 75 6e  nction. This fun
71b0: 63 74 69 6f 6e 0a 2a 2a 20 61 63 63 65 70 74 73  ction.** accepts
71c0: 20 6f 6e 65 20 61 72 67 75 6d 65 6e 74 20 2d 20   one argument - 
71d0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 61  the name of a ta
71e0: 62 6c 65 20 69 6e 20 74 68 65 20 52 42 55 20 64  ble in the RBU d
71f0: 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a  atabase. If the.
7200: 2a 2a 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d 61  ** table name ma
7210: 74 63 68 65 73 20 74 68 65 20 70 61 74 74 65 72  tches the patter
7220: 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 61 74  n:.**.**     dat
7230: 61 5b 30 2d 39 5d 5f 3c 6e 61 6d 65 3e 0a 2a 2a  a[0-9]_<name>.**
7240: 0a 2a 2a 20 77 68 65 72 65 20 3c 6e 61 6d 65 3e  .** where <name>
7250: 20 69 73 20 61 6e 79 20 73 65 71 75 65 6e 63 65   is any sequence
7260: 20 6f 66 20 31 20 6f 72 20 6d 6f 72 65 20 63 68   of 1 or more ch
7270: 61 72 61 63 74 65 72 73 2c 20 3c 6e 61 6d 65 3e  aracters, <name>
7280: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
7290: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
72a0: 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
72b0: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
72c0: 74 68 65 20 61 62 6f 76 65 20 70 61 74 74 65 72  the above patter
72d0: 6e 2c 20 61 6e 20 53 51 4c 0a 2a 2a 20 4e 55 4c  n, an SQL.** NUL
72e0: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  L is returned..*
72f0: 2a 0a 2a 2a 20 20 20 20 20 22 64 61 74 61 5f 74  *.**     "data_t
7300: 31 22 20 20 20 20 20 2d 3e 20 22 74 31 22 0a 2a  1"     -> "t1".*
7310: 2a 20 20 20 20 20 22 64 61 74 61 30 31 32 33 5f  *     "data0123_
7320: 74 32 22 20 2d 3e 20 22 74 32 22 0a 2a 2a 20 20  t2" -> "t2".**  
7330: 20 20 20 22 64 61 74 61 41 42 5f 74 33 22 20 20     "dataAB_t3"  
7340: 20 2d 3e 20 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74   -> NULL.*/.stat
7350: 69 63 20 76 6f 69 64 20 72 62 75 54 61 72 67 65  ic void rbuTarge
7360: 74 4e 61 6d 65 46 75 6e 63 28 0a 20 20 73 71 6c  tNameFunc(.  sql
7370: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
7380: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
7390: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
73a0: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63  ue **argv.){.  c
73b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 3b 0a  onst char *zIn;.
73c0: 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d    assert( argc==
73d0: 31 20 29 3b 0a 0a 20 20 7a 49 6e 20 3d 20 28 63  1 );..  zIn = (c
73e0: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
73f0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
7400: 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 7a 49  gv[0]);.  if( zI
7410: 6e 20 26 26 20 73 74 72 6c 65 6e 28 7a 49 6e 29  n && strlen(zIn)
7420: 3e 34 20 26 26 20 6d 65 6d 63 6d 70 28 22 64 61  >4 && memcmp("da
7430: 74 61 22 2c 20 7a 49 6e 2c 20 34 29 3d 3d 30 20  ta", zIn, 4)==0 
7440: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
7450: 20 20 66 6f 72 28 69 3d 34 3b 20 7a 49 6e 5b 69    for(i=4; zIn[i
7460: 5d 3e 3d 27 30 27 20 26 26 20 7a 49 6e 5b 69 5d  ]>='0' && zIn[i]
7470: 3c 3d 27 39 27 3b 20 69 2b 2b 29 3b 0a 20 20 20  <='9'; i++);.   
7480: 20 69 66 28 20 7a 49 6e 5b 69 5d 3d 3d 27 5f 27   if( zIn[i]=='_'
7490: 20 26 26 20 7a 49 6e 5b 69 2b 31 5d 20 29 7b 0a   && zIn[i+1] ){.
74a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
74b0: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
74c0: 74 2c 20 26 7a 49 6e 5b 69 2b 31 5d 2c 20 2d 31  t, &zIn[i+1], -1
74d0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
74e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
74f0: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
7500: 74 68 65 20 69 74 65 72 61 74 6f 72 20 73 74 72  the iterator str
7510: 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73  ucture passed as
7520: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
7530: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  ment..**.** If n
7540: 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
7550: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
7560: 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 69 74  urned and the it
7570: 65 72 61 74 6f 72 20 69 73 20 6c 65 66 74 20 0a  erator is left .
7580: 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ** pointing to t
7590: 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20  he first entry. 
75a0: 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 65 72  Otherwise, an er
75b0: 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 6d 65 73  ror code and mes
75c0: 73 61 67 65 20 69 73 20 0a 2a 2a 20 6c 65 66 74  sage is .** left
75d0: 20 69 6e 20 74 68 65 20 52 42 55 20 68 61 6e 64   in the RBU hand
75e0: 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  le passed as the
75f0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
7600: 20 41 20 63 6f 70 79 20 6f 66 20 74 68 65 20 0a   A copy of the .
7610: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
7620: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
7630: 61 74 69 63 20 69 6e 74 20 72 62 75 4f 62 6a 49  atic int rbuObjI
7640: 74 65 72 46 69 72 73 74 28 73 71 6c 69 74 65 33  terFirst(sqlite3
7650: 72 62 75 20 2a 70 2c 20 52 62 75 4f 62 6a 49 74  rbu *p, RbuObjIt
7660: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e  er *pIter){.  in
7670: 74 20 72 63 3b 0a 20 20 6d 65 6d 73 65 74 28 70  t rc;.  memset(p
7680: 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
7690: 52 62 75 4f 62 6a 49 74 65 72 29 29 3b 0a 0a 20  RbuObjIter));.. 
76a0: 20 72 63 20 3d 20 70 72 65 70 61 72 65 41 6e 64   rc = prepareAnd
76b0: 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e  CollectError(p->
76c0: 64 62 52 62 75 2c 20 26 70 49 74 65 72 2d 3e 70  dbRbu, &pIter->p
76d0: 54 62 6c 49 74 65 72 2c 20 26 70 2d 3e 7a 45 72  TblIter, &p->zEr
76e0: 72 6d 73 67 2c 20 0a 20 20 20 20 20 20 22 53 45  rmsg, .      "SE
76f0: 4c 45 43 54 20 72 62 75 5f 74 61 72 67 65 74 5f  LECT rbu_target_
7700: 6e 61 6d 65 28 6e 61 6d 65 29 20 41 53 20 74 61  name(name) AS ta
7710: 72 67 65 74 2c 20 6e 61 6d 65 20 46 52 4f 4d 20  rget, name FROM 
7720: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a  sqlite_master ".
7730: 20 20 20 20 20 20 22 57 48 45 52 45 20 74 79 70        "WHERE typ
7740: 65 20 49 4e 20 28 27 74 61 62 6c 65 27 2c 20 27  e IN ('table', '
7750: 76 69 65 77 27 29 20 41 4e 44 20 74 61 72 67 65  view') AND targe
7760: 74 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 22 0a  t IS NOT NULL ".
7770: 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20        "ORDER BY 
7780: 6e 61 6d 65 22 0a 20 20 29 3b 0a 0a 20 20 69 66  name".  );..  if
7790: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
77a0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 72 65 70  ){.    rc = prep
77b0: 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  areAndCollectErr
77c0: 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70  or(p->dbMain, &p
77d0: 49 74 65 72 2d 3e 70 49 64 78 49 74 65 72 2c 20  Iter->pIdxIter, 
77e0: 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20  &p->zErrmsg,.   
77f0: 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d       "SELECT nam
7800: 65 2c 20 72 6f 6f 74 70 61 67 65 2c 20 73 71 6c  e, rootpage, sql
7810: 20 49 53 20 4e 55 4c 4c 20 4f 52 20 73 75 62 73   IS NULL OR subs
7820: 74 72 28 38 2c 20 36 29 3d 3d 27 55 4e 49 51 55  tr(8, 6)=='UNIQU
7830: 45 27 20 22 0a 20 20 20 20 20 20 20 20 22 20 20  E' ".        "  
7840: 46 52 4f 4d 20 6d 61 69 6e 2e 73 71 6c 69 74 65  FROM main.sqlite
7850: 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20  _master ".      
7860: 20 20 22 20 20 57 48 45 52 45 20 74 79 70 65 3d    "  WHERE type=
7870: 27 69 6e 64 65 78 27 20 41 4e 44 20 74 62 6c 5f  'index' AND tbl_
7880: 6e 61 6d 65 20 3d 20 3f 22 0a 20 20 20 20 29 3b  name = ?".    );
7890: 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e 62  .  }..  pIter->b
78a0: 43 6c 65 61 6e 75 70 20 3d 20 31 3b 0a 20 20 70  Cleanup = 1;.  p
78b0: 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 72 65 74  ->rc = rc;.  ret
78c0: 75 72 6e 20 72 62 75 4f 62 6a 49 74 65 72 4e 65  urn rbuObjIterNe
78d0: 78 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a  xt(p, pIter);.}.
78e0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
78f0: 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   wrapper around 
7900: 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66  "sqlite3_mprintf
7910: 28 7a 46 6d 74 2c 20 2e 2e 2e 29 22 2e 20 49 66  (zFmt, ...)". If
7920: 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 0a   an OOM occurs,.
7930: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ** an error code
7940: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68   is stored in th
7950: 65 20 52 42 55 20 68 61 6e 64 6c 65 20 70 61 73  e RBU handle pas
7960: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
7970: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
7980: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
7990: 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
79a0: 64 20 28 70 2d 3e 72 63 20 69 73 20 61 6c 72 65  d (p->rc is alre
79b0: 61 64 79 20 73 65 74 20 74 6f 20 73 6f 6d 65 74  ady set to somet
79c0: 68 69 6e 67 20 6f 74 68 65 72 0a 2a 2a 20 74 68  hing other.** th
79d0: 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 29 2c 20 74  an SQLITE_OK), t
79e0: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
79f0: 6e 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 77  n returns NULL w
7a00: 69 74 68 6f 75 74 20 6d 6f 64 69 66 79 69 6e 67  ithout modifying
7a10: 20 74 68 65 0a 2a 2a 20 73 74 6f 72 65 64 20 65   the.** stored e
7a20: 72 72 6f 72 20 63 6f 64 65 2e 20 49 6e 20 74 68  rror code. In th
7a30: 69 73 20 63 61 73 65 20 69 74 20 73 74 69 6c 6c  is case it still
7a40: 20 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f 66   calls sqlite3_f
7a50: 72 65 65 28 29 20 6f 6e 20 61 6e 79 20 0a 2a 2a  ree() on any .**
7a60: 20 70 72 69 6e 74 66 28 29 20 70 61 72 61 6d 65   printf() parame
7a70: 74 65 72 73 20 61 73 73 6f 63 69 61 74 65 64 20  ters associated 
7a80: 77 69 74 68 20 25 7a 20 63 6f 6e 76 65 72 73 69  with %z conversi
7a90: 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ons..*/.static c
7aa0: 68 61 72 20 2a 72 62 75 4d 50 72 69 6e 74 66 28  har *rbuMPrintf(
7ab0: 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 63  sqlite3rbu *p, c
7ac0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c  onst char *zFmt,
7ad0: 20 2e 2e 2e 29 7b 0a 20 20 63 68 61 72 20 2a 7a   ...){.  char *z
7ae0: 53 71 6c 20 3d 20 30 3b 0a 20 20 76 61 5f 6c 69  Sql = 0;.  va_li
7af0: 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72  st ap;.  va_star
7b00: 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 7a  t(ap, zFmt);.  z
7b10: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d  Sql = sqlite3_vm
7b20: 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29  printf(zFmt, ap)
7b30: 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
7b40: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7b50: 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 70 2d  if( zSql==0 ) p-
7b60: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
7b70: 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  EM;.  }else{.   
7b80: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
7b90: 71 6c 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20  ql);.    zSql = 
7ba0: 30 3b 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28  0;.  }.  va_end(
7bb0: 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53  ap);.  return zS
7bc0: 71 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67  ql;.}../*.** Arg
7bd0: 75 6d 65 6e 74 20 7a 46 6d 74 20 69 73 20 61 20  ument zFmt is a 
7be0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
7bf0: 29 20 73 74 79 6c 65 20 66 6f 72 6d 61 74 20 73  ) style format s
7c00: 74 72 69 6e 67 2e 20 54 68 65 20 74 72 61 69 6c  tring. The trail
7c10: 69 6e 67 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73  ing.** arguments
7c20: 20 61 72 65 20 74 68 65 20 75 73 75 61 6c 20 73   are the usual s
7c30: 75 62 73 69 74 75 74 69 6f 6e 20 76 61 6c 75 65  ubsitution value
7c40: 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  s. This function
7c50: 20 70 65 72 66 6f 72 6d 73 0a 2a 2a 20 74 68 65   performs.** the
7c60: 20 70 72 69 6e 74 66 28 29 20 73 74 79 6c 65 20   printf() style 
7c70: 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 61 6e  substitutions an
7c80: 64 20 65 78 65 63 75 74 65 73 20 74 68 65 20 72  d executes the r
7c90: 65 73 75 6c 74 20 61 73 20 61 6e 20 53 51 4c 0a  esult as an SQL.
7ca0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20  ** statement on 
7cb0: 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65 73 20  the RBU handles 
7cc0: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
7cd0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
7ce0: 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  rs, an error cod
7cf0: 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73  e and error mess
7d00: 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  age is stored in
7d10: 20 74 68 65 0a 2a 2a 20 52 42 55 20 68 61 6e 64   the.** RBU hand
7d20: 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  le. If an error 
7d30: 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75  has already occu
7d40: 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66  rred when this f
7d50: 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61  unction is.** ca
7d60: 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
7d70: 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
7d80: 6e 74 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65  nt rbuMPrintfExe
7d90: 63 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c  c(sqlite3rbu *p,
7da0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f   sqlite3 *db, co
7db0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20  nst char *zFmt, 
7dc0: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
7dd0: 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  ap;.  char *zSql
7de0: 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
7df0: 20 7a 46 6d 74 29 3b 0a 20 20 7a 53 71 6c 20 3d   zFmt);.  zSql =
7e00: 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74   sqlite3_vmprint
7e10: 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20 69  f(zFmt, ap);.  i
7e20: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
7e30: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 7a  _OK ){.    if( z
7e40: 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Sql==0 ){.      
7e50: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
7e60: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
7e70: 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  .      p->rc = s
7e80: 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20  qlite3_exec(db, 
7e90: 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 70 2d 3e  zSql, 0, 0, &p->
7ea0: 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 7d 0a  zErrmsg);.    }.
7eb0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
7ec0: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 76 61 5f 65  ee(zSql);.  va_e
7ed0: 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e  nd(ap);.  return
7ee0: 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   p->rc;.}../*.**
7ef0: 20 41 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f   Attempt to allo
7f00: 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  cate and return 
7f10: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 7a  a pointer to a z
7f20: 65 72 6f 65 64 20 62 6c 6f 63 6b 20 6f 66 20 6e  eroed block of n
7f30: 42 79 74 65 20 0a 2a 2a 20 62 79 74 65 73 2e 20  Byte .** bytes. 
7f40: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
7f50: 6f 72 20 28 69 2e 65 2e 20 61 6e 20 4f 4f 4d 20  or (i.e. an OOM 
7f60: 63 6f 6e 64 69 74 69 6f 6e 29 20 6f 63 63 75 72  condition) occur
7f70: 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61  s, return NULL a
7f80: 6e 64 20 6c 65 61 76 65 20 61 6e 20 0a 2a 2a 20  nd leave an .** 
7f90: 65 72 72 6f 72 20 63 6f 64 65 20 69 6e 20 74 68  error code in th
7fa0: 65 20 72 62 75 20 68 61 6e 64 6c 65 20 70 61 73  e rbu handle pas
7fb0: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
7fc0: 20 61 72 67 75 6d 65 6e 74 2e 20 4f 72 2c 20 69   argument. Or, i
7fd0: 66 20 61 6e 20 0a 2a 2a 20 65 72 72 6f 72 20 68  f an .** error h
7fe0: 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
7ff0: 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  red when this fu
8000: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
8010: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 0a 2a  , return NULL .*
8020: 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 77 69  * immediately wi
8030: 74 68 6f 75 74 20 61 74 74 65 6d 70 74 69 6e 67  thout attempting
8040: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
8050: 6f 72 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65  or modifying the
8060: 20 73 74 6f 72 65 64 0a 2a 2a 20 65 72 72 6f 72   stored.** error
8070: 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
8080: 20 76 6f 69 64 20 2a 72 62 75 4d 61 6c 6c 6f 63   void *rbuMalloc
8090: 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20  (sqlite3rbu *p, 
80a0: 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 76 6f  int nByte){.  vo
80b0: 69 64 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20  id *pRet = 0;.  
80c0: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
80d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
80e0: 72 74 28 20 6e 42 79 74 65 3e 30 20 29 3b 0a 20  rt( nByte>0 );. 
80f0: 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65     pRet = sqlite
8100: 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65  3_malloc64(nByte
8110: 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74 3d  );.    if( pRet=
8120: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  =0 ){.      p->r
8130: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
8140: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8150: 20 20 20 6d 65 6d 73 65 74 28 70 52 65 74 2c 20     memset(pRet, 
8160: 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d  0, nByte);.    }
8170: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52  .  }.  return pR
8180: 65 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c  et;.}.../*.** Al
8190: 6c 6f 63 61 74 65 20 61 6e 64 20 7a 65 72 6f 20  locate and zero 
81a0: 74 68 65 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c  the pIter->azTbl
81b0: 43 6f 6c 5b 5d 20 61 6e 64 20 61 62 54 62 6c 50  Col[] and abTblP
81c0: 6b 5b 5d 20 61 72 72 61 79 73 20 73 6f 20 74 68  k[] arrays so th
81d0: 61 74 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 72  at.** there is r
81e0: 6f 6f 6d 20 66 6f 72 20 61 74 20 6c 65 61 73 74  oom for at least
81f0: 20 6e 43 6f 6c 20 65 6c 65 6d 65 6e 74 73 2e 20   nCol elements. 
8200: 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73  If an OOM occurs
8210: 2c 20 73 74 6f 72 65 20 61 6e 0a 2a 2a 20 65 72  , store an.** er
8220: 72 6f 72 20 63 6f 64 65 20 69 6e 20 74 68 65 20  ror code in the 
8230: 52 42 55 20 68 61 6e 64 6c 65 20 70 61 73 73 65  RBU handle passe
8240: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
8250: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
8260: 69 63 20 76 6f 69 64 20 72 62 75 41 6c 6c 6f 63  ic void rbuAlloc
8270: 61 74 65 49 74 65 72 41 72 72 61 79 73 28 73 71  ateIterArrays(sq
8280: 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62 75  lite3rbu *p, Rbu
8290: 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 2c 20  ObjIter *pIter, 
82a0: 69 6e 74 20 6e 43 6f 6c 29 7b 0a 20 20 69 6e 74  int nCol){.  int
82b0: 20 6e 42 79 74 65 20 3d 20 28 32 2a 73 69 7a 65   nByte = (2*size
82c0: 6f 66 28 63 68 61 72 2a 29 20 2b 20 73 69 7a 65  of(char*) + size
82d0: 6f 66 28 69 6e 74 29 20 2b 20 33 2a 73 69 7a 65  of(int) + 3*size
82e0: 6f 66 28 75 38 29 29 20 2a 20 6e 43 6f 6c 3b 0a  of(u8)) * nCol;.
82f0: 20 20 63 68 61 72 20 2a 2a 61 7a 4e 65 77 3b 0a    char **azNew;.
8300: 0a 20 20 61 7a 4e 65 77 20 3d 20 28 63 68 61 72  .  azNew = (char
8310: 2a 2a 29 72 62 75 4d 61 6c 6c 6f 63 28 70 2c 20  **)rbuMalloc(p, 
8320: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 61 7a  nByte);.  if( az
8330: 4e 65 77 20 29 7b 0a 20 20 20 20 70 49 74 65 72  New ){.    pIter
8340: 2d 3e 61 7a 54 62 6c 43 6f 6c 20 3d 20 61 7a 4e  ->azTblCol = azN
8350: 65 77 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61  ew;.    pIter->a
8360: 7a 54 62 6c 54 79 70 65 20 3d 20 26 61 7a 4e 65  zTblType = &azNe
8370: 77 5b 6e 43 6f 6c 5d 3b 0a 20 20 20 20 70 49 74  w[nCol];.    pIt
8380: 65 72 2d 3e 61 69 53 72 63 4f 72 64 65 72 20 3d  er->aiSrcOrder =
8390: 20 28 69 6e 74 2a 29 26 70 49 74 65 72 2d 3e 61   (int*)&pIter->a
83a0: 7a 54 62 6c 54 79 70 65 5b 6e 43 6f 6c 5d 3b 0a  zTblType[nCol];.
83b0: 20 20 20 20 70 49 74 65 72 2d 3e 61 62 54 62 6c      pIter->abTbl
83c0: 50 6b 20 3d 20 28 75 38 2a 29 26 70 49 74 65 72  Pk = (u8*)&pIter
83d0: 2d 3e 61 69 53 72 63 4f 72 64 65 72 5b 6e 43 6f  ->aiSrcOrder[nCo
83e0: 6c 5d 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61  l];.    pIter->a
83f0: 62 4e 6f 74 4e 75 6c 6c 20 3d 20 28 75 38 2a 29  bNotNull = (u8*)
8400: 26 70 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b  &pIter->abTblPk[
8410: 6e 43 6f 6c 5d 3b 0a 20 20 20 20 70 49 74 65 72  nCol];.    pIter
8420: 2d 3e 61 62 49 6e 64 65 78 65 64 20 3d 20 28 75  ->abIndexed = (u
8430: 38 2a 29 26 70 49 74 65 72 2d 3e 61 62 4e 6f 74  8*)&pIter->abNot
8440: 4e 75 6c 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 7d 0a  Null[nCol];.  }.
8450: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72  }../*.** The fir
8460: 73 74 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74  st argument must
8470: 20 62 65 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e   be a nul-termin
8480: 61 74 65 64 20 73 74 72 69 6e 67 2e 20 54 68 69  ated string. Thi
8490: 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65  s function.** re
84a0: 74 75 72 6e 73 20 61 20 63 6f 70 79 20 6f 66 20  turns a copy of 
84b0: 74 68 65 20 73 74 72 69 6e 67 20 69 6e 20 6d 65  the string in me
84c0: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
84d0: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
84e0: 63 28 29 2e 0a 2a 2a 20 49 74 20 69 73 20 74 68  c()..** It is th
84f0: 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
8500: 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
8510: 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  o eventually fre
8520: 65 20 74 68 69 73 20 6d 65 6d 6f 72 79 0a 2a 2a  e this memory.**
8530: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 66   using sqlite3_f
8540: 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ree()..**.** If 
8550: 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e  an OOM condition
8560: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
8570: 77 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67 20  when attempting 
8580: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
8590: 72 79 2c 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61  ry,.** output va
85a0: 72 69 61 62 6c 65 20 28 2a 70 52 63 29 20 69 73  riable (*pRc) is
85b0: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e   set to SQLITE_N
85c0: 4f 4d 45 4d 20 62 65 66 6f 72 65 20 72 65 74 75  OMEM before retu
85d0: 72 6e 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65  rning. Otherwise
85e0: 2c 0a 2a 2a 20 69 66 20 74 68 65 20 61 6c 6c 6f  ,.** if the allo
85f0: 63 61 74 69 6f 6e 20 73 75 63 63 65 65 64 73 2c  cation succeeds,
8600: 20 28 2a 70 52 63 29 20 69 73 20 6c 65 66 74 20   (*pRc) is left 
8610: 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74  unchanged..*/.st
8620: 61 74 69 63 20 63 68 61 72 20 2a 72 62 75 53 74  atic char *rbuSt
8630: 72 6e 64 75 70 28 63 6f 6e 73 74 20 63 68 61 72  rndup(const char
8640: 20 2a 7a 53 74 72 2c 20 69 6e 74 20 2a 70 52 63   *zStr, int *pRc
8650: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 20  ){.  char *zRet 
8660: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
8670: 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  *pRc==SQLITE_OK 
8680: 29 3b 0a 20 20 69 66 28 20 7a 53 74 72 20 29 7b  );.  if( zStr ){
8690: 0a 20 20 20 20 73 69 7a 65 5f 74 20 6e 43 6f 70  .    size_t nCop
86a0: 79 20 3d 20 73 74 72 6c 65 6e 28 7a 53 74 72 29  y = strlen(zStr)
86b0: 20 2b 20 31 3b 0a 20 20 20 20 7a 52 65 74 20 3d   + 1;.    zRet =
86c0: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f   (char*)sqlite3_
86d0: 6d 61 6c 6c 6f 63 36 34 28 6e 43 6f 70 79 29 3b  malloc64(nCopy);
86e0: 0a 20 20 20 20 69 66 28 20 7a 52 65 74 20 29 7b  .    if( zRet ){
86f0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 52  .      memcpy(zR
8700: 65 74 2c 20 7a 53 74 72 2c 20 6e 43 6f 70 79 29  et, zStr, nCopy)
8710: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8720: 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45     *pRc = SQLITE
8730: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
8740: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74  }..  return zRet
8750: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 61 6c  ;.}../*.** Final
8760: 69 7a 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ize the statemen
8770: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
8780: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
8790: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 71  .**.** If the sq
87a0: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 29  lite3_finalize()
87b0: 20 63 61 6c 6c 20 69 6e 64 69 63 61 74 65 73 20   call indicates 
87c0: 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 6f 63  that an error oc
87d0: 63 75 72 73 2c 20 61 6e 64 20 74 68 65 0a 2a 2a  curs, and the.**
87e0: 20 72 62 75 20 68 61 6e 64 6c 65 20 65 72 72 6f   rbu handle erro
87f0: 72 20 63 6f 64 65 20 69 73 20 6e 6f 74 20 61 6c  r code is not al
8800: 72 65 61 64 79 20 73 65 74 2c 20 73 65 74 20 74  ready set, set t
8810: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  he error code an
8820: 64 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73 61  d error.** messa
8830: 67 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a  ge accordingly..
8840: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
8850: 62 75 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74  buFinalize(sqlit
8860: 65 33 72 62 75 20 2a 70 2c 20 73 71 6c 69 74 65  e3rbu *p, sqlite
8870: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a  3_stmt *pStmt){.
8880: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
8890: 73 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c  sqlite3_db_handl
88a0: 65 28 70 53 74 6d 74 29 3b 0a 20 20 69 6e 74 20  e(pStmt);.  int 
88b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e  rc = sqlite3_fin
88c0: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
88d0: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
88e0: 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
88f0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e  TE_OK ){.    p->
8900: 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 70 2d 3e  rc = rc;.    p->
8910: 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65  zErrmsg = sqlite
8920: 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
8930: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
8940: 62 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 44  b));.  }.}../* D
8950: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 74 79 70  etermine the typ
8960: 65 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a 2a 2a  e of a table..**
8970: 0a 2a 2a 20 20 20 70 65 54 79 70 65 20 69 73 20  .**   peType is 
8980: 6f 66 20 74 79 70 65 20 28 69 6e 74 2a 29 2c 20  of type (int*), 
8990: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
89a0: 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72  output parameter
89b0: 20 6f 66 20 74 79 70 65 0a 2a 2a 20 20 20 28 69   of type.**   (i
89c0: 6e 74 29 2e 20 54 68 69 73 20 63 61 6c 6c 20 73  nt). This call s
89d0: 65 74 73 20 74 68 65 20 6f 75 74 70 75 74 20 70  ets the output p
89e0: 61 72 61 6d 65 74 65 72 20 61 73 20 66 6f 6c 6c  arameter as foll
89f0: 6f 77 73 2c 20 64 65 70 65 6e 64 69 6e 67 0a 2a  ows, depending.*
8a00: 2a 20 20 20 6f 6e 20 74 68 65 20 74 79 70 65 20  *   on the type 
8a10: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 73 70 65  of the table spe
8a20: 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
8a30: 74 65 72 73 20 64 62 4e 61 6d 65 20 61 6e 64 20  ters dbName and 
8a40: 7a 54 62 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  zTbl..**.**     
8a50: 52 42 55 5f 50 4b 5f 4e 4f 54 41 42 4c 45 3a 20  RBU_PK_NOTABLE: 
8a60: 20 20 20 20 20 20 4e 6f 20 73 75 63 68 20 74 61        No such ta
8a70: 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 52 42 55 5f  ble..**     RBU_
8a80: 50 4b 5f 4e 4f 4e 45 3a 20 20 20 20 20 20 20 20  PK_NONE:        
8a90: 20 20 54 61 62 6c 65 20 68 61 73 20 61 6e 20 69    Table has an i
8aa0: 6d 70 6c 69 63 69 74 20 72 6f 77 69 64 2e 0a 2a  mplicit rowid..*
8ab0: 2a 20 20 20 20 20 52 42 55 5f 50 4b 5f 49 50 4b  *     RBU_PK_IPK
8ac0: 3a 20 20 20 20 20 20 20 20 20 20 20 54 61 62 6c  :           Tabl
8ad0: 65 20 68 61 73 20 61 6e 20 65 78 70 6c 69 63 69  e has an explici
8ae0: 74 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a  t IPK column..**
8af0: 20 20 20 20 20 52 42 55 5f 50 4b 5f 45 58 54 45       RBU_PK_EXTE
8b00: 52 4e 41 4c 3a 20 20 20 20 20 20 54 61 62 6c 65  RNAL:      Table
8b10: 20 68 61 73 20 61 6e 20 65 78 74 65 72 6e 61 6c   has an external
8b20: 20 50 4b 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20   PK index..**   
8b30: 20 20 52 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54    RBU_PK_WITHOUT
8b40: 5f 52 4f 57 49 44 3a 20 54 61 62 6c 65 20 69 73  _ROWID: Table is
8b50: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 2e 0a   WITHOUT ROWID..
8b60: 2a 2a 20 20 20 20 20 52 42 55 5f 50 4b 5f 56 54  **     RBU_PK_VT
8b70: 41 42 3a 20 20 20 20 20 20 20 20 20 20 54 61 62  AB:          Tab
8b80: 6c 65 20 69 73 20 61 20 76 69 72 74 75 61 6c 20  le is a virtual 
8b90: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 41  table..**.**   A
8ba0: 72 67 75 6d 65 6e 74 20 2a 70 69 50 6b 20 69 73  rgument *piPk is
8bb0: 20 61 6c 73 6f 20 6f 66 20 74 79 70 65 20 28 69   also of type (i
8bc0: 6e 74 2a 29 2c 20 61 6e 64 20 61 6c 73 6f 20 70  nt*), and also p
8bd0: 6f 69 6e 74 73 20 74 6f 20 61 6e 20 6f 75 74 70  oints to an outp
8be0: 75 74 0a 2a 2a 20 20 20 70 61 72 61 6d 65 74 65  ut.**   paramete
8bf0: 72 2e 20 55 6e 6c 65 73 73 20 74 68 65 20 74 61  r. Unless the ta
8c00: 62 6c 65 20 68 61 73 20 61 6e 20 65 78 74 65 72  ble has an exter
8c10: 6e 61 6c 20 70 72 69 6d 61 72 79 20 6b 65 79 20  nal primary key 
8c20: 69 6e 64 65 78 20 0a 2a 2a 20 20 20 28 69 2e 65  index .**   (i.e
8c30: 2e 20 75 6e 6c 65 73 73 20 2a 70 65 54 79 70 65  . unless *peType
8c40: 20 69 73 20 73 65 74 20 74 6f 20 33 29 2c 20 74   is set to 3), t
8c50: 68 65 6e 20 2a 70 69 50 6b 20 69 73 20 73 65 74  hen *piPk is set
8c60: 20 74 6f 20 7a 65 72 6f 2e 20 4f 72 2c 0a 2a 2a   to zero. Or,.**
8c70: 20 20 20 69 66 20 74 68 65 20 74 61 62 6c 65 20     if the table 
8c80: 64 6f 65 73 20 68 61 76 65 20 61 6e 20 65 78 74  does have an ext
8c90: 65 72 6e 61 6c 20 70 72 69 6d 61 72 79 20 6b 65  ernal primary ke
8ca0: 79 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 2a 70  y index, then *p
8cb0: 69 50 6b 0a 2a 2a 20 20 20 69 73 20 73 65 74 20  iPk.**   is set 
8cc0: 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  to the root page
8cd0: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   number of the p
8ce0: 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78  rimary key index
8cf0: 20 62 65 66 6f 72 65 0a 2a 2a 20 20 20 72 65 74   before.**   ret
8d00: 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 4c  urning..**.** AL
8d10: 47 4f 52 49 54 48 4d 3a 0a 2a 2a 0a 2a 2a 20 20  GORITHM:.**.**  
8d20: 20 69 66 28 20 6e 6f 20 65 6e 74 72 79 20 65 78   if( no entry ex
8d30: 69 73 74 73 20 69 6e 20 73 71 6c 69 74 65 5f 6d  ists in sqlite_m
8d40: 61 73 74 65 72 20 29 7b 0a 2a 2a 20 20 20 20 20  aster ){.**     
8d50: 72 65 74 75 72 6e 20 52 42 55 5f 50 4b 5f 4e 4f  return RBU_PK_NO
8d60: 54 41 42 4c 45 0a 2a 2a 20 20 20 7d 65 6c 73 65  TABLE.**   }else
8d70: 20 69 66 28 20 73 71 6c 20 66 6f 72 20 74 68 65   if( sql for the
8d80: 20 65 6e 74 72 79 20 73 74 61 72 74 73 20 77 69   entry starts wi
8d90: 74 68 20 22 43 52 45 41 54 45 20 56 49 52 54 55  th "CREATE VIRTU
8da0: 41 4c 22 20 29 7b 0a 2a 2a 20 20 20 20 20 72 65  AL" ){.**     re
8db0: 74 75 72 6e 20 52 42 55 5f 50 4b 5f 56 54 41 42  turn RBU_PK_VTAB
8dc0: 0a 2a 2a 20 20 20 7d 65 6c 73 65 20 69 66 28 20  .**   }else if( 
8dd0: 22 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 6c 69  "PRAGMA index_li
8de0: 73 74 28 29 22 20 66 6f 72 20 74 68 65 20 74 61  st()" for the ta
8df0: 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 22  ble contains a "
8e00: 70 6b 22 20 69 6e 64 65 78 20 29 7b 0a 2a 2a 20  pk" index ){.** 
8e10: 20 20 20 20 69 66 28 20 74 68 65 20 69 6e 64 65      if( the inde
8e20: 78 20 74 68 61 74 20 69 73 20 74 68 65 20 70 6b  x that is the pk
8e30: 20 65 78 69 73 74 73 20 69 6e 20 73 71 6c 69 74   exists in sqlit
8e40: 65 5f 6d 61 73 74 65 72 20 29 7b 0a 2a 2a 20 20  e_master ){.**  
8e50: 20 20 20 20 20 2a 70 69 50 4b 20 3d 20 72 6f 6f       *piPK = roo
8e60: 74 70 61 67 65 20 6f 66 20 74 68 61 74 20 69 6e  tpage of that in
8e70: 64 65 78 2e 0a 2a 2a 20 20 20 20 20 20 20 72 65  dex..**       re
8e80: 74 75 72 6e 20 52 42 55 5f 50 4b 5f 45 58 54 45  turn RBU_PK_EXTE
8e90: 52 4e 41 4c 0a 2a 2a 20 20 20 20 20 7d 65 6c 73  RNAL.**     }els
8ea0: 65 7b 0a 2a 2a 20 20 20 20 20 20 20 72 65 74 75  e{.**       retu
8eb0: 72 6e 20 52 42 55 5f 50 4b 5f 57 49 54 48 4f 55  rn RBU_PK_WITHOU
8ec0: 54 5f 52 4f 57 49 44 0a 2a 2a 20 20 20 20 20 7d  T_ROWID.**     }
8ed0: 0a 2a 2a 20 20 20 7d 65 6c 73 65 20 69 66 28 20  .**   }else if( 
8ee0: 22 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e  "PRAGMA table_in
8ef0: 66 6f 28 29 22 20 6c 69 73 74 73 20 6f 6e 65 20  fo()" lists one 
8f00: 6f 72 20 6d 6f 72 65 20 22 70 6b 22 20 63 6f 6c  or more "pk" col
8f10: 75 6d 6e 73 20 29 7b 0a 2a 2a 20 20 20 20 20 72  umns ){.**     r
8f20: 65 74 75 72 6e 20 52 42 55 5f 50 4b 5f 49 50 4b  eturn RBU_PK_IPK
8f30: 0a 2a 2a 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20  .**   }else{.** 
8f40: 20 20 20 20 72 65 74 75 72 6e 20 52 42 55 5f 50      return RBU_P
8f50: 4b 5f 4e 4f 4e 45 0a 2a 2a 20 20 20 7d 0a 2a 2f  K_NONE.**   }.*/
8f60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
8f70: 54 61 62 6c 65 54 79 70 65 28 0a 20 20 73 71 6c  TableType(.  sql
8f80: 69 74 65 33 72 62 75 20 2a 70 2c 0a 20 20 63 6f  ite3rbu *p,.  co
8f90: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 2c 0a  nst char *zTab,.
8fa0: 20 20 69 6e 74 20 2a 70 65 54 79 70 65 2c 0a 20    int *peType,. 
8fb0: 20 69 6e 74 20 2a 70 69 54 6e 75 6d 2c 0a 20 20   int *piTnum,.  
8fc0: 69 6e 74 20 2a 70 69 50 6b 0a 29 7b 0a 20 20 2f  int *piPk.){.  /
8fd0: 2a 0a 20 20 2a 2a 20 30 29 20 53 45 4c 45 43 54  *.  ** 0) SELECT
8fe0: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 73   count(*) FROM s
8ff0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 77 68 65  qlite_master whe
9000: 72 65 20 6e 61 6d 65 3d 25 51 20 41 4e 44 20 49  re name=%Q AND I
9010: 73 56 69 72 74 75 61 6c 28 25 51 29 0a 20 20 2a  sVirtual(%Q).  *
9020: 2a 20 31 29 20 50 52 41 47 4d 41 20 69 6e 64 65  * 1) PRAGMA inde
9030: 78 5f 6c 69 73 74 20 3d 20 3f 0a 20 20 2a 2a 20  x_list = ?.  ** 
9040: 32 29 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28  2) SELECT count(
9050: 2a 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  *) FROM sqlite_m
9060: 61 73 74 65 72 20 77 68 65 72 65 20 6e 61 6d 65  aster where name
9070: 3d 25 51 20 0a 20 20 2a 2a 20 33 29 20 50 52 41  =%Q .  ** 3) PRA
9080: 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 20 3d  GMA table_info =
9090: 20 3f 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65   ?.  */.  sqlite
90a0: 33 5f 73 74 6d 74 20 2a 61 53 74 6d 74 5b 34 5d  3_stmt *aStmt[4]
90b0: 20 3d 20 7b 30 2c 20 30 2c 20 30 2c 20 30 7d 3b   = {0, 0, 0, 0};
90c0: 0a 0a 20 20 2a 70 65 54 79 70 65 20 3d 20 52 42  ..  *peType = RB
90d0: 55 5f 50 4b 5f 4e 4f 54 41 42 4c 45 3b 0a 20 20  U_PK_NOTABLE;.  
90e0: 2a 70 69 50 6b 20 3d 20 30 3b 0a 0a 20 20 61 73  *piPk = 0;..  as
90f0: 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
9100: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 70 2d 3e 72  ITE_OK );.  p->r
9110: 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41  c = prepareFreeA
9120: 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70  ndCollectError(p
9130: 2d 3e 64 62 4d 61 69 6e 2c 20 26 61 53 74 6d 74  ->dbMain, &aStmt
9140: 5b 30 5d 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  [0], &p->zErrmsg
9150: 2c 20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  , .    sqlite3_m
9160: 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
9170: 20 20 22 53 45 4c 45 43 54 20 28 73 71 6c 20 4c    "SELECT (sql L
9180: 49 4b 45 20 27 63 72 65 61 74 65 20 76 69 72 74  IKE 'create virt
9190: 75 61 6c 25 25 27 29 2c 20 72 6f 6f 74 70 61 67  ual%%'), rootpag
91a0: 65 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 20  e".          "  
91b0: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
91c0: 65 72 22 0a 20 20 20 20 20 20 20 20 20 20 22 20  er".          " 
91d0: 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 20  WHERE name=%Q", 
91e0: 7a 54 61 62 0a 20 20 29 29 3b 0a 20 20 69 66 28  zTab.  ));.  if(
91f0: 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
9200: 4b 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 65  K || sqlite3_ste
9210: 70 28 61 53 74 6d 74 5b 30 5d 29 21 3d 53 51 4c  p(aStmt[0])!=SQL
9220: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 2f  ITE_ROW ){.    /
9230: 2a 20 45 69 74 68 65 72 20 61 6e 20 65 72 72 6f  * Either an erro
9240: 72 2c 20 6f 72 20 6e 6f 20 73 75 63 68 20 74 61  r, or no such ta
9250: 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 67 6f 74 6f  ble. */.    goto
9260: 20 72 62 75 54 61 62 6c 65 54 79 70 65 5f 65 6e   rbuTableType_en
9270: 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  d;.  }.  if( sql
9280: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
9290: 61 53 74 6d 74 5b 30 5d 2c 20 30 29 20 29 7b 0a  aStmt[0], 0) ){.
92a0: 20 20 20 20 2a 70 65 54 79 70 65 20 3d 20 52 42      *peType = RB
92b0: 55 5f 50 4b 5f 56 54 41 42 3b 20 20 20 20 20 20  U_PK_VTAB;      
92c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
92d0: 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  * virtual table 
92e0: 2a 2f 0a 20 20 20 20 67 6f 74 6f 20 72 62 75 54  */.    goto rbuT
92f0: 61 62 6c 65 54 79 70 65 5f 65 6e 64 3b 0a 20 20  ableType_end;.  
9300: 7d 0a 20 20 2a 70 69 54 6e 75 6d 20 3d 20 73 71  }.  *piTnum = sq
9310: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
9320: 28 61 53 74 6d 74 5b 30 5d 2c 20 31 29 3b 0a 0a  (aStmt[0], 1);..
9330: 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72    p->rc = prepar
9340: 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45  eFreeAndCollectE
9350: 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  rror(p->dbMain, 
9360: 26 61 53 74 6d 74 5b 31 5d 2c 20 26 70 2d 3e 7a  &aStmt[1], &p->z
9370: 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 73 71 6c  Errmsg, .    sql
9380: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52  ite3_mprintf("PR
9390: 41 47 4d 41 20 69 6e 64 65 78 5f 6c 69 73 74 3d  AGMA index_list=
93a0: 25 51 22 2c 7a 54 61 62 29 0a 20 20 29 3b 0a 20  %Q",zTab).  );. 
93b0: 20 69 66 28 20 70 2d 3e 72 63 20 29 20 67 6f 74   if( p->rc ) got
93c0: 6f 20 72 62 75 54 61 62 6c 65 54 79 70 65 5f 65  o rbuTableType_e
93d0: 6e 64 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c  nd;.  while( sql
93e0: 69 74 65 33 5f 73 74 65 70 28 61 53 74 6d 74 5b  ite3_step(aStmt[
93f0: 31 5d 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  1])==SQLITE_ROW 
9400: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20  ){.    const u8 
9410: 2a 7a 4f 72 69 67 20 3d 20 73 71 6c 69 74 65 33  *zOrig = sqlite3
9420: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 61 53 74  _column_text(aSt
9430: 6d 74 5b 31 5d 2c 20 33 29 3b 0a 20 20 20 20 63  mt[1], 3);.    c
9440: 6f 6e 73 74 20 75 38 20 2a 7a 49 64 78 20 3d 20  onst u8 *zIdx = 
9450: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
9460: 65 78 74 28 61 53 74 6d 74 5b 31 5d 2c 20 31 29  ext(aStmt[1], 1)
9470: 3b 0a 20 20 20 20 69 66 28 20 7a 4f 72 69 67 20  ;.    if( zOrig 
9480: 26 26 20 7a 49 64 78 20 26 26 20 7a 4f 72 69 67  && zIdx && zOrig
9490: 5b 30 5d 3d 3d 27 70 27 20 29 7b 0a 20 20 20 20  [0]=='p' ){.    
94a0: 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72    p->rc = prepar
94b0: 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45  eFreeAndCollectE
94c0: 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  rror(p->dbMain, 
94d0: 26 61 53 74 6d 74 5b 32 5d 2c 20 26 70 2d 3e 7a  &aStmt[2], &p->z
94e0: 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20 20 20  Errmsg, .       
94f0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e     sqlite3_mprin
9500: 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  tf(.            
9510: 22 53 45 4c 45 43 54 20 72 6f 6f 74 70 61 67 65  "SELECT rootpage
9520: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
9530: 74 65 72 20 57 48 45 52 45 20 6e 61 6d 65 20 3d  ter WHERE name =
9540: 20 25 51 22 2c 20 7a 49 64 78 0a 20 20 20 20 20   %Q", zIdx.     
9550: 20 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   ));.      if( p
9560: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
9570: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
9580: 71 6c 69 74 65 33 5f 73 74 65 70 28 61 53 74 6d  qlite3_step(aStm
9590: 74 5b 32 5d 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  t[2])==SQLITE_RO
95a0: 57 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  W ){.          *
95b0: 70 69 50 6b 20 3d 20 73 71 6c 69 74 65 33 5f 63  piPk = sqlite3_c
95c0: 6f 6c 75 6d 6e 5f 69 6e 74 28 61 53 74 6d 74 5b  olumn_int(aStmt[
95d0: 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  2], 0);.        
95e0: 20 20 2a 70 65 54 79 70 65 20 3d 20 52 42 55 5f    *peType = RBU_
95f0: 50 4b 5f 45 58 54 45 52 4e 41 4c 3b 0a 20 20 20  PK_EXTERNAL;.   
9600: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9610: 20 20 20 20 20 20 2a 70 65 54 79 70 65 20 3d 20        *peType = 
9620: 52 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54 5f 52  RBU_PK_WITHOUT_R
9630: 4f 57 49 44 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OWID;.        }.
9640: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
9650: 74 6f 20 72 62 75 54 61 62 6c 65 54 79 70 65 5f  to rbuTableType_
9660: 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  end;.    }.  }..
9670: 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72    p->rc = prepar
9680: 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45  eFreeAndCollectE
9690: 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  rror(p->dbMain, 
96a0: 26 61 53 74 6d 74 5b 33 5d 2c 20 26 70 2d 3e 7a  &aStmt[3], &p->z
96b0: 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 73 71 6c  Errmsg, .    sql
96c0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52  ite3_mprintf("PR
96d0: 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 3d  AGMA table_info=
96e0: 25 51 22 2c 7a 54 61 62 29 0a 20 20 29 3b 0a 20  %Q",zTab).  );. 
96f0: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
9700: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 77 68 69  TE_OK ){.    whi
9710: 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70  le( sqlite3_step
9720: 28 61 53 74 6d 74 5b 33 5d 29 3d 3d 53 51 4c 49  (aStmt[3])==SQLI
9730: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  TE_ROW ){.      
9740: 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  if( sqlite3_colu
9750: 6d 6e 5f 69 6e 74 28 61 53 74 6d 74 5b 33 5d 2c  mn_int(aStmt[3],
9760: 35 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  5)>0 ){.        
9770: 2a 70 65 54 79 70 65 20 3d 20 52 42 55 5f 50 4b  *peType = RBU_PK
9780: 5f 49 50 4b 3b 20 20 20 20 20 20 20 20 20 20 20  _IPK;           
9790: 20 20 20 20 20 2f 2a 20 65 78 70 6c 69 63 69 74       /* explicit
97a0: 20 49 50 4b 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20   IPK column */. 
97b0: 20 20 20 20 20 20 20 67 6f 74 6f 20 72 62 75 54         goto rbuT
97c0: 61 62 6c 65 54 79 70 65 5f 65 6e 64 3b 0a 20 20  ableType_end;.  
97d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
97e0: 2a 70 65 54 79 70 65 20 3d 20 52 42 55 5f 50 4b  *peType = RBU_PK
97f0: 5f 4e 4f 4e 45 3b 0a 20 20 7d 0a 0a 72 62 75 54  _NONE;.  }..rbuT
9800: 61 62 6c 65 54 79 70 65 5f 65 6e 64 3a 20 7b 0a  ableType_end: {.
9810: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
9820: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
9830: 20 69 3c 73 69 7a 65 6f 66 28 61 53 74 6d 74 29   i<sizeof(aStmt)
9840: 2f 73 69 7a 65 6f 66 28 61 53 74 6d 74 5b 30 5d  /sizeof(aStmt[0]
9850: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  ); i++){.      r
9860: 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 61 53  buFinalize(p, aS
9870: 74 6d 74 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  tmt[i]);.    }. 
9880: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
9890: 20 69 73 20 61 20 68 65 6c 70 65 72 20 66 75 6e   is a helper fun
98a0: 63 74 69 6f 6e 20 66 6f 72 20 72 62 75 4f 62 6a  ction for rbuObj
98b0: 49 74 65 72 43 61 63 68 65 54 61 62 6c 65 49 6e  IterCacheTableIn
98c0: 66 6f 28 29 2e 20 49 74 20 70 6f 70 75 6c 61 74  fo(). It populat
98d0: 65 73 0a 2a 2a 20 74 68 65 20 70 49 74 65 72 2d  es.** the pIter-
98e0: 3e 61 62 49 6e 64 65 78 65 64 5b 5d 20 61 72 72  >abIndexed[] arr
98f0: 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ay..*/.static vo
9900: 69 64 20 72 62 75 4f 62 6a 49 74 65 72 43 61 63  id rbuObjIterCac
9910: 68 65 49 6e 64 65 78 65 64 43 6f 6c 73 28 73 71  heIndexedCols(sq
9920: 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62 75  lite3rbu *p, Rbu
9930: 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 29 7b  ObjIter *pIter){
9940: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
9950: 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 69 6e  *pList = 0;.  in
9960: 74 20 62 49 6e 64 65 78 20 3d 20 30 3b 0a 0a 20  t bIndex = 0;.. 
9970: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
9980: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 65 6d  TE_OK ){.    mem
9990: 63 70 79 28 70 49 74 65 72 2d 3e 61 62 49 6e 64  cpy(pIter->abInd
99a0: 65 78 65 64 2c 20 70 49 74 65 72 2d 3e 61 62 54  exed, pIter->abT
99b0: 62 6c 50 6b 2c 20 73 69 7a 65 6f 66 28 75 38 29  blPk, sizeof(u8)
99c0: 2a 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 29  *pIter->nTblCol)
99d0: 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72  ;.    p->rc = pr
99e0: 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c  epareFreeAndColl
99f0: 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61  ectError(p->dbMa
9a00: 69 6e 2c 20 26 70 4c 69 73 74 2c 20 26 70 2d 3e  in, &pList, &p->
9a10: 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20 20 20 20  zErrmsg,.       
9a20: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
9a30: 28 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 69 6e  ("PRAGMA main.in
9a40: 64 65 78 5f 6c 69 73 74 20 3d 20 25 51 22 2c 20  dex_list = %Q", 
9a50: 70 49 74 65 72 2d 3e 7a 54 62 6c 29 0a 20 20 20  pIter->zTbl).   
9a60: 20 29 3b 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72   );.  }..  pIter
9a70: 2d 3e 6e 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  ->nIndex = 0;.  
9a80: 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51  while( p->rc==SQ
9a90: 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54  LITE_OK && SQLIT
9aa0: 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
9ab0: 74 65 70 28 70 4c 69 73 74 29 20 29 7b 0a 20 20  tep(pList) ){.  
9ac0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
9ad0: 64 78 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  dx = (const char
9ae0: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
9af0: 5f 74 65 78 74 28 70 4c 69 73 74 2c 20 31 29 3b  _text(pList, 1);
9b00: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
9b10: 74 20 2a 70 58 49 6e 66 6f 20 3d 20 30 3b 0a 20  t *pXInfo = 0;. 
9b20: 20 20 20 69 66 28 20 7a 49 64 78 3d 3d 30 20 29     if( zIdx==0 )
9b30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 2d 3e 72   break;.    p->r
9b40: 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41  c = prepareFreeA
9b50: 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70  ndCollectError(p
9b60: 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 58 49 6e 66  ->dbMain, &pXInf
9b70: 6f 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a  o, &p->zErrmsg,.
9b80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
9b90: 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20  mprintf("PRAGMA 
9ba0: 6d 61 69 6e 2e 69 6e 64 65 78 5f 78 69 6e 66 6f  main.index_xinfo
9bb0: 20 3d 20 25 51 22 2c 20 7a 49 64 78 29 0a 20 20   = %Q", zIdx).  
9bc0: 20 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20    );.    while( 
9bd0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
9be0: 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d   && SQLITE_ROW==
9bf0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 58 49  sqlite3_step(pXI
9c00: 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  nfo) ){.      in
9c10: 74 20 69 43 69 64 20 3d 20 73 71 6c 69 74 65 33  t iCid = sqlite3
9c20: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49 6e  _column_int(pXIn
9c30: 66 6f 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  fo, 1);.      if
9c40: 28 20 69 43 69 64 3e 3d 30 20 29 20 70 49 74 65  ( iCid>=0 ) pIte
9c50: 72 2d 3e 61 62 49 6e 64 65 78 65 64 5b 69 43 69  r->abIndexed[iCi
9c60: 64 5d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  d] = 1;.    }.  
9c70: 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c    rbuFinalize(p,
9c80: 20 70 58 49 6e 66 6f 29 3b 0a 20 20 20 20 62 49   pXInfo);.    bI
9c90: 6e 64 65 78 20 3d 20 31 3b 0a 20 20 20 20 70 49  ndex = 1;.    pI
9ca0: 74 65 72 2d 3e 6e 49 6e 64 65 78 2b 2b 3b 0a 20  ter->nIndex++;. 
9cb0: 20 7d 0a 0a 20 20 72 62 75 46 69 6e 61 6c 69 7a   }..  rbuFinaliz
9cc0: 65 28 70 2c 20 70 4c 69 73 74 29 3b 0a 20 20 69  e(p, pList);.  i
9cd0: 66 28 20 62 49 6e 64 65 78 3d 3d 30 20 29 20 70  f( bIndex==0 ) p
9ce0: 49 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64 20  Iter->abIndexed 
9cf0: 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  = 0;.}.../*.** I
9d00: 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 61  f they are not a
9d10: 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64  lready populated
9d20: 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 70  , populate the p
9d30: 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 5d  Iter->azTblCol[]
9d40: 2c 0a 2a 2a 20 70 49 74 65 72 2d 3e 61 62 54 62  ,.** pIter->abTb
9d50: 6c 50 6b 5b 5d 2c 20 70 49 74 65 72 2d 3e 6e 54  lPk[], pIter->nT
9d60: 62 6c 43 6f 6c 20 61 6e 64 20 70 49 74 65 72 2d  blCol and pIter-
9d70: 3e 62 52 6f 77 69 64 20 76 61 72 69 61 62 6c 65  >bRowid variable
9d80: 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 0a 2a  s according to.*
9d90: 2a 20 74 68 65 20 74 61 62 6c 65 20 28 6e 6f 74  * the table (not
9da0: 20 69 6e 64 65 78 29 20 74 68 61 74 20 74 68 65   index) that the
9db0: 20 69 74 65 72 61 74 6f 72 20 63 75 72 72 65 6e   iterator curren
9dc0: 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a  tly points to..*
9dd0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
9de0: 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  TE_OK if success
9df0: 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74  ful, or an SQLit
9e00: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  e error code oth
9e10: 65 72 77 69 73 65 2e 20 49 66 0a 2a 2a 20 61 6e  erwise. If.** an
9e20: 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75   error does occu
9e30: 72 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  r, an error code
9e40: 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61   and error messa
9e50: 67 65 20 61 72 65 20 61 6c 73 6f 20 6c 65 66 74  ge are also left
9e60: 20 69 6e 20 0a 2a 2a 20 74 68 65 20 52 42 55 20   in .** the RBU 
9e70: 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  handle..*/.stati
9e80: 63 20 69 6e 74 20 72 62 75 4f 62 6a 49 74 65 72  c int rbuObjIter
9e90: 43 61 63 68 65 54 61 62 6c 65 49 6e 66 6f 28 73  CacheTableInfo(s
9ea0: 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62  qlite3rbu *p, Rb
9eb0: 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 29  uObjIter *pIter)
9ec0: 7b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 61  {.  if( pIter->a
9ed0: 7a 54 62 6c 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20  zTblCol==0 ){.  
9ee0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
9ef0: 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 69  pStmt = 0;.    i
9f00: 6e 74 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  nt nCol = 0;.   
9f10: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
9f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9f30: 2a 20 66 6f 72 28 29 20 6c 6f 6f 70 20 69 74 65  * for() loop ite
9f40: 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a  rator variable *
9f50: 2f 0a 20 20 20 20 69 6e 74 20 62 52 62 75 52 6f  /.    int bRbuRo
9f60: 77 69 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  wid = 0;        
9f70: 20 20 20 20 2f 2a 20 49 66 20 69 6e 70 75 74 20      /* If input 
9f80: 74 61 62 6c 65 20 68 61 73 20 63 6f 6c 75 6d 6e  table has column
9f90: 20 22 72 62 75 5f 72 6f 77 69 64 22 20 2a 2f 0a   "rbu_rowid" */.
9fa0: 20 20 20 20 69 6e 74 20 69 4f 72 64 65 72 20 3d      int iOrder =
9fb0: 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 54 6e 75   0;.    int iTnu
9fc0: 6d 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 46  m = 0;..    /* F
9fd0: 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 74 79  igure out the ty
9fe0: 70 65 20 6f 66 20 74 61 62 6c 65 20 74 68 69 73  pe of table this
9ff0: 20 73 74 65 70 20 77 69 6c 6c 20 64 65 61 6c 20   step will deal 
a000: 77 69 74 68 2e 20 2a 2f 0a 20 20 20 20 61 73 73  with. */.    ass
a010: 65 72 74 28 20 70 49 74 65 72 2d 3e 65 54 79 70  ert( pIter->eTyp
a020: 65 3d 3d 30 20 29 3b 0a 20 20 20 20 72 62 75 54  e==0 );.    rbuT
a030: 61 62 6c 65 54 79 70 65 28 70 2c 20 70 49 74 65  ableType(p, pIte
a040: 72 2d 3e 7a 54 62 6c 2c 20 26 70 49 74 65 72 2d  r->zTbl, &pIter-
a050: 3e 65 54 79 70 65 2c 20 26 69 54 6e 75 6d 2c 20  >eType, &iTnum, 
a060: 26 70 49 74 65 72 2d 3e 69 50 6b 54 6e 75 6d 29  &pIter->iPkTnum)
a070: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  ;.    if( p->rc=
a080: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49  =SQLITE_OK && pI
a090: 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f  ter->eType==RBU_
a0a0: 50 4b 5f 4e 4f 54 41 42 4c 45 20 29 7b 0a 20 20  PK_NOTABLE ){.  
a0b0: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
a0c0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
a0d0: 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c  p->zErrmsg = sql
a0e0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f  ite3_mprintf("no
a0f0: 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22   such table: %s"
a100: 2c 20 70 49 74 65 72 2d 3e 7a 54 62 6c 29 3b 0a  , pIter->zTbl);.
a110: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
a120: 3e 72 63 20 29 20 72 65 74 75 72 6e 20 70 2d 3e  >rc ) return p->
a130: 72 63 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  rc;.    if( pIte
a140: 72 2d 3e 7a 49 64 78 3d 3d 30 20 29 20 70 49 74  r->zIdx==0 ) pIt
a150: 65 72 2d 3e 69 54 6e 75 6d 20 3d 20 69 54 6e 75  er->iTnum = iTnu
a160: 6d 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  m;..    assert( 
a170: 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
a180: 55 5f 50 4b 5f 4e 4f 4e 45 20 7c 7c 20 70 49 74  U_PK_NONE || pIt
a190: 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
a1a0: 4b 5f 49 50 4b 20 0a 20 20 20 20 20 20 20 20 20  K_IPK .         
a1b0: 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  || pIter->eType=
a1c0: 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c  =RBU_PK_EXTERNAL
a1d0: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65   || pIter->eType
a1e0: 3d 3d 52 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54  ==RBU_PK_WITHOUT
a1f0: 5f 52 4f 57 49 44 0a 20 20 20 20 20 20 20 20 20  _ROWID.         
a200: 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  || pIter->eType=
a210: 3d 52 42 55 5f 50 4b 5f 56 54 41 42 0a 20 20 20  =RBU_PK_VTAB.   
a220: 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75   );..    /* Popu
a230: 6c 61 74 65 20 74 68 65 20 61 7a 54 62 6c 43 6f  late the azTblCo
a240: 6c 5b 5d 20 61 6e 64 20 6e 54 62 6c 43 6f 6c 20  l[] and nTblCol 
a250: 76 61 72 69 61 62 6c 65 73 20 62 61 73 65 64 20  variables based 
a260: 6f 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 73 0a 20  on the columns. 
a270: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e 70     ** of the inp
a280: 75 74 20 74 61 62 6c 65 2e 20 49 67 6e 6f 72 65  ut table. Ignore
a290: 20 61 6e 79 20 69 6e 70 75 74 20 74 61 62 6c 65   any input table
a2a0: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 62 65   columns that be
a2b0: 67 69 6e 20 77 69 74 68 0a 20 20 20 20 2a 2a 20  gin with.    ** 
a2c0: 22 72 62 75 5f 22 2e 20 20 2a 2f 0a 20 20 20 20  "rbu_".  */.    
a2d0: 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46  p->rc = prepareF
a2e0: 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  reeAndCollectErr
a2f0: 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20 26 70 53  or(p->dbRbu, &pS
a300: 74 6d 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  tmt, &p->zErrmsg
a310: 2c 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  , .        sqlit
a320: 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45  e3_mprintf("SELE
a330: 43 54 20 2a 20 46 52 4f 4d 20 27 25 71 27 22 2c  CT * FROM '%q'",
a340: 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c   pIter->zDataTbl
a350: 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  ).    );.    if(
a360: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
a370: 4b 20 29 7b 0a 20 20 20 20 20 20 6e 43 6f 6c 20  K ){.      nCol 
a380: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
a390: 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20  _count(pStmt);. 
a3a0: 20 20 20 20 20 72 62 75 41 6c 6c 6f 63 61 74 65       rbuAllocate
a3b0: 49 74 65 72 41 72 72 61 79 73 28 70 2c 20 70 49  IterArrays(p, pI
a3c0: 74 65 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  ter, nCol);.    
a3d0: 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 70  }.    for(i=0; p
a3e0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
a3f0: 26 26 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  && i<nCol; i++){
a400: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
a410: 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73  r *zName = (cons
a420: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
a430: 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d  column_name(pStm
a440: 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  t, i);.      if(
a450: 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d   sqlite3_strnicm
a460: 70 28 22 72 62 75 5f 22 2c 20 7a 4e 61 6d 65 2c  p("rbu_", zName,
a470: 20 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63   4) ){.        c
a480: 68 61 72 20 2a 7a 43 6f 70 79 20 3d 20 72 62 75  har *zCopy = rbu
a490: 53 74 72 6e 64 75 70 28 7a 4e 61 6d 65 2c 20 26  Strndup(zName, &
a4a0: 70 2d 3e 72 63 29 3b 0a 20 20 20 20 20 20 20 20  p->rc);.        
a4b0: 70 49 74 65 72 2d 3e 61 69 53 72 63 4f 72 64 65  pIter->aiSrcOrde
a4c0: 72 5b 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c  r[pIter->nTblCol
a4d0: 5d 20 3d 20 70 49 74 65 72 2d 3e 6e 54 62 6c 43  ] = pIter->nTblC
a4e0: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65  ol;.        pIte
a4f0: 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 70 49 74 65  r->azTblCol[pIte
a500: 72 2d 3e 6e 54 62 6c 43 6f 6c 2b 2b 5d 20 3d 20  r->nTblCol++] = 
a510: 7a 43 6f 70 79 3b 0a 20 20 20 20 20 20 7d 0a 20  zCopy;.      }. 
a520: 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 30 3d       else if( 0=
a530: 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70  =sqlite3_stricmp
a540: 28 22 72 62 75 5f 72 6f 77 69 64 22 2c 20 7a 4e  ("rbu_rowid", zN
a550: 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ame) ){.        
a560: 62 52 62 75 52 6f 77 69 64 20 3d 20 31 3b 0a 20  bRbuRowid = 1;. 
a570: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
a580: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
a590: 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 70 53  e(pStmt);.    pS
a5a0: 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  tmt = 0;..    if
a5b0: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
a5c0: 4f 4b 0a 20 20 20 20 20 26 26 20 62 52 62 75 52  OK.     && bRbuR
a5d0: 6f 77 69 64 21 3d 28 70 49 74 65 72 2d 3e 65 54  owid!=(pIter->eT
a5e0: 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 56 54 41 42  ype==RBU_PK_VTAB
a5f0: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65   || pIter->eType
a600: 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 29 0a 20  ==RBU_PK_NONE). 
a610: 20 20 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72     ){.      p->r
a620: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
a630: 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 6d  ;.      p->zErrm
a640: 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
a650: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
a660: 22 74 61 62 6c 65 20 25 71 20 25 73 20 72 62 75  "table %q %s rbu
a670: 5f 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 22 2c 20  _rowid column", 
a680: 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 2c  pIter->zDataTbl,
a690: 0a 20 20 20 20 20 20 20 20 20 20 28 62 52 62 75  .          (bRbu
a6a0: 52 6f 77 69 64 20 3f 20 22 6d 61 79 20 6e 6f 74  Rowid ? "may not
a6b0: 20 68 61 76 65 22 20 3a 20 22 72 65 71 75 69 72   have" : "requir
a6c0: 65 73 22 29 0a 20 20 20 20 20 20 29 3b 0a 20 20  es").      );.  
a6d0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
a6e0: 6b 20 74 68 61 74 20 61 6c 6c 20 6e 6f 6e 2d 48  k that all non-H
a6f0: 49 44 44 45 4e 20 63 6f 6c 75 6d 6e 73 20 69 6e  IDDEN columns in
a700: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
a710: 20 74 61 62 6c 65 20 61 72 65 20 61 6c 73 6f 0a   table are also.
a720: 20 20 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 69      ** present i
a730: 6e 20 74 68 65 20 69 6e 70 75 74 20 74 61 62 6c  n the input tabl
a740: 65 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  e. Populate the 
a750: 61 62 54 62 6c 50 6b 5b 5d 2c 20 61 7a 54 62 6c  abTblPk[], azTbl
a760: 54 79 70 65 5b 5d 20 61 6e 64 0a 20 20 20 20 2a  Type[] and.    *
a770: 2a 20 61 69 54 62 6c 4f 72 64 65 72 5b 5d 20 61  * aiTblOrder[] a
a780: 72 72 61 79 73 20 61 74 20 74 68 65 20 73 61 6d  rrays at the sam
a790: 65 20 74 69 6d 65 2e 20 20 2a 2f 0a 20 20 20 20  e time.  */.    
a7a0: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
a7b0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
a7c0: 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65  >rc = prepareFre
a7d0: 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72  eAndCollectError
a7e0: 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 53 74  (p->dbMain, &pSt
a7f0: 6d 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c  mt, &p->zErrmsg,
a800: 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69   .          sqli
a810: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41  te3_mprintf("PRA
a820: 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 28 25  GMA table_info(%
a830: 51 29 22 2c 20 70 49 74 65 72 2d 3e 7a 54 62 6c  Q)", pIter->zTbl
a840: 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  ).      );.    }
a850: 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72  .    while( p->r
a860: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
a870: 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
a880: 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20  te3_step(pStmt) 
a890: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
a8a0: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f  har *zName = (co
a8b0: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
a8c0: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
a8d0: 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  tmt, 1);.      i
a8e0: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72  f( zName==0 ) br
a8f0: 65 61 6b 3b 20 20 2f 2a 20 41 6e 20 4f 4f 4d 20  eak;  /* An OOM 
a900: 2d 20 66 69 6e 61 6c 69 7a 65 28 29 20 62 65 6c  - finalize() bel
a910: 6f 77 20 72 65 74 75 72 6e 73 20 53 5f 4e 4f 4d  ow returns S_NOM
a920: 45 4d 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28  EM */.      for(
a930: 69 3d 69 4f 72 64 65 72 3b 20 69 3c 70 49 74 65  i=iOrder; i<pIte
a940: 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69 2b 2b 29  r->nTblCol; i++)
a950: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d  {.        if( 0=
a960: 3d 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 70  =strcmp(zName, p
a970: 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69  Iter->azTblCol[i
a980: 5d 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ]) ) break;.    
a990: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3d    }.      if( i=
a9a0: 3d 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20  =pIter->nTblCol 
a9b0: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63  ){.        p->rc
a9c0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
a9d0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72  .        p->zErr
a9e0: 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  msg = sqlite3_mp
a9f0: 72 69 6e 74 66 28 22 63 6f 6c 75 6d 6e 20 6d 69  rintf("column mi
aa00: 73 73 69 6e 67 20 66 72 6f 6d 20 25 71 3a 20 25  ssing from %q: %
aa10: 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
aa20: 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 2c  pIter->zDataTbl,
aa30: 20 7a 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 29   zName.        )
aa40: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
aa50: 20 20 20 20 20 20 20 69 6e 74 20 69 50 6b 20 3d         int iPk =
aa60: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
aa70: 69 6e 74 28 70 53 74 6d 74 2c 20 35 29 3b 0a 20  int(pStmt, 5);. 
aa80: 20 20 20 20 20 20 20 69 6e 74 20 62 4e 6f 74 4e         int bNotN
aa90: 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ull = sqlite3_co
aaa0: 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20  lumn_int(pStmt, 
aab0: 33 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  3);.        cons
aac0: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20  t char *zType = 
aad0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
aae0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
aaf0: 28 70 53 74 6d 74 2c 20 32 29 3b 0a 0a 20 20 20  (pStmt, 2);..   
ab00: 20 20 20 20 20 69 66 28 20 69 21 3d 69 4f 72 64       if( i!=iOrd
ab10: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  er ){.          
ab20: 53 57 41 50 28 69 6e 74 2c 20 70 49 74 65 72 2d  SWAP(int, pIter-
ab30: 3e 61 69 53 72 63 4f 72 64 65 72 5b 69 5d 2c 20  >aiSrcOrder[i], 
ab40: 70 49 74 65 72 2d 3e 61 69 53 72 63 4f 72 64 65  pIter->aiSrcOrde
ab50: 72 5b 69 4f 72 64 65 72 5d 29 3b 0a 20 20 20 20  r[iOrder]);.    
ab60: 20 20 20 20 20 20 53 57 41 50 28 63 68 61 72 2a        SWAP(char*
ab70: 2c 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f  , pIter->azTblCo
ab80: 6c 5b 69 5d 2c 20 70 49 74 65 72 2d 3e 61 7a 54  l[i], pIter->azT
ab90: 62 6c 43 6f 6c 5b 69 4f 72 64 65 72 5d 29 3b 0a  blCol[iOrder]);.
aba0: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
abb0: 20 20 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 54     pIter->azTblT
abc0: 79 70 65 5b 69 4f 72 64 65 72 5d 20 3d 20 72 62  ype[iOrder] = rb
abd0: 75 53 74 72 6e 64 75 70 28 7a 54 79 70 65 2c 20  uStrndup(zType, 
abe0: 26 70 2d 3e 72 63 29 3b 0a 20 20 20 20 20 20 20  &p->rc);.       
abf0: 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b   pIter->abTblPk[
ac00: 69 4f 72 64 65 72 5d 20 3d 20 28 69 50 6b 21 3d  iOrder] = (iPk!=
ac10: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65  0);.        pIte
ac20: 72 2d 3e 61 62 4e 6f 74 4e 75 6c 6c 5b 69 4f 72  r->abNotNull[iOr
ac30: 64 65 72 5d 20 3d 20 28 75 38 29 62 4e 6f 74 4e  der] = (u8)bNotN
ac40: 75 6c 6c 20 7c 7c 20 28 69 50 6b 21 3d 30 29 3b  ull || (iPk!=0);
ac50: 0a 20 20 20 20 20 20 20 20 69 4f 72 64 65 72 2b  .        iOrder+
ac60: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
ac70: 0a 0a 20 20 20 20 72 62 75 46 69 6e 61 6c 69 7a  ..    rbuFinaliz
ac80: 65 28 70 2c 20 70 53 74 6d 74 29 3b 0a 20 20 20  e(p, pStmt);.   
ac90: 20 72 62 75 4f 62 6a 49 74 65 72 43 61 63 68 65   rbuObjIterCache
aca0: 49 6e 64 65 78 65 64 43 6f 6c 73 28 70 2c 20 70  IndexedCols(p, p
acb0: 49 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  Iter);.    asser
acc0: 74 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65 21  t( pIter->eType!
acd0: 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20 7c 7c 20  =RBU_PK_VTAB || 
ace0: 70 49 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64  pIter->abIndexed
acf0: 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  ==0 );.  }..  re
ad00: 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f  turn p->rc;.}../
ad10: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
ad20: 6f 6e 20 63 6f 6e 73 74 72 75 63 74 73 20 61 6e  on constructs an
ad30: 64 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  d returns a poin
ad40: 74 65 72 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72  ter to a nul-ter
ad50: 6d 69 6e 61 74 65 64 20 0a 2a 2a 20 73 74 72 69  minated .** stri
ad60: 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73 6f  ng containing so
ad70: 6d 65 20 53 51 4c 20 63 6c 61 75 73 65 20 6f 72  me SQL clause or
ad80: 20 6c 69 73 74 20 62 61 73 65 64 20 6f 6e 20 6f   list based on o
ad90: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
ada0: 65 20 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e .** column nam
adb0: 65 73 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  es currently sto
adc0: 72 65 64 20 69 6e 20 74 68 65 20 70 49 74 65 72  red in the pIter
add0: 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 5d 20 61 72 72  ->azTblCol[] arr
ade0: 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ay..*/.static ch
adf0: 61 72 20 2a 72 62 75 4f 62 6a 49 74 65 72 47 65  ar *rbuObjIterGe
ae00: 74 43 6f 6c 6c 69 73 74 28 0a 20 20 73 71 6c 69  tCollist(.  sqli
ae10: 74 65 33 72 62 75 20 2a 70 2c 20 20 20 20 20 20  te3rbu *p,      
ae20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
ae30: 42 55 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 52  BU object */.  R
ae40: 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72  buObjIter *pIter
ae50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ae60: 2a 20 4f 62 6a 65 63 74 20 69 74 65 72 61 74 6f  * Object iterato
ae70: 72 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 6e 61 6d  r for column nam
ae80: 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  es */.){.  char 
ae90: 2a 7a 4c 69 73 74 20 3d 20 30 3b 0a 20 20 63 6f  *zList = 0;.  co
aea0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70 20 3d  nst char *zSep =
aeb0: 20 22 22 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   "";.  int i;.  
aec0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72  for(i=0; i<pIter
aed0: 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69 2b 2b 29 7b  ->nTblCol; i++){
aee0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
aef0: 2a 7a 20 3d 20 70 49 74 65 72 2d 3e 61 7a 54 62  *z = pIter->azTb
af00: 6c 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 7a 4c 69  lCol[i];.    zLi
af10: 73 74 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28  st = rbuMPrintf(
af20: 70 2c 20 22 25 7a 25 73 5c 22 25 77 5c 22 22 2c  p, "%z%s\"%w\"",
af30: 20 7a 4c 69 73 74 2c 20 7a 53 65 70 2c 20 7a 29   zList, zSep, z)
af40: 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 20  ;.    zSep = ", 
af50: 22 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ";.  }.  return 
af60: 7a 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zList;.}../*.** 
af70: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
af80: 20 75 73 65 64 20 74 6f 20 63 72 65 61 74 65 20   used to create 
af90: 61 20 53 45 4c 45 43 54 20 6c 69 73 74 20 28 74  a SELECT list (t
afa0: 68 65 20 6c 69 73 74 20 6f 66 20 53 51 4c 20 0a  he list of SQL .
afb0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  ** expressions t
afc0: 68 61 74 20 66 6f 6c 6c 6f 77 73 20 61 20 53 45  hat follows a SE
afd0: 4c 45 43 54 20 6b 65 79 77 6f 72 64 29 20 66 6f  LECT keyword) fo
afe0: 72 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  r a SELECT state
aff0: 6d 65 6e 74 20 0a 2a 2a 20 75 73 65 64 20 74 6f  ment .** used to
b000: 20 72 65 61 64 20 66 72 6f 6d 20 61 6e 20 64 61   read from an da
b010: 74 61 5f 78 78 78 20 6f 72 20 72 62 75 5f 74 6d  ta_xxx or rbu_tm
b020: 70 5f 78 78 78 20 74 61 62 6c 65 20 77 68 69 6c  p_xxx table whil
b030: 65 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 0a  e updating the .
b040: 2a 2a 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20  ** index object 
b050: 63 75 72 72 65 6e 74 6c 79 20 69 6e 64 69 63 61  currently indica
b060: 74 65 64 20 62 79 20 74 68 65 20 69 74 65 72 61  ted by the itera
b070: 74 6f 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65  tor object passe
b080: 64 20 61 73 20 74 68 65 20 0a 2a 2a 20 73 65 63  d as the .** sec
b090: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20 41 20  ond argument. A 
b0a0: 22 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 78 69  "PRAGMA index_xi
b0b0: 6e 66 6f 20 3d 20 3c 69 64 78 6e 61 6d 65 3e 22  nfo = <idxname>"
b0c0: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 75 73   statement is us
b0d0: 65 64 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e  ed .** to obtain
b0e0: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 69 6e   the required in
b0f0: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  formation..**.**
b100: 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 69 73   If the index is
b110: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
b120: 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  g form:.**.**   
b130: 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
b140: 4f 4e 20 74 31 28 63 2c 20 62 20 43 4f 4c 4c 41  ON t1(c, b COLLA
b150: 54 45 20 6e 6f 63 61 73 65 29 3b 0a 2a 2a 0a 2a  TE nocase);.**.*
b160: 2a 20 61 6e 64 20 22 74 31 22 20 69 73 20 61 20  * and "t1" is a 
b170: 74 61 62 6c 65 20 77 69 74 68 20 61 6e 20 65 78  table with an ex
b180: 70 6c 69 63 69 74 20 49 4e 54 45 47 45 52 20 50  plicit INTEGER P
b190: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
b1a0: 6e 20 0a 2a 2a 20 22 69 70 6b 22 2c 20 74 68 65  n .** "ipk", the
b1b0: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
b1c0: 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 60 63   is:.**.**   "`c
b1d0: 60 20 43 4f 4c 4c 41 54 45 20 27 42 49 4e 41 52  ` COLLATE 'BINAR
b1e0: 59 27 2c 20 60 62 60 20 43 4f 4c 4c 41 54 45 20  Y', `b` COLLATE 
b1f0: 27 4e 4f 43 41 53 45 27 2c 20 60 69 70 6b 60 20  'NOCASE', `ipk` 
b200: 43 4f 4c 4c 41 54 45 20 27 42 49 4e 41 52 59 27  COLLATE 'BINARY'
b210: 22 0a 2a 2a 0a 2a 2a 20 41 73 20 77 65 6c 6c 20  ".**.** As well 
b220: 61 73 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  as the returned 
b230: 73 74 72 69 6e 67 2c 20 74 68 72 65 65 20 6f 74  string, three ot
b240: 68 65 72 20 6d 61 6c 6c 6f 63 27 64 20 73 74 72  her malloc'd str
b250: 69 6e 67 73 20 61 72 65 20 0a 2a 2a 20 72 65 74  ings are .** ret
b260: 75 72 6e 65 64 20 76 69 61 20 6f 75 74 70 75 74  urned via output
b270: 20 70 61 72 61 6d 65 74 65 72 73 2e 20 41 73 20   parameters. As 
b280: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
b290: 20 70 7a 49 6d 70 6f 73 74 65 72 43 6f 6c 73 3a   pzImposterCols:
b2a0: 20 2e 2e 2e 0a 2a 2a 20 20 20 70 7a 49 6d 70 6f   ....**   pzImpo
b2b0: 73 74 65 72 50 6b 3a 20 2e 2e 2e 0a 2a 2a 20 20  sterPk: ....**  
b2c0: 20 70 7a 57 68 65 72 65 3a 20 2e 2e 2e 0a 2a 2f   pzWhere: ....*/
b2d0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 62  .static char *rb
b2e0: 75 4f 62 6a 49 74 65 72 47 65 74 49 6e 64 65 78  uObjIterGetIndex
b2f0: 43 6f 6c 73 28 0a 20 20 73 71 6c 69 74 65 33 72  Cols(.  sqlite3r
b300: 62 75 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  bu *p,          
b310: 20 20 20 20 20 20 20 20 2f 2a 20 52 42 55 20 6f          /* RBU o
b320: 62 6a 65 63 74 20 2a 2f 0a 20 20 52 62 75 4f 62  bject */.  RbuOb
b330: 6a 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20  jIter *pIter,   
b340: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62             /* Ob
b350: 6a 65 63 74 20 69 74 65 72 61 74 6f 72 20 66 6f  ject iterator fo
b360: 72 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  r column names *
b370: 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 49 6d 70  /.  char **pzImp
b380: 6f 73 74 65 72 43 6f 6c 73 2c 20 20 20 20 20 20  osterCols,      
b390: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43 6f 6c 75      /* OUT: Colu
b3a0: 6d 6e 73 20 66 6f 72 20 69 6d 70 6f 73 74 65 72  mns for imposter
b3b0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 68 61 72   table */.  char
b3c0: 20 2a 2a 70 7a 49 6d 70 6f 73 74 65 72 50 6b 2c   **pzImposterPk,
b3d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
b3e0: 55 54 3a 20 49 6d 70 6f 73 74 65 72 20 50 4b 20  UT: Imposter PK 
b3f0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 63 68 61 72  clause */.  char
b400: 20 2a 2a 70 7a 57 68 65 72 65 2c 20 20 20 20 20   **pzWhere,     
b410: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
b420: 55 54 3a 20 57 48 45 52 45 20 63 6c 61 75 73 65  UT: WHERE clause
b430: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 42 69 6e   */.  int *pnBin
b440: 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
b450: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 72        /* OUT: Tr
b460: 62 75 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  bul number of co
b470: 6c 75 6d 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  lumns */.){.  in
b480: 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 20 20 20  t rc = p->rc;   
b490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b4a0: 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   Error code */. 
b4b0: 20 69 6e 74 20 72 63 32 3b 20 20 20 20 20 20 20   int rc2;       
b4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4d0: 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 69 6e 61   /* sqlite3_fina
b4e0: 6c 69 7a 65 28 29 20 72 65 74 75 72 6e 20 63 6f  lize() return co
b4f0: 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 52  de */.  char *zR
b500: 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  et = 0;         
b510: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e          /* Strin
b520: 67 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  g to return */. 
b530: 20 63 68 61 72 20 2a 7a 49 6d 70 43 6f 6c 73 20   char *zImpCols 
b540: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
b550: 20 2f 2a 20 53 74 72 69 6e 67 20 74 6f 20 72 65   /* String to re
b560: 74 75 72 6e 20 76 69 61 20 2a 70 7a 49 6d 70 6f  turn via *pzImpo
b570: 73 74 65 72 43 6f 6c 73 20 2a 2f 0a 20 20 63 68  sterCols */.  ch
b580: 61 72 20 2a 7a 49 6d 70 50 4b 20 3d 20 30 3b 20  ar *zImpPK = 0; 
b590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b5a0: 20 53 74 72 69 6e 67 20 74 6f 20 72 65 74 75 72   String to retur
b5b0: 6e 20 76 69 61 20 2a 70 7a 49 6d 70 6f 73 74 65  n via *pzImposte
b5c0: 72 50 4b 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  rPK */.  char *z
b5d0: 57 68 65 72 65 20 3d 20 30 3b 20 20 20 20 20 20  Where = 0;      
b5e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69           /* Stri
b5f0: 6e 67 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61  ng to return via
b600: 20 2a 70 7a 57 68 65 72 65 20 2a 2f 0a 20 20 69   *pzWhere */.  i
b610: 6e 74 20 6e 42 69 6e 64 20 3d 20 30 3b 20 20 20  nt nBind = 0;   
b620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b630: 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
b640: 6e 20 76 69 61 20 2a 70 6e 42 69 6e 64 20 2a 2f  n via *pnBind */
b650: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
b660: 43 6f 6d 20 3d 20 22 22 3b 20 20 20 20 20 20 20  Com = "";       
b670: 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 22 2c 20     /* Set to ", 
b680: 22 20 6c 61 74 65 72 20 6f 6e 20 2a 2f 0a 20 20  " later on */.  
b690: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 6e 64  const char *zAnd
b6a0: 20 3d 20 22 22 3b 20 20 20 20 20 20 20 20 20 20   = "";          
b6b0: 2f 2a 20 53 65 74 20 74 6f 20 22 20 41 4e 44 20  /* Set to " AND 
b6c0: 22 20 6c 61 74 65 72 20 6f 6e 20 2a 2f 0a 20 20  " later on */.  
b6d0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 58  sqlite3_stmt *pX
b6e0: 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 20  Info = 0;       
b6f0: 2f 2a 20 50 52 41 47 4d 41 20 69 6e 64 65 78 5f  /* PRAGMA index_
b700: 78 69 6e 66 6f 20 3d 20 3f 20 2a 2f 0a 0a 20 20  xinfo = ? */..  
b710: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
b720: 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
b730: 20 70 2d 3e 7a 45 72 72 6d 73 67 3d 3d 30 20 29   p->zErrmsg==0 )
b740: 3b 0a 20 20 20 20 72 63 20 3d 20 70 72 65 70 61  ;.    rc = prepa
b750: 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74  reFreeAndCollect
b760: 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c  Error(p->dbMain,
b770: 20 26 70 58 49 6e 66 6f 2c 20 26 70 2d 3e 7a 45   &pXInfo, &p->zE
b780: 72 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 73  rrmsg,.        s
b790: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
b7a0: 50 52 41 47 4d 41 20 6d 61 69 6e 2e 69 6e 64 65  PRAGMA main.inde
b7b0: 78 5f 78 69 6e 66 6f 20 3d 20 25 51 22 2c 20 70  x_xinfo = %Q", p
b7c0: 49 74 65 72 2d 3e 7a 49 64 78 29 0a 20 20 20 20  Iter->zIdx).    
b7d0: 29 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28  );.  }..  while(
b7e0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
b7f0: 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  & SQLITE_ROW==sq
b800: 6c 69 74 65 33 5f 73 74 65 70 28 70 58 49 6e 66  lite3_step(pXInf
b810: 6f 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 43  o) ){.    int iC
b820: 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  id = sqlite3_col
b830: 75 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20  umn_int(pXInfo, 
b840: 31 29 3b 0a 20 20 20 20 69 6e 74 20 62 44 65 73  1);.    int bDes
b850: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  c = sqlite3_colu
b860: 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20 33  mn_int(pXInfo, 3
b870: 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  );.    const cha
b880: 72 20 2a 7a 43 6f 6c 6c 61 74 65 20 3d 20 28 63  r *zCollate = (c
b890: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
b8a0: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
b8b0: 58 49 6e 66 6f 2c 20 34 29 3b 0a 20 20 20 20 63  XInfo, 4);.    c
b8c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 3b  onst char *zCol;
b8d0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
b8e0: 2a 7a 54 79 70 65 3b 0a 0a 20 20 20 20 69 66 28  *zType;..    if(
b8f0: 20 69 43 69 64 3c 30 20 29 7b 0a 20 20 20 20 20   iCid<0 ){.     
b900: 20 2f 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 70   /* An integer p
b910: 72 69 6d 61 72 79 20 6b 65 79 2e 20 49 66 20 74  rimary key. If t
b920: 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20  he table has an 
b930: 65 78 70 6c 69 63 69 74 20 49 50 4b 2c 20 75 73  explicit IPK, us
b940: 65 0a 20 20 20 20 20 20 2a 2a 20 69 74 73 20 6e  e.      ** its n
b950: 61 6d 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ame. Otherwise, 
b960: 75 73 65 20 22 72 62 75 5f 72 6f 77 69 64 22 2e  use "rbu_rowid".
b970: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
b980: 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55  Iter->eType==RBU
b990: 5f 50 4b 5f 49 50 4b 20 29 7b 0a 20 20 20 20 20  _PK_IPK ){.     
b9a0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
b9b0: 20 20 66 6f 72 28 69 3d 30 3b 20 70 49 74 65 72    for(i=0; pIter
b9c0: 2d 3e 61 62 54 62 6c 50 6b 5b 69 5d 3d 3d 30 3b  ->abTblPk[i]==0;
b9d0: 20 69 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 61   i++);.        a
b9e0: 73 73 65 72 74 28 20 69 3c 70 49 74 65 72 2d 3e  ssert( i<pIter->
b9f0: 6e 54 62 6c 43 6f 6c 20 29 3b 0a 20 20 20 20 20  nTblCol );.     
ba00: 20 20 20 7a 43 6f 6c 20 3d 20 70 49 74 65 72 2d     zCol = pIter-
ba10: 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 3b 0a 20 20  >azTblCol[i];.  
ba20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ba30: 20 20 20 7a 43 6f 6c 20 3d 20 22 72 62 75 5f 72     zCol = "rbu_r
ba40: 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 0a 20  owid";.      }. 
ba50: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e       zType = "IN
ba60: 54 45 47 45 52 22 3b 0a 20 20 20 20 7d 65 6c 73  TEGER";.    }els
ba70: 65 7b 0a 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  e{.      zCol = 
ba80: 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b  pIter->azTblCol[
ba90: 69 43 69 64 5d 3b 0a 20 20 20 20 20 20 7a 54 79  iCid];.      zTy
baa0: 70 65 20 3d 20 70 49 74 65 72 2d 3e 61 7a 54 62  pe = pIter->azTb
bab0: 6c 54 79 70 65 5b 69 43 69 64 5d 3b 0a 20 20 20  lType[iCid];.   
bac0: 20 7d 0a 0a 20 20 20 20 7a 52 65 74 20 3d 20 73   }..    zRet = s
bad0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
bae0: 25 7a 25 73 5c 22 25 77 5c 22 20 43 4f 4c 4c 41  %z%s\"%w\" COLLA
baf0: 54 45 20 25 51 22 2c 20 7a 52 65 74 2c 20 7a 43  TE %Q", zRet, zC
bb00: 6f 6d 2c 20 7a 43 6f 6c 2c 20 7a 43 6f 6c 6c 61  om, zCol, zColla
bb10: 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74  te);.    if( pIt
bb20: 65 72 2d 3e 62 55 6e 69 71 75 65 3d 3d 30 20 7c  er->bUnique==0 |
bb30: 7c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  | sqlite3_column
bb40: 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20 35 29 20  _int(pXInfo, 5) 
bb50: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
bb60: 68 61 72 20 2a 7a 4f 72 64 65 72 20 3d 20 28 62  har *zOrder = (b
bb70: 44 65 73 63 20 3f 20 22 20 44 45 53 43 22 20 3a  Desc ? " DESC" :
bb80: 20 22 22 29 3b 0a 20 20 20 20 20 20 7a 49 6d 70   "");.      zImp
bb90: 50 4b 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  PK = sqlite3_mpr
bba0: 69 6e 74 66 28 22 25 7a 25 73 5c 22 72 62 75 5f  intf("%z%s\"rbu_
bbb0: 69 6d 70 5f 25 64 25 77 5c 22 25 73 22 2c 20 0a  imp_%d%w\"%s", .
bbc0: 20 20 20 20 20 20 20 20 20 20 7a 49 6d 70 50 4b            zImpPK
bbd0: 2c 20 7a 43 6f 6d 2c 20 6e 42 69 6e 64 2c 20 7a  , zCom, nBind, z
bbe0: 43 6f 6c 2c 20 7a 4f 72 64 65 72 0a 20 20 20 20  Col, zOrder.    
bbf0: 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a    );.    }.    z
bc00: 49 6d 70 43 6f 6c 73 20 3d 20 73 71 6c 69 74 65  ImpCols = sqlite
bc10: 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 25 73 5c  3_mprintf("%z%s\
bc20: 22 72 62 75 5f 69 6d 70 5f 25 64 25 77 5c 22 20  "rbu_imp_%d%w\" 
bc30: 25 73 20 43 4f 4c 4c 41 54 45 20 25 51 22 2c 20  %s COLLATE %Q", 
bc40: 0a 20 20 20 20 20 20 20 20 7a 49 6d 70 43 6f 6c  .        zImpCol
bc50: 73 2c 20 7a 43 6f 6d 2c 20 6e 42 69 6e 64 2c 20  s, zCom, nBind, 
bc60: 7a 43 6f 6c 2c 20 7a 54 79 70 65 2c 20 7a 43 6f  zCol, zType, zCo
bc70: 6c 6c 61 74 65 0a 20 20 20 20 29 3b 0a 20 20 20  llate.    );.   
bc80: 20 7a 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65   zWhere = sqlite
bc90: 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
bca0: 20 20 20 22 25 7a 25 73 5c 22 72 62 75 5f 69 6d     "%z%s\"rbu_im
bcb0: 70 5f 25 64 25 77 5c 22 20 49 53 20 3f 22 2c 20  p_%d%w\" IS ?", 
bcc0: 7a 57 68 65 72 65 2c 20 7a 41 6e 64 2c 20 6e 42  zWhere, zAnd, nB
bcd0: 69 6e 64 2c 20 7a 43 6f 6c 0a 20 20 20 20 29 3b  ind, zCol.    );
bce0: 0a 20 20 20 20 69 66 28 20 7a 52 65 74 3d 3d 30  .    if( zRet==0
bcf0: 20 7c 7c 20 7a 49 6d 70 50 4b 3d 3d 30 20 7c 7c   || zImpPK==0 ||
bd00: 20 7a 49 6d 70 43 6f 6c 73 3d 3d 30 20 7c 7c 20   zImpCols==0 || 
bd10: 7a 57 68 65 72 65 3d 3d 30 20 29 20 72 63 20 3d  zWhere==0 ) rc =
bd20: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
bd30: 20 20 20 7a 43 6f 6d 20 3d 20 22 2c 20 22 3b 0a     zCom = ", ";.
bd40: 20 20 20 20 7a 41 6e 64 20 3d 20 22 20 41 4e 44      zAnd = " AND
bd50: 20 22 3b 0a 20 20 20 20 6e 42 69 6e 64 2b 2b 3b   ";.    nBind++;
bd60: 0a 20 20 7d 0a 0a 20 20 72 63 32 20 3d 20 73 71  .  }..  rc2 = sq
bd70: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
bd80: 58 49 6e 66 6f 29 3b 0a 20 20 69 66 28 20 72 63  XInfo);.  if( rc
bd90: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  ==SQLITE_OK ) rc
bda0: 20 3d 20 72 63 32 3b 0a 0a 20 20 69 66 28 20 72   = rc2;..  if( r
bdb0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
bdc0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
bdd0: 28 7a 52 65 74 29 3b 0a 20 20 20 20 73 71 6c 69  (zRet);.    sqli
bde0: 74 65 33 5f 66 72 65 65 28 7a 49 6d 70 43 6f 6c  te3_free(zImpCol
bdf0: 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  s);.    sqlite3_
be00: 66 72 65 65 28 7a 49 6d 70 50 4b 29 3b 0a 20 20  free(zImpPK);.  
be10: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
be20: 57 68 65 72 65 29 3b 0a 20 20 20 20 7a 52 65 74  Where);.    zRet
be30: 20 3d 20 30 3b 0a 20 20 20 20 7a 49 6d 70 43 6f   = 0;.    zImpCo
be40: 6c 73 20 3d 20 30 3b 0a 20 20 20 20 7a 49 6d 70  ls = 0;.    zImp
be50: 50 4b 20 3d 20 30 3b 0a 20 20 20 20 7a 57 68 65  PK = 0;.    zWhe
be60: 72 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 72  re = 0;.    p->r
be70: 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2a  c = rc;.  }..  *
be80: 70 7a 49 6d 70 6f 73 74 65 72 43 6f 6c 73 20 3d  pzImposterCols =
be90: 20 7a 49 6d 70 43 6f 6c 73 3b 0a 20 20 2a 70 7a   zImpCols;.  *pz
bea0: 49 6d 70 6f 73 74 65 72 50 6b 20 3d 20 7a 49 6d  ImposterPk = zIm
beb0: 70 50 4b 3b 0a 20 20 2a 70 7a 57 68 65 72 65 20  pPK;.  *pzWhere 
bec0: 3d 20 7a 57 68 65 72 65 3b 0a 20 20 2a 70 6e 42  = zWhere;.  *pnB
bed0: 69 6e 64 20 3d 20 6e 42 69 6e 64 3b 0a 20 20 72  ind = nBind;.  r
bee0: 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 2f  eturn zRet;.}../
bef0: 2a 0a 2a 2a 20 41 73 73 75 6d 69 6e 67 20 74 68  *.** Assuming th
bf00: 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20  e current table 
bf10: 63 6f 6c 75 6d 6e 73 20 61 72 65 20 22 61 22 2c  columns are "a",
bf20: 20 22 62 22 20 61 6e 64 20 22 63 22 2c 20 61 6e   "b" and "c", an
bf30: 64 20 74 68 65 20 7a 4f 62 6a 0a 2a 2a 20 70 61  d the zObj.** pa
bf40: 72 61 6d 74 65 72 20 69 73 20 70 61 73 73 65 64  ramter is passed
bf50: 20 22 6f 6c 64 22 2c 20 72 65 74 75 72 6e 20 61   "old", return a
bf60: 20 73 74 72 69 6e 67 20 6f 66 20 74 68 65 20 66   string of the f
bf70: 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 22  orm:.**.**     "
bf80: 6f 6c 64 2e 61 2c 20 6f 6c 64 2e 62 2c 20 6f 6c  old.a, old.b, ol
bf90: 64 2e 62 22 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20  d.b".**.** With 
bfa0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
bfb0: 20 65 73 63 61 70 65 64 2e 0a 2a 2a 0a 2a 2a 20   escaped..**.** 
bfc0: 46 6f 72 20 74 61 62 6c 65 73 20 77 69 74 68 20  For tables with 
bfd0: 69 6d 70 6c 69 63 69 74 20 72 6f 77 69 64 73 20  implicit rowids 
bfe0: 2d 20 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41  - RBU_PK_EXTERNA
bff0: 4c 20 61 6e 64 20 52 42 55 5f 50 4b 5f 4e 4f 4e  L and RBU_PK_NON
c000: 45 2c 20 61 70 70 65 6e 64 0a 2a 2a 20 74 68 65  E, append.** the
c010: 20 74 65 78 74 20 22 2c 20 6f 6c 64 2e 5f 72 6f   text ", old._ro
c020: 77 69 64 5f 22 20 74 6f 20 74 68 65 20 72 65 74  wid_" to the ret
c030: 75 72 6e 65 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a  urned value..*/.
c040: 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 62 75  static char *rbu
c050: 4f 62 6a 49 74 65 72 47 65 74 4f 6c 64 6c 69 73  ObjIterGetOldlis
c060: 74 28 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20  t(.  sqlite3rbu 
c070: 2a 70 2c 20 0a 20 20 52 62 75 4f 62 6a 49 74 65  *p, .  RbuObjIte
c080: 72 20 2a 70 49 74 65 72 2c 0a 20 20 63 6f 6e 73  r *pIter,.  cons
c090: 74 20 63 68 61 72 20 2a 7a 4f 62 6a 0a 29 7b 0a  t char *zObj.){.
c0a0: 20 20 63 68 61 72 20 2a 7a 4c 69 73 74 20 3d 20    char *zList = 
c0b0: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  0;.  if( p->rc==
c0c0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49 74  SQLITE_OK && pIt
c0d0: 65 72 2d 3e 61 62 49 6e 64 65 78 65 64 20 29 7b  er->abIndexed ){
c0e0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
c0f0: 2a 7a 53 20 3d 20 22 22 3b 0a 20 20 20 20 69 6e  *zS = "";.    in
c100: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
c110: 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43  ; i<pIter->nTblC
c120: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
c130: 69 66 28 20 70 49 74 65 72 2d 3e 61 62 49 6e 64  if( pIter->abInd
c140: 65 78 65 64 5b 69 5d 20 29 7b 0a 20 20 20 20 20  exed[i] ){.     
c150: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
c160: 43 6f 6c 20 3d 20 70 49 74 65 72 2d 3e 61 7a 54  Col = pIter->azT
c170: 62 6c 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  blCol[i];.      
c180: 20 20 7a 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    zList = sqlite
c190: 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 25 73 25  3_mprintf("%z%s%
c1a0: 73 2e 5c 22 25 77 5c 22 22 2c 20 7a 4c 69 73 74  s.\"%w\"", zList
c1b0: 2c 20 7a 53 2c 20 7a 4f 62 6a 2c 20 7a 43 6f 6c  , zS, zObj, zCol
c1c0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
c1d0: 20 20 20 20 20 20 20 20 7a 4c 69 73 74 20 3d 20          zList = 
c1e0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
c1f0: 22 25 7a 25 73 4e 55 4c 4c 22 2c 20 7a 4c 69 73  "%z%sNULL", zLis
c200: 74 2c 20 7a 53 29 3b 0a 20 20 20 20 20 20 7d 0a  t, zS);.      }.
c210: 20 20 20 20 20 20 7a 53 20 3d 20 22 2c 20 22 3b        zS = ", ";
c220: 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69 73 74  .      if( zList
c230: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
c240: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
c250: 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 62 72 65  MEM;.        bre
c260: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
c270: 7d 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61 20  }..    /* For a 
c280: 74 61 62 6c 65 20 77 69 74 68 20 69 6d 70 6c 69  table with impli
c290: 63 69 74 20 72 6f 77 69 64 73 2c 20 61 70 70 65  cit rowids, appe
c2a0: 6e 64 20 22 6f 6c 64 2e 5f 72 6f 77 69 64 5f 22  nd "old._rowid_"
c2b0: 20 74 6f 20 74 68 65 20 6c 69 73 74 2e 20 2a 2f   to the list. */
c2c0: 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
c2d0: 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45 58  eType==RBU_PK_EX
c2e0: 54 45 52 4e 41 4c 20 7c 7c 20 70 49 74 65 72 2d  TERNAL || pIter-
c2f0: 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e  >eType==RBU_PK_N
c300: 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 7a 4c 69  ONE ){.      zLi
c310: 73 74 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28  st = rbuMPrintf(
c320: 70 2c 20 22 25 7a 2c 20 25 73 2e 5f 72 6f 77 69  p, "%z, %s._rowi
c330: 64 5f 22 2c 20 7a 4c 69 73 74 2c 20 7a 4f 62 6a  d_", zList, zObj
c340: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
c350: 65 74 75 72 6e 20 7a 4c 69 73 74 3b 0a 7d 0a 0a  eturn zList;.}..
c360: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20  /*.** Return an 
c370: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
c380: 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61  can be used in a
c390: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
c3a0: 20 6d 61 74 63 68 20 74 68 65 0a 2a 2a 20 70 72   match the.** pr
c3b0: 69 6d 61 72 79 20 6b 65 79 20 6f 66 20 74 68 65  imary key of the
c3c0: 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 2e 20   current table. 
c3d0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
c3e0: 74 68 65 20 74 61 62 6c 65 20 69 73 3a 0a 2a 2a  the table is:.**
c3f0: 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42  .**   CREATE TAB
c400: 4c 45 20 74 31 28 61 2c 20 62 2c 20 63 2c 20 50  LE t1(a, b, c, P
c410: 52 49 4d 41 52 59 20 4b 45 59 28 62 2c 20 63 29  RIMARY KEY(b, c)
c420: 29 3b 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  );.**.** Return 
c430: 74 68 65 20 73 74 72 69 6e 67 3a 0a 2a 2a 0a 2a  the string:.**.*
c440: 2a 20 20 20 22 62 20 3d 20 3f 31 20 41 4e 44 20  *   "b = ?1 AND 
c450: 63 20 3d 20 3f 32 22 0a 2a 2f 0a 73 74 61 74 69  c = ?2".*/.stati
c460: 63 20 63 68 61 72 20 2a 72 62 75 4f 62 6a 49 74  c char *rbuObjIt
c470: 65 72 47 65 74 57 68 65 72 65 28 0a 20 20 73 71  erGetWhere(.  sq
c480: 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 0a 20 20  lite3rbu *p, .  
c490: 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65  RbuObjIter *pIte
c4a0: 72 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 69  r.){.  char *zLi
c4b0: 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 49  st = 0;.  if( pI
c4c0: 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f  ter->eType==RBU_
c4d0: 50 4b 5f 56 54 41 42 20 7c 7c 20 70 49 74 65 72  PK_VTAB || pIter
c4e0: 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
c4f0: 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 7a 4c 69 73  NONE ){.    zLis
c500: 74 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70  t = rbuMPrintf(p
c510: 2c 20 22 5f 72 6f 77 69 64 5f 20 3d 20 3f 25 64  , "_rowid_ = ?%d
c520: 22 2c 20 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f  ", pIter->nTblCo
c530: 6c 2b 31 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  l+1);.  }else if
c540: 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  ( pIter->eType==
c550: 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20  RBU_PK_EXTERNAL 
c560: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
c570: 72 20 2a 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20  r *zSep = "";.  
c580: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
c590: 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e  (i=0; i<pIter->n
c5a0: 54 62 6c 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  TblCol; i++){.  
c5b0: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 61      if( pIter->a
c5c0: 62 54 62 6c 50 6b 5b 69 5d 20 29 7b 0a 20 20 20  bTblPk[i] ){.   
c5d0: 20 20 20 20 20 7a 4c 69 73 74 20 3d 20 72 62 75       zList = rbu
c5e0: 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 25 73  MPrintf(p, "%z%s
c5f0: 63 25 64 3d 3f 25 64 22 2c 20 7a 4c 69 73 74 2c  c%d=?%d", zList,
c600: 20 7a 53 65 70 2c 20 69 2c 20 69 2b 31 29 3b 0a   zSep, i, i+1);.
c610: 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22          zSep = "
c620: 20 41 4e 44 20 22 3b 0a 20 20 20 20 20 20 7d 0a   AND ";.      }.
c630: 20 20 20 20 7d 0a 20 20 20 20 7a 4c 69 73 74 20      }.    zList 
c640: 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20  = rbuMPrintf(p, 
c650: 0a 20 20 20 20 20 20 20 20 22 5f 72 6f 77 69 64  .        "_rowid
c660: 5f 20 3d 20 28 53 45 4c 45 43 54 20 69 64 20 46  _ = (SELECT id F
c670: 52 4f 4d 20 72 62 75 5f 69 6d 70 6f 73 74 65 72  ROM rbu_imposter
c680: 32 20 57 48 45 52 45 20 25 7a 29 22 2c 20 7a 4c  2 WHERE %z)", zL
c690: 69 73 74 0a 20 20 20 20 29 3b 0a 0a 20 20 7d 65  ist.    );..  }e
c6a0: 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  lse{.    const c
c6b0: 68 61 72 20 2a 7a 53 65 70 20 3d 20 22 22 3b 0a  har *zSep = "";.
c6c0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
c6d0: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d  or(i=0; i<pIter-
c6e0: 3e 6e 54 62 6c 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nTblCol; i++){.
c6f0: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
c700: 3e 61 62 54 62 6c 50 6b 5b 69 5d 20 29 7b 0a 20  >abTblPk[i] ){. 
c710: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
c720: 72 20 2a 7a 43 6f 6c 20 3d 20 70 49 74 65 72 2d  r *zCol = pIter-
c730: 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 3b 0a 20 20  >azTblCol[i];.  
c740: 20 20 20 20 20 20 7a 4c 69 73 74 20 3d 20 72 62        zList = rb
c750: 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 25  uMPrintf(p, "%z%
c760: 73 5c 22 25 77 5c 22 3d 3f 25 64 22 2c 20 7a 4c  s\"%w\"=?%d", zL
c770: 69 73 74 2c 20 7a 53 65 70 2c 20 7a 43 6f 6c 2c  ist, zSep, zCol,
c780: 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7a   i+1);.        z
c790: 53 65 70 20 3d 20 22 20 41 4e 44 20 22 3b 0a 20  Sep = " AND ";. 
c7a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
c7b0: 0a 20 20 72 65 74 75 72 6e 20 7a 4c 69 73 74 3b  .  return zList;
c7c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 53 45  .}../*.** The SE
c7d0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
c7e0: 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68  terating through
c7f0: 20 74 68 65 20 6b 65 79 73 20 66 6f 72 20 74 68   the keys for th
c800: 65 20 63 75 72 72 65 6e 74 20 6f 62 6a 65 63 74  e current object
c810: 0a 2a 2a 20 28 70 2d 3e 6f 62 6a 69 74 65 72 2e  .** (p->objiter.
c820: 70 53 65 6c 65 63 74 29 20 63 75 72 72 65 6e 74  pSelect) current
c830: 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 76  ly points to a v
c840: 61 6c 69 64 20 72 6f 77 2e 20 48 6f 77 65 76 65  alid row. Howeve
c850: 72 2c 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 73  r, there.** is s
c860: 6f 6d 65 74 68 69 6e 67 20 77 72 6f 6e 67 20 77  omething wrong w
c870: 69 74 68 20 74 68 65 20 72 62 75 5f 63 6f 6e 74  ith the rbu_cont
c880: 72 6f 6c 20 76 61 6c 75 65 20 69 6e 20 74 68 65  rol value in the
c890: 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 76 61 6c   rbu_control val
c8a0: 75 65 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  ue.** stored in 
c8b0: 74 68 65 20 28 70 2d 3e 6e 43 6f 6c 2b 31 29 27  the (p->nCol+1)'
c8c0: 74 68 20 63 6f 6c 75 6d 6e 2e 20 53 65 74 20 74  th column. Set t
c8d0: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  he error code an
c8e0: 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  d error message.
c8f0: 2a 2a 20 6f 66 20 74 68 65 20 52 42 55 20 68 61  ** of the RBU ha
c900: 6e 64 6c 65 20 74 6f 20 73 6f 6d 65 74 68 69 6e  ndle to somethin
c910: 67 20 72 65 66 6c 65 63 74 69 6e 67 20 74 68 69  g reflecting thi
c920: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
c930: 64 20 72 62 75 42 61 64 43 6f 6e 74 72 6f 6c 45  d rbuBadControlE
c940: 72 72 6f 72 28 73 71 6c 69 74 65 33 72 62 75 20  rror(sqlite3rbu 
c950: 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53  *p){.  p->rc = S
c960: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 70  QLITE_ERROR;.  p
c970: 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69  ->zErrmsg = sqli
c980: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 69 6e 76  te3_mprintf("inv
c990: 61 6c 69 64 20 72 62 75 5f 63 6f 6e 74 72 6f 6c  alid rbu_control
c9a0: 20 76 61 6c 75 65 22 29 3b 0a 7d 0a 0a 0a 2f 2a   value");.}.../*
c9b0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6e 75 6c  .** Return a nul
c9c0: 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
c9d0: 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ng containing th
c9e0: 65 20 63 6f 6d 6d 61 20 73 65 70 61 72 61 74 65  e comma separate
c9f0: 64 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 61 73 73  d list of.** ass
ca00: 69 67 6e 6d 65 6e 74 73 20 74 68 61 74 20 73 68  ignments that sh
ca10: 6f 75 6c 64 20 62 65 20 69 6e 63 6c 75 64 65 64  ould be included
ca20: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 22   following the "
ca30: 53 45 54 22 20 6b 65 79 77 6f 72 64 20 6f 66 0a  SET" keyword of.
ca40: 2a 2a 20 61 6e 20 55 50 44 41 54 45 20 73 74 61  ** an UPDATE sta
ca50: 74 65 6d 65 6e 74 20 75 73 65 64 20 74 6f 20 75  tement used to u
ca60: 70 64 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  pdate the table 
ca70: 6f 62 6a 65 63 74 20 74 68 61 74 20 74 68 65 20  object that the 
ca80: 69 74 65 72 61 74 6f 72 0a 2a 2a 20 70 61 73 73  iterator.** pass
ca90: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
caa0: 20 61 72 67 75 6d 65 6e 74 20 63 75 72 72 65 6e   argument curren
cab0: 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 69 66  tly points to if
cac0: 20 74 68 65 20 72 62 75 5f 63 6f 6e 74 72 6f 6c   the rbu_control
cad0: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  .** column of th
cae0: 65 20 64 61 74 61 5f 78 78 78 20 74 61 62 6c 65  e data_xxx table
caf0: 20 65 6e 74 72 79 20 69 73 20 73 65 74 20 74 6f   entry is set to
cb00: 20 7a 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68   zMask..**.** Th
cb10: 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65  e memory for the
cb20: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
cb30: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
cb40: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
cb50: 28 29 2e 0a 2a 2a 20 49 74 20 69 73 20 74 68 65  ()..** It is the
cb60: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
cb70: 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
cb80: 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
cb90: 20 69 74 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c   it using.** sql
cba0: 69 74 65 33 5f 66 72 65 65 28 29 2e 20 0a 2a 2a  ite3_free(). .**
cbb0: 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72  .** If an OOM er
cbc0: 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
cbd0: 65 64 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74 69  ed when allocati
cbe0: 6e 67 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  ng space for the
cbf0: 20 6e 65 77 0a 2a 2a 20 73 74 72 69 6e 67 2c 20   new.** string, 
cc00: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
cc10: 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72 62 75   left in the rbu
cc20: 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61   handle passed a
cc30: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61  s the first.** a
cc40: 72 67 75 6d 65 6e 74 20 61 6e 64 20 4e 55 4c 4c  rgument and NULL
cc50: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72   is returned. Or
cc60: 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 68 61  , if an error ha
cc70: 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
cc80: 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20  ed.** when this 
cc90: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
cca0: 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  ed, NULL is retu
ccb0: 72 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  rned immediately
ccc0: 2c 20 77 69 74 68 6f 75 74 0a 2a 2a 20 61 74 74  , without.** att
ccd0: 65 6d 70 74 69 6e 67 20 74 68 65 20 61 6c 6c 6f  empting the allo
cce0: 63 61 74 69 6f 6e 20 6f 72 20 6d 6f 64 69 66 79  cation or modify
ccf0: 69 6e 67 20 74 68 65 20 73 74 6f 72 65 64 20 65  ing the stored e
cd00: 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
cd10: 61 74 69 63 20 63 68 61 72 20 2a 72 62 75 4f 62  atic char *rbuOb
cd20: 6a 49 74 65 72 47 65 74 53 65 74 6c 69 73 74 28  jIterGetSetlist(
cd30: 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70  .  sqlite3rbu *p
cd40: 2c 0a 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a  ,.  RbuObjIter *
cd50: 70 49 74 65 72 2c 0a 20 20 63 6f 6e 73 74 20 63  pIter,.  const c
cd60: 68 61 72 20 2a 7a 4d 61 73 6b 0a 29 7b 0a 20 20  har *zMask.){.  
cd70: 63 68 61 72 20 2a 7a 4c 69 73 74 20 3d 20 30 3b  char *zList = 0;
cd80: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
cd90: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
cda0: 6e 74 20 69 3b 0a 0a 20 20 20 20 69 66 28 20 28  nt i;..    if( (
cdb0: 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4d 61 73 6b  int)strlen(zMask
cdc0: 29 21 3d 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f  )!=pIter->nTblCo
cdd0: 6c 20 29 7b 0a 20 20 20 20 20 20 72 62 75 42 61  l ){.      rbuBa
cde0: 64 43 6f 6e 74 72 6f 6c 45 72 72 6f 72 28 70 29  dControlError(p)
cdf0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
ce00: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
ce10: 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 20 20  Sep = "";.      
ce20: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72  for(i=0; i<pIter
ce30: 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69 2b 2b 29 7b  ->nTblCol; i++){
ce40: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63 20  .        char c 
ce50: 3d 20 7a 4d 61 73 6b 5b 70 49 74 65 72 2d 3e 61  = zMask[pIter->a
ce60: 69 53 72 63 4f 72 64 65 72 5b 69 5d 5d 3b 0a 20  iSrcOrder[i]];. 
ce70: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 78         if( c=='x
ce80: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ' ){.          z
ce90: 4c 69 73 74 20 3d 20 72 62 75 4d 50 72 69 6e 74  List = rbuMPrint
cea0: 66 28 70 2c 20 22 25 7a 25 73 5c 22 25 77 5c 22  f(p, "%z%s\"%w\"
ceb0: 3d 3f 25 64 22 2c 20 0a 20 20 20 20 20 20 20 20  =?%d", .        
cec0: 20 20 20 20 20 20 7a 4c 69 73 74 2c 20 7a 53 65        zList, zSe
ced0: 70 2c 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43  p, pIter->azTblC
cee0: 6f 6c 5b 69 5d 2c 20 69 2b 31 0a 20 20 20 20 20  ol[i], i+1.     
cef0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
cf00: 20 20 7a 53 65 70 20 3d 20 22 2c 20 22 3b 0a 20    zSep = ", ";. 
cf10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
cf20: 20 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 64 27   else if( c=='d'
cf30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4c   ){.          zL
cf40: 69 73 74 20 3d 20 72 62 75 4d 50 72 69 6e 74 66  ist = rbuMPrintf
cf50: 28 70 2c 20 22 25 7a 25 73 5c 22 25 77 5c 22 3d  (p, "%z%s\"%w\"=
cf60: 72 62 75 5f 64 65 6c 74 61 28 5c 22 25 77 5c 22  rbu_delta(\"%w\"
cf70: 2c 20 3f 25 64 29 22 2c 20 0a 20 20 20 20 20 20  , ?%d)", .      
cf80: 20 20 20 20 20 20 20 20 7a 4c 69 73 74 2c 20 7a          zList, z
cf90: 53 65 70 2c 20 70 49 74 65 72 2d 3e 61 7a 54 62  Sep, pIter->azTb
cfa0: 6c 43 6f 6c 5b 69 5d 2c 20 70 49 74 65 72 2d 3e  lCol[i], pIter->
cfb0: 61 7a 54 62 6c 43 6f 6c 5b 69 5d 2c 20 69 2b 31  azTblCol[i], i+1
cfc0: 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
cfd0: 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22          zSep = "
cfe0: 2c 20 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  , ";.        }. 
cff0: 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20         else if( 
d000: 63 3d 3d 27 66 27 20 29 7b 0a 20 20 20 20 20 20  c=='f' ){.      
d010: 20 20 20 20 7a 4c 69 73 74 20 3d 20 72 62 75 4d      zList = rbuM
d020: 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 25 73 5c  Printf(p, "%z%s\
d030: 22 25 77 5c 22 3d 72 62 75 5f 66 6f 73 73 69 6c  "%w\"=rbu_fossil
d040: 5f 64 65 6c 74 61 28 5c 22 25 77 5c 22 2c 20 3f  _delta(\"%w\", ?
d050: 25 64 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20  %d)", .         
d060: 20 20 20 20 20 7a 4c 69 73 74 2c 20 7a 53 65 70       zList, zSep
d070: 2c 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f  , pIter->azTblCo
d080: 6c 5b 69 5d 2c 20 70 49 74 65 72 2d 3e 61 7a 54  l[i], pIter->azT
d090: 62 6c 43 6f 6c 5b 69 5d 2c 20 69 2b 31 0a 20 20  blCol[i], i+1.  
d0a0: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
d0b0: 20 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 20 22       zSep = ", "
d0c0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d0d0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
d0e0: 72 65 74 75 72 6e 20 7a 4c 69 73 74 3b 0a 7d 0a  return zList;.}.
d0f0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
d100: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73  nul-terminated s
d110: 74 72 69 6e 67 20 63 6f 6e 73 69 73 74 69 6e 67  tring consisting
d120: 20 6f 66 20 6e 42 79 74 65 20 63 6f 6d 6d 61 20   of nByte comma 
d130: 73 65 70 61 72 61 74 65 64 0a 2a 2a 20 22 3f 22  separated.** "?"
d140: 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 46 6f   expressions. Fo
d150: 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 6e 42  r example, if nB
d160: 79 74 65 20 69 73 20 33 2c 20 72 65 74 75 72 6e  yte is 3, return
d170: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a   a pointer to.**
d180: 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
d190: 6e 69 6e 67 20 74 68 65 20 73 74 72 69 6e 67 20  ning the string 
d1a0: 22 3f 2c 3f 2c 3f 22 2e 0a 2a 2a 0a 2a 2a 20 54  "?,?,?"..**.** T
d1b0: 68 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68  he memory for th
d1c0: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
d1d0: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  g is obtained fr
d1e0: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
d1f0: 63 28 29 2e 0a 2a 2a 20 49 74 20 69 73 20 74 68  c()..** It is th
d200: 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
d210: 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
d220: 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  o eventually fre
d230: 65 20 69 74 20 75 73 69 6e 67 0a 2a 2a 20 73 71  e it using.** sq
d240: 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 20 0a 2a  lite3_free(). .*
d250: 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65  *.** If an OOM e
d260: 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
d270: 72 65 64 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74  red when allocat
d280: 69 6e 67 20 73 70 61 63 65 20 66 6f 72 20 74 68  ing space for th
d290: 65 20 6e 65 77 0a 2a 2a 20 73 74 72 69 6e 67 2c  e new.** string,
d2a0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
d2b0: 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72 62  s left in the rb
d2c0: 75 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20  u handle passed 
d2d0: 61 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  as the first.** 
d2e0: 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 4e 55 4c  argument and NUL
d2f0: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  L is returned. O
d300: 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 68  r, if an error h
d310: 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
d320: 72 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73  red.** when this
d330: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
d340: 6c 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  led, NULL is ret
d350: 75 72 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  urned immediatel
d360: 79 2c 20 77 69 74 68 6f 75 74 0a 2a 2a 20 61 74  y, without.** at
d370: 74 65 6d 70 74 69 6e 67 20 74 68 65 20 61 6c 6c  tempting the all
d380: 6f 63 61 74 69 6f 6e 20 6f 72 20 6d 6f 64 69 66  ocation or modif
d390: 79 69 6e 67 20 74 68 65 20 73 74 6f 72 65 64 20  ying the stored 
d3a0: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
d3b0: 74 61 74 69 63 20 63 68 61 72 20 2a 72 62 75 4f  tatic char *rbuO
d3c0: 62 6a 49 74 65 72 47 65 74 42 69 6e 64 6c 69 73  bjIterGetBindlis
d3d0: 74 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c  t(sqlite3rbu *p,
d3e0: 20 69 6e 74 20 6e 42 69 6e 64 29 7b 0a 20 20 63   int nBind){.  c
d3f0: 68 61 72 20 2a 7a 52 65 74 20 3d 20 30 3b 0a 20  har *zRet = 0;. 
d400: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 6e 42 69   int nByte = nBi
d410: 6e 64 2a 32 20 2b 20 31 3b 0a 0a 20 20 7a 52 65  nd*2 + 1;..  zRe
d420: 74 20 3d 20 28 63 68 61 72 2a 29 72 62 75 4d 61  t = (char*)rbuMa
d430: 6c 6c 6f 63 28 70 2c 20 6e 42 79 74 65 29 3b 0a  lloc(p, nByte);.
d440: 20 20 69 66 28 20 7a 52 65 74 20 29 7b 0a 20 20    if( zRet ){.  
d450: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
d460: 28 69 3d 30 3b 20 69 3c 6e 42 69 6e 64 3b 20 69  (i=0; i<nBind; i
d470: 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 52 65 74 5b  ++){.      zRet[
d480: 69 2a 32 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20  i*2] = '?';.    
d490: 20 20 7a 52 65 74 5b 69 2a 32 2b 31 5d 20 3d 20    zRet[i*2+1] = 
d4a0: 28 69 2b 31 3d 3d 6e 42 69 6e 64 29 20 3f 20 27  (i+1==nBind) ? '
d4b0: 5c 30 27 20 3a 20 27 2c 27 3b 0a 20 20 20 20 7d  \0' : ',';.    }
d4c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52  .  }.  return zR
d4d0: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  et;.}../*.** The
d4e0: 20 69 74 65 72 61 74 6f 72 20 63 75 72 72 65 6e   iterator curren
d4f0: 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  tly points to a 
d500: 74 61 62 6c 65 20 28 6e 6f 74 20 69 6e 64 65 78  table (not index
d510: 29 20 6f 66 20 74 79 70 65 20 0a 2a 2a 20 52 42  ) of type .** RB
d520: 55 5f 50 4b 5f 57 49 54 48 4f 55 54 5f 52 4f 57  U_PK_WITHOUT_ROW
d530: 49 44 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ID. This functio
d540: 6e 20 63 72 65 61 74 65 73 20 74 68 65 20 50 52  n creates the PR
d550: 49 4d 41 52 59 20 4b 45 59 20 0a 2a 2a 20 64 65  IMARY KEY .** de
d560: 63 6c 61 72 61 74 69 6f 6e 20 66 6f 72 20 74 68  claration for th
d570: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
d580: 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 2e 20  imposter table. 
d590: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20  For example,.** 
d5a0: 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  if the iterator 
d5b0: 70 6f 69 6e 74 73 20 74 6f 20 61 20 74 61 62 6c  points to a tabl
d5c0: 65 20 63 72 65 61 74 65 64 20 61 73 3a 0a 2a 2a  e created as:.**
d5d0: 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42  .**   CREATE TAB
d5e0: 4c 45 20 74 31 28 61 2c 20 62 2c 20 63 2c 20 50  LE t1(a, b, c, P
d5f0: 52 49 4d 41 52 59 20 4b 45 59 28 62 2c 20 61 20  RIMARY KEY(b, a 
d600: 44 45 53 43 29 29 20 57 49 54 48 4f 55 54 20 52  DESC)) WITHOUT R
d610: 4f 57 49 44 0a 2a 2a 0a 2a 2a 20 74 68 69 73 20  OWID.**.** this 
d620: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
d630: 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 52 49 4d 41 52  :.**.**   PRIMAR
d640: 59 20 4b 45 59 28 22 62 22 2c 20 22 61 22 20 44  Y KEY("b", "a" D
d650: 45 53 43 29 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ESC).*/.static c
d660: 68 61 72 20 2a 72 62 75 57 69 74 68 6f 75 74 52  har *rbuWithoutR
d670: 6f 77 69 64 50 4b 28 73 71 6c 69 74 65 33 72 62  owidPK(sqlite3rb
d680: 75 20 2a 70 2c 20 52 62 75 4f 62 6a 49 74 65 72  u *p, RbuObjIter
d690: 20 2a 70 49 74 65 72 29 7b 0a 20 20 63 68 61 72   *pIter){.  char
d6a0: 20 2a 7a 20 3d 20 30 3b 0a 20 20 61 73 73 65 72   *z = 0;.  asser
d6b0: 74 28 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d  t( pIter->zIdx==
d6c0: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  0 );.  if( p->rc
d6d0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
d6e0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
d6f0: 53 65 70 20 3d 20 22 50 52 49 4d 41 52 59 20 4b  Sep = "PRIMARY K
d700: 45 59 28 22 3b 0a 20 20 20 20 73 71 6c 69 74 65  EY(";.    sqlite
d710: 33 5f 73 74 6d 74 20 2a 70 58 4c 69 73 74 20 3d  3_stmt *pXList =
d720: 20 30 3b 20 20 20 20 20 2f 2a 20 50 52 41 47 4d   0;     /* PRAGM
d730: 41 20 69 6e 64 65 78 5f 6c 69 73 74 20 3d 20 28  A index_list = (
d740: 70 49 74 65 72 2d 3e 7a 54 62 6c 29 20 2a 2f 0a  pIter->zTbl) */.
d750: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
d760: 20 2a 70 58 49 6e 66 6f 20 3d 20 30 3b 20 20 20   *pXInfo = 0;   
d770: 20 20 2f 2a 20 50 52 41 47 4d 41 20 69 6e 64 65    /* PRAGMA inde
d780: 78 5f 78 69 6e 66 6f 20 3d 20 3c 70 6b 2d 69 6e  x_xinfo = <pk-in
d790: 64 65 78 3e 20 2a 2f 0a 20 20 20 0a 20 20 20 20  dex> */.   .    
d7a0: 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46  p->rc = prepareF
d7b0: 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  reeAndCollectErr
d7c0: 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70  or(p->dbMain, &p
d7d0: 58 4c 69 73 74 2c 20 26 70 2d 3e 7a 45 72 72 6d  XList, &p->zErrm
d7e0: 73 67 2c 0a 20 20 20 20 20 20 20 20 73 71 6c 69  sg,.        sqli
d7f0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41  te3_mprintf("PRA
d800: 47 4d 41 20 6d 61 69 6e 2e 69 6e 64 65 78 5f 6c  GMA main.index_l
d810: 69 73 74 20 3d 20 25 51 22 2c 20 70 49 74 65 72  ist = %Q", pIter
d820: 2d 3e 7a 54 62 6c 29 0a 20 20 20 20 29 3b 0a 20  ->zTbl).    );. 
d830: 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d     while( p->rc=
d840: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51  =SQLITE_OK && SQ
d850: 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
d860: 33 5f 73 74 65 70 28 70 58 4c 69 73 74 29 20 29  3_step(pXList) )
d870: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
d880: 61 72 20 2a 7a 4f 72 69 67 20 3d 20 28 63 6f 6e  ar *zOrig = (con
d890: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
d8a0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 58 4c  _column_text(pXL
d8b0: 69 73 74 2c 33 29 3b 0a 20 20 20 20 20 20 69 66  ist,3);.      if
d8c0: 28 20 7a 4f 72 69 67 20 26 26 20 73 74 72 63 6d  ( zOrig && strcm
d8d0: 70 28 7a 4f 72 69 67 2c 20 22 70 6b 22 29 3d 3d  p(zOrig, "pk")==
d8e0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  0 ){.        con
d8f0: 73 74 20 63 68 61 72 20 2a 7a 49 64 78 20 3d 20  st char *zIdx = 
d900: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
d910: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
d920: 28 70 58 4c 69 73 74 2c 31 29 3b 0a 20 20 20 20  (pXList,1);.    
d930: 20 20 20 20 69 66 28 20 7a 49 64 78 20 29 7b 0a      if( zIdx ){.
d940: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
d950: 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64  = prepareFreeAnd
d960: 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e  CollectError(p->
d970: 64 62 4d 61 69 6e 2c 20 26 70 58 49 6e 66 6f 2c  dbMain, &pXInfo,
d980: 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20   &p->zErrmsg,.  
d990: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
d9a0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41  te3_mprintf("PRA
d9b0: 47 4d 41 20 6d 61 69 6e 2e 69 6e 64 65 78 5f 78  GMA main.index_x
d9c0: 69 6e 66 6f 20 3d 20 25 51 22 2c 20 7a 49 64 78  info = %Q", zIdx
d9d0: 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  ).          );. 
d9e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d9f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
da00: 20 20 20 20 7d 0a 20 20 20 20 72 62 75 46 69 6e      }.    rbuFin
da10: 61 6c 69 7a 65 28 70 2c 20 70 58 4c 69 73 74 29  alize(p, pXList)
da20: 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d  ;..    while( p-
da30: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
da40: 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  & SQLITE_ROW==sq
da50: 6c 69 74 65 33 5f 73 74 65 70 28 70 58 49 6e 66  lite3_step(pXInf
da60: 6f 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  o) ){.      if( 
da70: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
da80: 6e 74 28 70 58 49 6e 66 6f 2c 20 35 29 20 29 7b  nt(pXInfo, 5) ){
da90: 0a 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 74 20  .        /* int 
daa0: 69 43 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63  iCid = sqlite3_c
dab0: 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f  olumn_int(pXInfo
dac0: 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20  , 0); */.       
dad0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
dae0: 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  l = (const char*
daf0: 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
db00: 74 65 78 74 28 70 58 49 6e 66 6f 2c 20 32 29 3b  text(pXInfo, 2);
db10: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
db20: 68 61 72 20 2a 7a 44 65 73 63 20 3d 20 73 71 6c  har *zDesc = sql
db30: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
db40: 70 58 49 6e 66 6f 2c 20 33 29 20 3f 20 22 20 44  pXInfo, 3) ? " D
db50: 45 53 43 22 20 3a 20 22 22 3b 0a 20 20 20 20 20  ESC" : "";.     
db60: 20 20 20 7a 20 3d 20 72 62 75 4d 50 72 69 6e 74     z = rbuMPrint
db70: 66 28 70 2c 20 22 25 7a 25 73 5c 22 25 77 5c 22  f(p, "%z%s\"%w\"
db80: 25 73 22 2c 20 7a 2c 20 7a 53 65 70 2c 20 7a 43  %s", z, zSep, zC
db90: 6f 6c 2c 20 7a 44 65 73 63 29 3b 0a 20 20 20 20  ol, zDesc);.    
dba0: 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 20 22 3b      zSep = ", ";
dbb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
dbc0: 20 20 20 7a 20 3d 20 72 62 75 4d 50 72 69 6e 74     z = rbuMPrint
dbd0: 66 28 70 2c 20 22 25 7a 29 22 2c 20 7a 29 3b 0a  f(p, "%z)", z);.
dbe0: 20 20 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28      rbuFinalize(
dbf0: 70 2c 20 70 58 49 6e 66 6f 29 3b 0a 20 20 7d 0a  p, pXInfo);.  }.
dc00: 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f    return z;.}../
dc10: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
dc20: 6f 6e 20 63 72 65 61 74 65 73 20 74 68 65 20 73  on creates the s
dc30: 65 63 6f 6e 64 20 69 6d 70 6f 73 74 65 72 20 74  econd imposter t
dc40: 61 62 6c 65 20 75 73 65 64 20 77 68 65 6e 20 77  able used when w
dc50: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 61 20 74  riting to.** a t
dc60: 61 62 6c 65 20 62 2d 74 72 65 65 20 77 68 65 72  able b-tree wher
dc70: 65 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20  e the table has 
dc80: 61 6e 20 65 78 74 65 72 6e 61 6c 20 70 72 69 6d  an external prim
dc90: 61 72 79 20 6b 65 79 2e 20 49 66 20 74 68 65 0a  ary key. If the.
dca0: 2a 2a 20 69 74 65 72 61 74 6f 72 20 70 61 73 73  ** iterator pass
dcb0: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
dcc0: 20 61 72 67 75 6d 65 6e 74 20 64 6f 65 73 20 6e   argument does n
dcd0: 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  ot currently poi
dce0: 6e 74 20 74 6f 0a 2a 2a 20 61 20 74 61 62 6c 65  nt to.** a table
dcf0: 20 28 6e 6f 74 20 69 6e 64 65 78 29 20 77 69 74   (not index) wit
dd00: 68 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 70 72  h an external pr
dd10: 69 6d 61 72 79 20 6b 65 79 2c 20 74 68 69 73 20  imary key, this 
dd20: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 0a 2a 2a  function is a.**
dd30: 20 6e 6f 2d 6f 70 2e 20 0a 2a 2a 0a 2a 2a 20 41   no-op. .**.** A
dd40: 73 73 75 6d 69 6e 67 20 74 68 65 20 69 74 65 72  ssuming the iter
dd50: 61 74 6f 72 20 64 6f 65 73 20 70 6f 69 6e 74 20  ator does point 
dd60: 74 6f 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  to a table with 
dd70: 61 6e 20 65 78 74 65 72 6e 61 6c 20 50 4b 2c 20  an external PK, 
dd80: 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
dd90: 20 63 72 65 61 74 65 73 20 61 20 57 49 54 48 4f   creates a WITHO
dda0: 55 54 20 52 4f 57 49 44 20 69 6d 70 6f 73 74 65  UT ROWID imposte
ddb0: 72 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 22 72  r table named "r
ddc0: 62 75 5f 69 6d 70 6f 73 74 65 72 32 22 0a 2a 2a  bu_imposter2".**
ddd0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
dde0: 74 68 61 74 20 50 4b 20 69 6e 64 65 78 2e 20 46  that PK index. F
ddf0: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  or example, if t
de00: 68 65 20 74 61 72 67 65 74 20 74 61 62 6c 65 20  he target table 
de10: 69 73 0a 2a 2a 20 64 65 63 6c 61 72 65 64 20 61  is.** declared a
de20: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
de30: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
de40: 74 31 28 61 2c 20 62 20 54 45 58 54 2c 20 63 20  t1(a, b TEXT, c 
de50: 52 45 41 4c 2c 20 50 52 49 4d 41 52 59 20 4b 45  REAL, PRIMARY KE
de60: 59 28 62 2c 20 63 29 29 3b 0a 2a 2a 0a 2a 2a 20  Y(b, c));.**.** 
de70: 74 68 65 6e 20 74 68 65 20 69 6d 70 6f 73 74 65  then the imposte
de80: 72 20 74 61 62 6c 65 20 73 63 68 65 6d 61 20 69  r table schema i
de90: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54  s:.**.**   CREAT
dea0: 45 20 54 41 42 4c 45 20 72 62 75 5f 69 6d 70 6f  E TABLE rbu_impo
deb0: 73 74 65 72 32 28 63 31 20 54 45 58 54 2c 20 63  ster2(c1 TEXT, c
dec0: 32 20 52 45 41 4c 2c 20 69 64 20 49 4e 54 45 47  2 REAL, id INTEG
ded0: 45 52 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49  ER) WITHOUT ROWI
dee0: 44 3b 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  D;.**.*/.static 
def0: 76 6f 69 64 20 72 62 75 43 72 65 61 74 65 49 6d  void rbuCreateIm
df00: 70 6f 73 74 65 72 54 61 62 6c 65 32 28 73 71 6c  posterTable2(sql
df10: 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62 75 4f  ite3rbu *p, RbuO
df20: 62 6a 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  bjIter *pIter){.
df30: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
df40: 49 54 45 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d  ITE_OK && pIter-
df50: 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45  >eType==RBU_PK_E
df60: 58 54 45 52 4e 41 4c 20 29 7b 0a 20 20 20 20 69  XTERNAL ){.    i
df70: 6e 74 20 74 6e 75 6d 20 3d 20 70 49 74 65 72 2d  nt tnum = pIter-
df80: 3e 69 50 6b 54 6e 75 6d 3b 20 20 20 20 2f 2a 20  >iPkTnum;    /* 
df90: 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 50 4b 20  Root page of PK 
dfa0: 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 73 71 6c  index */.    sql
dfb0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 51 75 65 72  ite3_stmt *pQuer
dfc0: 79 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 53 45  y = 0;     /* SE
dfd0: 4c 45 43 54 20 6e 61 6d 65 20 2e 2e 2e 20 57 48  LECT name ... WH
dfe0: 45 52 45 20 72 6f 6f 74 70 61 67 65 20 3d 20 24  ERE rootpage = $
dff0: 74 6e 75 6d 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  tnum */.    cons
e000: 74 20 63 68 61 72 20 2a 7a 49 64 78 20 3d 20 30  t char *zIdx = 0
e010: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  ;         /* Nam
e020: 65 20 6f 66 20 50 4b 20 69 6e 64 65 78 20 2a 2f  e of PK index */
e030: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
e040: 74 20 2a 70 58 49 6e 66 6f 20 3d 20 30 3b 20 20  t *pXInfo = 0;  
e050: 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 6d 61 69     /* PRAGMA mai
e060: 6e 2e 69 6e 64 65 78 5f 78 69 6e 66 6f 20 3d 20  n.index_xinfo = 
e070: 24 7a 49 64 78 20 2a 2f 0a 20 20 20 20 63 6f 6e  $zIdx */.    con
e080: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 61 20  st char *zComma 
e090: 3d 20 22 22 3b 0a 20 20 20 20 63 68 61 72 20 2a  = "";.    char *
e0a0: 7a 43 6f 6c 73 20 3d 20 30 3b 20 20 20 20 20 20  zCols = 0;      
e0b0: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
e0c0: 74 6f 20 62 75 69 6c 64 20 75 70 20 6c 69 73 74  to build up list
e0d0: 20 6f 66 20 74 61 62 6c 65 20 63 6f 6c 73 20 2a   of table cols *
e0e0: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 50 6b 20  /.    char *zPk 
e0f0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
e100: 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 62      /* Used to b
e110: 75 69 6c 64 20 75 70 20 74 61 62 6c 65 20 50 4b  uild up table PK
e120: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a   declaration */.
e130: 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  .    /* Figure o
e140: 75 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ut the name of t
e150: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  he primary key i
e160: 6e 64 65 78 20 66 6f 72 20 74 68 65 20 63 75 72  ndex for the cur
e170: 72 65 6e 74 20 74 61 62 6c 65 2e 0a 20 20 20 20  rent table..    
e180: 2a 2a 20 54 68 69 73 20 69 73 20 6e 65 65 64 65  ** This is neede
e190: 64 20 66 6f 72 20 74 68 65 20 61 72 67 75 6d 65  d for the argume
e1a0: 6e 74 20 74 6f 20 22 50 52 41 47 4d 41 20 69 6e  nt to "PRAGMA in
e1b0: 64 65 78 5f 78 69 6e 66 6f 22 2e 20 53 65 74 0a  dex_xinfo". Set.
e1c0: 20 20 20 20 2a 2a 20 7a 49 64 78 20 74 6f 20 70      ** zIdx to p
e1d0: 6f 69 6e 74 20 74 6f 20 61 20 6e 75 6c 2d 74 65  oint to a nul-te
e1e0: 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20  rminated string 
e1f0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20  containing this 
e200: 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 70 2d 3e  name. */.    p->
e210: 72 63 20 3d 20 70 72 65 70 61 72 65 41 6e 64 43  rc = prepareAndC
e220: 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64  ollectError(p->d
e230: 62 4d 61 69 6e 2c 20 26 70 51 75 65 72 79 2c 20  bMain, &pQuery, 
e240: 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20  &p->zErrmsg, .  
e250: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61        "SELECT na
e260: 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  me FROM sqlite_m
e270: 61 73 74 65 72 20 57 48 45 52 45 20 72 6f 6f 74  aster WHERE root
e280: 70 61 67 65 20 3d 20 3f 22 0a 20 20 20 20 29 3b  page = ?".    );
e290: 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  .    if( p->rc==
e2a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
e2b0: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
e2c0: 69 6e 74 28 70 51 75 65 72 79 2c 20 31 2c 20 74  int(pQuery, 1, t
e2d0: 6e 75 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  num);.      if( 
e2e0: 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
e2f0: 74 65 33 5f 73 74 65 70 28 70 51 75 65 72 79 29  te3_step(pQuery)
e300: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 49 64 78   ){.        zIdx
e310: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
e320: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
e330: 65 78 74 28 70 51 75 65 72 79 2c 20 30 29 3b 0a  ext(pQuery, 0);.
e340: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e350: 20 20 69 66 28 20 7a 49 64 78 20 29 7b 0a 20 20    if( zIdx ){.  
e360: 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70      p->rc = prep
e370: 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63  areFreeAndCollec
e380: 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e  tError(p->dbMain
e390: 2c 20 26 70 58 49 6e 66 6f 2c 20 26 70 2d 3e 7a  , &pXInfo, &p->z
e3a0: 45 72 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20  Errmsg,.        
e3b0: 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
e3c0: 66 28 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 69  f("PRAGMA main.i
e3d0: 6e 64 65 78 5f 78 69 6e 66 6f 20 3d 20 25 51 22  ndex_xinfo = %Q"
e3e0: 2c 20 7a 49 64 78 29 0a 20 20 20 20 20 20 29 3b  , zIdx).      );
e3f0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 62 75 46 69  .    }.    rbuFi
e400: 6e 61 6c 69 7a 65 28 70 2c 20 70 51 75 65 72 79  nalize(p, pQuery
e410: 29 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 70  );..    while( p
e420: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
e430: 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  && SQLITE_ROW==s
e440: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 58 49 6e  qlite3_step(pXIn
e450: 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  fo) ){.      int
e460: 20 62 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 5f   bKey = sqlite3_
e470: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49 6e 66  column_int(pXInf
e480: 6f 2c 20 35 29 3b 0a 20 20 20 20 20 20 69 66 28  o, 5);.      if(
e490: 20 62 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20   bKey ){.       
e4a0: 20 69 6e 74 20 69 43 69 64 20 3d 20 73 71 6c 69   int iCid = sqli
e4b0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
e4c0: 58 49 6e 66 6f 2c 20 31 29 3b 0a 20 20 20 20 20  XInfo, 1);.     
e4d0: 20 20 20 69 6e 74 20 62 44 65 73 63 20 3d 20 73     int bDesc = s
e4e0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
e4f0: 74 28 70 58 49 6e 66 6f 2c 20 33 29 3b 0a 20 20  t(pXInfo, 3);.  
e500: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
e510: 20 2a 7a 43 6f 6c 6c 61 74 65 20 3d 20 28 63 6f   *zCollate = (co
e520: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
e530: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 58  3_column_text(pX
e540: 49 6e 66 6f 2c 20 34 29 3b 0a 20 20 20 20 20 20  Info, 4);.      
e550: 20 20 7a 43 6f 6c 73 20 3d 20 72 62 75 4d 50 72    zCols = rbuMPr
e560: 69 6e 74 66 28 70 2c 20 22 25 7a 25 73 63 25 64  intf(p, "%z%sc%d
e570: 20 25 73 20 43 4f 4c 4c 41 54 45 20 25 73 22 2c   %s COLLATE %s",
e580: 20 7a 43 6f 6c 73 2c 20 7a 43 6f 6d 6d 61 2c 20   zCols, zComma, 
e590: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 43 69  .            iCi
e5a0: 64 2c 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 54  d, pIter->azTblT
e5b0: 79 70 65 5b 69 43 69 64 5d 2c 20 7a 43 6f 6c 6c  ype[iCid], zColl
e5c0: 61 74 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  ate.        );. 
e5d0: 20 20 20 20 20 20 20 7a 50 6b 20 3d 20 72 62 75         zPk = rbu
e5e0: 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 25 73  MPrintf(p, "%z%s
e5f0: 63 25 64 25 73 22 2c 20 7a 50 6b 2c 20 7a 43 6f  c%d%s", zPk, zCo
e600: 6d 6d 61 2c 20 69 43 69 64 2c 20 62 44 65 73 63  mma, iCid, bDesc
e610: 3f 22 20 44 45 53 43 22 3a 22 22 29 3b 0a 20 20  ?" DESC":"");.  
e620: 20 20 20 20 20 20 7a 43 6f 6d 6d 61 20 3d 20 22        zComma = "
e630: 2c 20 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  , ";.      }.   
e640: 20 7d 0a 20 20 20 20 7a 43 6f 6c 73 20 3d 20 72   }.    zCols = r
e650: 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a  buMPrintf(p, "%z
e660: 2c 20 69 64 20 49 4e 54 45 47 45 52 22 2c 20 7a  , id INTEGER", z
e670: 43 6f 6c 73 29 3b 0a 20 20 20 20 72 62 75 46 69  Cols);.    rbuFi
e680: 6e 61 6c 69 7a 65 28 70 2c 20 70 58 49 6e 66 6f  nalize(p, pXInfo
e690: 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  );..    sqlite3_
e6a0: 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
e6b0: 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50  ITE_TESTCTRL_IMP
e6c0: 4f 53 54 45 52 2c 20 70 2d 3e 64 62 4d 61 69 6e  OSTER, p->dbMain
e6d0: 2c 20 22 6d 61 69 6e 22 2c 20 31 2c 20 74 6e 75  , "main", 1, tnu
e6e0: 6d 29 3b 0a 20 20 20 20 72 62 75 4d 50 72 69 6e  m);.    rbuMPrin
e6f0: 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64 62 4d  tfExec(p, p->dbM
e700: 61 69 6e 2c 0a 20 20 20 20 20 20 20 20 22 43 52  ain,.        "CR
e710: 45 41 54 45 20 54 41 42 4c 45 20 72 62 75 5f 69  EATE TABLE rbu_i
e720: 6d 70 6f 73 74 65 72 32 28 25 7a 2c 20 50 52 49  mposter2(%z, PRI
e730: 4d 41 52 59 20 4b 45 59 28 25 7a 29 29 20 57 49  MARY KEY(%z)) WI
e740: 54 48 4f 55 54 20 52 4f 57 49 44 22 2c 20 0a 20  THOUT ROWID", . 
e750: 20 20 20 20 20 20 20 7a 43 6f 6c 73 2c 20 7a 50         zCols, zP
e760: 6b 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  k.    );.    sql
e770: 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
e780: 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
e790: 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64  L_IMPOSTER, p->d
e7a0: 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c 20 30  bMain, "main", 0
e7b0: 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 0);.  }.}../*.
e7c0: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68  ** If an error h
e7d0: 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
e7e0: 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  red when this fu
e7f0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
e800: 2c 20 69 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61  , it .** immedia
e810: 74 65 6c 79 20 72 65 74 75 72 6e 73 20 7a 65 72  tely returns zer
e820: 6f 20 28 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  o (without doing
e830: 20 61 6e 79 20 77 6f 72 6b 29 2e 20 4f 72 2c 20   any work). Or, 
e840: 69 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f  if an error.** o
e850: 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
e860: 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68   execution of th
e870: 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 69 74 20  is function, it 
e880: 73 65 74 73 20 74 68 65 20 65 72 72 6f 72 20 63  sets the error c
e890: 6f 64 65 0a 2a 2a 20 69 6e 20 74 68 65 20 73 71  ode.** in the sq
e8a0: 6c 69 74 65 33 72 62 75 20 6f 62 6a 65 63 74 20  lite3rbu object 
e8b0: 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65  indicated by the
e8c0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
e8d0: 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a 2a 20 7a  and returns.** z
e8e0: 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ero..**.** The i
e8f0: 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61  terator passed a
e900: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
e910: 75 6d 65 6e 74 20 69 73 20 67 75 61 72 61 6e 74  ument is guarant
e920: 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a  eed to point to.
e930: 2a 2a 20 61 20 74 61 62 6c 65 20 28 6e 6f 74 20  ** a table (not 
e940: 61 6e 20 69 6e 64 65 78 29 20 77 68 65 6e 20 74  an index) when t
e950: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
e960: 63 61 6c 6c 65 64 2e 20 54 68 69 73 20 66 75 6e  called. This fun
e970: 63 74 69 6f 6e 0a 2a 2a 20 61 74 74 65 6d 70 74  ction.** attempt
e980: 73 20 74 6f 20 63 72 65 61 74 65 20 61 6e 79 20  s to create any 
e990: 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20 72  imposter table r
e9a0: 65 71 75 69 72 65 64 20 74 6f 20 77 72 69 74 65  equired to write
e9b0: 20 74 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20   to the main.** 
e9c0: 74 61 62 6c 65 20 62 2d 74 72 65 65 20 6f 66 20  table b-tree of 
e9d0: 74 68 65 20 74 61 62 6c 65 20 62 65 66 6f 72 65  the table before
e9e0: 20 72 65 74 75 72 6e 69 6e 67 2e 20 4e 6f 6e 2d   returning. Non-
e9f0: 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64  zero is returned
ea00: 20 69 66 0a 2a 2a 20 61 6e 20 69 6d 70 6f 73 74   if.** an impost
ea10: 65 72 20 74 61 62 6c 65 20 61 72 65 20 63 72 65  er table are cre
ea20: 61 74 65 64 2c 20 6f 72 20 7a 65 72 6f 20 6f 74  ated, or zero ot
ea30: 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 41  herwise..**.** A
ea40: 6e 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65  n imposter table
ea50: 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20   is required in 
ea60: 61 6c 6c 20 63 61 73 65 73 20 65 78 63 65 70 74  all cases except
ea70: 20 52 42 55 5f 50 4b 5f 56 54 41 42 2e 20 4f 6e   RBU_PK_VTAB. On
ea80: 6c 79 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 61  ly.** virtual ta
ea90: 62 6c 65 73 20 61 72 65 20 77 72 69 74 74 65 6e  bles are written
eaa0: 20 74 6f 20 64 69 72 65 63 74 6c 79 2e 20 54 68   to directly. Th
eab0: 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65  e imposter table
eac0: 20 68 61 73 20 74 68 65 20 0a 2a 2a 20 73 61 6d   has the .** sam
ead0: 65 20 73 63 68 65 6d 61 20 61 73 20 74 68 65 20  e schema as the 
eae0: 61 63 74 75 61 6c 20 74 61 72 67 65 74 20 74 61  actual target ta
eaf0: 62 6c 65 20 28 6c 65 73 73 20 61 6e 79 20 55 4e  ble (less any UN
eb00: 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 73  IQUE constraints
eb10: 29 2e 20 0a 2a 2a 20 4d 6f 72 65 20 70 72 65 63  ). .** More prec
eb20: 69 73 65 6c 79 2c 20 74 68 65 20 22 73 61 6d 65  isely, the "same
eb30: 20 73 63 68 65 6d 61 22 20 6d 65 61 6e 73 20 74   schema" means t
eb40: 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 73 2c  he same columns,
eb50: 20 74 79 70 65 73 2c 20 0a 2a 2a 20 63 6f 6c 6c   types, .** coll
eb60: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 2e  ation sequences.
eb70: 20 46 6f 72 20 74 61 62 6c 65 73 20 74 68 61 74   For tables that
eb80: 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 61 6e 20   do not have an 
eb90: 65 78 74 65 72 6e 61 6c 20 50 52 49 4d 41 52 59  external PRIMARY
eba0: 0a 2a 2a 20 4b 45 59 2c 20 69 74 20 61 6c 73 6f  .** KEY, it also
ebb0: 20 6d 65 61 6e 73 20 74 68 65 20 73 61 6d 65 20   means the same 
ebc0: 50 52 49 4d 41 52 59 20 4b 45 59 20 64 65 63 6c  PRIMARY KEY decl
ebd0: 61 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  aration..*/.stat
ebe0: 69 63 20 76 6f 69 64 20 72 62 75 43 72 65 61 74  ic void rbuCreat
ebf0: 65 49 6d 70 6f 73 74 65 72 54 61 62 6c 65 28 73  eImposterTable(s
ec00: 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62  qlite3rbu *p, Rb
ec10: 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 29  uObjIter *pIter)
ec20: 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
ec30: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49 74 65  QLITE_OK && pIte
ec40: 72 2d 3e 65 54 79 70 65 21 3d 52 42 55 5f 50 4b  r->eType!=RBU_PK
ec50: 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 69 6e 74  _VTAB ){.    int
ec60: 20 74 6e 75 6d 20 3d 20 70 49 74 65 72 2d 3e 69   tnum = pIter->i
ec70: 54 6e 75 6d 3b 0a 20 20 20 20 63 6f 6e 73 74 20  Tnum;.    const 
ec80: 63 68 61 72 20 2a 7a 43 6f 6d 6d 61 20 3d 20 22  char *zComma = "
ec90: 22 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71  ";.    char *zSq
eca0: 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  l = 0;.    int i
ecb0: 43 6f 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Col;.    sqlite3
ecc0: 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
ecd0: 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d  LITE_TESTCTRL_IM
ece0: 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 4d 61 69  POSTER, p->dbMai
ecf0: 6e 2c 20 22 6d 61 69 6e 22 2c 20 30 2c 20 31 29  n, "main", 0, 1)
ed00: 3b 0a 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d  ;..    for(iCol=
ed10: 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  0; p->rc==SQLITE
ed20: 5f 4f 4b 20 26 26 20 69 43 6f 6c 3c 70 49 74 65  _OK && iCol<pIte
ed30: 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69 43 6f 6c  r->nTblCol; iCol
ed40: 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ++){.      const
ed50: 20 63 68 61 72 20 2a 7a 50 6b 20 3d 20 22 22 3b   char *zPk = "";
ed60: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
ed70: 72 20 2a 7a 43 6f 6c 20 3d 20 70 49 74 65 72 2d  r *zCol = pIter-
ed80: 3e 61 7a 54 62 6c 43 6f 6c 5b 69 43 6f 6c 5d 3b  >azTblCol[iCol];
ed90: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
eda0: 72 20 2a 7a 43 6f 6c 6c 20 3d 20 30 3b 0a 0a 20  r *zColl = 0;.. 
edb0: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c       p->rc = sql
edc0: 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d  ite3_table_colum
edd0: 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20 20 20  n_metadata(.    
ede0: 20 20 20 20 20 20 70 2d 3e 64 62 4d 61 69 6e 2c        p->dbMain,
edf0: 20 22 6d 61 69 6e 22 2c 20 70 49 74 65 72 2d 3e   "main", pIter->
ee00: 7a 54 62 6c 2c 20 7a 43 6f 6c 2c 20 30 2c 20 26  zTbl, zCol, 0, &
ee10: 7a 43 6f 6c 6c 2c 20 30 2c 20 30 2c 20 30 0a 20  zColl, 0, 0, 0. 
ee20: 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20 20 69       );..      i
ee30: 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  f( pIter->eType=
ee40: 3d 52 42 55 5f 50 4b 5f 49 50 4b 20 26 26 20 70  =RBU_PK_IPK && p
ee50: 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 43  Iter->abTblPk[iC
ee60: 6f 6c 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ol] ){.        /
ee70: 2a 20 49 66 20 74 68 65 20 74 61 72 67 65 74 20  * If the target 
ee80: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 69 73 20  table column is 
ee90: 61 6e 20 22 49 4e 54 45 47 45 52 20 50 52 49 4d  an "INTEGER PRIM
eea0: 41 52 59 20 4b 45 59 22 2c 20 61 64 64 0a 20 20  ARY KEY", add.  
eeb0: 20 20 20 20 20 20 2a 2a 20 22 50 52 49 4d 41 52        ** "PRIMAR
eec0: 59 20 4b 45 59 22 20 74 6f 20 74 68 65 20 69 6d  Y KEY" to the im
eed0: 70 6f 73 74 65 72 20 74 61 62 6c 65 20 63 6f 6c  poster table col
eee0: 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 2e  umn declaration.
eef0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 50 6b 20   */.        zPk 
ef00: 3d 20 22 50 52 49 4d 41 52 59 20 4b 45 59 20 22  = "PRIMARY KEY "
ef10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ef20: 7a 53 71 6c 20 3d 20 72 62 75 4d 50 72 69 6e 74  zSql = rbuMPrint
ef30: 66 28 70 2c 20 22 25 7a 25 73 5c 22 25 77 5c 22  f(p, "%z%s\"%w\"
ef40: 20 25 73 20 25 73 43 4f 4c 4c 41 54 45 20 25 73   %s %sCOLLATE %s
ef50: 25 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  %s", .          
ef60: 7a 53 71 6c 2c 20 7a 43 6f 6d 6d 61 2c 20 7a 43  zSql, zComma, zC
ef70: 6f 6c 2c 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c  ol, pIter->azTbl
ef80: 54 79 70 65 5b 69 43 6f 6c 5d 2c 20 7a 50 6b 2c  Type[iCol], zPk,
ef90: 20 7a 43 6f 6c 6c 2c 0a 20 20 20 20 20 20 20 20   zColl,.        
efa0: 20 20 28 70 49 74 65 72 2d 3e 61 62 4e 6f 74 4e    (pIter->abNotN
efb0: 75 6c 6c 5b 69 43 6f 6c 5d 20 3f 20 22 20 4e 4f  ull[iCol] ? " NO
efc0: 54 20 4e 55 4c 4c 22 20 3a 20 22 22 29 0a 20 20  T NULL" : "").  
efd0: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7a 43 6f      );.      zCo
efe0: 6d 6d 61 20 3d 20 22 2c 20 22 3b 0a 20 20 20 20  mma = ", ";.    
eff0: 7d 0a 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  }..    if( pIter
f000: 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
f010: 57 49 54 48 4f 55 54 5f 52 4f 57 49 44 20 29 7b  WITHOUT_ROWID ){
f020: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50 6b  .      char *zPk
f030: 20 3d 20 72 62 75 57 69 74 68 6f 75 74 52 6f 77   = rbuWithoutRow
f040: 69 64 50 4b 28 70 2c 20 70 49 74 65 72 29 3b 0a  idPK(p, pIter);.
f050: 20 20 20 20 20 20 69 66 28 20 7a 50 6b 20 29 7b        if( zPk ){
f060: 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20  .        zSql = 
f070: 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25  rbuMPrintf(p, "%
f080: 7a 2c 20 25 7a 22 2c 20 7a 53 71 6c 2c 20 7a 50  z, %z", zSql, zP
f090: 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  k);.      }.    
f0a0: 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74  }..    sqlite3_t
f0b0: 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
f0c0: 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f  TE_TESTCTRL_IMPO
f0d0: 53 54 45 52 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c  STER, p->dbMain,
f0e0: 20 22 6d 61 69 6e 22 2c 20 31 2c 20 74 6e 75 6d   "main", 1, tnum
f0f0: 29 3b 0a 20 20 20 20 72 62 75 4d 50 72 69 6e 74  );.    rbuMPrint
f100: 66 45 78 65 63 28 70 2c 20 70 2d 3e 64 62 4d 61  fExec(p, p->dbMa
f110: 69 6e 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c  in, "CREATE TABL
f120: 45 20 5c 22 72 62 75 5f 69 6d 70 5f 25 77 5c 22  E \"rbu_imp_%w\"
f130: 28 25 7a 29 25 73 22 2c 20 0a 20 20 20 20 20 20  (%z)%s", .      
f140: 20 20 70 49 74 65 72 2d 3e 7a 54 62 6c 2c 20 7a    pIter->zTbl, z
f150: 53 71 6c 2c 20 0a 20 20 20 20 20 20 20 20 28 70  Sql, .        (p
f160: 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55  Iter->eType==RBU
f170: 5f 50 4b 5f 57 49 54 48 4f 55 54 5f 52 4f 57 49  _PK_WITHOUT_ROWI
f180: 44 20 3f 20 22 20 57 49 54 48 4f 55 54 20 52 4f  D ? " WITHOUT RO
f190: 57 49 44 22 20 3a 20 22 22 29 0a 20 20 20 20 29  WID" : "").    )
f1a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65  ;.    sqlite3_te
f1b0: 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
f1c0: 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53  E_TESTCTRL_IMPOS
f1d0: 54 45 52 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20  TER, p->dbMain, 
f1e0: 22 6d 61 69 6e 22 2c 20 30 2c 20 30 29 3b 0a 20  "main", 0, 0);. 
f1f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70   }.}../*.** Prep
f200: 61 72 65 20 61 20 73 74 61 74 65 6d 65 6e 74 20  are a statement 
f210: 75 73 65 64 20 74 6f 20 69 6e 73 65 72 74 20 72  used to insert r
f220: 6f 77 73 20 69 6e 74 6f 20 74 68 65 20 22 72 62  ows into the "rb
f230: 75 5f 74 6d 70 5f 78 78 78 22 20 74 61 62 6c 65  u_tmp_xxx" table
f240: 2e 0a 2a 2a 20 53 70 65 63 69 66 69 63 61 6c 6c  ..** Specificall
f250: 79 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 66  y a statement of
f260: 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
f270: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
f280: 20 72 62 75 5f 74 6d 70 5f 78 78 78 20 56 41 4c   rbu_tmp_xxx VAL
f290: 55 45 53 28 3f 2c 20 3f 2c 20 3f 20 2e 2e 2e 29  UES(?, ?, ? ...)
f2a0: 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62  ;.**.** The numb
f2b0: 65 72 20 6f 66 20 62 6f 75 6e 64 20 76 61 72 69  er of bound vari
f2c0: 61 62 6c 65 73 20 69 73 20 65 71 75 61 6c 20 74  ables is equal t
f2d0: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
f2e0: 63 6f 6c 75 6d 6e 73 20 69 6e 0a 2a 2a 20 74 68  columns in.** th
f2f0: 65 20 74 61 72 67 65 74 20 74 61 62 6c 65 2c 20  e target table, 
f300: 70 6c 75 73 20 6f 6e 65 20 28 66 6f 72 20 74 68  plus one (for th
f310: 65 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 63 6f  e rbu_control co
f320: 6c 75 6d 6e 29 2c 20 70 6c 75 73 20 6f 6e 65 20  lumn), plus one 
f330: 6d 6f 72 65 20 0a 2a 2a 20 28 66 6f 72 20 74 68  more .** (for th
f340: 65 20 72 62 75 5f 72 6f 77 69 64 20 63 6f 6c 75  e rbu_rowid colu
f350: 6d 6e 29 20 69 66 20 74 68 65 20 74 61 72 67 65  mn) if the targe
f360: 74 20 74 61 62 6c 65 20 69 73 20 61 6e 20 69 6d  t table is an im
f370: 70 6c 69 63 69 74 20 49 50 4b 20 6f 72 20 0a 2a  plicit IPK or .*
f380: 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  * virtual table.
f390: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f3a0: 72 62 75 4f 62 6a 49 74 65 72 50 72 65 70 61 72  rbuObjIterPrepar
f3b0: 65 54 6d 70 49 6e 73 65 72 74 28 0a 20 20 73 71  eTmpInsert(.  sq
f3c0: 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 0a 20 20  lite3rbu *p, .  
f3d0: 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65  RbuObjIter *pIte
f3e0: 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  r,.  const char 
f3f0: 2a 7a 43 6f 6c 6c 69 73 74 2c 0a 20 20 63 6f 6e  *zCollist,.  con
f400: 73 74 20 63 68 61 72 20 2a 7a 52 62 75 52 6f 77  st char *zRbuRow
f410: 69 64 0a 29 7b 0a 20 20 69 6e 74 20 62 52 62 75  id.){.  int bRbu
f420: 52 6f 77 69 64 20 3d 20 28 70 49 74 65 72 2d 3e  Rowid = (pIter->
f430: 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45 58  eType==RBU_PK_EX
f440: 54 45 52 4e 41 4c 20 7c 7c 20 70 49 74 65 72 2d  TERNAL || pIter-
f450: 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e  >eType==RBU_PK_N
f460: 4f 4e 45 29 3b 0a 20 20 63 68 61 72 20 2a 7a 42  ONE);.  char *zB
f470: 69 6e 64 20 3d 20 72 62 75 4f 62 6a 49 74 65 72  ind = rbuObjIter
f480: 47 65 74 42 69 6e 64 6c 69 73 74 28 70 2c 20 70  GetBindlist(p, p
f490: 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20 2b 20  Iter->nTblCol + 
f4a0: 31 20 2b 20 62 52 62 75 52 6f 77 69 64 29 3b 0a  1 + bRbuRowid);.
f4b0: 20 20 69 66 28 20 7a 42 69 6e 64 20 29 7b 0a 20    if( zBind ){. 
f4c0: 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72     assert( pIter
f4d0: 2d 3e 70 54 6d 70 49 6e 73 65 72 74 3d 3d 30 20  ->pTmpInsert==0 
f4e0: 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 70  );.    p->rc = p
f4f0: 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c  repareFreeAndCol
f500: 6c 65 63 74 45 72 72 6f 72 28 0a 20 20 20 20 20  lectError(.     
f510: 20 20 20 70 2d 3e 64 62 52 62 75 2c 20 26 70 49     p->dbRbu, &pI
f520: 74 65 72 2d 3e 70 54 6d 70 49 6e 73 65 72 74 2c  ter->pTmpInsert,
f530: 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 73 71   &p->zErrmsg, sq
f540: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
f550: 20 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54           "INSERT
f560: 20 49 4e 54 4f 20 25 73 2e 27 72 62 75 5f 74 6d   INTO %s.'rbu_tm
f570: 70 5f 25 71 27 28 72 62 75 5f 63 6f 6e 74 72 6f  p_%q'(rbu_contro
f580: 6c 2c 25 73 25 73 29 20 56 41 4c 55 45 53 28 25  l,%s%s) VALUES(%
f590: 7a 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  z)", .          
f5a0: 70 2d 3e 7a 53 74 61 74 65 44 62 2c 20 70 49 74  p->zStateDb, pIt
f5b0: 65 72 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 7a 43  er->zDataTbl, zC
f5c0: 6f 6c 6c 69 73 74 2c 20 7a 52 62 75 52 6f 77 69  ollist, zRbuRowi
f5d0: 64 2c 20 7a 42 69 6e 64 0a 20 20 20 20 29 29 3b  d, zBind.    ));
f5e0: 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
f5f0: 6f 69 64 20 72 62 75 54 6d 70 49 6e 73 65 72 74  oid rbuTmpInsert
f600: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
f610: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
f620: 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20 73 71    int nVal,.  sq
f630: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
f640: 56 61 6c 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  Val.){.  sqlite3
f650: 72 62 75 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  rbu *p = sqlite3
f660: 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74 78 29  _user_data(pCtx)
f670: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
f680: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b  ITE_OK;.  int i;
f690: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
f6a0: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70  te3_value_int(ap
f6b0: 56 61 6c 5b 30 5d 29 21 3d 30 0a 20 20 20 20 20  Val[0])!=0.     
f6c0: 20 7c 7c 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 65   || p->objiter.e
f6d0: 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54  Type==RBU_PK_EXT
f6e0: 45 52 4e 41 4c 20 0a 20 20 20 20 20 20 7c 7c 20  ERNAL .      || 
f6f0: 70 2d 3e 6f 62 6a 69 74 65 72 2e 65 54 79 70 65  p->objiter.eType
f700: 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 0a 20  ==RBU_PK_NONE . 
f710: 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   );.  if( sqlite
f720: 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61  3_value_int(apVa
f730: 6c 5b 30 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20  l[0])!=0 ){.    
f740: 70 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70  p->nPhaseOneStep
f750: 20 2b 3d 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 6e   += p->objiter.n
f760: 49 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 66 6f  Index;.  }..  fo
f770: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
f780: 45 5f 4f 4b 20 26 26 20 69 3c 6e 56 61 6c 3b 20  E_OK && i<nVal; 
f790: 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  i++){.    rc = s
f7a0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75  qlite3_bind_valu
f7b0: 65 28 70 2d 3e 6f 62 6a 69 74 65 72 2e 70 54 6d  e(p->objiter.pTm
f7c0: 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20 61 70  pInsert, i+1, ap
f7d0: 56 61 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 69  Val[i]);.  }.  i
f7e0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
f7f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
f800: 73 74 65 70 28 70 2d 3e 6f 62 6a 69 74 65 72 2e  step(p->objiter.
f810: 70 54 6d 70 49 6e 73 65 72 74 29 3b 0a 20 20 20  pTmpInsert);.   
f820: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
f830: 73 65 74 28 70 2d 3e 6f 62 6a 69 74 65 72 2e 70  set(p->objiter.p
f840: 54 6d 70 49 6e 73 65 72 74 29 3b 0a 20 20 7d 0a  TmpInsert);.  }.
f850: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
f860: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
f870: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
f880: 5f 63 6f 64 65 28 70 43 74 78 2c 20 72 63 29 3b  _code(pCtx, rc);
f890: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e  .  }.}../*.** En
f8a0: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 53 51  sure that the SQ
f8b0: 4c 69 74 65 20 73 74 61 74 65 6d 65 6e 74 20 68  Lite statement h
f8c0: 61 6e 64 6c 65 73 20 72 65 71 75 69 72 65 64 20  andles required 
f8d0: 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 0a 2a  to update the .*
f8e0: 2a 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73  * target databas
f8f0: 65 20 6f 62 6a 65 63 74 20 63 75 72 72 65 6e 74  e object current
f900: 6c 79 20 69 6e 64 69 63 61 74 65 64 20 62 79 20  ly indicated by 
f910: 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73  the iterator pas
f920: 73 65 64 20 0a 2a 2a 20 61 73 20 74 68 65 20 73  sed .** as the s
f930: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 61  econd argument a
f940: 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f  re available..*/
f950: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 4f  .static int rbuO
f960: 62 6a 49 74 65 72 50 72 65 70 61 72 65 41 6c 6c  bjIterPrepareAll
f970: 28 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a  (.  sqlite3rbu *
f980: 70 2c 20 0a 20 20 52 62 75 4f 62 6a 49 74 65 72  p, .  RbuObjIter
f990: 20 2a 70 49 74 65 72 2c 0a 20 20 69 6e 74 20 6e   *pIter,.  int n
f9a0: 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20 20  Offset          
f9b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
f9c0: 64 20 22 4c 49 4d 49 54 20 2d 31 20 4f 46 46 53  d "LIMIT -1 OFFS
f9d0: 45 54 20 24 6e 4f 66 66 73 65 74 22 20 74 6f 20  ET $nOffset" to 
f9e0: 53 45 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20 20 61  SELECT */.){.  a
f9f0: 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 62 43  ssert( pIter->bC
fa00: 6c 65 61 6e 75 70 3d 3d 30 20 29 3b 0a 20 20 69  leanup==0 );.  i
fa10: 66 28 20 70 49 74 65 72 2d 3e 70 53 65 6c 65 63  f( pIter->pSelec
fa20: 74 3d 3d 30 20 26 26 20 72 62 75 4f 62 6a 49 74  t==0 && rbuObjIt
fa30: 65 72 43 61 63 68 65 54 61 62 6c 65 49 6e 66 6f  erCacheTableInfo
fa40: 28 70 2c 20 70 49 74 65 72 29 3d 3d 53 51 4c 49  (p, pIter)==SQLI
fa50: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e  TE_OK ){.    con
fa60: 73 74 20 69 6e 74 20 74 6e 75 6d 20 3d 20 70 49  st int tnum = pI
fa70: 74 65 72 2d 3e 69 54 6e 75 6d 3b 0a 20 20 20 20  ter->iTnum;.    
fa80: 63 68 61 72 20 2a 7a 43 6f 6c 6c 69 73 74 20 3d  char *zCollist =
fa90: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
faa0: 20 4c 69 73 74 20 6f 66 20 69 6e 64 65 78 65 64   List of indexed
fab0: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20   columns */.    
fac0: 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70 2d 3e  char **pz = &p->
fad0: 7a 45 72 72 6d 73 67 3b 0a 20 20 20 20 63 6f 6e  zErrmsg;.    con
fae0: 73 74 20 63 68 61 72 20 2a 7a 49 64 78 20 3d 20  st char *zIdx = 
faf0: 70 49 74 65 72 2d 3e 7a 49 64 78 3b 0a 20 20 20  pIter->zIdx;.   
fb00: 20 63 68 61 72 20 2a 7a 4c 69 6d 69 74 20 3d 20   char *zLimit = 
fb10: 30 3b 0a 0a 20 20 20 20 69 66 28 20 6e 4f 66 66  0;..    if( nOff
fb20: 73 65 74 20 29 7b 0a 20 20 20 20 20 20 7a 4c 69  set ){.      zLi
fb30: 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  mit = sqlite3_mp
fb40: 72 69 6e 74 66 28 22 20 4c 49 4d 49 54 20 2d 31  rintf(" LIMIT -1
fb50: 20 4f 46 46 53 45 54 20 25 64 22 2c 20 6e 4f 66   OFFSET %d", nOf
fb60: 66 73 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28  fset);.      if(
fb70: 20 21 7a 4c 69 6d 69 74 20 29 20 70 2d 3e 72 63   !zLimit ) p->rc
fb80: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
fb90: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
fba0: 7a 49 64 78 20 29 7b 0a 20 20 20 20 20 20 63 6f  zIdx ){.      co
fbb0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c 20 3d  nst char *zTbl =
fbc0: 20 70 49 74 65 72 2d 3e 7a 54 62 6c 3b 0a 20 20   pIter->zTbl;.  
fbd0: 20 20 20 20 63 68 61 72 20 2a 7a 49 6d 70 6f 73      char *zImpos
fbe0: 74 65 72 43 6f 6c 73 20 3d 20 30 3b 20 20 20 20  terCols = 0;    
fbf0: 2f 2a 20 43 6f 6c 75 6d 6e 73 20 66 6f 72 20 69  /* Columns for i
fc00: 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20 2a 2f  mposter table */
fc10: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 49 6d  .      char *zIm
fc20: 70 6f 73 74 65 72 50 4b 20 3d 20 30 3b 20 20 20  posterPK = 0;   
fc30: 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 6b 65     /* Primary ke
fc40: 79 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 66 6f  y declaration fo
fc50: 72 20 69 6d 70 6f 73 74 65 72 20 2a 2f 0a 20 20  r imposter */.  
fc60: 20 20 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65      char *zWhere
fc70: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
fc80: 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
fc90: 6f 6e 20 50 4b 20 63 6f 6c 75 6d 6e 73 20 2a 2f  on PK columns */
fca0: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42 69  .      char *zBi
fcb0: 6e 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  nd = 0;.      in
fcc0: 74 20 6e 42 69 6e 64 20 3d 20 30 3b 0a 0a 20 20  t nBind = 0;..  
fcd0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
fce0: 72 2d 3e 65 54 79 70 65 21 3d 52 42 55 5f 50 4b  r->eType!=RBU_PK
fcf0: 5f 56 54 41 42 20 29 3b 0a 20 20 20 20 20 20 7a  _VTAB );.      z
fd00: 43 6f 6c 6c 69 73 74 20 3d 20 72 62 75 4f 62 6a  Collist = rbuObj
fd10: 49 74 65 72 47 65 74 49 6e 64 65 78 43 6f 6c 73  IterGetIndexCols
fd20: 28 0a 20 20 20 20 20 20 20 20 20 20 70 2c 20 70  (.          p, p
fd30: 49 74 65 72 2c 20 26 7a 49 6d 70 6f 73 74 65 72  Iter, &zImposter
fd40: 43 6f 6c 73 2c 20 26 7a 49 6d 70 6f 73 74 65 72  Cols, &zImposter
fd50: 50 4b 2c 20 26 7a 57 68 65 72 65 2c 20 26 6e 42  PK, &zWhere, &nB
fd60: 69 6e 64 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ind.      );.   
fd70: 20 20 20 7a 42 69 6e 64 20 3d 20 72 62 75 4f 62     zBind = rbuOb
fd80: 6a 49 74 65 72 47 65 74 42 69 6e 64 6c 69 73 74  jIterGetBindlist
fd90: 28 70 2c 20 6e 42 69 6e 64 29 3b 0a 0a 20 20 20  (p, nBind);..   
fda0: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65     /* Create the
fdb0: 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20   imposter table 
fdc0: 75 73 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f  used to write to
fdd0: 20 74 68 69 73 20 69 6e 64 65 78 2e 20 2a 2f 0a   this index. */.
fde0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65        sqlite3_te
fdf0: 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
fe00: 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53  E_TESTCTRL_IMPOS
fe10: 54 45 52 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20  TER, p->dbMain, 
fe20: 22 6d 61 69 6e 22 2c 20 30 2c 20 31 29 3b 0a 20  "main", 0, 1);. 
fe30: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73       sqlite3_tes
fe40: 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
fe50: 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54  _TESTCTRL_IMPOST
fe60: 45 52 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22  ER, p->dbMain, "
fe70: 6d 61 69 6e 22 2c 20 31 2c 74 6e 75 6d 29 3b 0a  main", 1,tnum);.
fe80: 20 20 20 20 20 20 72 62 75 4d 50 72 69 6e 74 66        rbuMPrintf
fe90: 45 78 65 63 28 70 2c 20 70 2d 3e 64 62 4d 61 69  Exec(p, p->dbMai
fea0: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 22 43 52  n,.          "CR
feb0: 45 41 54 45 20 54 41 42 4c 45 20 5c 22 72 62 75  EATE TABLE \"rbu
fec0: 5f 69 6d 70 5f 25 77 5c 22 28 20 25 73 2c 20 50  _imp_%w\"( %s, P
fed0: 52 49 4d 41 52 59 20 4b 45 59 28 20 25 73 20 29  RIMARY KEY( %s )
fee0: 20 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44   ) WITHOUT ROWID
fef0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 7a 54 62  ",.          zTb
ff00: 6c 2c 20 7a 49 6d 70 6f 73 74 65 72 43 6f 6c 73  l, zImposterCols
ff10: 2c 20 7a 49 6d 70 6f 73 74 65 72 50 4b 0a 20 20  , zImposterPK.  
ff20: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c      );.      sql
ff30: 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
ff40: 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
ff50: 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64  L_IMPOSTER, p->d
ff60: 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c 20 30  bMain, "main", 0
ff70: 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  , 0);..      /* 
ff80: 43 72 65 61 74 65 20 74 68 65 20 73 74 61 74 65  Create the state
ff90: 6d 65 6e 74 20 74 6f 20 69 6e 73 65 72 74 20 69  ment to insert i
ffa0: 6e 64 65 78 20 65 6e 74 72 69 65 73 20 2a 2f 0a  ndex entries */.
ffb0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 43 6f        pIter->nCo
ffc0: 6c 20 3d 20 6e 42 69 6e 64 3b 0a 20 20 20 20 20  l = nBind;.     
ffd0: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
ffe0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
fff0: 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65   p->rc = prepare
10000 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  FreeAndCollectEr
10010 72 6f 72 28 0a 20 20 20 20 20 20 20 20 20 20 20  ror(.           
10020 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 49 74   p->dbMain, &pIt
10030 65 72 2d 3e 70 49 6e 73 65 72 74 2c 20 26 70 2d  er->pInsert, &p-
10040 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20 20 20  >zErrmsg,.      
10050 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69      sqlite3_mpri
10060 6e 74 66 28 22 49 4e 53 45 52 54 20 49 4e 54 4f  ntf("INSERT INTO
10070 20 5c 22 72 62 75 5f 69 6d 70 5f 25 77 5c 22 20   \"rbu_imp_%w\" 
10080 56 41 4c 55 45 53 28 25 73 29 22 2c 20 7a 54 62  VALUES(%s)", zTb
10090 6c 2c 20 7a 42 69 6e 64 29 0a 20 20 20 20 20 20  l, zBind).      
100a0 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20    );.      }..  
100b0 20 20 20 20 2f 2a 20 41 6e 64 20 74 6f 20 64 65      /* And to de
100c0 6c 65 74 65 20 69 6e 64 65 78 20 65 6e 74 72 69  lete index entri
100d0 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  es */.      if( 
100e0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
100f0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   ){.        p->r
10100 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41  c = prepareFreeA
10110 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 0a  ndCollectError(.
10120 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 64              p->d
10130 62 4d 61 69 6e 2c 20 26 70 49 74 65 72 2d 3e 70  bMain, &pIter->p
10140 44 65 6c 65 74 65 2c 20 26 70 2d 3e 7a 45 72 72  Delete, &p->zErr
10150 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20 73  msg,.          s
10160 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
10170 44 45 4c 45 54 45 20 46 52 4f 4d 20 5c 22 72 62  DELETE FROM \"rb
10180 75 5f 69 6d 70 5f 25 77 5c 22 20 57 48 45 52 45  u_imp_%w\" WHERE
10190 20 25 73 22 2c 20 7a 54 62 6c 2c 20 7a 57 68 65   %s", zTbl, zWhe
101a0 72 65 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  re).        );. 
101b0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
101c0 20 43 72 65 61 74 65 20 74 68 65 20 53 45 4c 45   Create the SELE
101d0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  CT statement to 
101e0 72 65 61 64 20 6b 65 79 73 20 69 6e 20 73 6f 72  read keys in sor
101f0 74 65 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20  ted order */.   
10200 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
10210 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10220 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20     char *zSql;. 
10230 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72         if( pIter
10240 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
10250 45 58 54 45 52 4e 41 4c 20 7c 7c 20 70 49 74 65  EXTERNAL || pIte
10260 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
10270 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _NONE ){.       
10280 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
10290 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
102a0 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54           "SELECT
102b0 20 25 73 2c 20 72 62 75 5f 63 6f 6e 74 72 6f 6c   %s, rbu_control
102c0 20 46 52 4f 4d 20 25 73 2e 27 72 62 75 5f 74 6d   FROM %s.'rbu_tm
102d0 70 5f 25 71 27 20 4f 52 44 45 52 20 42 59 20 25  p_%q' ORDER BY %
102e0 73 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s%s",.          
102f0 20 20 20 20 7a 43 6f 6c 6c 69 73 74 2c 20 70 2d      zCollist, p-
10300 3e 7a 53 74 61 74 65 44 62 2c 20 70 49 74 65 72  >zStateDb, pIter
10310 2d 3e 7a 44 61 74 61 54 62 6c 2c 0a 20 20 20 20  ->zDataTbl,.    
10320 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69            zColli
10330 73 74 2c 20 7a 4c 69 6d 69 74 0a 20 20 20 20 20  st, zLimit.     
10340 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
10350 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
10360 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
10370 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
10380 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 25         "SELECT %
10390 73 2c 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 46  s, rbu_control F
103a0 52 4f 4d 20 25 73 2e 27 72 62 75 5f 74 6d 70 5f  ROM %s.'rbu_tmp_
103b0 25 71 27 20 22 0a 20 20 20 20 20 20 20 20 20 20  %q' ".          
103c0 20 20 20 20 22 55 4e 49 4f 4e 20 41 4c 4c 20 22      "UNION ALL "
103d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
103e0 53 45 4c 45 43 54 20 25 73 2c 20 72 62 75 5f 63  SELECT %s, rbu_c
103f0 6f 6e 74 72 6f 6c 20 46 52 4f 4d 20 27 25 71 27  ontrol FROM '%q'
10400 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
10410 20 22 57 48 45 52 45 20 74 79 70 65 6f 66 28 72   "WHERE typeof(r
10420 62 75 5f 63 6f 6e 74 72 6f 6c 29 3d 27 69 6e 74  bu_control)='int
10430 65 67 65 72 27 20 41 4e 44 20 72 62 75 5f 63 6f  eger' AND rbu_co
10440 6e 74 72 6f 6c 21 3d 31 20 22 0a 20 20 20 20 20  ntrol!=1 ".     
10450 20 20 20 20 20 20 20 20 20 22 4f 52 44 45 52 20           "ORDER 
10460 42 59 20 25 73 25 73 22 2c 0a 20 20 20 20 20 20  BY %s%s",.      
10470 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74          zCollist
10480 2c 20 70 2d 3e 7a 53 74 61 74 65 44 62 2c 20 70  , p->zStateDb, p
10490 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 2c 20  Iter->zDataTbl, 
104a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  .              z
104b0 43 6f 6c 6c 69 73 74 2c 20 70 49 74 65 72 2d 3e  Collist, pIter->
104c0 7a 44 61 74 61 54 62 6c 2c 20 0a 20 20 20 20 20  zDataTbl, .     
104d0 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73           zCollis
104e0 74 2c 20 7a 4c 69 6d 69 74 0a 20 20 20 20 20 20  t, zLimit.      
104f0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d      );.        }
10500 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
10510 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43   prepareFreeAndC
10520 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64  ollectError(p->d
10530 62 52 62 75 2c 20 26 70 49 74 65 72 2d 3e 70 53  bRbu, &pIter->pS
10540 65 6c 65 63 74 2c 20 70 7a 2c 20 7a 53 71 6c 29  elect, pz, zSql)
10550 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
10560 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 49   sqlite3_free(zI
10570 6d 70 6f 73 74 65 72 43 6f 6c 73 29 3b 0a 20 20  mposterCols);.  
10580 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
10590 28 7a 49 6d 70 6f 73 74 65 72 50 4b 29 3b 0a 20  (zImposterPK);. 
105a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
105b0 65 28 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 20  e(zWhere);.     
105c0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
105d0 69 6e 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ind);.    }else{
105e0 0a 20 20 20 20 20 20 69 6e 74 20 62 52 62 75 52  .      int bRbuR
105f0 6f 77 69 64 20 3d 20 28 70 49 74 65 72 2d 3e 65  owid = (pIter->e
10600 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 56 54 41  Type==RBU_PK_VTA
10610 42 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70  B || pIter->eTyp
10620 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 29 3b  e==RBU_PK_NONE);
10630 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
10640 72 20 2a 7a 54 62 6c 20 3d 20 70 49 74 65 72 2d  r *zTbl = pIter-
10650 3e 7a 54 62 6c 3b 20 20 20 20 20 20 20 2f 2a 20  >zTbl;       /* 
10660 54 61 62 6c 65 20 74 68 69 73 20 73 74 65 70 20  Table this step 
10670 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20  applies to */.  
10680 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
10690 7a 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20  zWrite;         
106a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6d 70            /* Imp
106b0 6f 73 74 65 72 20 74 61 62 6c 65 20 6e 61 6d 65  oster table name
106c0 20 2a 2f 0a 0a 20 20 20 20 20 20 63 68 61 72 20   */..      char 
106d0 2a 7a 42 69 6e 64 69 6e 67 73 20 3d 20 72 62 75  *zBindings = rbu
106e0 4f 62 6a 49 74 65 72 47 65 74 42 69 6e 64 6c 69  ObjIterGetBindli
106f0 73 74 28 70 2c 20 70 49 74 65 72 2d 3e 6e 54 62  st(p, pIter->nTb
10700 6c 43 6f 6c 20 2b 20 62 52 62 75 52 6f 77 69 64  lCol + bRbuRowid
10710 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  );.      char *z
10720 57 68 65 72 65 20 3d 20 72 62 75 4f 62 6a 49 74  Where = rbuObjIt
10730 65 72 47 65 74 57 68 65 72 65 28 70 2c 20 70 49  erGetWhere(p, pI
10740 74 65 72 29 3b 0a 20 20 20 20 20 20 63 68 61 72  ter);.      char
10750 20 2a 7a 4f 6c 64 6c 69 73 74 20 3d 20 72 62 75   *zOldlist = rbu
10760 4f 62 6a 49 74 65 72 47 65 74 4f 6c 64 6c 69 73  ObjIterGetOldlis
10770 74 28 70 2c 20 70 49 74 65 72 2c 20 22 6f 6c 64  t(p, pIter, "old
10780 22 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  ");.      char *
10790 7a 4e 65 77 6c 69 73 74 20 3d 20 72 62 75 4f 62  zNewlist = rbuOb
107a0 6a 49 74 65 72 47 65 74 4f 6c 64 6c 69 73 74 28  jIterGetOldlist(
107b0 70 2c 20 70 49 74 65 72 2c 20 22 6e 65 77 22 29  p, pIter, "new")
107c0 3b 0a 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73  ;..      zCollis
107d0 74 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 47 65  t = rbuObjIterGe
107e0 74 43 6f 6c 6c 69 73 74 28 70 2c 20 70 49 74 65  tCollist(p, pIte
107f0 72 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  r);.      pIter-
10800 3e 6e 43 6f 6c 20 3d 20 70 49 74 65 72 2d 3e 6e  >nCol = pIter->n
10810 54 62 6c 43 6f 6c 3b 0a 0a 20 20 20 20 20 20 2f  TblCol;..      /
10820 2a 20 43 72 65 61 74 65 20 74 68 65 20 69 6d 70  * Create the imp
10830 6f 73 74 65 72 20 74 61 62 6c 65 20 6f 72 20 74  oster table or t
10840 61 62 6c 65 73 20 28 69 66 20 72 65 71 75 69 72  ables (if requir
10850 65 64 29 2e 20 2a 2f 0a 20 20 20 20 20 20 72 62  ed). */.      rb
10860 75 43 72 65 61 74 65 49 6d 70 6f 73 74 65 72 54  uCreateImposterT
10870 61 62 6c 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  able(p, pIter);.
10880 20 20 20 20 20 20 72 62 75 43 72 65 61 74 65 49        rbuCreateI
10890 6d 70 6f 73 74 65 72 54 61 62 6c 65 32 28 70 2c  mposterTable2(p,
108a0 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7a   pIter);.      z
108b0 57 72 69 74 65 20 3d 20 28 70 49 74 65 72 2d 3e  Write = (pIter->
108c0 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 56 54  eType==RBU_PK_VT
108d0 41 42 20 3f 20 22 22 20 3a 20 22 72 62 75 5f 69  AB ? "" : "rbu_i
108e0 6d 70 5f 22 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  mp_");..      /*
108f0 20 43 72 65 61 74 65 20 74 68 65 20 49 4e 53 45   Create the INSE
10900 52 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  RT statement to 
10910 77 72 69 74 65 20 74 6f 20 74 68 65 20 74 61 72  write to the tar
10920 67 65 74 20 50 4b 20 62 2d 74 72 65 65 20 2a 2f  get PK b-tree */
10930 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
10940 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
10950 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70         p->rc = p
10960 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c  repareFreeAndCol
10970 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d  lectError(p->dbM
10980 61 69 6e 2c 20 26 70 49 74 65 72 2d 3e 70 49 6e  ain, &pIter->pIn
10990 73 65 72 74 2c 20 70 7a 2c 0a 20 20 20 20 20 20  sert, pz,.      
109a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70        sqlite3_mp
109b0 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
109c0 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54       "INSERT INT
109d0 4f 20 5c 22 25 73 25 77 5c 22 28 25 73 25 73 29  O \"%s%w\"(%s%s)
109e0 20 56 41 4c 55 45 53 28 25 73 29 22 2c 20 0a 20   VALUES(%s)", . 
109f0 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 57 72               zWr
10a00 69 74 65 2c 20 7a 54 62 6c 2c 20 7a 43 6f 6c 6c  ite, zTbl, zColl
10a10 69 73 74 2c 20 28 62 52 62 75 52 6f 77 69 64 20  ist, (bRbuRowid 
10a20 3f 20 22 2c 20 5f 72 6f 77 69 64 5f 22 20 3a 20  ? ", _rowid_" : 
10a30 22 22 29 2c 20 7a 42 69 6e 64 69 6e 67 73 0a 20  ""), zBindings. 
10a40 20 20 20 20 20 20 20 20 20 20 20 29 0a 20 20 20             ).   
10a50 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
10a60 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65  .      /* Create
10a70 20 74 68 65 20 44 45 4c 45 54 45 20 73 74 61 74   the DELETE stat
10a80 65 6d 65 6e 74 20 74 6f 20 77 72 69 74 65 20 74  ement to write t
10a90 6f 20 74 68 65 20 74 61 72 67 65 74 20 50 4b 20  o the target PK 
10aa0 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20  b-tree */.      
10ab0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
10ac0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
10ad0 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46  p->rc = prepareF
10ae0 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  reeAndCollectErr
10af0 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70  or(p->dbMain, &p
10b00 49 74 65 72 2d 3e 70 44 65 6c 65 74 65 2c 20 70  Iter->pDelete, p
10b10 7a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  z,.            s
10b20 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
10b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 44                "D
10b40 45 4c 45 54 45 20 46 52 4f 4d 20 5c 22 25 73 25  ELETE FROM \"%s%
10b50 77 5c 22 20 57 48 45 52 45 20 25 73 22 2c 20 7a  w\" WHERE %s", z
10b60 57 72 69 74 65 2c 20 7a 54 62 6c 2c 20 7a 57 68  Write, zTbl, zWh
10b70 65 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ere.            
10b80 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
10b90 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
10ba0 70 49 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64  pIter->abIndexed
10bb0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
10bc0 74 20 63 68 61 72 20 2a 7a 52 62 75 52 6f 77 69  t char *zRbuRowi
10bd0 64 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20  d = "";.        
10be0 69 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65  if( pIter->eType
10bf0 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41  ==RBU_PK_EXTERNA
10c00 4c 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70  L || pIter->eTyp
10c10 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 29  e==RBU_PK_NONE )
10c20 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 52 62 75  {.          zRbu
10c30 52 6f 77 69 64 20 3d 20 22 2c 20 72 62 75 5f 72  Rowid = ", rbu_r
10c40 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 20 20 7d  owid";.        }
10c50 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 72 65  ..        /* Cre
10c60 61 74 65 20 74 68 65 20 72 62 75 5f 74 6d 70 5f  ate the rbu_tmp_
10c70 78 78 78 20 74 61 62 6c 65 20 61 6e 64 20 74 68  xxx table and th
10c80 65 20 74 72 69 67 67 65 72 73 20 74 6f 20 70 6f  e triggers to po
10c90 70 75 6c 61 74 65 20 69 74 2e 20 2a 2f 0a 20 20  pulate it. */.  
10ca0 20 20 20 20 20 20 72 62 75 4d 50 72 69 6e 74 66        rbuMPrintf
10cb0 45 78 65 63 28 70 2c 20 70 2d 3e 64 62 52 62 75  Exec(p, p->dbRbu
10cc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43  ,.            "C
10cd0 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e  REATE TABLE IF N
10ce0 4f 54 20 45 58 49 53 54 53 20 25 73 2e 27 72 62  OT EXISTS %s.'rb
10cf0 75 5f 74 6d 70 5f 25 71 27 20 41 53 20 22 0a 20  u_tmp_%q' AS ". 
10d00 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45             "SELE
10d10 43 54 20 2a 25 73 20 46 52 4f 4d 20 27 25 71 27  CT *%s FROM '%q'
10d20 20 57 48 45 52 45 20 30 3b 22 0a 20 20 20 20 20   WHERE 0;".     
10d30 20 20 20 20 20 20 20 2c 20 70 2d 3e 7a 53 74 61         , p->zSta
10d40 74 65 44 62 2c 20 70 49 74 65 72 2d 3e 7a 44 61  teDb, pIter->zDa
10d50 74 61 54 62 6c 0a 20 20 20 20 20 20 20 20 20 20  taTbl.          
10d60 20 20 2c 20 28 70 49 74 65 72 2d 3e 65 54 79 70    , (pIter->eTyp
10d70 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e  e==RBU_PK_EXTERN
10d80 41 4c 20 3f 20 22 2c 20 30 20 41 53 20 72 62 75  AL ? ", 0 AS rbu
10d90 5f 72 6f 77 69 64 22 20 3a 20 22 22 29 0a 20 20  _rowid" : "").  
10da0 20 20 20 20 20 20 20 20 20 20 2c 20 70 49 74 65            , pIte
10db0 72 2d 3e 7a 44 61 74 61 54 62 6c 0a 20 20 20 20  r->zDataTbl.    
10dc0 20 20 20 20 29 3b 0a 0a 20 20 20 20 20 20 20 20      );..        
10dd0 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63 28 70  rbuMPrintfExec(p
10de0 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 0a 20 20 20  , p->dbMain,.   
10df0 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
10e00 20 54 45 4d 50 20 54 52 49 47 47 45 52 20 72 62   TEMP TRIGGER rb
10e10 75 5f 64 65 6c 65 74 65 5f 74 72 20 42 45 46 4f  u_delete_tr BEFO
10e20 52 45 20 44 45 4c 45 54 45 20 4f 4e 20 5c 22 25  RE DELETE ON \"%
10e30 73 25 77 5c 22 20 22 0a 20 20 20 20 20 20 20 20  s%w\" ".        
10e40 20 20 20 20 22 42 45 47 49 4e 20 22 0a 20 20 20      "BEGIN ".   
10e50 20 20 20 20 20 20 20 20 20 22 20 20 53 45 4c 45           "  SELE
10e60 43 54 20 72 62 75 5f 74 6d 70 5f 69 6e 73 65 72  CT rbu_tmp_inser
10e70 74 28 33 2c 20 25 73 29 3b 22 0a 20 20 20 20 20  t(3, %s);".     
10e80 20 20 20 20 20 20 20 22 45 4e 44 3b 22 0a 0a 20         "END;".. 
10e90 20 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41             "CREA
10ea0 54 45 20 54 45 4d 50 20 54 52 49 47 47 45 52 20  TE TEMP TRIGGER 
10eb0 72 62 75 5f 75 70 64 61 74 65 31 5f 74 72 20 42  rbu_update1_tr B
10ec0 45 46 4f 52 45 20 55 50 44 41 54 45 20 4f 4e 20  EFORE UPDATE ON 
10ed0 5c 22 25 73 25 77 5c 22 20 22 0a 20 20 20 20 20  \"%s%w\" ".     
10ee0 20 20 20 20 20 20 20 22 42 45 47 49 4e 20 22 0a         "BEGIN ".
10ef0 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 53              "  S
10f00 45 4c 45 43 54 20 72 62 75 5f 74 6d 70 5f 69 6e  ELECT rbu_tmp_in
10f10 73 65 72 74 28 33 2c 20 25 73 29 3b 22 0a 20 20  sert(3, %s);".  
10f20 20 20 20 20 20 20 20 20 20 20 22 45 4e 44 3b 22            "END;"
10f30 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43  ..            "C
10f40 52 45 41 54 45 20 54 45 4d 50 20 54 52 49 47 47  REATE TEMP TRIGG
10f50 45 52 20 72 62 75 5f 75 70 64 61 74 65 32 5f 74  ER rbu_update2_t
10f60 72 20 41 46 54 45 52 20 55 50 44 41 54 45 20 4f  r AFTER UPDATE O
10f70 4e 20 5c 22 25 73 25 77 5c 22 20 22 0a 20 20 20  N \"%s%w\" ".   
10f80 20 20 20 20 20 20 20 20 20 22 42 45 47 49 4e 20           "BEGIN 
10f90 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 20  ".            " 
10fa0 20 53 45 4c 45 43 54 20 72 62 75 5f 74 6d 70 5f   SELECT rbu_tmp_
10fb0 69 6e 73 65 72 74 28 34 2c 20 25 73 29 3b 22 0a  insert(4, %s);".
10fc0 20 20 20 20 20 20 20 20 20 20 20 20 22 45 4e 44              "END
10fd0 3b 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ;",.            
10fe0 7a 57 72 69 74 65 2c 20 7a 54 62 6c 2c 20 7a 4f  zWrite, zTbl, zO
10ff0 6c 64 6c 69 73 74 2c 0a 20 20 20 20 20 20 20 20  ldlist,.        
11000 20 20 20 20 7a 57 72 69 74 65 2c 20 7a 54 62 6c      zWrite, zTbl
11010 2c 20 7a 4f 6c 64 6c 69 73 74 2c 0a 20 20 20 20  , zOldlist,.    
11020 20 20 20 20 20 20 20 20 7a 57 72 69 74 65 2c 20          zWrite, 
11030 7a 54 62 6c 2c 20 7a 4e 65 77 6c 69 73 74 0a 20  zTbl, zNewlist. 
11040 20 20 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20         );..     
11050 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 65 54     if( pIter->eT
11060 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45  ype==RBU_PK_EXTE
11070 52 4e 41 4c 20 7c 7c 20 70 49 74 65 72 2d 3e 65  RNAL || pIter->e
11080 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e  Type==RBU_PK_NON
11090 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  E ){.          r
110a0 62 75 4d 50 72 69 6e 74 66 45 78 65 63 28 70 2c  buMPrintfExec(p,
110b0 20 70 2d 3e 64 62 4d 61 69 6e 2c 0a 20 20 20 20   p->dbMain,.    
110c0 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54            "CREAT
110d0 45 20 54 45 4d 50 20 54 52 49 47 47 45 52 20 72  E TEMP TRIGGER r
110e0 62 75 5f 69 6e 73 65 72 74 5f 74 72 20 41 46 54  bu_insert_tr AFT
110f0 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 5c 22 25  ER INSERT ON \"%
11100 73 25 77 5c 22 20 22 0a 20 20 20 20 20 20 20 20  s%w\" ".        
11110 20 20 20 20 20 20 22 42 45 47 49 4e 20 22 0a 20        "BEGIN ". 
11120 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
11130 53 45 4c 45 43 54 20 72 62 75 5f 74 6d 70 5f 69  SELECT rbu_tmp_i
11140 6e 73 65 72 74 28 30 2c 20 25 73 29 3b 22 0a 20  nsert(0, %s);". 
11150 20 20 20 20 20 20 20 20 20 20 20 20 20 22 45 4e               "EN
11160 44 3b 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  D;",.           
11170 20 20 20 7a 57 72 69 74 65 2c 20 7a 54 62 6c 2c     zWrite, zTbl,
11180 20 7a 4e 65 77 6c 69 73 74 0a 20 20 20 20 20 20   zNewlist.      
11190 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d      );.        }
111a0 0a 0a 20 20 20 20 20 20 20 20 72 62 75 4f 62 6a  ..        rbuObj
111b0 49 74 65 72 50 72 65 70 61 72 65 54 6d 70 49 6e  IterPrepareTmpIn
111c0 73 65 72 74 28 70 2c 20 70 49 74 65 72 2c 20 7a  sert(p, pIter, z
111d0 43 6f 6c 6c 69 73 74 2c 20 7a 52 62 75 52 6f 77  Collist, zRbuRow
111e0 69 64 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  id);.      }..  
111f0 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68      /* Create th
11200 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
11210 6e 74 20 74 6f 20 72 65 61 64 20 6b 65 79 73 20  nt to read keys 
11220 66 72 6f 6d 20 64 61 74 61 5f 78 78 78 20 2a 2f  from data_xxx */
11230 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
11240 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
11250 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70         p->rc = p
11260 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c  repareFreeAndCol
11270 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 52  lectError(p->dbR
11280 62 75 2c 20 26 70 49 74 65 72 2d 3e 70 53 65 6c  bu, &pIter->pSel
11290 65 63 74 2c 20 70 7a 2c 0a 20 20 20 20 20 20 20  ect, pz,.       
112a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72       sqlite3_mpr
112b0 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
112c0 20 20 20 20 22 53 45 4c 45 43 54 20 25 73 2c 20      "SELECT %s, 
112d0 72 62 75 5f 63 6f 6e 74 72 6f 6c 25 73 20 46 52  rbu_control%s FR
112e0 4f 4d 20 27 25 71 27 25 73 22 2c 20 0a 20 20 20  OM '%q'%s", .   
112f0 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c             zColl
11300 69 73 74 2c 20 28 62 52 62 75 52 6f 77 69 64 20  ist, (bRbuRowid 
11310 3f 20 22 2c 20 72 62 75 5f 72 6f 77 69 64 22 20  ? ", rbu_rowid" 
11320 3a 20 22 22 29 2c 20 0a 20 20 20 20 20 20 20 20  : ""), .        
11330 20 20 20 20 20 20 70 49 74 65 72 2d 3e 7a 44 61        pIter->zDa
11340 74 61 54 62 6c 2c 20 7a 4c 69 6d 69 74 0a 20 20  taTbl, zLimit.  
11350 20 20 20 20 20 20 20 20 20 20 29 0a 20 20 20 20            ).    
11360 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a      );.      }..
11370 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
11380 65 65 28 7a 57 68 65 72 65 29 3b 0a 20 20 20 20  ee(zWhere);.    
11390 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
113a0 4f 6c 64 6c 69 73 74 29 3b 0a 20 20 20 20 20 20  Oldlist);.      
113b0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 65  sqlite3_free(zNe
113c0 77 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 73 71  wlist);.      sq
113d0 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 69 6e 64  lite3_free(zBind
113e0 69 6e 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ings);.    }.   
113f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
11400 6f 6c 6c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c  ollist);.    sql
11410 69 74 65 33 5f 66 72 65 65 28 7a 4c 69 6d 69 74  ite3_free(zLimit
11420 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 72 65 74 75  );.  }.  .  retu
11430 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a  rn p->rc;.}../*.
11440 2a 2a 20 53 65 74 20 6f 75 74 70 75 74 20 76 61  ** Set output va
11450 72 69 61 62 6c 65 20 2a 70 70 53 74 6d 74 20 74  riable *ppStmt t
11460 6f 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 55 50  o point to an UP
11470 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74  DATE statement t
11480 68 61 74 20 6d 61 79 0a 2a 2a 20 62 65 20 75 73  hat may.** be us
11490 65 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  ed to update the
114a0 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20   imposter table 
114b0 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 74 61 62  for the main tab
114c0 6c 65 20 62 2d 74 72 65 65 20 6f 66 20 74 68 65  le b-tree of the
114d0 0a 2a 2a 20 74 61 62 6c 65 20 6f 62 6a 65 63 74  .** table object
114e0 20 74 68 61 74 20 70 49 74 65 72 20 63 75 72 72   that pIter curr
114f0 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2c  ently points to,
11500 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 74   assuming that t
11510 68 65 20 0a 2a 2a 20 72 62 75 5f 63 6f 6e 74 72  he .** rbu_contr
11520 6f 6c 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  ol column of the
11530 20 64 61 74 61 5f 78 79 7a 20 74 61 62 6c 65 20   data_xyz table 
11540 63 6f 6e 74 61 69 6e 73 20 7a 4d 61 73 6b 2e 0a  contains zMask..
11550 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 7a 4d  ** .** If the zM
11560 61 73 6b 20 73 74 72 69 6e 67 20 64 6f 65 73 20  ask string does 
11570 6e 6f 74 20 73 70 65 63 69 66 79 20 61 6e 79 20  not specify any 
11580 63 6f 6c 75 6d 6e 73 20 74 6f 20 75 70 64 61 74  columns to updat
11590 65 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20  e, then this.** 
115a0 69 73 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 2e  is not an error.
115b0 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   Output variable
115c0 20 2a 70 70 53 74 6d 74 20 69 73 20 73 65 74 20   *ppStmt is set 
115d0 74 6f 20 4e 55 4c 4c 20 69 6e 20 74 68 69 73 20  to NULL in this 
115e0 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  case..*/.static 
115f0 69 6e 74 20 72 62 75 47 65 74 55 70 64 61 74 65  int rbuGetUpdate
11600 53 74 6d 74 28 0a 20 20 73 71 6c 69 74 65 33 72  Stmt(.  sqlite3r
11610 62 75 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  bu *p,          
11620 20 20 20 20 20 20 20 20 2f 2a 20 52 42 55 20 68          /* RBU h
11630 61 6e 64 6c 65 20 2a 2f 0a 20 20 52 62 75 4f 62  andle */.  RbuOb
11640 6a 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20  jIter *pIter,   
11650 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62             /* Ob
11660 6a 65 63 74 20 69 74 65 72 61 74 6f 72 20 2a 2f  ject iterator */
11670 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
11680 4d 61 73 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Mask,           
11690 20 20 20 2f 2a 20 72 62 75 5f 63 6f 6e 74 72 6f     /* rbu_contro
116a0 6c 20 76 61 6c 75 65 20 28 27 78 2e 78 2e 27 29  l value ('x.x.')
116b0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
116c0 6d 74 20 2a 2a 70 70 53 74 6d 74 20 20 20 20 20  mt **ppStmt     
116d0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 55 50        /* OUT: UP
116e0 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 68  DATE statement h
116f0 61 6e 64 6c 65 20 2a 2f 0a 29 7b 0a 20 20 52 62  andle */.){.  Rb
11700 75 55 70 64 61 74 65 53 74 6d 74 20 2a 2a 70 70  uUpdateStmt **pp
11710 3b 0a 20 20 52 62 75 55 70 64 61 74 65 53 74 6d  ;.  RbuUpdateStm
11720 74 20 2a 70 55 70 20 3d 20 30 3b 0a 20 20 69 6e  t *pUp = 0;.  in
11730 74 20 6e 55 70 20 3d 20 30 3b 0a 0a 20 20 2f 2a  t nUp = 0;..  /*
11740 20 49 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f   In case an erro
11750 72 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20 2a 70  r occurs */.  *p
11760 70 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  pStmt = 0;..  /*
11770 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65   Search for an e
11780 78 69 73 74 69 6e 67 20 73 74 61 74 65 6d 65 6e  xisting statemen
11790 74 2e 20 49 66 20 6f 6e 65 20 69 73 20 66 6f 75  t. If one is fou
117a0 6e 64 2c 20 73 68 69 66 74 20 69 74 20 74 6f 20  nd, shift it to 
117b0 74 68 65 20 66 72 6f 6e 74 0a 20 20 2a 2a 20 6f  the front.  ** o
117c0 66 20 74 68 65 20 4c 52 55 20 71 75 65 75 65 20  f the LRU queue 
117d0 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d 65 64  and return immed
117e0 69 61 74 65 6c 79 2e 20 4f 74 68 65 72 77 69 73  iately. Otherwis
117f0 65 2c 20 6c 65 61 76 65 20 6e 55 70 20 70 6f 69  e, leave nUp poi
11800 6e 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68  nting.  ** to th
11810 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 74 61 74  e number of stat
11820 65 6d 65 6e 74 73 20 63 75 72 72 65 6e 74 6c 79  ements currently
11830 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 61 6e   in the cache an
11840 64 20 70 55 70 20 74 6f 20 74 68 65 0a 20 20 2a  d pUp to the.  *
11850 2a 20 6c 61 73 74 20 6f 62 6a 65 63 74 20 69 6e  * last object in
11860 20 74 68 65 20 6c 69 73 74 2e 20 20 2a 2f 0a 20   the list.  */. 
11870 20 66 6f 72 28 70 70 3d 26 70 49 74 65 72 2d 3e   for(pp=&pIter->
11880 70 52 62 75 55 70 64 61 74 65 3b 20 2a 70 70 3b  pRbuUpdate; *pp;
11890 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65   pp=&((*pp)->pNe
118a0 78 74 29 29 7b 0a 20 20 20 20 70 55 70 20 3d 20  xt)){.    pUp = 
118b0 2a 70 70 3b 0a 20 20 20 20 69 66 28 20 73 74 72  *pp;.    if( str
118c0 63 6d 70 28 70 55 70 2d 3e 7a 4d 61 73 6b 2c 20  cmp(pUp->zMask, 
118d0 7a 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  zMask)==0 ){.   
118e0 20 20 20 2a 70 70 20 3d 20 70 55 70 2d 3e 70 4e     *pp = pUp->pN
118f0 65 78 74 3b 0a 20 20 20 20 20 20 70 55 70 2d 3e  ext;.      pUp->
11900 70 4e 65 78 74 20 3d 20 70 49 74 65 72 2d 3e 70  pNext = pIter->p
11910 52 62 75 55 70 64 61 74 65 3b 0a 20 20 20 20 20  RbuUpdate;.     
11920 20 70 49 74 65 72 2d 3e 70 52 62 75 55 70 64 61   pIter->pRbuUpda
11930 74 65 20 3d 20 70 55 70 3b 0a 20 20 20 20 20 20  te = pUp;.      
11940 2a 70 70 53 74 6d 74 20 3d 20 70 55 70 2d 3e 70  *ppStmt = pUp->p
11950 55 70 64 61 74 65 3b 20 0a 20 20 20 20 20 20 72  Update; .      r
11960 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11970 0a 20 20 20 20 7d 0a 20 20 20 20 6e 55 70 2b 2b  .    }.    nUp++
11980 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
11990 70 55 70 3d 3d 30 20 7c 7c 20 70 55 70 2d 3e 70  pUp==0 || pUp->p
119a0 4e 65 78 74 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  Next==0 );..  if
119b0 28 20 6e 55 70 3e 3d 53 51 4c 49 54 45 5f 52 42  ( nUp>=SQLITE_RB
119c0 55 5f 55 50 44 41 54 45 5f 43 41 43 48 45 53 49  U_UPDATE_CACHESI
119d0 5a 45 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 70  ZE ){.    for(pp
119e0 3d 26 70 49 74 65 72 2d 3e 70 52 62 75 55 70 64  =&pIter->pRbuUpd
119f0 61 74 65 3b 20 2a 70 70 21 3d 70 55 70 3b 20 70  ate; *pp!=pUp; p
11a00 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74  p=&((*pp)->pNext
11a10 29 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b  ));.    *pp = 0;
11a20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
11a30 61 6c 69 7a 65 28 70 55 70 2d 3e 70 55 70 64 61  alize(pUp->pUpda
11a40 74 65 29 3b 0a 20 20 20 20 70 55 70 2d 3e 70 55  te);.    pUp->pU
11a50 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  pdate = 0;.  }el
11a60 73 65 7b 0a 20 20 20 20 70 55 70 20 3d 20 28 52  se{.    pUp = (R
11a70 62 75 55 70 64 61 74 65 53 74 6d 74 2a 29 72 62  buUpdateStmt*)rb
11a80 75 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f  uMalloc(p, sizeo
11a90 66 28 52 62 75 55 70 64 61 74 65 53 74 6d 74 29  f(RbuUpdateStmt)
11aa0 2b 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 2b  +pIter->nTblCol+
11ab0 31 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  1);.  }..  if( p
11ac0 55 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  Up ){.    char *
11ad0 7a 57 68 65 72 65 20 3d 20 72 62 75 4f 62 6a 49  zWhere = rbuObjI
11ae0 74 65 72 47 65 74 57 68 65 72 65 28 70 2c 20 70  terGetWhere(p, p
11af0 49 74 65 72 29 3b 0a 20 20 20 20 63 68 61 72 20  Iter);.    char 
11b00 2a 7a 53 65 74 20 3d 20 72 62 75 4f 62 6a 49 74  *zSet = rbuObjIt
11b10 65 72 47 65 74 53 65 74 6c 69 73 74 28 70 2c 20  erGetSetlist(p, 
11b20 70 49 74 65 72 2c 20 7a 4d 61 73 6b 29 3b 0a 20  pIter, zMask);. 
11b30 20 20 20 63 68 61 72 20 2a 7a 55 70 64 61 74 65     char *zUpdate
11b40 20 3d 20 30 3b 0a 0a 20 20 20 20 70 55 70 2d 3e   = 0;..    pUp->
11b50 7a 4d 61 73 6b 20 3d 20 28 63 68 61 72 2a 29 26  zMask = (char*)&
11b60 70 55 70 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63  pUp[1];.    memc
11b70 70 79 28 70 55 70 2d 3e 7a 4d 61 73 6b 2c 20 7a  py(pUp->zMask, z
11b80 4d 61 73 6b 2c 20 70 49 74 65 72 2d 3e 6e 54 62  Mask, pIter->nTb
11b90 6c 43 6f 6c 29 3b 0a 20 20 20 20 70 55 70 2d 3e  lCol);.    pUp->
11ba0 70 4e 65 78 74 20 3d 20 70 49 74 65 72 2d 3e 70  pNext = pIter->p
11bb0 52 62 75 55 70 64 61 74 65 3b 0a 20 20 20 20 70  RbuUpdate;.    p
11bc0 49 74 65 72 2d 3e 70 52 62 75 55 70 64 61 74 65  Iter->pRbuUpdate
11bd0 20 3d 20 70 55 70 3b 0a 0a 20 20 20 20 69 66 28   = pUp;..    if(
11be0 20 7a 53 65 74 20 29 7b 0a 20 20 20 20 20 20 63   zSet ){.      c
11bf0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72 65 66  onst char *zPref
11c00 69 78 20 3d 20 22 22 3b 0a 0a 20 20 20 20 20 20  ix = "";..      
11c10 69 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65  if( pIter->eType
11c20 21 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20 29 20  !=RBU_PK_VTAB ) 
11c30 7a 50 72 65 66 69 78 20 3d 20 22 72 62 75 5f 69  zPrefix = "rbu_i
11c40 6d 70 5f 22 3b 0a 20 20 20 20 20 20 7a 55 70 64  mp_";.      zUpd
11c50 61 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ate = sqlite3_mp
11c60 72 69 6e 74 66 28 22 55 50 44 41 54 45 20 5c 22  rintf("UPDATE \"
11c70 25 73 25 77 5c 22 20 53 45 54 20 25 73 20 57 48  %s%w\" SET %s WH
11c80 45 52 45 20 25 73 22 2c 20 0a 20 20 20 20 20 20  ERE %s", .      
11c90 20 20 20 20 7a 50 72 65 66 69 78 2c 20 70 49 74      zPrefix, pIt
11ca0 65 72 2d 3e 7a 54 62 6c 2c 20 7a 53 65 74 2c 20  er->zTbl, zSet, 
11cb0 7a 57 68 65 72 65 0a 20 20 20 20 20 20 29 3b 0a  zWhere.      );.
11cc0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72        p->rc = pr
11cd0 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c  epareFreeAndColl
11ce0 65 63 74 45 72 72 6f 72 28 0a 20 20 20 20 20 20  ectError(.      
11cf0 20 20 20 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 26      p->dbMain, &
11d00 70 55 70 2d 3e 70 55 70 64 61 74 65 2c 20 26 70  pUp->pUpdate, &p
11d10 2d 3e 7a 45 72 72 6d 73 67 2c 20 7a 55 70 64 61  ->zErrmsg, zUpda
11d20 74 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  te.      );.    
11d30 20 20 2a 70 70 53 74 6d 74 20 3d 20 70 55 70 2d    *ppStmt = pUp-
11d40 3e 70 55 70 64 61 74 65 3b 0a 20 20 20 20 7d 0a  >pUpdate;.    }.
11d50 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
11d60 28 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71  (zWhere);.    sq
11d70 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 65 74 29  lite3_free(zSet)
11d80 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
11d90 70 2d 3e 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63  p->rc;.}..static
11da0 20 73 71 6c 69 74 65 33 20 2a 72 62 75 4f 70 65   sqlite3 *rbuOpe
11db0 6e 44 62 68 61 6e 64 6c 65 28 73 71 6c 69 74 65  nDbhandle(sqlite
11dc0 33 72 62 75 20 2a 70 2c 20 63 6f 6e 73 74 20 63  3rbu *p, const c
11dd0 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 73  har *zName){.  s
11de0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 30 3b 0a  qlite3 *db = 0;.
11df0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
11e00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f  ITE_OK ){.    co
11e10 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  nst int flags = 
11e20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
11e30 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
11e40 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49 54 45 5f  N_CREATE|SQLITE_
11e50 4f 50 45 4e 5f 55 52 49 3b 0a 20 20 20 20 70 2d  OPEN_URI;.    p-
11e60 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70  >rc = sqlite3_op
11e70 65 6e 5f 76 32 28 7a 4e 61 6d 65 2c 20 26 64 62  en_v2(zName, &db
11e80 2c 20 66 6c 61 67 73 2c 20 70 2d 3e 7a 56 66 73  , flags, p->zVfs
11e90 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Name);.    if( p
11ea0 2d 3e 72 63 20 29 7b 0a 20 20 20 20 20 20 70 2d  ->rc ){.      p-
11eb0 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74  >zErrmsg = sqlit
11ec0 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
11ed0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
11ee0 64 62 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  db));.      sqli
11ef0 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20  te3_close(db);. 
11f00 20 20 20 20 20 64 62 20 3d 20 30 3b 0a 20 20 20       db = 0;.   
11f10 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
11f20 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  db;.}../*.** Ope
11f30 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
11f40 61 6e 64 6c 65 20 61 6e 64 20 61 74 74 61 63 68  andle and attach
11f50 20 74 68 65 20 52 42 55 20 64 61 74 61 62 61 73   the RBU databas
11f60 65 20 61 73 20 22 72 62 75 22 2e 20 49 66 20 61  e as "rbu". If a
11f70 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72  n.** error occur
11f80 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  s, leave an erro
11f90 72 20 63 6f 64 65 20 61 6e 64 20 6d 65 73 73 61  r code and messa
11fa0 67 65 20 69 6e 20 74 68 65 20 52 42 55 20 68 61  ge in the RBU ha
11fb0 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndle..*/.static 
11fc0 76 6f 69 64 20 72 62 75 4f 70 65 6e 44 61 74 61  void rbuOpenData
11fd0 62 61 73 65 28 73 71 6c 69 74 65 33 72 62 75 20  base(sqlite3rbu 
11fe0 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
11ff0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
12000 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
12010 64 62 4d 61 69 6e 3d 3d 30 20 26 26 20 70 2d 3e  dbMain==0 && p->
12020 64 62 52 62 75 3d 3d 30 20 29 3b 0a 0a 20 20 70  dbRbu==0 );..  p
12030 2d 3e 65 53 74 61 67 65 20 3d 20 30 3b 0a 20 20  ->eStage = 0;.  
12040 70 2d 3e 64 62 4d 61 69 6e 20 3d 20 72 62 75 4f  p->dbMain = rbuO
12050 70 65 6e 44 62 68 61 6e 64 6c 65 28 70 2c 20 70  penDbhandle(p, p
12060 2d 3e 7a 54 61 72 67 65 74 29 3b 0a 20 20 70 2d  ->zTarget);.  p-
12070 3e 64 62 52 62 75 20 3d 20 72 62 75 4f 70 65 6e  >dbRbu = rbuOpen
12080 44 62 68 61 6e 64 6c 65 28 70 2c 20 70 2d 3e 7a  Dbhandle(p, p->z
12090 52 62 75 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 75  Rbu);..  /* If u
120a0 73 69 6e 67 20 73 65 70 61 72 61 74 65 20 52 42  sing separate RB
120b0 55 20 61 6e 64 20 73 74 61 74 65 20 64 61 74 61  U and state data
120c0 62 61 73 65 73 2c 20 61 74 74 61 63 68 20 74 68  bases, attach th
120d0 65 20 73 74 61 74 65 20 64 61 74 61 62 61 73 65  e state database
120e0 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 52 42 55   to.  ** the RBU
120f0 20 64 62 20 68 61 6e 64 6c 65 20 6e 6f 77 2e 20   db handle now. 
12100 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 7a 53 74   */.  if( p->zSt
12110 61 74 65 20 29 7b 0a 20 20 20 20 72 62 75 4d 50  ate ){.    rbuMP
12120 72 69 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e  rintfExec(p, p->
12130 64 62 52 62 75 2c 20 22 41 54 54 41 43 48 20 25  dbRbu, "ATTACH %
12140 51 20 41 53 20 73 74 61 74 22 2c 20 70 2d 3e 7a  Q AS stat", p->z
12150 53 74 61 74 65 29 3b 0a 20 20 20 20 6d 65 6d 63  State);.    memc
12160 70 79 28 70 2d 3e 7a 53 74 61 74 65 44 62 2c 20  py(p->zStateDb, 
12170 22 73 74 61 74 22 2c 20 34 29 3b 0a 20 20 7d 65  "stat", 4);.  }e
12180 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  lse{.    memcpy(
12190 70 2d 3e 7a 53 74 61 74 65 44 62 2c 20 22 6d 61  p->zStateDb, "ma
121a0 69 6e 22 2c 20 34 29 3b 0a 20 20 7d 0a 0a 20 20  in", 4);.  }..  
121b0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
121c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72  E_OK ){.    p->r
121d0 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
121e0 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64  te_function(p->d
121f0 62 4d 61 69 6e 2c 20 0a 20 20 20 20 20 20 20 20  bMain, .        
12200 22 72 62 75 5f 74 6d 70 5f 69 6e 73 65 72 74 22  "rbu_tmp_insert"
12210 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
12220 38 2c 20 28 76 6f 69 64 2a 29 70 2c 20 72 62 75  8, (void*)p, rbu
12230 54 6d 70 49 6e 73 65 72 74 46 75 6e 63 2c 20 30  TmpInsertFunc, 0
12240 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a  , 0.    );.  }..
12250 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
12260 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d  ITE_OK ){.    p-
12270 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72  >rc = sqlite3_cr
12280 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d  eate_function(p-
12290 3e 64 62 4d 61 69 6e 2c 20 0a 20 20 20 20 20 20  >dbMain, .      
122a0 20 20 22 72 62 75 5f 66 6f 73 73 69 6c 5f 64 65    "rbu_fossil_de
122b0 6c 74 61 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f  lta", 2, SQLITE_
122c0 55 54 46 38 2c 20 30 2c 20 72 62 75 46 6f 73 73  UTF8, 0, rbuFoss
122d0 69 6c 44 65 6c 74 61 46 75 6e 63 2c 20 30 2c 20  ilDeltaFunc, 0, 
122e0 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20  0.    );.  }..  
122f0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
12300 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72  E_OK ){.    p->r
12310 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
12320 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64  te_function(p->d
12330 62 52 62 75 2c 20 0a 20 20 20 20 20 20 20 20 22  bRbu, .        "
12340 72 62 75 5f 74 61 72 67 65 74 5f 6e 61 6d 65 22  rbu_target_name"
12350 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 1, SQLITE_UTF8
12360 2c 20 28 76 6f 69 64 2a 29 70 2c 20 72 62 75 54  , (void*)p, rbuT
12370 61 72 67 65 74 4e 61 6d 65 46 75 6e 63 2c 20 30  argetNameFunc, 0
12380 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a  , 0.    );.  }..
12390 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
123a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d  ITE_OK ){.    p-
123b0 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69  >rc = sqlite3_fi
123c0 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62  le_control(p->db
123d0 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c 20 53 51  Main, "main", SQ
123e0 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 42 55 2c 20  LITE_FCNTL_RBU, 
123f0 28 76 6f 69 64 2a 29 70 29 3b 0a 20 20 7d 0a 20  (void*)p);.  }. 
12400 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63 28   rbuMPrintfExec(
12410 70 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 53  p, p->dbMain, "S
12420 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c  ELECT * FROM sql
12430 69 74 65 5f 6d 61 73 74 65 72 22 29 3b 0a 0a 20  ite_master");.. 
12440 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 64 61 74   /* Mark the dat
12450 61 62 61 73 65 20 66 69 6c 65 20 6a 75 73 74 20  abase file just 
12460 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 52 42 55  opened as an RBU
12470 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65   target database
12480 2e 20 49 66 20 0a 20 20 2a 2a 20 74 68 69 73 20  . If .  ** this 
12490 63 61 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c  call returns SQL
124a0 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 2c 20 74 68  ITE_NOTFOUND, th
124b0 65 6e 20 74 68 65 20 52 42 55 20 76 66 73 20 69  en the RBU vfs i
124c0 73 20 6e 6f 74 20 69 6e 20 75 73 65 2e 0a 20 20  s not in use..  
124d0 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 65 72  ** This is an er
124e0 72 6f 72 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ror.  */.  if( p
124f0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
12500 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  ){.    p->rc = s
12510 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
12520 72 6f 6c 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22  rol(p->dbMain, "
12530 6d 61 69 6e 22 2c 20 53 51 4c 49 54 45 5f 46 43  main", SQLITE_FC
12540 4e 54 4c 5f 52 42 55 2c 20 28 76 6f 69 64 2a 29  NTL_RBU, (void*)
12550 70 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  p);.  }..  if( p
12560 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54  ->rc==SQLITE_NOT
12570 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 70 2d 3e  FOUND ){.    p->
12580 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
12590 52 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73  R;.    p->zErrms
125a0 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
125b0 6e 74 66 28 22 72 62 75 20 76 66 73 20 6e 6f 74  ntf("rbu vfs not
125c0 20 66 6f 75 6e 64 22 29 3b 0a 20 20 7d 0a 7d 0a   found");.  }.}.
125d0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
125e0 69 6e 65 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ine is a copy of
125f0 20 74 68 65 20 73 71 6c 69 74 65 33 46 69 6c 65   the sqlite3File
12600 53 75 66 66 69 78 33 28 29 20 72 6f 75 74 69 6e  Suffix3() routin
12610 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 72 65 2e  e from the core.
12620 0a 2a 2a 20 49 74 20 69 73 20 61 20 6e 6f 2d 6f  .** It is a no-o
12630 70 20 75 6e 6c 65 73 73 20 53 51 4c 49 54 45 5f  p unless SQLITE_
12640 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53  ENABLE_8_3_NAMES
12650 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a   is defined..**.
12660 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 45 4e 41  ** If SQLITE_ENA
12670 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20 69 73  BLE_8_3_NAMES is
12680 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 2d   set at compile-
12690 74 69 6d 65 20 61 6e 64 20 69 66 20 74 68 65 20  time and if the 
126a0 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
126b0 6e 61 6d 65 20 69 6e 20 7a 42 61 73 65 46 69 6c  name in zBaseFil
126c0 65 6e 61 6d 65 20 69 73 20 61 20 55 52 49 20 77  ename is a URI w
126d0 69 74 68 20 74 68 65 20 22 38 5f 33 5f 6e 61 6d  ith the "8_3_nam
126e0 65 73 3d 31 22 20 70 61 72 61 6d 65 74 65 72 20  es=1" parameter 
126f0 61 6e 64 0a 2a 2a 20 69 66 20 66 69 6c 65 6e 61  and.** if filena
12700 6d 65 20 69 6e 20 7a 5b 5d 20 68 61 73 20 61 20  me in z[] has a 
12710 73 75 66 66 69 78 20 28 61 2e 6b 2e 61 2e 20 22  suffix (a.k.a. "
12720 65 78 74 65 6e 73 69 6f 6e 22 29 20 74 68 61 74  extension") that
12730 20 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 0a   is longer than.
12740 2a 2a 20 74 68 72 65 65 20 63 68 61 72 61 63 74  ** three charact
12750 65 72 73 2c 20 74 68 65 6e 20 73 68 6f 72 74 65  ers, then shorte
12760 6e 20 74 68 65 20 73 75 66 66 69 78 20 6f 6e 20  n the suffix on 
12770 7a 5b 5d 20 74 6f 20 62 65 20 74 68 65 20 6c 61  z[] to be the la
12780 73 74 20 74 68 72 65 65 0a 2a 2a 20 63 68 61 72  st three.** char
12790 61 63 74 65 72 73 20 6f 66 20 74 68 65 20 6f 72  acters of the or
127a0 69 67 69 6e 61 6c 20 73 75 66 66 69 78 2e 0a 2a  iginal suffix..*
127b0 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 45  *.** If SQLITE_E
127c0 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20  NABLE_8_3_NAMES 
127d0 69 73 20 73 65 74 20 74 6f 20 32 20 61 74 20 63  is set to 2 at c
127e0 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c 20 74 68 65  ompile-time, the
127f0 6e 20 61 6c 77 61 79 73 0a 2a 2a 20 64 6f 20 74  n always.** do t
12800 68 65 20 73 75 66 66 69 78 20 73 68 6f 72 74 65  he suffix shorte
12810 6e 69 6e 67 20 72 65 67 61 72 64 6c 65 73 73 20  ning regardless 
12820 6f 66 20 55 52 49 20 70 61 72 61 6d 65 74 65 72  of URI parameter
12830 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 73  ..**.** Examples
12840 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 74 65 73 74  :.**.**     test
12850 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 20 20 20 3d  .db-journal    =
12860 3e 20 20 20 74 65 73 74 2e 6e 61 6c 0a 2a 2a 20  >   test.nal.** 
12870 20 20 20 20 74 65 73 74 2e 64 62 2d 77 61 6c 20      test.db-wal 
12880 20 20 20 20 20 20 20 3d 3e 20 20 20 74 65 73 74         =>   test
12890 2e 77 61 6c 0a 2a 2a 20 20 20 20 20 74 65 73 74  .wal.**     test
128a0 2e 64 62 2d 73 68 6d 20 20 20 20 20 20 20 20 3d  .db-shm        =
128b0 3e 20 20 20 74 65 73 74 2e 73 68 6d 0a 2a 2a 20  >   test.shm.** 
128c0 20 20 20 20 74 65 73 74 2e 64 62 2d 6d 6a 37 66      test.db-mj7f
128d0 33 33 31 39 66 61 20 3d 3e 20 20 20 74 65 73 74  3319fa =>   test
128e0 2e 39 66 61 0a 2a 2f 0a 73 74 61 74 69 63 20 76  .9fa.*/.static v
128f0 6f 69 64 20 72 62 75 46 69 6c 65 53 75 66 66 69  oid rbuFileSuffi
12900 78 33 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  x3(const char *z
12910 42 61 73 65 2c 20 63 68 61 72 20 2a 7a 29 7b 0a  Base, char *z){.
12920 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
12930 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 0a 23  ABLE_8_3_NAMES.#
12940 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
12950 5f 38 5f 33 5f 4e 41 4d 45 53 3c 32 0a 20 20 69  _8_3_NAMES<2.  i
12960 66 28 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62  f( sqlite3_uri_b
12970 6f 6f 6c 65 61 6e 28 7a 42 61 73 65 2c 20 22 38  oolean(zBase, "8
12980 5f 33 5f 6e 61 6d 65 73 22 2c 20 30 29 20 29 0a  _3_names", 0) ).
12990 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 69  #endif.  {.    i
129a0 6e 74 20 69 2c 20 73 7a 3b 0a 20 20 20 20 73 7a  nt i, sz;.    sz
129b0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
129c0 33 30 28 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69  30(z);.    for(i
129d0 3d 73 7a 2d 31 3b 20 69 3e 30 20 26 26 20 7a 5b  =sz-1; i>0 && z[
129e0 69 5d 21 3d 27 2f 27 20 26 26 20 7a 5b 69 5d 21  i]!='/' && z[i]!
129f0 3d 27 2e 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 20  ='.'; i--){}.   
12a00 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2e 27 20 26   if( z[i]=='.' &
12a10 26 20 41 4c 57 41 59 53 28 73 7a 3e 69 2b 34 29  & ALWAYS(sz>i+4)
12a20 20 29 20 6d 65 6d 6d 6f 76 65 28 26 7a 5b 69 2b   ) memmove(&z[i+
12a30 31 5d 2c 20 26 7a 5b 73 7a 2d 33 5d 2c 20 34 29  1], &z[sz-3], 4)
12a40 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
12a50 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
12a60 20 63 75 72 72 65 6e 74 20 77 61 6c 2d 69 6e 64   current wal-ind
12a70 65 78 20 68 65 61 64 65 72 20 63 68 65 63 6b 73  ex header checks
12a80 75 6d 20 66 6f 72 20 74 68 65 20 74 61 72 67 65  um for the targe
12a90 74 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 61  t database .** a
12aa0 73 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67  s a 64-bit integ
12ab0 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 68  er..**.** The ch
12ac0 65 63 6b 73 75 6d 20 69 73 20 73 74 6f 72 65 20  ecksum is store 
12ad0 69 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 67  in the first pag
12ae0 65 20 6f 66 20 78 53 68 6d 4d 61 70 20 6d 65 6d  e of xShmMap mem
12af0 6f 72 79 20 61 73 20 61 6e 20 38 2d 62 79 74 65  ory as an 8-byte
12b00 20 0a 2a 2a 20 62 6c 6f 62 20 73 74 61 72 74 69   .** blob starti
12b10 6e 67 20 61 74 20 62 79 74 65 20 6f 66 66 73 65  ng at byte offse
12b20 74 20 34 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  t 40..*/.static 
12b30 69 36 34 20 72 62 75 53 68 6d 43 68 65 63 6b 73  i64 rbuShmChecks
12b40 75 6d 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  um(sqlite3rbu *p
12b50 29 7b 0a 20 20 69 36 34 20 69 52 65 74 20 3d 20  ){.  i64 iRet = 
12b60 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  0;.  if( p->rc==
12b70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12b80 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
12b90 44 62 20 3d 20 70 2d 3e 70 54 61 72 67 65 74 46  Db = p->pTargetF
12ba0 64 2d 3e 70 52 65 61 6c 3b 0a 20 20 20 20 75 33  d->pReal;.    u3
12bb0 32 20 76 6f 6c 61 74 69 6c 65 20 2a 70 74 72 3b  2 volatile *ptr;
12bc0 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 44 62  .    p->rc = pDb
12bd0 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d  ->pMethods->xShm
12be0 4d 61 70 28 70 44 62 2c 20 30 2c 20 33 32 2a 31  Map(pDb, 0, 32*1
12bf0 30 32 34 2c 20 30 2c 20 28 76 6f 69 64 20 76 6f  024, 0, (void vo
12c00 6c 61 74 69 6c 65 2a 2a 29 26 70 74 72 29 3b 0a  latile**)&ptr);.
12c10 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
12c20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12c30 20 20 69 52 65 74 20 3d 20 28 28 69 36 34 29 70    iRet = ((i64)p
12c40 74 72 5b 31 30 5d 20 3c 3c 20 33 32 29 20 2b 20  tr[10] << 32) + 
12c50 70 74 72 5b 31 31 5d 3b 0a 20 20 20 20 7d 0a 20  ptr[11];.    }. 
12c60 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 74   }.  return iRet
12c70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
12c80 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
12c90 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 69 6e  ed as part of in
12ca0 69 74 69 61 6c 69 7a 69 6e 67 20 6f 72 20 72 65  itializing or re
12cb0 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 6e 0a  initializing an.
12cc0 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 63  ** incremental c
12cd0 68 65 63 6b 70 6f 69 6e 74 2e 20 0a 2a 2a 0a 2a  heckpoint. .**.*
12ce0 2a 20 49 74 20 70 6f 70 75 6c 61 74 65 73 20 74  * It populates t
12cf0 68 65 20 73 71 6c 69 74 65 33 72 62 75 2e 61 46  he sqlite3rbu.aF
12d00 72 61 6d 65 5b 5d 20 61 72 72 61 79 20 77 69 74  rame[] array wit
12d10 68 20 74 68 65 20 73 65 74 20 6f 66 20 0a 2a 2a  h the set of .**
12d20 20 28 77 61 6c 20 66 72 61 6d 65 20 2d 3e 20 64   (wal frame -> d
12d30 62 20 70 61 67 65 29 20 63 6f 70 79 20 6f 70 65  b page) copy ope
12d40 72 61 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64  rations required
12d50 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 74   to checkpoint t
12d60 68 65 20 0a 2a 2a 20 63 75 72 72 65 6e 74 20 77  he .** current w
12d70 61 6c 20 66 69 6c 65 2c 20 61 6e 64 20 6f 62 74  al file, and obt
12d80 61 69 6e 73 20 74 68 65 20 73 65 74 20 6f 66 20  ains the set of 
12d90 73 68 6d 20 6c 6f 63 6b 73 20 72 65 71 75 69 72  shm locks requir
12da0 65 64 20 74 6f 20 73 61 66 65 6c 79 20 0a 2a 2a  ed to safely .**
12db0 20 70 65 72 66 6f 72 6d 20 74 68 65 20 63 6f 70   perform the cop
12dc0 79 20 6f 70 65 72 61 74 69 6f 6e 73 20 64 69 72  y operations dir
12dd0 65 63 74 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c  ectly on the fil
12de0 65 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20  e-system..**.** 
12df0 49 66 20 61 72 67 75 6d 65 6e 74 20 70 53 74 61  If argument pSta
12e00 74 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  te is not NULL, 
12e10 74 68 65 6e 20 74 68 65 20 69 6e 63 72 65 6d 65  then the increme
12e20 6e 74 61 6c 20 63 68 65 63 6b 70 6f 69 6e 74 20  ntal checkpoint 
12e30 69 73 0a 2a 2a 20 62 65 69 6e 67 20 72 65 73 75  is.** being resu
12e40 6d 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  med. In this cas
12e50 65 2c 20 69 66 20 74 68 65 20 63 68 65 63 6b 73  e, if the checks
12e60 75 6d 20 6f 66 20 74 68 65 20 77 61 6c 2d 69 6e  um of the wal-in
12e70 64 65 78 2d 68 65 61 64 65 72 0a 2a 2a 20 66 6f  dex-header.** fo
12e80 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65 72 79  llowing recovery
12e90 20 69 73 20 6e 6f 74 20 74 68 65 20 73 61 6d 65   is not the same
12ea0 20 61 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d   as the checksum
12eb0 20 73 61 76 65 64 20 69 6e 20 74 68 65 20 52 62   saved in the Rb
12ec0 75 53 74 61 74 65 0a 2a 2a 20 6f 62 6a 65 63 74  uState.** object
12ed0 2c 20 74 68 65 6e 20 74 68 65 20 72 62 75 20 68  , then the rbu h
12ee0 61 6e 64 6c 65 20 69 73 20 73 65 74 20 74 6f 20  andle is set to 
12ef0 44 4f 4e 45 20 73 74 61 74 65 2e 20 54 68 69 73  DONE state. This
12f00 20 6f 63 63 75 72 73 20 69 66 20 73 6f 6d 65 0a   occurs if some.
12f10 2a 2a 20 6f 74 68 65 72 20 63 6c 69 65 6e 74 20  ** other client 
12f20 61 70 70 65 6e 64 73 20 61 20 74 72 61 6e 73 61  appends a transa
12f30 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 77 61 6c  ction to the wal
12f40 20 66 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64   file in the mid
12f50 64 6c 65 20 6f 66 0a 2a 2a 20 61 6e 20 69 6e 63  dle of.** an inc
12f60 72 65 6d 65 6e 74 61 6c 20 63 68 65 63 6b 70 6f  remental checkpo
12f70 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  int..*/.static v
12f80 6f 69 64 20 72 62 75 53 65 74 75 70 43 68 65 63  oid rbuSetupChec
12f90 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 72 62  kpoint(sqlite3rb
12fa0 75 20 2a 70 2c 20 52 62 75 53 74 61 74 65 20 2a  u *p, RbuState *
12fb0 70 53 74 61 74 65 29 7b 0a 0a 20 20 2f 2a 20 49  pState){..  /* I
12fc0 66 20 70 53 74 61 74 65 20 69 73 20 4e 55 4c 4c  f pState is NULL
12fd0 2c 20 74 68 65 6e 20 74 68 65 20 77 61 6c 20 66  , then the wal f
12fe0 69 6c 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65  ile may not have
12ff0 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 61 6e 64   been opened and
13000 0a 20 20 2a 2a 20 72 65 63 6f 76 65 72 65 64 2e  .  ** recovered.
13010 20 52 75 6e 6e 69 6e 67 20 61 20 72 65 61 64 2d   Running a read-
13020 73 74 61 74 65 6d 65 6e 74 20 68 65 72 65 20 74  statement here t
13030 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 64 6f  o ensure that do
13040 69 6e 67 20 73 6f 0a 20 20 2a 2a 20 64 6f 65 73  ing so.  ** does
13050 20 6e 6f 74 20 69 6e 74 65 72 66 65 72 65 20 77   not interfere w
13060 69 74 68 20 74 68 65 20 22 63 61 70 74 75 72 65  ith the "capture
13070 22 20 70 72 6f 63 65 73 73 20 62 65 6c 6f 77 2e  " process below.
13080 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 74 61 74    */.  if( pStat
13090 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 65  e==0 ){.    p->e
130a0 53 74 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 69  Stage = 0;.    i
130b0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
130c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  _OK ){.      p->
130d0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
130e0 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 53 45  c(p->dbMain, "SE
130f0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69  LECT * FROM sqli
13100 74 65 5f 6d 61 73 74 65 72 22 2c 20 30 2c 20 30  te_master", 0, 0
13110 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
13120 0a 20 20 2f 2a 20 41 73 73 75 6d 69 6e 67 20 6e  .  /* Assuming n
13130 6f 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  o error has occu
13140 72 72 65 64 2c 20 72 75 6e 20 61 20 22 72 65 73  rred, run a "res
13150 74 61 72 74 22 20 63 68 65 63 6b 70 6f 69 6e 74  tart" checkpoint
13160 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73   with the.  ** s
13170 71 6c 69 74 65 33 72 62 75 2e 65 53 74 61 67 65  qlite3rbu.eStage
13180 20 76 61 72 69 61 62 6c 65 20 73 65 74 20 74 6f   variable set to
13190 20 43 41 50 54 55 52 45 2e 20 54 68 69 73 20 74   CAPTURE. This t
131a0 75 72 6e 73 20 6f 6e 20 74 68 65 20 66 6f 6c 6c  urns on the foll
131b0 6f 77 69 6e 67 0a 20 20 2a 2a 20 73 70 65 63 69  owing.  ** speci
131c0 61 6c 20 62 65 68 61 76 69 6f 75 72 20 69 6e 20  al behaviour in 
131d0 74 68 65 20 72 62 75 20 56 46 53 3a 0a 20 20 2a  the rbu VFS:.  *
131e0 2a 0a 20 20 2a 2a 20 20 20 2a 20 49 66 20 74 68  *.  **   * If th
131f0 65 20 65 78 63 6c 75 73 69 76 65 20 73 68 6d 20  e exclusive shm 
13200 57 52 49 54 45 52 20 6f 72 20 52 45 41 44 30 20  WRITER or READ0 
13210 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f  lock cannot be o
13220 62 74 61 69 6e 65 64 2c 0a 20 20 2a 2a 20 20 20  btained,.  **   
13230 20 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74    the checkpoint
13240 20 66 61 69 6c 73 20 77 69 74 68 20 53 51 4c 49   fails with SQLI
13250 54 45 5f 42 55 53 59 20 28 6e 6f 72 6d 61 6c 6c  TE_BUSY (normall
13260 79 20 53 51 4c 69 74 65 20 77 6f 75 6c 64 0a 20  y SQLite would. 
13270 20 2a 2a 20 20 20 20 20 70 72 6f 63 65 65 64 20   **     proceed 
13280 77 69 74 68 20 72 75 6e 6e 69 6e 67 20 61 20 70  with running a p
13290 61 73 73 69 76 65 20 63 68 65 63 6b 70 6f 69 6e  assive checkpoin
132a0 74 20 69 6e 73 74 65 61 64 20 6f 66 20 66 61 69  t instead of fai
132b0 6c 69 6e 67 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ling)..  **.  **
132c0 20 20 20 2a 20 41 74 74 65 6d 70 74 73 20 74 6f     * Attempts to
132d0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 2a   read from the *
132e0 2d 77 61 6c 20 66 69 6c 65 20 6f 72 20 77 72 69  -wal file or wri
132f0 74 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  te to the databa
13300 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 20 20 20  se file.  **    
13310 20 64 6f 20 6e 6f 74 20 70 65 72 66 6f 72 6d 20   do not perform 
13320 61 6e 79 20 49 4f 2e 20 49 6e 73 74 65 61 64 2c  any IO. Instead,
13330 20 74 68 65 20 66 72 61 6d 65 2f 70 61 67 65 20   the frame/page 
13340 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 74 68 61  combinations tha
13350 74 0a 20 20 2a 2a 20 20 20 20 20 77 6f 75 6c 64  t.  **     would
13360 20 62 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e   be read/written
13370 20 61 72 65 20 72 65 63 6f 72 64 65 64 20 69 6e   are recorded in
13380 20 74 68 65 20 73 71 6c 69 74 65 33 72 62 75 2e   the sqlite3rbu.
13390 61 46 72 61 6d 65 5b 5d 0a 20 20 2a 2a 20 20 20  aFrame[].  **   
133a0 20 20 61 72 72 61 79 2e 0a 20 20 2a 2a 0a 20 20    array..  **.  
133b0 2a 2a 20 20 20 2a 20 43 61 6c 6c 73 20 74 6f 20  **   * Calls to 
133c0 78 53 68 6d 4c 6f 63 6b 28 55 4e 4c 4f 43 4b 29  xShmLock(UNLOCK)
133d0 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65 20   to release the 
133e0 65 78 63 6c 75 73 69 76 65 20 73 68 6d 20 57 52  exclusive shm WR
133f0 49 54 45 52 2c 20 0a 20 20 2a 2a 20 20 20 20 20  ITER, .  **     
13400 52 45 41 44 30 20 61 6e 64 20 43 48 45 43 4b 50  READ0 and CHECKP
13410 4f 49 4e 54 20 6c 6f 63 6b 73 20 74 61 6b 65 6e  OINT locks taken
13420 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
13430 63 68 65 63 6b 70 6f 69 6e 74 20 61 72 65 0a 20  checkpoint are. 
13440 20 2a 2a 20 20 20 20 20 6e 6f 2d 6f 70 73 2e 20   **     no-ops. 
13450 54 68 65 73 65 20 6c 6f 63 6b 73 20 77 69 6c 6c  These locks will
13460 20 6e 6f 74 20 62 65 20 72 65 6c 65 61 73 65 64   not be released
13470 20 75 6e 74 69 6c 20 74 68 65 20 63 6f 6e 6e 65   until the conne
13480 63 74 69 6f 6e 0a 20 20 2a 2a 20 20 20 20 20 69  ction.  **     i
13490 73 20 63 6c 6f 73 65 64 2e 0a 20 20 2a 2a 0a 20  s closed..  **. 
134a0 20 2a 2a 20 20 20 2a 20 41 74 74 65 6d 70 74 69   **   * Attempti
134b0 6e 67 20 74 6f 20 78 53 79 6e 63 28 29 20 74 68  ng to xSync() th
134c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
134d0 63 61 75 73 65 73 20 61 6e 20 53 51 4c 49 54 45  causes an SQLITE
134e0 5f 49 4e 54 45 52 4e 41 4c 20 0a 20 20 2a 2a 20  _INTERNAL .  ** 
134f0 20 20 20 20 65 72 72 6f 72 2e 0a 20 20 2a 2a 0a      error..  **.
13500 20 20 2a 2a 20 41 73 20 61 20 72 65 73 75 6c 74    ** As a result
13510 2c 20 75 6e 6c 65 73 73 20 61 6e 20 65 72 72 6f  , unless an erro
13520 72 20 28 69 2e 65 2e 20 4f 4f 4d 20 6f 72 20 53  r (i.e. OOM or S
13530 51 4c 49 54 45 5f 42 55 53 59 29 20 6f 63 63 75  QLITE_BUSY) occu
13540 72 73 2c 20 74 68 65 0a 20 20 2a 2a 20 63 68 65  rs, the.  ** che
13550 63 6b 70 6f 69 6e 74 20 62 65 6c 6f 77 20 66 61  ckpoint below fa
13560 69 6c 73 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ils with SQLITE_
13570 49 4e 54 45 52 4e 41 4c 2c 20 61 6e 64 20 6c 65  INTERNAL, and le
13580 61 76 65 73 20 74 68 65 20 61 46 72 61 6d 65 5b  aves the aFrame[
13590 5d 0a 20 20 2a 2a 20 61 72 72 61 79 20 70 6f 70  ].  ** array pop
135a0 75 6c 61 74 65 64 20 77 69 74 68 20 61 20 73 65  ulated with a se
135b0 74 20 6f 66 20 28 66 72 61 6d 65 20 2d 3e 20 70  t of (frame -> p
135c0 61 67 65 29 20 6d 61 70 70 69 6e 67 73 2e 20 42  age) mappings. B
135d0 65 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a 2a  ecause the .  **
135e0 20 57 52 49 54 45 52 2c 20 43 48 45 43 4b 50 4f   WRITER, CHECKPO
135f0 49 4e 54 20 61 6e 64 20 52 45 41 44 30 20 6c 6f  INT and READ0 lo
13600 63 6b 73 20 61 72 65 20 73 74 69 6c 6c 20 68 65  cks are still he
13610 6c 64 2c 20 69 74 20 69 73 20 73 61 66 65 20 74  ld, it is safe t
13620 6f 20 63 6f 70 79 20 0a 20 20 2a 2a 20 64 61 74  o copy .  ** dat
13630 61 20 66 72 6f 6d 20 74 68 65 20 77 61 6c 20 66  a from the wal f
13640 69 6c 65 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ile into the dat
13650 61 62 61 73 65 20 66 69 6c 65 20 61 63 63 6f 72  abase file accor
13660 64 69 6e 67 20 74 6f 20 74 68 65 20 0a 20 20 2a  ding to the .  *
13670 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 46  * contents of aF
13680 72 61 6d 65 5b 5d 2e 0a 20 20 2a 2f 0a 20 20 69  rame[]..  */.  i
13690 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
136a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  _OK ){.    int r
136b0 63 32 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61 67  c2;.    p->eStag
136c0 65 20 3d 20 52 42 55 5f 53 54 41 47 45 5f 43 41  e = RBU_STAGE_CA
136d0 50 54 55 52 45 3b 0a 20 20 20 20 72 63 32 20 3d  PTURE;.    rc2 =
136e0 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
136f0 3e 64 62 4d 61 69 6e 2c 20 22 50 52 41 47 4d 41  >dbMain, "PRAGMA
13700 20 6d 61 69 6e 2e 77 61 6c 5f 63 68 65 63 6b 70   main.wal_checkp
13710 6f 69 6e 74 3d 72 65 73 74 61 72 74 22 2c 20 30  oint=restart", 0
13720 2c 20 30 2c 30 29 3b 0a 20 20 20 20 69 66 28 20  , 0,0);.    if( 
13730 72 63 32 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45  rc2!=SQLITE_INTE
13740 52 4e 41 4c 20 29 20 70 2d 3e 72 63 20 3d 20 72  RNAL ) p->rc = r
13750 63 32 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  c2;.  }..  if( p
13760 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
13770 29 7b 0a 20 20 20 20 70 2d 3e 65 53 74 61 67 65  ){.    p->eStage
13780 20 3d 20 52 42 55 5f 53 54 41 47 45 5f 43 4b 50   = RBU_STAGE_CKP
13790 54 3b 0a 20 20 20 20 70 2d 3e 6e 53 74 65 70 20  T;.    p->nStep 
137a0 3d 20 28 70 53 74 61 74 65 20 3f 20 70 53 74 61  = (pState ? pSta
137b0 74 65 2d 3e 6e 52 6f 77 20 3a 20 30 29 3b 0a 20  te->nRow : 0);. 
137c0 20 20 20 70 2d 3e 61 42 75 66 20 3d 20 72 62 75     p->aBuf = rbu
137d0 4d 61 6c 6c 6f 63 28 70 2c 20 70 2d 3e 70 67 73  Malloc(p, p->pgs
137e0 7a 29 3b 0a 20 20 20 20 70 2d 3e 69 57 61 6c 43  z);.    p->iWalC
137f0 6b 73 75 6d 20 3d 20 72 62 75 53 68 6d 43 68 65  ksum = rbuShmChe
13800 63 6b 73 75 6d 28 70 29 3b 0a 20 20 7d 0a 0a 20  cksum(p);.  }.. 
13810 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
13820 54 45 5f 4f 4b 20 26 26 20 70 53 74 61 74 65 20  TE_OK && pState 
13830 26 26 20 70 53 74 61 74 65 2d 3e 69 57 61 6c 43  && pState->iWalC
13840 6b 73 75 6d 21 3d 70 2d 3e 69 57 61 6c 43 6b 73  ksum!=p->iWalCks
13850 75 6d 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  um ){.    p->rc 
13860 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
13870 20 20 20 70 2d 3e 65 53 74 61 67 65 20 3d 20 52     p->eStage = R
13880 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45 3b 0a 20  BU_STAGE_DONE;. 
13890 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c   }.}../*.** Call
138a0 65 64 20 77 68 65 6e 20 69 41 6d 74 20 62 79 74  ed when iAmt byt
138b0 65 73 20 61 72 65 20 72 65 61 64 20 66 72 6f 6d  es are read from
138c0 20 6f 66 66 73 65 74 20 69 4f 66 66 20 6f 66 20   offset iOff of 
138d0 74 68 65 20 77 61 6c 20 66 69 6c 65 20 77 68 69  the wal file whi
138e0 6c 65 0a 2a 2a 20 74 68 65 20 72 62 75 20 6f 62  le.** the rbu ob
138f0 6a 65 63 74 20 69 73 20 69 6e 20 63 61 70 74 75  ject is in captu
13900 72 65 20 6d 6f 64 65 2e 20 52 65 63 6f 72 64 20  re mode. Record 
13910 74 68 65 20 66 72 61 6d 65 20 6e 75 6d 62 65 72  the frame number
13920 20 6f 66 20 74 68 65 20 66 72 61 6d 65 0a 2a 2a   of the frame.**
13930 20 62 65 69 6e 67 20 72 65 61 64 20 69 6e 20 74   being read in t
13940 68 65 20 61 46 72 61 6d 65 5b 5d 20 61 72 72 61  he aFrame[] arra
13950 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
13960 20 72 62 75 43 61 70 74 75 72 65 57 61 6c 52 65   rbuCaptureWalRe
13970 61 64 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  ad(sqlite3rbu *p
13980 52 62 75 2c 20 69 36 34 20 69 4f 66 66 2c 20 69  Rbu, i64 iOff, i
13990 6e 74 20 69 41 6d 74 29 7b 0a 20 20 63 6f 6e 73  nt iAmt){.  cons
139a0 74 20 75 33 32 20 6d 52 65 71 20 3d 20 28 31 3c  t u32 mReq = (1<
139b0 3c 57 41 4c 5f 4c 4f 43 4b 5f 57 52 49 54 45 29  <WAL_LOCK_WRITE)
139c0 7c 28 31 3c 3c 57 41 4c 5f 4c 4f 43 4b 5f 43 4b  |(1<<WAL_LOCK_CK
139d0 50 54 29 7c 28 31 3c 3c 57 41 4c 5f 4c 4f 43 4b  PT)|(1<<WAL_LOCK
139e0 5f 52 45 41 44 30 29 3b 0a 20 20 75 33 32 20 69  _READ0);.  u32 i
139f0 46 72 61 6d 65 3b 0a 0a 20 20 69 66 28 20 70 52  Frame;..  if( pR
13a00 62 75 2d 3e 6d 4c 6f 63 6b 21 3d 6d 52 65 71 20  bu->mLock!=mReq 
13a10 29 7b 0a 20 20 20 20 70 52 62 75 2d 3e 72 63 20  ){.    pRbu->rc 
13a20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
13a30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13a40 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20 7d 0a 0a  _INTERNAL;.  }..
13a50 20 20 70 52 62 75 2d 3e 70 67 73 7a 20 3d 20 69    pRbu->pgsz = i
13a60 41 6d 74 3b 0a 20 20 69 66 28 20 70 52 62 75 2d  Amt;.  if( pRbu-
13a70 3e 6e 46 72 61 6d 65 3d 3d 70 52 62 75 2d 3e 6e  >nFrame==pRbu->n
13a80 46 72 61 6d 65 41 6c 6c 6f 63 20 29 7b 0a 20 20  FrameAlloc ){.  
13a90 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70 52    int nNew = (pR
13aa0 62 75 2d 3e 6e 46 72 61 6d 65 41 6c 6c 6f 63 20  bu->nFrameAlloc 
13ab0 3f 20 70 52 62 75 2d 3e 6e 46 72 61 6d 65 41 6c  ? pRbu->nFrameAl
13ac0 6c 6f 63 20 3a 20 36 34 29 20 2a 20 32 3b 0a 20  loc : 64) * 2;. 
13ad0 20 20 20 52 62 75 46 72 61 6d 65 20 2a 61 4e 65     RbuFrame *aNe
13ae0 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 28 52  w;.    aNew = (R
13af0 62 75 46 72 61 6d 65 2a 29 73 71 6c 69 74 65 33  buFrame*)sqlite3
13b00 5f 72 65 61 6c 6c 6f 63 36 34 28 70 52 62 75 2d  _realloc64(pRbu-
13b10 3e 61 46 72 61 6d 65 2c 20 6e 4e 65 77 20 2a 20  >aFrame, nNew * 
13b20 73 69 7a 65 6f 66 28 52 62 75 46 72 61 6d 65 29  sizeof(RbuFrame)
13b30 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d  );.    if( aNew=
13b40 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
13b50 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 52  TE_NOMEM;.    pR
13b60 62 75 2d 3e 61 46 72 61 6d 65 20 3d 20 61 4e 65  bu->aFrame = aNe
13b70 77 3b 0a 20 20 20 20 70 52 62 75 2d 3e 6e 46 72  w;.    pRbu->nFr
13b80 61 6d 65 41 6c 6c 6f 63 20 3d 20 6e 4e 65 77 3b  ameAlloc = nNew;
13b90 0a 20 20 7d 0a 0a 20 20 69 46 72 61 6d 65 20 3d  .  }..  iFrame =
13ba0 20 28 75 33 32 29 28 28 69 4f 66 66 2d 33 32 29   (u32)((iOff-32)
13bb0 20 2f 20 28 69 36 34 29 28 69 41 6d 74 2b 32 34   / (i64)(iAmt+24
13bc0 29 29 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 52  )) + 1;.  if( pR
13bd0 62 75 2d 3e 69 4d 61 78 46 72 61 6d 65 3c 69 46  bu->iMaxFrame<iF
13be0 72 61 6d 65 20 29 20 70 52 62 75 2d 3e 69 4d 61  rame ) pRbu->iMa
13bf0 78 46 72 61 6d 65 20 3d 20 69 46 72 61 6d 65 3b  xFrame = iFrame;
13c00 0a 20 20 70 52 62 75 2d 3e 61 46 72 61 6d 65 5b  .  pRbu->aFrame[
13c10 70 52 62 75 2d 3e 6e 46 72 61 6d 65 5d 2e 69 57  pRbu->nFrame].iW
13c20 61 6c 46 72 61 6d 65 20 3d 20 69 46 72 61 6d 65  alFrame = iFrame
13c30 3b 0a 20 20 70 52 62 75 2d 3e 61 46 72 61 6d 65  ;.  pRbu->aFrame
13c40 5b 70 52 62 75 2d 3e 6e 46 72 61 6d 65 5d 2e 69  [pRbu->nFrame].i
13c50 44 62 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 52  DbPage = 0;.  pR
13c60 62 75 2d 3e 6e 46 72 61 6d 65 2b 2b 3b 0a 20 20  bu->nFrame++;.  
13c70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13c80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 65  ;.}../*.** Calle
13c90 64 20 77 68 65 6e 20 61 20 70 61 67 65 20 6f 66  d when a page of
13ca0 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
13cb0 20 74 6f 20 6f 66 66 73 65 74 20 69 4f 66 66 20   to offset iOff 
13cc0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
13cd0 2a 2a 20 66 69 6c 65 20 77 68 69 6c 65 20 74 68  ** file while th
13ce0 65 20 72 62 75 20 68 61 6e 64 6c 65 20 69 73 20  e rbu handle is 
13cf0 69 6e 20 63 61 70 74 75 72 65 20 6d 6f 64 65 2e  in capture mode.
13d00 20 52 65 63 6f 72 64 20 74 68 65 20 70 61 67 65   Record the page
13d10 20 6e 75 6d 62 65 72 20 0a 2a 2a 20 6f 66 20 74   number .** of t
13d20 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 77 72  he page being wr
13d30 69 74 74 65 6e 20 69 6e 20 74 68 65 20 61 46 72  itten in the aFr
13d40 61 6d 65 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a  ame[] array..*/.
13d50 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 43 61  static int rbuCa
13d60 70 74 75 72 65 44 62 57 72 69 74 65 28 73 71 6c  ptureDbWrite(sql
13d70 69 74 65 33 72 62 75 20 2a 70 52 62 75 2c 20 69  ite3rbu *pRbu, i
13d80 36 34 20 69 4f 66 66 29 7b 0a 20 20 70 52 62 75  64 iOff){.  pRbu
13d90 2d 3e 61 46 72 61 6d 65 5b 70 52 62 75 2d 3e 6e  ->aFrame[pRbu->n
13da0 46 72 61 6d 65 2d 31 5d 2e 69 44 62 50 61 67 65  Frame-1].iDbPage
13db0 20 3d 20 28 75 33 32 29 28 69 4f 66 66 20 2f 20   = (u32)(iOff / 
13dc0 70 52 62 75 2d 3e 70 67 73 7a 29 20 2b 20 31 3b  pRbu->pgsz) + 1;
13dd0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
13de0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
13df0 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20  is is called as 
13e00 70 61 72 74 20 6f 66 20 61 6e 20 69 6e 63 72 65  part of an incre
13e10 6d 65 6e 74 61 6c 20 63 68 65 63 6b 70 6f 69 6e  mental checkpoin
13e20 74 20 6f 70 65 72 61 74 69 6f 6e 2e 20 43 6f 70  t operation. Cop
13e30 79 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 72  y.** a single fr
13e40 61 6d 65 20 6f 66 20 64 61 74 61 20 66 72 6f 6d  ame of data from
13e50 20 74 68 65 20 77 61 6c 20 66 69 6c 65 20 69 6e   the wal file in
13e60 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
13e70 66 69 6c 65 2c 20 61 73 0a 2a 2a 20 69 6e 64 69  file, as.** indi
13e80 63 61 74 65 64 20 62 79 20 74 68 65 20 52 62 75  cated by the Rbu
13e90 46 72 61 6d 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f  Frame object..*/
13ea0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
13eb0 43 68 65 63 6b 70 6f 69 6e 74 46 72 61 6d 65 28  CheckpointFrame(
13ec0 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 52  sqlite3rbu *p, R
13ed0 62 75 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29  buFrame *pFrame)
13ee0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  {.  sqlite3_file
13ef0 20 2a 70 57 61 6c 20 3d 20 70 2d 3e 70 54 61 72   *pWal = p->pTar
13f00 67 65 74 46 64 2d 3e 70 57 61 6c 46 64 2d 3e 70  getFd->pWalFd->p
13f10 52 65 61 6c 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Real;.  sqlite3_
13f20 66 69 6c 65 20 2a 70 44 62 20 3d 20 70 2d 3e 70  file *pDb = p->p
13f30 54 61 72 67 65 74 46 64 2d 3e 70 52 65 61 6c 3b  TargetFd->pReal;
13f40 0a 20 20 69 36 34 20 69 4f 66 66 3b 0a 0a 20 20  .  i64 iOff;..  
13f50 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
13f60 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 4f  QLITE_OK );.  iO
13f70 66 66 20 3d 20 28 69 36 34 29 28 70 46 72 61 6d  ff = (i64)(pFram
13f80 65 2d 3e 69 57 61 6c 46 72 61 6d 65 2d 31 29 20  e->iWalFrame-1) 
13f90 2a 20 28 70 2d 3e 70 67 73 7a 20 2b 20 32 34 29  * (p->pgsz + 24)
13fa0 20 2b 20 33 32 20 2b 20 32 34 3b 0a 20 20 70 2d   + 32 + 24;.  p-
13fb0 3e 72 63 20 3d 20 70 57 61 6c 2d 3e 70 4d 65 74  >rc = pWal->pMet
13fc0 68 6f 64 73 2d 3e 78 52 65 61 64 28 70 57 61 6c  hods->xRead(pWal
13fd0 2c 20 70 2d 3e 61 42 75 66 2c 20 70 2d 3e 70 67  , p->aBuf, p->pg
13fe0 73 7a 2c 20 69 4f 66 66 29 3b 0a 20 20 69 66 28  sz, iOff);.  if(
13ff0 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b   p->rc ) return;
14000 0a 0a 20 20 69 4f 66 66 20 3d 20 28 69 36 34 29  ..  iOff = (i64)
14010 28 70 46 72 61 6d 65 2d 3e 69 44 62 50 61 67 65  (pFrame->iDbPage
14020 2d 31 29 20 2a 20 70 2d 3e 70 67 73 7a 3b 0a 20  -1) * p->pgsz;. 
14030 20 70 2d 3e 72 63 20 3d 20 70 44 62 2d 3e 70 4d   p->rc = pDb->pM
14040 65 74 68 6f 64 73 2d 3e 78 57 72 69 74 65 28 70  ethods->xWrite(p
14050 44 62 2c 20 70 2d 3e 61 42 75 66 2c 20 70 2d 3e  Db, p->aBuf, p->
14060 70 67 73 7a 2c 20 69 4f 66 66 29 3b 0a 7d 0a 0a  pgsz, iOff);.}..
14070 0a 2f 2a 0a 2a 2a 20 54 61 6b 65 20 61 6e 20 45  ./*.** Take an E
14080 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
14090 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
140a0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
140b0 69 64 20 72 62 75 4c 6f 63 6b 44 61 74 61 62 61  id rbuLockDataba
140c0 73 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  se(sqlite3rbu *p
140d0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  ){.  sqlite3_fil
140e0 65 20 2a 70 52 65 61 6c 20 3d 20 70 2d 3e 70 54  e *pReal = p->pT
140f0 61 72 67 65 74 46 64 2d 3e 70 52 65 61 6c 3b 0a  argetFd->pReal;.
14100 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
14110 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
14120 70 2d 3e 72 63 20 3d 20 70 52 65 61 6c 2d 3e 70  p->rc = pReal->p
14130 4d 65 74 68 6f 64 73 2d 3e 78 4c 6f 63 6b 28 70  Methods->xLock(p
14140 52 65 61 6c 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  Real, SQLITE_LOC
14150 4b 5f 53 48 41 52 45 44 29 3b 0a 20 20 69 66 28  K_SHARED);.  if(
14160 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
14170 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  K ){.    p->rc =
14180 20 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73   pReal->pMethods
14190 2d 3e 78 4c 6f 63 6b 28 70 52 65 61 6c 2c 20 53  ->xLock(pReal, S
141a0 51 4c 49 54 45 5f 4c 4f 43 4b 5f 45 58 43 4c 55  QLITE_LOCK_EXCLU
141b0 53 49 56 45 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  SIVE);.  }.}..#i
141c0 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32  f defined(_WIN32
141d0 5f 57 43 45 29 0a 73 74 61 74 69 63 20 4c 50 57  _WCE).static LPW
141e0 53 54 52 20 72 62 75 57 69 6e 55 74 66 38 54 6f  STR rbuWinUtf8To
141f0 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68  Unicode(const ch
14200 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
14210 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a 20 20 4c    int nChar;.  L
14220 50 57 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e  PWSTR zWideFilen
14230 61 6d 65 3b 0a 0a 20 20 6e 43 68 61 72 20 3d 20  ame;..  nChar = 
14240 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
14250 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30 2c 20  har(CP_UTF8, 0, 
14260 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e  zFilename, -1, N
14270 55 4c 4c 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e  ULL, 0);.  if( n
14280 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Char==0 ){.    r
14290 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a  eturn 0;.  }.  z
142a0 57 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20 73  WideFilename = s
142b0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
142c0 20 6e 43 68 61 72 2a 73 69 7a 65 6f 66 28 7a 57   nChar*sizeof(zW
142d0 69 64 65 46 69 6c 65 6e 61 6d 65 5b 30 5d 29 20  ideFilename[0]) 
142e0 29 3b 0a 20 20 69 66 28 20 7a 57 69 64 65 46 69  );.  if( zWideFi
142f0 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  lename==0 ){.   
14300 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
14310 20 6d 65 6d 73 65 74 28 7a 57 69 64 65 46 69 6c   memset(zWideFil
14320 65 6e 61 6d 65 2c 20 30 2c 20 6e 43 68 61 72 2a  ename, 0, nChar*
14330 73 69 7a 65 6f 66 28 7a 57 69 64 65 46 69 6c 65  sizeof(zWideFile
14340 6e 61 6d 65 5b 30 5d 29 29 3b 0a 20 20 6e 43 68  name[0]));.  nCh
14350 61 72 20 3d 20 4d 75 6c 74 69 42 79 74 65 54 6f  ar = MultiByteTo
14360 57 69 64 65 43 68 61 72 28 43 50 5f 55 54 46 38  WideChar(CP_UTF8
14370 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  , 0, zFilename, 
14380 2d 31 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  -1, zWideFilenam
14390 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
143a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143b0 20 20 20 6e 43 68 61 72 29 3b 0a 20 20 69 66 28     nChar);.  if(
143c0 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20   nChar==0 ){.   
143d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57   sqlite3_free(zW
143e0 69 64 65 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ideFilename);.  
143f0 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 20    zWideFilename 
14400 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
14410 6e 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b  n zWideFilename;
14420 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
14430 20 54 68 65 20 52 42 55 20 68 61 6e 64 6c 65 20   The RBU handle 
14440 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  is currently in 
14450 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 73 74  RBU_STAGE_OAL st
14460 61 74 65 2c 20 77 69 74 68 20 61 20 53 48 41 52  ate, with a SHAR
14470 45 44 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 74 68  ED lock.** on th
14480 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
14490 20 54 68 69 73 20 70 72 6f 63 20 6d 6f 76 65 73   This proc moves
144a0 20 74 68 65 20 2a 2d 6f 61 6c 20 66 69 6c 65 20   the *-oal file 
144b0 74 6f 20 74 68 65 20 2a 2d 77 61 6c 20 70 61 74  to the *-wal pat
144c0 68 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 6f 70 65  h,.** then reope
144d0 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
144e0 66 69 6c 65 20 28 74 68 69 73 20 74 69 6d 65 20  file (this time 
144f0 69 6e 20 76 61 6e 69 6c 6c 61 2c 20 6e 6f 6e 2d  in vanilla, non-
14500 6f 61 6c 2c 20 57 41 4c 20 6d 6f 64 65 29 2e 0a  oal, WAL mode)..
14510 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
14520 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20  ccurs, leave an 
14530 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65  error code and e
14540 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
14550 74 68 65 20 72 62 75 20 0a 2a 2a 20 68 61 6e 64  the rbu .** hand
14560 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
14570 69 64 20 72 62 75 4d 6f 76 65 4f 61 6c 46 69 6c  id rbuMoveOalFil
14580 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29  e(sqlite3rbu *p)
14590 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
145a0 7a 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 5f  zBase = sqlite3_
145b0 64 62 5f 66 69 6c 65 6e 61 6d 65 28 70 2d 3e 64  db_filename(p->d
145c0 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 29 3b 0a  bMain, "main");.
145d0 0a 20 20 63 68 61 72 20 2a 7a 57 61 6c 20 3d 20  .  char *zWal = 
145e0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
145f0 22 25 73 2d 77 61 6c 22 2c 20 7a 42 61 73 65 29  "%s-wal", zBase)
14600 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 61 6c 20 3d  ;.  char *zOal =
14610 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
14620 28 22 25 73 2d 6f 61 6c 22 2c 20 7a 42 61 73 65  ("%s-oal", zBase
14630 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  );..  assert( p-
14640 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41  >eStage==RBU_STA
14650 47 45 5f 4d 4f 56 45 20 29 3b 0a 20 20 61 73 73  GE_MOVE );.  ass
14660 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
14670 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 7a 45 72 72  TE_OK && p->zErr
14680 6d 73 67 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  msg==0 );.  if( 
14690 7a 57 61 6c 3d 3d 30 20 7c 7c 20 7a 4f 61 6c 3d  zWal==0 || zOal=
146a0 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  =0 ){.    p->rc 
146b0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
146c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
146d0 4d 6f 76 65 20 74 68 65 20 2a 2d 6f 61 6c 20 66  Move the *-oal f
146e0 69 6c 65 20 74 6f 20 2a 2d 77 61 6c 2e 20 41 74  ile to *-wal. At
146f0 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6f 6e 6e   this point conn
14700 65 63 74 69 6f 6e 20 70 2d 3e 64 62 20 69 73 0a  ection p->db is.
14710 20 20 20 20 2a 2a 20 68 6f 6c 64 69 6e 67 20 61      ** holding a
14720 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20   SHARED lock on 
14730 74 68 65 20 74 61 72 67 65 74 20 64 61 74 61 62  the target datab
14740 61 73 65 20 66 69 6c 65 20 28 62 65 63 61 75 73  ase file (becaus
14750 65 20 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 69  e it is.    ** i
14760 6e 20 57 41 4c 20 6d 6f 64 65 29 2e 20 53 6f 20  n WAL mode). So 
14770 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  no other connect
14780 69 6f 6e 20 6d 61 79 20 62 65 20 77 72 69 74 69  ion may be writi
14790 6e 67 20 74 68 65 20 64 62 2e 20 0a 20 20 20 20  ng the db. .    
147a0 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 6f 72 64  **.    ** In ord
147b0 65 72 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  er to ensure tha
147c0 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64  t there are no d
147d0 61 74 61 62 61 73 65 20 72 65 61 64 65 72 73 2c  atabase readers,
147e0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 0a 20 20   an EXCLUSIVE.  
147f0 20 20 2a 2a 20 6c 6f 63 6b 20 69 73 20 6f 62 74    ** lock is obt
14800 61 69 6e 65 64 20 68 65 72 65 20 62 65 66 6f 72  ained here befor
14810 65 20 74 68 65 20 2a 2d 6f 61 6c 20 69 73 20 6d  e the *-oal is m
14820 6f 76 65 64 20 74 6f 20 2a 2d 77 61 6c 2e 0a 20  oved to *-wal.. 
14830 20 20 20 2a 2f 0a 20 20 20 20 72 62 75 4c 6f 63     */.    rbuLoc
14840 6b 44 61 74 61 62 61 73 65 28 70 29 3b 0a 20 20  kDatabase(p);.  
14850 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
14860 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14870 72 62 75 46 69 6c 65 53 75 66 66 69 78 33 28 7a  rbuFileSuffix3(z
14880 42 61 73 65 2c 20 7a 57 61 6c 29 3b 0a 20 20 20  Base, zWal);.   
14890 20 20 20 72 62 75 46 69 6c 65 53 75 66 66 69 78     rbuFileSuffix
148a0 33 28 7a 42 61 73 65 2c 20 7a 4f 61 6c 29 3b 0a  3(zBase, zOal);.
148b0 0a 20 20 20 20 20 20 2f 2a 20 52 65 2d 6f 70 65  .      /* Re-ope
148c0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 73 2e  n the databases.
148d0 20 2a 2f 0a 20 20 20 20 20 20 72 62 75 4f 62 6a   */.      rbuObj
148e0 49 74 65 72 46 69 6e 61 6c 69 7a 65 28 26 70 2d  IterFinalize(&p-
148f0 3e 6f 62 6a 69 74 65 72 29 3b 0a 20 20 20 20 20  >objiter);.     
14900 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70   sqlite3_close(p
14910 2d 3e 64 62 4d 61 69 6e 29 3b 0a 20 20 20 20 20  ->dbMain);.     
14920 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70   sqlite3_close(p
14930 2d 3e 64 62 52 62 75 29 3b 0a 20 20 20 20 20 20  ->dbRbu);.      
14940 70 2d 3e 64 62 4d 61 69 6e 20 3d 20 30 3b 0a 20  p->dbMain = 0;. 
14950 20 20 20 20 20 70 2d 3e 64 62 52 62 75 20 3d 20       p->dbRbu = 
14960 30 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  0;..#if defined(
14970 5f 57 49 4e 33 32 5f 57 43 45 29 0a 20 20 20 20  _WIN32_WCE).    
14980 20 20 7b 0a 20 20 20 20 20 20 20 20 4c 50 57 53    {.        LPWS
14990 54 52 20 7a 57 69 64 65 4f 61 6c 3b 0a 20 20 20  TR zWideOal;.   
149a0 20 20 20 20 20 4c 50 57 53 54 52 20 7a 57 69 64       LPWSTR zWid
149b0 65 57 61 6c 3b 0a 0a 20 20 20 20 20 20 20 20 7a  eWal;..        z
149c0 57 69 64 65 4f 61 6c 20 3d 20 72 62 75 57 69 6e  WideOal = rbuWin
149d0 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 4f  Utf8ToUnicode(zO
149e0 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  al);.        if(
149f0 20 7a 57 69 64 65 4f 61 6c 20 29 7b 0a 20 20 20   zWideOal ){.   
14a00 20 20 20 20 20 20 20 7a 57 69 64 65 57 61 6c 20         zWideWal 
14a10 3d 20 72 62 75 57 69 6e 55 74 66 38 54 6f 55 6e  = rbuWinUtf8ToUn
14a20 69 63 6f 64 65 28 7a 57 61 6c 29 3b 0a 20 20 20  icode(zWal);.   
14a30 20 20 20 20 20 20 20 69 66 28 20 7a 57 69 64 65         if( zWide
14a40 57 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Wal ){.         
14a50 20 20 20 69 66 28 20 4d 6f 76 65 46 69 6c 65 57     if( MoveFileW
14a60 28 7a 57 69 64 65 4f 61 6c 2c 20 7a 57 69 64 65  (zWideOal, zWide
14a70 57 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Wal) ){.        
14a80 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
14a90 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
14aa0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14ab0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
14ac0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  = SQLITE_IOERR;.
14ad0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
14ae0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14af0 33 5f 66 72 65 65 28 7a 57 69 64 65 57 61 6c 29  3_free(zWideWal)
14b00 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
14b10 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
14b20 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f  ->rc = SQLITE_IO
14b30 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ERR_NOMEM;.     
14b40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
14b50 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57   sqlite3_free(zW
14b60 69 64 65 4f 61 6c 29 3b 0a 20 20 20 20 20 20 20  ideOal);.       
14b70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14b80 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
14b90 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
14ba0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
14bb0 23 65 6c 73 65 0a 20 20 20 20 20 20 70 2d 3e 72  #else.      p->r
14bc0 63 20 3d 20 72 65 6e 61 6d 65 28 7a 4f 61 6c 2c  c = rename(zOal,
14bd0 20 7a 57 61 6c 29 20 3f 20 53 51 4c 49 54 45 5f   zWal) ? SQLITE_
14be0 49 4f 45 52 52 20 3a 20 53 51 4c 49 54 45 5f 4f  IOERR : SQLITE_O
14bf0 4b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20  K;.#endif..     
14c00 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
14c10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
14c20 20 72 62 75 4f 70 65 6e 44 61 74 61 62 61 73 65   rbuOpenDatabase
14c30 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 62 75  (p);.        rbu
14c40 53 65 74 75 70 43 68 65 63 6b 70 6f 69 6e 74 28  SetupCheckpoint(
14c50 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  p, 0);.      }. 
14c60 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69     }.  }..  sqli
14c70 74 65 33 5f 66 72 65 65 28 7a 57 61 6c 29 3b 0a  te3_free(zWal);.
14c80 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
14c90 4f 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Oal);.}../*.** T
14ca0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
14cb0 65 6e 74 20 69 74 65 72 61 74 69 6e 67 20 74 68  ent iterating th
14cc0 72 6f 75 67 68 20 74 68 65 20 6b 65 79 73 20 66  rough the keys f
14cd0 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f  or the current o
14ce0 62 6a 65 63 74 0a 2a 2a 20 28 70 2d 3e 6f 62 6a  bject.** (p->obj
14cf0 69 74 65 72 2e 70 53 65 6c 65 63 74 29 20 63 75  iter.pSelect) cu
14d00 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
14d10 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 2e 20 54  o a valid row. T
14d20 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
14d30 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20 74  determines the t
14d40 79 70 65 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e  ype of operation
14d50 20 72 65 71 75 65 73 74 65 64 20 62 79 20 74 68   requested by th
14d60 69 73 20 72 6f 77 20 61 6e 64 20 72 65 74 75 72  is row and retur
14d70 6e 73 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65  ns.** one of the
14d80 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c 75 65   following value
14d90 73 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  s to indicate th
14da0 65 20 72 65 73 75 6c 74 3a 0a 2a 2a 0a 2a 2a 20  e result:.**.** 
14db0 20 20 20 20 2a 20 52 42 55 5f 49 4e 53 45 52 54      * RBU_INSERT
14dc0 0a 2a 2a 20 20 20 20 20 2a 20 52 42 55 5f 44 45  .**     * RBU_DE
14dd0 4c 45 54 45 0a 2a 2a 20 20 20 20 20 2a 20 52 42  LETE.**     * RB
14de0 55 5f 49 44 58 5f 44 45 4c 45 54 45 0a 2a 2a 20  U_IDX_DELETE.** 
14df0 20 20 20 20 2a 20 52 42 55 5f 55 50 44 41 54 45      * RBU_UPDATE
14e00 0a 2a 2a 0a 2a 2a 20 49 66 20 52 42 55 5f 55 50  .**.** If RBU_UP
14e10 44 41 54 45 20 69 73 20 72 65 74 75 72 6e 65 64  DATE is returned
14e20 2c 20 74 68 65 6e 20 6f 75 74 70 75 74 20 76 61  , then output va
14e30 72 69 61 62 6c 65 20 2a 70 7a 4d 61 73 6b 20 69  riable *pzMask i
14e40 73 20 73 65 74 20 74 6f 0a 2a 2a 20 70 6f 69 6e  s set to.** poin
14e50 74 20 74 6f 20 74 68 65 20 74 65 78 74 20 76 61  t to the text va
14e60 6c 75 65 20 69 6e 64 69 63 61 74 69 6e 67 20 74  lue indicating t
14e70 68 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 75 70  he columns to up
14e80 64 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  date..**.** If t
14e90 68 65 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 66  he rbu_control f
14ea0 69 65 6c 64 20 63 6f 6e 74 61 69 6e 73 20 61 6e  ield contains an
14eb0 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2c 20   invalid value, 
14ec0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  an error code an
14ed0 64 0a 2a 2a 20 6d 65 73 73 61 67 65 20 61 72 65  d.** message are
14ee0 20 6c 65 66 74 20 69 6e 20 74 68 65 20 52 42 55   left in the RBU
14ef0 20 68 61 6e 64 6c 65 20 61 6e 64 20 7a 65 72 6f   handle and zero
14f00 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
14f10 61 74 69 63 20 69 6e 74 20 72 62 75 53 74 65 70  atic int rbuStep
14f20 54 79 70 65 28 73 71 6c 69 74 65 33 72 62 75 20  Type(sqlite3rbu 
14f30 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
14f40 2a 70 7a 4d 61 73 6b 29 7b 0a 20 20 69 6e 74 20  *pzMask){.  int 
14f50 69 43 6f 6c 20 3d 20 70 2d 3e 6f 62 6a 69 74 65  iCol = p->objite
14f60 72 2e 6e 43 6f 6c 3b 20 20 20 20 20 2f 2a 20 49  r.nCol;     /* I
14f70 6e 64 65 78 20 6f 66 20 72 62 75 5f 63 6f 6e 74  ndex of rbu_cont
14f80 72 6f 6c 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  rol column */.  
14f90 69 6e 74 20 72 65 73 20 3d 20 30 3b 20 20 20 20  int res = 0;    
14fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14fb0 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20  /* Return value 
14fc0 2a 2f 0a 0a 20 20 73 77 69 74 63 68 28 20 73 71  */..  switch( sq
14fd0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70  lite3_column_typ
14fe0 65 28 70 2d 3e 6f 62 6a 69 74 65 72 2e 70 53 65  e(p->objiter.pSe
14ff0 6c 65 63 74 2c 20 69 43 6f 6c 29 20 29 7b 0a 20  lect, iCol) ){. 
15000 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
15010 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
15020 69 6e 74 20 69 56 61 6c 20 3d 20 73 71 6c 69 74  int iVal = sqlit
15030 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 2d  e3_column_int(p-
15040 3e 6f 62 6a 69 74 65 72 2e 70 53 65 6c 65 63 74  >objiter.pSelect
15050 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 73  , iCol);.      s
15060 77 69 74 63 68 28 20 69 56 61 6c 20 29 7b 0a 20  witch( iVal ){. 
15070 20 20 20 20 20 20 20 63 61 73 65 20 30 3a 20 72         case 0: r
15080 65 73 20 3d 20 52 42 55 5f 49 4e 53 45 52 54 3b  es = RBU_INSERT;
15090 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
150a0 20 20 20 20 63 61 73 65 20 31 3a 20 72 65 73 20      case 1: res 
150b0 3d 20 52 42 55 5f 44 45 4c 45 54 45 3b 20 20 20  = RBU_DELETE;   
150c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
150d0 20 63 61 73 65 20 32 3a 20 72 65 73 20 3d 20 52   case 2: res = R
150e0 42 55 5f 52 45 50 4c 41 43 45 3b 20 20 20 20 62  BU_REPLACE;    b
150f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
15100 73 65 20 33 3a 20 72 65 73 20 3d 20 52 42 55 5f  se 3: res = RBU_
15110 49 44 58 5f 44 45 4c 45 54 45 3b 20 62 72 65 61  IDX_DELETE; brea
15120 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
15130 34 3a 20 72 65 73 20 3d 20 52 42 55 5f 49 44 58  4: res = RBU_IDX
15140 5f 49 4e 53 45 52 54 3b 20 62 72 65 61 6b 3b 0a  _INSERT; break;.
15150 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
15160 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
15170 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58 54  case SQLITE_TEXT
15180 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  : {.      const 
15190 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
151a0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
151b0 6e 5f 74 65 78 74 28 70 2d 3e 6f 62 6a 69 74 65  n_text(p->objite
151c0 72 2e 70 53 65 6c 65 63 74 2c 20 69 43 6f 6c 29  r.pSelect, iCol)
151d0 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 3d 3d 30  ;.      if( z==0
151e0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   ){.        p->r
151f0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
15200 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
15210 20 20 20 20 20 20 20 2a 70 7a 4d 61 73 6b 20 3d         *pzMask =
15220 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 3b   (const char*)z;
15230 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
15240 65 73 20 3d 20 52 42 55 5f 55 50 44 41 54 45 3b  es = RBU_UPDATE;
15250 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ..      break;. 
15260 20 20 20 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c     }..    defaul
15270 74 3a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  t:.      break;.
15280 20 20 7d 0a 0a 20 20 69 66 28 20 72 65 73 3d 3d    }..  if( res==
15290 30 20 29 7b 0a 20 20 20 20 72 62 75 42 61 64 43  0 ){.    rbuBadC
152a0 6f 6e 74 72 6f 6c 45 72 72 6f 72 28 70 29 3b 0a  ontrolError(p);.
152b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73    }.  return res
152c0 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
152d0 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 41  TE_DEBUG./*.** A
152e0 73 73 65 72 74 20 74 68 61 74 20 63 6f 6c 75 6d  ssert that colum
152f0 6e 20 69 43 6f 6c 20 6f 66 20 73 74 61 74 65 6d  n iCol of statem
15300 65 6e 74 20 70 53 74 6d 74 20 69 73 20 6e 61 6d  ent pStmt is nam
15310 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61  ed zName..*/.sta
15320 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 43  tic void assertC
15330 6f 6c 75 6d 6e 4e 61 6d 65 28 73 71 6c 69 74 65  olumnName(sqlite
15340 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 2c 20 69  3_stmt *pStmt, i
15350 6e 74 20 69 43 6f 6c 2c 20 63 6f 6e 73 74 20 63  nt iCol, const c
15360 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 63  har *zName){.  c
15370 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 20  onst char *zCol 
15380 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
15390 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69 43 6f  _name(pStmt, iCo
153a0 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d  l);.  assert( 0=
153b0 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70  =sqlite3_stricmp
153c0 28 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 20 29 3b  (zName, zCol) );
153d0 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
153e0 65 20 61 73 73 65 72 74 43 6f 6c 75 6d 6e 4e 61  e assertColumnNa
153f0 6d 65 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66  me(x,y,z).#endif
15400 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ../*.** Argument
15410 20 65 54 79 70 65 20 6d 75 73 74 20 62 65 20 6f   eType must be o
15420 6e 65 20 6f 66 20 52 42 55 5f 49 4e 53 45 52 54  ne of RBU_INSERT
15430 2c 20 52 42 55 5f 44 45 4c 45 54 45 2c 20 52 42  , RBU_DELETE, RB
15440 55 5f 49 44 58 5f 49 4e 53 45 52 54 20 6f 72 0a  U_IDX_INSERT or.
15450 2a 2a 20 52 42 55 5f 49 44 58 5f 44 45 4c 45 54  ** RBU_IDX_DELET
15460 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  E. This function
15470 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20 77 6f   performs the wo
15480 72 6b 20 6f 66 20 61 20 73 69 6e 67 6c 65 0a 2a  rk of a single.*
15490 2a 20 73 71 6c 69 74 65 33 72 62 75 5f 73 74 65  * sqlite3rbu_ste
154a0 70 28 29 20 63 61 6c 6c 20 66 6f 72 20 74 68 65  p() call for the
154b0 20 74 79 70 65 20 6f 66 20 6f 70 65 72 61 74 69   type of operati
154c0 6f 6e 20 73 70 65 63 69 66 69 65 64 20 62 79 20  on specified by 
154d0 65 54 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  eType..*/.static
154e0 20 76 6f 69 64 20 72 62 75 53 74 65 70 4f 6e 65   void rbuStepOne
154f0 4f 70 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  Op(sqlite3rbu *p
15500 2c 20 69 6e 74 20 65 54 79 70 65 29 7b 0a 20 20  , int eType){.  
15510 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65  RbuObjIter *pIte
15520 72 20 3d 20 26 70 2d 3e 6f 62 6a 69 74 65 72 3b  r = &p->objiter;
15530 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
15540 20 2a 70 56 61 6c 3b 0a 20 20 73 71 6c 69 74 65   *pVal;.  sqlite
15550 33 5f 73 74 6d 74 20 2a 70 57 72 69 74 65 72 3b  3_stmt *pWriter;
15560 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73  .  int i;..  ass
15570 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
15580 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72  TE_OK );.  asser
15590 74 28 20 65 54 79 70 65 21 3d 52 42 55 5f 44 45  t( eType!=RBU_DE
155a0 4c 45 54 45 20 7c 7c 20 70 49 74 65 72 2d 3e 7a  LETE || pIter->z
155b0 49 64 78 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  Idx==0 );.  asse
155c0 72 74 28 20 65 54 79 70 65 3d 3d 52 42 55 5f 44  rt( eType==RBU_D
155d0 45 4c 45 54 45 20 7c 7c 20 65 54 79 70 65 3d 3d  ELETE || eType==
155e0 52 42 55 5f 49 44 58 5f 44 45 4c 45 54 45 0a 20  RBU_IDX_DELETE. 
155f0 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
15600 52 42 55 5f 49 4e 53 45 52 54 20 7c 7c 20 65 54  RBU_INSERT || eT
15610 79 70 65 3d 3d 52 42 55 5f 49 44 58 5f 49 4e 53  ype==RBU_IDX_INS
15620 45 52 54 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 49  ERT.  );..  /* I
15630 66 20 74 68 69 73 20 69 73 20 61 20 64 65 6c 65  f this is a dele
15640 74 65 2c 20 64 65 63 72 65 6d 65 6e 74 20 6e 50  te, decrement nP
15650 68 61 73 65 4f 6e 65 53 74 65 70 20 62 79 20 6e  haseOneStep by n
15660 49 6e 64 65 78 2e 20 49 66 20 74 68 65 20 44 45  Index. If the DE
15670 4c 45 54 45 0a 20 20 2a 2a 20 73 74 61 74 65 6d  LETE.  ** statem
15680 65 6e 74 20 62 65 6c 6f 77 20 64 6f 65 73 20 61  ent below does a
15690 63 74 75 61 6c 6c 79 20 64 65 6c 65 74 65 20 61  ctually delete a
156a0 20 72 6f 77 2c 20 6e 50 68 61 73 65 4f 6e 65 53   row, nPhaseOneS
156b0 74 65 70 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a  tep will be.  **
156c0 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 79 20   incremented by 
156d0 74 68 65 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20  the same amount 
156e0 77 68 65 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f  when SQL functio
156f0 6e 20 72 62 75 5f 74 6d 70 5f 69 6e 73 65 72 74  n rbu_tmp_insert
15700 28 29 0a 20 20 2a 2a 20 69 73 20 69 6e 76 6f 6b  ().  ** is invok
15710 65 64 20 62 79 20 74 68 65 20 74 72 69 67 67 65  ed by the trigge
15720 72 2e 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  r.  */.  if( eTy
15730 70 65 3d 3d 52 42 55 5f 44 45 4c 45 54 45 20 29  pe==RBU_DELETE )
15740 7b 0a 20 20 20 20 70 2d 3e 6e 50 68 61 73 65 4f  {.    p->nPhaseO
15750 6e 65 53 74 65 70 20 2d 3d 20 70 2d 3e 6f 62 6a  neStep -= p->obj
15760 69 74 65 72 2e 6e 49 6e 64 65 78 3b 0a 20 20 7d  iter.nIndex;.  }
15770 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 52  ..  if( eType==R
15780 42 55 5f 49 44 58 5f 44 45 4c 45 54 45 20 7c 7c  BU_IDX_DELETE ||
15790 20 65 54 79 70 65 3d 3d 52 42 55 5f 44 45 4c 45   eType==RBU_DELE
157a0 54 45 20 29 7b 0a 20 20 20 20 70 57 72 69 74 65  TE ){.    pWrite
157b0 72 20 3d 20 70 49 74 65 72 2d 3e 70 44 65 6c 65  r = pIter->pDele
157c0 74 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  te;.  }else{.   
157d0 20 70 57 72 69 74 65 72 20 3d 20 70 49 74 65 72   pWriter = pIter
157e0 2d 3e 70 49 6e 73 65 72 74 3b 0a 20 20 7d 0a 0a  ->pInsert;.  }..
157f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74    for(i=0; i<pIt
15800 65 72 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  er->nCol; i++){.
15810 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
15820 73 20 61 6e 20 49 4e 53 45 52 54 20 69 6e 74 6f  s an INSERT into
15830 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20   a table b-tree 
15840 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 68 61  and the table ha
15850 73 20 61 6e 0a 20 20 20 20 2a 2a 20 65 78 70 6c  s an.    ** expl
15860 69 63 69 74 20 49 4e 54 45 47 45 52 20 50 52 49  icit INTEGER PRI
15870 4d 41 52 59 20 4b 45 59 2c 20 63 68 65 63 6b 20  MARY KEY, check 
15880 74 68 61 74 20 74 68 69 73 20 69 73 20 6e 6f 74  that this is not
15890 20 61 6e 20 61 74 74 65 6d 70 74 0a 20 20 20 20   an attempt.    
158a0 2a 2a 20 74 6f 20 77 72 69 74 65 20 61 20 4e 55  ** to write a NU
158b0 4c 4c 20 69 6e 74 6f 20 74 68 65 20 49 50 4b 20  LL into the IPK 
158c0 63 6f 6c 75 6d 6e 2e 20 54 68 61 74 20 69 73 20  column. That is 
158d0 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e 20 20  not permitted.  
158e0 2a 2f 0a 20 20 20 20 69 66 28 20 65 54 79 70 65  */.    if( eType
158f0 3d 3d 52 42 55 5f 49 4e 53 45 52 54 20 0a 20 20  ==RBU_INSERT .  
15900 20 20 20 26 26 20 70 49 74 65 72 2d 3e 7a 49 64     && pIter->zId
15910 78 3d 3d 30 20 26 26 20 70 49 74 65 72 2d 3e 65  x==0 && pIter->e
15920 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 49 50 4b  Type==RBU_PK_IPK
15930 20 26 26 20 70 49 74 65 72 2d 3e 61 62 54 62 6c   && pIter->abTbl
15940 50 6b 5b 69 5d 20 0a 20 20 20 20 20 26 26 20 73  Pk[i] .     && s
15950 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79  qlite3_column_ty
15960 70 65 28 70 49 74 65 72 2d 3e 70 53 65 6c 65 63  pe(pIter->pSelec
15970 74 2c 20 69 29 3d 3d 53 51 4c 49 54 45 5f 4e 55  t, i)==SQLITE_NU
15980 4c 4c 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  LL.    ){.      
15990 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4d  p->rc = SQLITE_M
159a0 49 53 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 70  ISMATCH;.      p
159b0 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69  ->zErrmsg = sqli
159c0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 64 61 74  te3_mprintf("dat
159d0 61 74 79 70 65 20 6d 69 73 6d 61 74 63 68 22 29  atype mismatch")
159e0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
159f0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65      }..    if( e
15a00 54 79 70 65 3d 3d 52 42 55 5f 44 45 4c 45 54 45  Type==RBU_DELETE
15a10 20 26 26 20 70 49 74 65 72 2d 3e 61 62 54 62 6c   && pIter->abTbl
15a20 50 6b 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  Pk[i]==0 ){.    
15a30 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
15a40 7d 0a 0a 20 20 20 20 70 56 61 6c 20 3d 20 73 71  }..    pVal = sq
15a50 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c  lite3_column_val
15a60 75 65 28 70 49 74 65 72 2d 3e 70 53 65 6c 65 63  ue(pIter->pSelec
15a70 74 2c 20 69 29 3b 0a 20 20 20 20 70 2d 3e 72 63  t, i);.    p->rc
15a80 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
15a90 76 61 6c 75 65 28 70 57 72 69 74 65 72 2c 20 69  value(pWriter, i
15aa0 2b 31 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20 69  +1, pVal);.    i
15ab0 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72  f( p->rc ) retur
15ac0 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 74  n;.  }.  if( pIt
15ad0 65 72 2d 3e 7a 49 64 78 3d 3d 30 0a 20 20 20 26  er->zIdx==0.   &
15ae0 26 20 28 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  & (pIter->eType=
15af0 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20 7c 7c 20  =RBU_PK_VTAB || 
15b00 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
15b10 55 5f 50 4b 5f 4e 4f 4e 45 29 20 0a 20 20 29 7b  U_PK_NONE) .  ){
15b20 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61 20 76 69  .    /* For a vi
15b30 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 6f 72 20  rtual table, or 
15b40 61 20 74 61 62 6c 65 20 77 69 74 68 20 6e 6f 20  a table with no 
15b50 70 72 69 6d 61 72 79 20 6b 65 79 2c 20 74 68 65  primary key, the
15b60 20 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20   .    ** SELECT 
15b70 73 74 61 74 65 6d 65 6e 74 20 69 73 3a 0a 20 20  statement is:.  
15b80 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45    **.    **   SE
15b90 4c 45 43 54 20 3c 63 6f 6c 73 3e 2c 20 72 62 75  LECT <cols>, rbu
15ba0 5f 63 6f 6e 74 72 6f 6c 2c 20 72 62 75 5f 72 6f  _control, rbu_ro
15bb0 77 69 64 20 46 52 4f 4d 20 2e 2e 2e 2e 0a 20 20  wid FROM .....  
15bc0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 48 65 6e 63    **.    ** Henc
15bd0 65 20 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70  e column_value(p
15be0 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31 29 2e 0a 20  Iter->nCol+1).. 
15bf0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
15c00 43 6f 6c 75 6d 6e 4e 61 6d 65 28 70 49 74 65 72  ColumnName(pIter
15c10 2d 3e 70 53 65 6c 65 63 74 2c 20 70 49 74 65 72  ->pSelect, pIter
15c20 2d 3e 6e 43 6f 6c 2b 31 2c 20 22 72 62 75 5f 72  ->nCol+1, "rbu_r
15c30 6f 77 69 64 22 29 3b 0a 20 20 20 20 70 56 61 6c  owid");.    pVal
15c40 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
15c50 6e 5f 76 61 6c 75 65 28 70 49 74 65 72 2d 3e 70  n_value(pIter->p
15c60 53 65 6c 65 63 74 2c 20 70 49 74 65 72 2d 3e 6e  Select, pIter->n
15c70 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 70 2d 3e 72  Col+1);.    p->r
15c80 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
15c90 5f 76 61 6c 75 65 28 70 57 72 69 74 65 72 2c 20  _value(pWriter, 
15ca0 70 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31 2c 20 70  pIter->nCol+1, p
15cb0 56 61 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Val);.  }.  if( 
15cc0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
15cd0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
15ce0 73 74 65 70 28 70 57 72 69 74 65 72 29 3b 0a 20  step(pWriter);. 
15cf0 20 20 20 70 2d 3e 72 63 20 3d 20 72 65 73 65 74     p->rc = reset
15d00 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
15d10 70 57 72 69 74 65 72 2c 20 26 70 2d 3e 7a 45 72  pWriter, &p->zEr
15d20 72 6d 73 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  rmsg);.  }.}../*
15d30 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
15d40 6e 20 64 6f 65 73 20 74 68 65 20 77 6f 72 6b 20  n does the work 
15d50 66 6f 72 20 61 6e 20 73 71 6c 69 74 65 33 72 62  for an sqlite3rb
15d60 75 5f 73 74 65 70 28 29 20 63 61 6c 6c 2e 0a 2a  u_step() call..*
15d70 2a 0a 2a 2a 20 54 68 65 20 6f 62 6a 65 63 74 2d  *.** The object-
15d80 69 74 65 72 61 74 6f 72 20 28 70 2d 3e 6f 62 6a  iterator (p->obj
15d90 69 74 65 72 29 20 63 75 72 72 65 6e 74 6c 79 20  iter) currently 
15da0 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 69  points to a vali
15db0 64 20 6f 62 6a 65 63 74 2c 0a 2a 2a 20 61 6e 64  d object,.** and
15dc0 20 74 68 65 20 69 6e 70 75 74 20 63 75 72 73 6f   the input curso
15dd0 72 20 28 70 2d 3e 6f 62 6a 69 74 65 72 2e 70 53  r (p->objiter.pS
15de0 65 6c 65 63 74 29 20 63 75 72 72 65 6e 74 6c 79  elect) currently
15df0 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c   points to a val
15e00 69 64 0a 2a 2a 20 69 6e 70 75 74 20 72 6f 77 2e  id.** input row.
15e10 20 50 65 72 66 6f 72 6d 20 77 68 61 74 65 76 65   Perform whateve
15e20 72 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20  r processing is 
15e30 72 65 71 75 69 72 65 64 20 61 6e 64 20 72 65 74  required and ret
15e40 75 72 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  urn..**.** If no
15e50 20 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20    error occurs, 
15e60 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
15e70 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
15e80 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a  , an error code.
15e90 2a 2a 20 61 6e 64 20 6d 65 73 73 61 67 65 20 69  ** and message i
15ea0 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 52 42  s left in the RB
15eb0 55 20 68 61 6e 64 6c 65 20 61 6e 64 20 61 20 63  U handle and a c
15ec0 6f 70 79 20 6f 66 20 74 68 65 20 65 72 72 6f 72  opy of the error
15ed0 20 63 6f 64 65 0a 2a 2a 20 72 65 74 75 72 6e 65   code.** returne
15ee0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
15ef0 20 72 62 75 53 74 65 70 28 73 71 6c 69 74 65 33   rbuStep(sqlite3
15f00 72 62 75 20 2a 70 29 7b 0a 20 20 52 62 75 4f 62  rbu *p){.  RbuOb
15f10 6a 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 26  jIter *pIter = &
15f20 70 2d 3e 6f 62 6a 69 74 65 72 3b 0a 20 20 63 6f  p->objiter;.  co
15f30 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 6b 20  nst char *zMask 
15f40 3d 20 30 3b 0a 20 20 69 6e 74 20 65 54 79 70 65  = 0;.  int eType
15f50 20 3d 20 72 62 75 53 74 65 70 54 79 70 65 28 70   = rbuStepType(p
15f60 2c 20 26 7a 4d 61 73 6b 29 3b 0a 0a 20 20 69 66  , &zMask);..  if
15f70 28 20 65 54 79 70 65 20 29 7b 0a 20 20 20 20 61  ( eType ){.    a
15f80 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 52 42  ssert( eType==RB
15f90 55 5f 49 4e 53 45 52 54 20 20 20 20 20 7c 7c 20  U_INSERT     || 
15fa0 65 54 79 70 65 3d 3d 52 42 55 5f 44 45 4c 45 54  eType==RBU_DELET
15fb0 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 65 54  E.         || eT
15fc0 79 70 65 3d 3d 52 42 55 5f 52 45 50 4c 41 43 45  ype==RBU_REPLACE
15fd0 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 52 42      || eType==RB
15fe0 55 5f 49 44 58 5f 44 45 4c 45 54 45 0a 20 20 20  U_IDX_DELETE.   
15ff0 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
16000 52 42 55 5f 49 44 58 5f 49 4e 53 45 52 54 20 7c  RBU_IDX_INSERT |
16010 7c 20 65 54 79 70 65 3d 3d 52 42 55 5f 55 50 44  | eType==RBU_UPD
16020 41 54 45 0a 20 20 20 20 29 3b 0a 20 20 20 20 61  ATE.    );.    a
16030 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 52 42  ssert( eType!=RB
16040 55 5f 55 50 44 41 54 45 20 7c 7c 20 70 49 74 65  U_UPDATE || pIte
16050 72 2d 3e 7a 49 64 78 3d 3d 30 20 29 3b 0a 0a 20  r->zIdx==0 );.. 
16060 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 7a 49     if( pIter->zI
16070 64 78 3d 3d 30 20 26 26 20 65 54 79 70 65 3d 3d  dx==0 && eType==
16080 52 42 55 5f 49 44 58 5f 44 45 4c 45 54 45 20 29  RBU_IDX_DELETE )
16090 7b 0a 20 20 20 20 20 20 72 62 75 42 61 64 43 6f  {.      rbuBadCo
160a0 6e 74 72 6f 6c 45 72 72 6f 72 28 70 29 3b 0a 20  ntrolError(p);. 
160b0 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66     }.    else if
160c0 28 20 65 54 79 70 65 3d 3d 52 42 55 5f 52 45 50  ( eType==RBU_REP
160d0 4c 41 43 45 20 29 7b 0a 20 20 20 20 20 20 69 66  LACE ){.      if
160e0 28 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d 30  ( pIter->zIdx==0
160f0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   ){.        p->n
16100 50 68 61 73 65 4f 6e 65 53 74 65 70 20 2b 3d 20  PhaseOneStep += 
16110 70 2d 3e 6f 62 6a 69 74 65 72 2e 6e 49 6e 64 65  p->objiter.nInde
16120 78 3b 0a 20 20 20 20 20 20 20 20 72 62 75 53 74  x;.        rbuSt
16130 65 70 4f 6e 65 4f 70 28 70 2c 20 52 42 55 5f 44  epOneOp(p, RBU_D
16140 45 4c 45 54 45 29 3b 0a 20 20 20 20 20 20 7d 0a  ELETE);.      }.
16150 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
16160 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 62 75  =SQLITE_OK ) rbu
16170 53 74 65 70 4f 6e 65 4f 70 28 70 2c 20 52 42 55  StepOneOp(p, RBU
16180 5f 49 4e 53 45 52 54 29 3b 0a 20 20 20 20 7d 0a  _INSERT);.    }.
16190 20 20 20 20 65 6c 73 65 20 69 66 28 20 65 54 79      else if( eTy
161a0 70 65 21 3d 52 42 55 5f 55 50 44 41 54 45 20 29  pe!=RBU_UPDATE )
161b0 7b 0a 20 20 20 20 20 20 72 62 75 53 74 65 70 4f  {.      rbuStepO
161c0 6e 65 4f 70 28 70 2c 20 65 54 79 70 65 29 3b 0a  neOp(p, eType);.
161d0 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 7b 0a      }.    else{.
161e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61        sqlite3_va
161f0 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 20 20 20  lue *pVal;.     
16200 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
16210 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20  Update = 0;.    
16220 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
16230 3d 52 42 55 5f 55 50 44 41 54 45 20 29 3b 0a 20  =RBU_UPDATE );. 
16240 20 20 20 20 20 70 2d 3e 6e 50 68 61 73 65 4f 6e       p->nPhaseOn
16250 65 53 74 65 70 20 2d 3d 20 70 2d 3e 6f 62 6a 69  eStep -= p->obji
16260 74 65 72 2e 6e 49 6e 64 65 78 3b 0a 20 20 20 20  ter.nIndex;.    
16270 20 20 72 62 75 47 65 74 55 70 64 61 74 65 53 74    rbuGetUpdateSt
16280 6d 74 28 70 2c 20 70 49 74 65 72 2c 20 7a 4d 61  mt(p, pIter, zMa
16290 73 6b 2c 20 26 70 55 70 64 61 74 65 29 3b 0a 20  sk, &pUpdate);. 
162a0 20 20 20 20 20 69 66 28 20 70 55 70 64 61 74 65       if( pUpdate
162b0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
162c0 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  i;.        for(i
162d0 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  =0; p->rc==SQLIT
162e0 45 5f 4f 4b 20 26 26 20 69 3c 70 49 74 65 72 2d  E_OK && i<pIter-
162f0 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
16300 20 20 20 20 20 20 20 63 68 61 72 20 63 20 3d 20         char c = 
16310 7a 4d 61 73 6b 5b 70 49 74 65 72 2d 3e 61 69 53  zMask[pIter->aiS
16320 72 63 4f 72 64 65 72 5b 69 5d 5d 3b 0a 20 20 20  rcOrder[i]];.   
16330 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 73 71         pVal = sq
16340 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c  lite3_column_val
16350 75 65 28 70 49 74 65 72 2d 3e 70 53 65 6c 65 63  ue(pIter->pSelec
16360 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
16370 20 69 66 28 20 70 49 74 65 72 2d 3e 61 62 54 62   if( pIter->abTb
16380 6c 50 6b 5b 69 5d 20 7c 7c 20 63 21 3d 27 2e 27  lPk[i] || c!='.'
16390 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
163a0 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
163b0 62 69 6e 64 5f 76 61 6c 75 65 28 70 55 70 64 61  bind_value(pUpda
163c0 74 65 2c 20 69 2b 31 2c 20 70 56 61 6c 29 3b 0a  te, i+1, pVal);.
163d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
163e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
163f0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
16400 4f 4b 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  OK .         && 
16410 28 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52  (pIter->eType==R
16420 42 55 5f 50 4b 5f 56 54 41 42 20 7c 7c 20 70 49  BU_PK_VTAB || pI
16430 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f  ter->eType==RBU_
16440 50 4b 5f 4e 4f 4e 45 29 20 0a 20 20 20 20 20 20  PK_NONE) .      
16450 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f    ){.          /
16460 2a 20 42 69 6e 64 20 74 68 65 20 72 62 75 5f 72  * Bind the rbu_r
16470 6f 77 69 64 20 76 61 6c 75 65 20 74 6f 20 63 6f  owid value to co
16480 6c 75 6d 6e 20 5f 72 6f 77 69 64 5f 20 2a 2f 0a  lumn _rowid_ */.
16490 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
164a0 43 6f 6c 75 6d 6e 4e 61 6d 65 28 70 49 74 65 72  ColumnName(pIter
164b0 2d 3e 70 53 65 6c 65 63 74 2c 20 70 49 74 65 72  ->pSelect, pIter
164c0 2d 3e 6e 43 6f 6c 2b 31 2c 20 22 72 62 75 5f 72  ->nCol+1, "rbu_r
164d0 6f 77 69 64 22 29 3b 0a 20 20 20 20 20 20 20 20  owid");.        
164e0 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    pVal = sqlite3
164f0 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 49  _column_value(pI
16500 74 65 72 2d 3e 70 53 65 6c 65 63 74 2c 20 70 49  ter->pSelect, pI
16510 74 65 72 2d 3e 6e 43 6f 6c 2b 31 29 3b 0a 20 20  ter->nCol+1);.  
16520 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
16530 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c  sqlite3_bind_val
16540 75 65 28 70 55 70 64 61 74 65 2c 20 70 49 74 65  ue(pUpdate, pIte
16550 72 2d 3e 6e 43 6f 6c 2b 31 2c 20 70 56 61 6c 29  r->nCol+1, pVal)
16560 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16570 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
16580 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16590 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
165a0 65 70 28 70 55 70 64 61 74 65 29 3b 0a 20 20 20  ep(pUpdate);.   
165b0 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72         p->rc = r
165c0 65 73 65 74 41 6e 64 43 6f 6c 6c 65 63 74 45 72  esetAndCollectEr
165d0 72 6f 72 28 70 55 70 64 61 74 65 2c 20 26 70 2d  ror(pUpdate, &p-
165e0 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 20  >zErrmsg);.     
165f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
16600 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
16610 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p->rc;.}../*.** 
16620 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 73 63  Increment the sc
16630 68 65 6d 61 20 63 6f 6f 6b 69 65 20 6f 66 20 74  hema cookie of t
16640 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
16650 20 6f 70 65 6e 65 64 20 62 79 20 70 2d 3e 64 62   opened by p->db
16660 4d 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Main..*/.static 
16670 76 6f 69 64 20 72 62 75 49 6e 63 72 53 63 68 65  void rbuIncrSche
16680 6d 61 43 6f 6f 6b 69 65 28 73 71 6c 69 74 65 33  maCookie(sqlite3
16690 72 62 75 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  rbu *p){.  if( p
166a0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
166b0 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6f 6b  ){.    int iCook
166c0 69 65 20 3d 20 31 30 30 30 30 30 30 3b 0a 20 20  ie = 1000000;.  
166d0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
166e0 70 53 74 6d 74 3b 0a 0a 20 20 20 20 70 2d 3e 72  pStmt;..    p->r
166f0 63 20 3d 20 70 72 65 70 61 72 65 41 6e 64 43 6f  c = prepareAndCo
16700 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62  llectError(p->db
16710 4d 61 69 6e 2c 20 26 70 53 74 6d 74 2c 20 26 70  Main, &pStmt, &p
16720 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20  ->zErrmsg, .    
16730 20 20 20 20 22 50 52 41 47 4d 41 20 73 63 68 65      "PRAGMA sche
16740 6d 61 5f 76 65 72 73 69 6f 6e 22 0a 20 20 20 20  ma_version".    
16750 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
16760 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
16770 20 20 20 20 20 2f 2a 20 43 6f 76 65 72 61 67 65       /* Coverage
16780 3a 20 69 74 20 6d 61 79 20 62 65 20 74 68 61 74  : it may be that
16790 20 74 68 69 73 20 73 71 6c 69 74 65 33 5f 73 74   this sqlite3_st
167a0 65 70 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c  ep() cannot fail
167b0 2e 20 54 68 65 72 65 0a 20 20 20 20 20 20 2a 2a  . There.      **
167c0 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 74 72   is already a tr
167d0 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20  ansaction open, 
167e0 73 6f 20 74 68 65 20 70 72 65 70 61 72 65 64 20  so the prepared 
167f0 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 6e 6f 74  statement cannot
16800 0a 20 20 20 20 20 20 2a 2a 20 74 68 72 6f 77 20  .      ** throw 
16810 61 6e 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41  an SQLITE_SCHEMA
16820 20 65 78 63 65 70 74 69 6f 6e 2e 20 54 68 65 20   exception. The 
16830 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 70 61  only database pa
16840 67 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  ge the.      ** 
16850 73 74 61 74 65 6d 65 6e 74 20 72 65 61 64 73 20  statement reads 
16860 69 73 20 70 61 67 65 20 31 2c 20 77 68 69 63 68  is page 1, which
16870 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
16880 6f 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68  o be in the cach
16890 65 2e 0a 20 20 20 20 20 20 2a 2a 20 41 6e 64 20  e..      ** And 
168a0 6e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  no memory alloca
168b0 74 69 6f 6e 73 20 61 72 65 20 72 65 71 75 69 72  tions are requir
168c0 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66  ed.  */.      if
168d0 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ( SQLITE_ROW==sq
168e0 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
168f0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43 6f  ) ){.        iCo
16900 6f 6b 69 65 20 3d 20 73 71 6c 69 74 65 33 5f 63  okie = sqlite3_c
16910 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
16920 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
16930 20 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70     rbuFinalize(p
16940 2c 20 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a  , pStmt);.    }.
16950 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
16960 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16970 20 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63    rbuMPrintfExec
16980 28 70 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22  (p, p->dbMain, "
16990 50 52 41 47 4d 41 20 73 63 68 65 6d 61 5f 76 65  PRAGMA schema_ve
169a0 72 73 69 6f 6e 20 3d 20 25 64 22 2c 20 69 43 6f  rsion = %d", iCo
169b0 6f 6b 69 65 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  okie+1);.    }. 
169c0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61   }.}../*.** Upda
169d0 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  te the contents 
169e0 6f 66 20 74 68 65 20 72 62 75 5f 73 74 61 74 65  of the rbu_state
169f0 20 74 61 62 6c 65 20 77 69 74 68 69 6e 20 74 68   table within th
16a00 65 20 72 62 75 20 64 61 74 61 62 61 73 65 2e 20  e rbu database. 
16a10 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 73 74 6f  The.** value sto
16a20 72 65 64 20 69 6e 20 74 68 65 20 52 42 55 5f 53  red in the RBU_S
16a30 54 41 54 45 5f 53 54 41 47 45 20 63 6f 6c 75 6d  TATE_STAGE colum
16a40 6e 20 69 73 20 65 53 74 61 67 65 2e 20 41 6c 6c  n is eStage. All
16a50 20 6f 74 68 65 72 20 76 61 6c 75 65 73 0a 2a 2a   other values.**
16a60 20 61 72 65 20 64 65 74 65 72 6d 69 6e 65 64 20   are determined 
16a70 62 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68  by inspecting th
16a80 65 20 72 62 75 20 68 61 6e 64 6c 65 20 70 61 73  e rbu handle pas
16a90 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
16aa0 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
16ab0 61 74 69 63 20 76 6f 69 64 20 72 62 75 53 61 76  atic void rbuSav
16ac0 65 53 74 61 74 65 28 73 71 6c 69 74 65 33 72 62  eState(sqlite3rb
16ad0 75 20 2a 70 2c 20 69 6e 74 20 65 53 74 61 67 65  u *p, int eStage
16ae0 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ){.  if( p->rc==
16af0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e  SQLITE_OK || p->
16b00 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
16b10 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
16b20 74 6d 74 20 2a 70 49 6e 73 65 72 74 20 3d 20 30  tmt *pInsert = 0
16b30 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ;.    int rc;.. 
16b40 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a 45     assert( p->zE
16b50 72 72 6d 73 67 3d 3d 30 20 29 3b 0a 20 20 20 20  rrmsg==0 );.    
16b60 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65  rc = prepareFree
16b70 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
16b80 70 2d 3e 64 62 52 62 75 2c 20 26 70 49 6e 73 65  p->dbRbu, &pInse
16b90 72 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c  rt, &p->zErrmsg,
16ba0 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
16bb0 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
16bc0 20 20 20 20 20 22 49 4e 53 45 52 54 20 4f 52 20       "INSERT OR 
16bd0 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 25 73 2e  REPLACE INTO %s.
16be0 72 62 75 5f 73 74 61 74 65 28 6b 2c 20 76 29 20  rbu_state(k, v) 
16bf0 56 41 4c 55 45 53 20 22 0a 20 20 20 20 20 20 20  VALUES ".       
16c00 20 20 20 22 28 25 64 2c 20 25 64 29 2c 20 22 0a     "(%d, %d), ".
16c10 20 20 20 20 20 20 20 20 20 20 22 28 25 64 2c 20            "(%d, 
16c20 25 51 29 2c 20 22 0a 20 20 20 20 20 20 20 20 20  %Q), ".         
16c30 20 22 28 25 64 2c 20 25 51 29 2c 20 22 0a 20 20   "(%d, %Q), ".  
16c40 20 20 20 20 20 20 20 20 22 28 25 64 2c 20 25 64          "(%d, %d
16c50 29 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 22  ), ".          "
16c60 28 25 64 2c 20 25 64 29 2c 20 22 0a 20 20 20 20  (%d, %d), ".    
16c70 20 20 20 20 20 20 22 28 25 64 2c 20 25 6c 6c 64        "(%d, %lld
16c80 29 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 22  ), ".          "
16c90 28 25 64 2c 20 25 6c 6c 64 29 2c 20 22 0a 20 20  (%d, %lld), ".  
16ca0 20 20 20 20 20 20 20 20 22 28 25 64 2c 20 25 6c          "(%d, %l
16cb0 6c 64 29 2c 20 22 0a 20 20 20 20 20 20 20 20 20  ld), ".         
16cc0 20 22 28 25 64 2c 20 25 6c 6c 64 29 20 22 2c 0a   "(%d, %lld) ",.
16cd0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 53 74            p->zSt
16ce0 61 74 65 44 62 2c 0a 20 20 20 20 20 20 20 20 20  ateDb,.         
16cf0 20 52 42 55 5f 53 54 41 54 45 5f 53 54 41 47 45   RBU_STATE_STAGE
16d00 2c 20 65 53 74 61 67 65 2c 0a 20 20 20 20 20 20  , eStage,.      
16d10 20 20 20 20 52 42 55 5f 53 54 41 54 45 5f 54 42      RBU_STATE_TB
16d20 4c 2c 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 7a 54  L, p->objiter.zT
16d30 62 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20 52  bl, .          R
16d40 42 55 5f 53 54 41 54 45 5f 49 44 58 2c 20 70 2d  BU_STATE_IDX, p-
16d50 3e 6f 62 6a 69 74 65 72 2e 7a 49 64 78 2c 20 0a  >objiter.zIdx, .
16d60 20 20 20 20 20 20 20 20 20 20 52 42 55 5f 53 54            RBU_ST
16d70 41 54 45 5f 52 4f 57 2c 20 70 2d 3e 6e 53 74 65  ATE_ROW, p->nSte
16d80 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 52 42  p, .          RB
16d90 55 5f 53 54 41 54 45 5f 50 52 4f 47 52 45 53 53  U_STATE_PROGRESS
16da0 2c 20 70 2d 3e 6e 50 72 6f 67 72 65 73 73 2c 0a  , p->nProgress,.
16db0 20 20 20 20 20 20 20 20 20 20 52 42 55 5f 53 54            RBU_ST
16dc0 41 54 45 5f 43 4b 50 54 2c 20 70 2d 3e 69 57 61  ATE_CKPT, p->iWa
16dd0 6c 43 6b 73 75 6d 2c 0a 20 20 20 20 20 20 20 20  lCksum,.        
16de0 20 20 52 42 55 5f 53 54 41 54 45 5f 43 4f 4f 4b    RBU_STATE_COOK
16df0 49 45 2c 20 28 69 36 34 29 70 2d 3e 70 54 61 72  IE, (i64)p->pTar
16e00 67 65 74 46 64 2d 3e 69 43 6f 6f 6b 69 65 2c 0a  getFd->iCookie,.
16e10 20 20 20 20 20 20 20 20 20 20 52 42 55 5f 53 54            RBU_ST
16e20 41 54 45 5f 4f 41 4c 53 5a 2c 20 70 2d 3e 69 4f  ATE_OALSZ, p->iO
16e30 61 6c 53 7a 2c 0a 20 20 20 20 20 20 20 20 20 20  alSz,.          
16e40 52 42 55 5f 53 54 41 54 45 5f 50 48 41 53 45 4f  RBU_STATE_PHASEO
16e50 4e 45 53 54 45 50 2c 20 70 2d 3e 6e 50 68 61 73  NESTEP, p->nPhas
16e60 65 4f 6e 65 53 74 65 70 0a 20 20 20 20 20 20 29  eOneStep.      )
16e70 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73 65  .    );.    asse
16e80 72 74 28 20 70 49 6e 73 65 72 74 3d 3d 30 20 7c  rt( pInsert==0 |
16e90 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  | rc==SQLITE_OK 
16ea0 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  );..    if( rc==
16eb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16ec0 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28     sqlite3_step(
16ed0 70 49 6e 73 65 72 74 29 3b 0a 20 20 20 20 20 20  pInsert);.      
16ee0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e  rc = sqlite3_fin
16ef0 61 6c 69 7a 65 28 70 49 6e 73 65 72 74 29 3b 0a  alize(pInsert);.
16f00 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
16f10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d  !=SQLITE_OK ) p-
16f20 3e 72 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 7d 0a  >rc = rc;.  }.}.
16f30 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65  ../*.** Step the
16f40 20 52 42 55 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a   RBU object..*/.
16f50 69 6e 74 20 73 71 6c 69 74 65 33 72 62 75 5f 73  int sqlite3rbu_s
16f60 74 65 70 28 73 71 6c 69 74 65 33 72 62 75 20 2a  tep(sqlite3rbu *
16f70 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  p){.  if( p ){. 
16f80 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e 65 53     switch( p->eS
16f90 74 61 67 65 20 29 7b 0a 20 20 20 20 20 20 63 61  tage ){.      ca
16fa0 73 65 20 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c  se RBU_STAGE_OAL
16fb0 3a 20 7b 0a 20 20 20 20 20 20 20 20 52 62 75 4f  : {.        RbuO
16fc0 62 6a 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20  bjIter *pIter = 
16fd0 26 70 2d 3e 6f 62 6a 69 74 65 72 3b 0a 20 20 20  &p->objiter;.   
16fe0 20 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72       while( p->r
16ff0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
17000 70 49 74 65 72 2d 3e 7a 54 62 6c 20 29 7b 0a 0a  pIter->zTbl ){..
17010 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
17020 74 65 72 2d 3e 62 43 6c 65 61 6e 75 70 20 29 7b  ter->bCleanup ){
17030 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
17040 43 6c 65 61 6e 20 75 70 20 74 68 65 20 72 62 75  Clean up the rbu
17050 5f 74 6d 70 5f 78 78 78 20 74 61 62 6c 65 20 66  _tmp_xxx table f
17060 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  or the previous 
17070 74 61 62 6c 65 2e 20 49 74 20 0a 20 20 20 20 20  table. It .     
17080 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 6e 6f 74         ** cannot
17090 20 62 65 20 64 72 6f 70 70 65 64 20 61 73 20 74   be dropped as t
170a0 68 65 72 65 20 61 72 65 20 63 75 72 72 65 6e 74  here are current
170b0 6c 79 20 61 63 74 69 76 65 20 53 51 4c 20 73 74  ly active SQL st
170c0 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 20 20  atements..      
170d0 20 20 20 20 20 20 2a 2a 20 42 75 74 20 74 68 65        ** But the
170e0 20 63 6f 6e 74 65 6e 74 73 20 63 61 6e 20 62 65   contents can be
170f0 20 64 65 6c 65 74 65 64 2e 20 20 2a 2f 0a 20 20   deleted.  */.  
17100 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
17110 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64 20 29  ter->abIndexed )
17120 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
17130 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63 28 70  rbuMPrintfExec(p
17140 2c 20 70 2d 3e 64 62 52 62 75 2c 20 0a 20 20 20  , p->dbRbu, .   
17150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
17160 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 73 2e 27  DELETE FROM %s.'
17170 72 62 75 5f 74 6d 70 5f 25 71 27 22 2c 20 70 2d  rbu_tmp_%q'", p-
17180 3e 7a 53 74 61 74 65 44 62 2c 20 70 49 74 65 72  >zStateDb, pIter
17190 2d 3e 7a 44 61 74 61 54 62 6c 0a 20 20 20 20 20  ->zDataTbl.     
171a0 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
171b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
171c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
171d0 20 20 20 20 20 20 20 72 62 75 4f 62 6a 49 74 65         rbuObjIte
171e0 72 50 72 65 70 61 72 65 41 6c 6c 28 70 2c 20 70  rPrepareAll(p, p
171f0 49 74 65 72 2c 20 30 29 3b 0a 0a 20 20 20 20 20  Iter, 0);..     
17200 20 20 20 20 20 20 20 2f 2a 20 41 64 76 61 6e 63         /* Advanc
17210 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f  e to the next ro
17220 77 20 74 6f 20 70 72 6f 63 65 73 73 2e 20 2a 2f  w to process. */
17230 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
17240 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
17250 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
17260 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
17270 74 65 33 5f 73 74 65 70 28 70 49 74 65 72 2d 3e  te3_step(pIter->
17280 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
17290 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
172a0 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
172b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
172c0 3e 6e 50 72 6f 67 72 65 73 73 2b 2b 3b 0a 20 20  >nProgress++;.  
172d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
172e0 3e 6e 53 74 65 70 2b 2b 3b 0a 20 20 20 20 20 20  >nStep++;.      
172f0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
17300 20 72 62 75 53 74 65 70 28 70 29 3b 0a 20 20 20   rbuStep(p);.   
17310 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
17320 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63             p->rc
17330 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
17340 28 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 29  (pIter->pSelect)
17350 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
17360 70 2d 3e 6e 53 74 65 70 20 3d 20 30 3b 0a 20 20  p->nStep = 0;.  
17370 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
17380 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
17390 20 20 20 72 62 75 4f 62 6a 49 74 65 72 4e 65 78     rbuObjIterNex
173a0 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  t(p, pIter);.   
173b0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
173c0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
173d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
173e0 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
173f0 3e 7a 54 62 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  >zTbl==0 );.    
17400 20 20 20 20 20 20 72 62 75 53 61 76 65 53 74 61        rbuSaveSta
17410 74 65 28 70 2c 20 52 42 55 5f 53 54 41 47 45 5f  te(p, RBU_STAGE_
17420 4d 4f 56 45 29 3b 0a 20 20 20 20 20 20 20 20 20  MOVE);.         
17430 20 72 62 75 49 6e 63 72 53 63 68 65 6d 61 43 6f   rbuIncrSchemaCo
17440 6f 6b 69 65 28 70 29 3b 0a 20 20 20 20 20 20 20  okie(p);.       
17450 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
17460 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17470 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73         p->rc = s
17480 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
17490 62 4d 61 69 6e 2c 20 22 43 4f 4d 4d 49 54 22 2c  bMain, "COMMIT",
174a0 20 30 2c 20 30 2c 20 26 70 2d 3e 7a 45 72 72 6d   0, 0, &p->zErrm
174b0 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  sg);.          }
174c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
174d0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
174e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
174f0 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65  ->rc = sqlite3_e
17500 78 65 63 28 70 2d 3e 64 62 52 62 75 2c 20 22 43  xec(p->dbRbu, "C
17510 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 26 70  OMMIT", 0, 0, &p
17520 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20  ->zErrmsg);.    
17530 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17540 20 20 70 2d 3e 65 53 74 61 67 65 20 3d 20 52 42    p->eStage = RB
17550 55 5f 53 54 41 47 45 5f 4d 4f 56 45 3b 0a 20 20  U_STAGE_MOVE;.  
17560 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17570 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
17580 20 20 20 20 20 20 63 61 73 65 20 52 42 55 5f 53        case RBU_S
17590 54 41 47 45 5f 4d 4f 56 45 3a 20 7b 0a 20 20 20  TAGE_MOVE: {.   
175a0 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
175b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
175c0 20 20 20 20 20 20 20 72 62 75 4d 6f 76 65 4f 61         rbuMoveOa
175d0 6c 46 69 6c 65 28 70 29 3b 0a 20 20 20 20 20 20  lFile(p);.      
175e0 20 20 20 20 70 2d 3e 6e 50 72 6f 67 72 65 73 73      p->nProgress
175f0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
17600 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17610 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65     }..      case
17620 20 52 42 55 5f 53 54 41 47 45 5f 43 4b 50 54 3a   RBU_STAGE_CKPT:
17630 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   {.        if( p
17640 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
17650 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
17660 20 70 2d 3e 6e 53 74 65 70 3e 3d 70 2d 3e 6e 46   p->nStep>=p->nF
17670 72 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  rame ){.        
17680 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
17690 20 2a 70 44 62 20 3d 20 70 2d 3e 70 54 61 72 67   *pDb = p->pTarg
176a0 65 74 46 64 2d 3e 70 52 65 61 6c 3b 0a 20 20 0a  etFd->pReal;.  .
176b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
176c0 79 6e 63 20 74 68 65 20 64 62 20 66 69 6c 65 20  ync the db file 
176d0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  */.            p
176e0 2d 3e 72 63 20 3d 20 70 44 62 2d 3e 70 4d 65 74  ->rc = pDb->pMet
176f0 68 6f 64 73 2d 3e 78 53 79 6e 63 28 70 44 62 2c  hods->xSync(pDb,
17700 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
17710 4d 41 4c 29 3b 0a 20 20 0a 20 20 20 20 20 20 20  MAL);.  .       
17720 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 6e       /* Update n
17730 42 61 63 6b 66 69 6c 6c 20 2a 2f 0a 20 20 20 20  Backfill */.    
17740 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
17750 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
17760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76 6f                vo
17770 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 70 74 72  id volatile *ptr
17780 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
17790 70 2d 3e 72 63 20 3d 20 70 44 62 2d 3e 70 4d 65  p->rc = pDb->pMe
177a0 74 68 6f 64 73 2d 3e 78 53 68 6d 4d 61 70 28 70  thods->xShmMap(p
177b0 44 62 2c 20 30 2c 20 33 32 2a 31 30 32 34 2c 20  Db, 0, 32*1024, 
177c0 30 2c 20 26 70 74 72 29 3b 0a 20 20 20 20 20 20  0, &ptr);.      
177d0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
177e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
177f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17800 28 28 75 33 32 20 76 6f 6c 61 74 69 6c 65 2a 29  ((u32 volatile*)
17810 70 74 72 29 5b 32 34 5d 20 3d 20 70 2d 3e 69 4d  ptr)[24] = p->iM
17820 61 78 46 72 61 6d 65 3b 0a 20 20 20 20 20 20 20  axFrame;.       
17830 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17840 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
17850 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
17860 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17870 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 65              p->e
17880 53 74 61 67 65 20 3d 20 52 42 55 5f 53 54 41 47  Stage = RBU_STAG
17890 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  E_DONE;.        
178a0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
178b0 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20  LITE_DONE;.     
178c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
178d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
178e0 20 20 20 20 20 20 52 62 75 46 72 61 6d 65 20 2a        RbuFrame *
178f0 70 46 72 61 6d 65 20 3d 20 26 70 2d 3e 61 46 72  pFrame = &p->aFr
17900 61 6d 65 5b 70 2d 3e 6e 53 74 65 70 5d 3b 0a 20  ame[p->nStep];. 
17910 20 20 20 20 20 20 20 20 20 20 20 72 62 75 43 68             rbuCh
17920 65 63 6b 70 6f 69 6e 74 46 72 61 6d 65 28 70 2c  eckpointFrame(p,
17930 20 70 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20   pFrame);.      
17940 20 20 20 20 20 20 70 2d 3e 6e 53 74 65 70 2b 2b        p->nStep++
17950 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
17960 20 20 20 20 20 20 20 20 70 2d 3e 6e 50 72 6f 67          p->nProg
17970 72 65 73 73 2b 2b 3b 0a 20 20 20 20 20 20 20 20  ress++;.        
17980 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
17990 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
179a0 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20  default:.       
179b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
179c0 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a    return p->rc;.
179d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
179e0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
179f0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ;.  }.}../*.** F
17a00 72 65 65 20 61 6e 20 52 62 75 53 74 61 74 65 20  ree an RbuState 
17a10 6f 62 6a 65 63 74 20 61 6c 6c 6f 63 61 74 65 64  object allocated
17a20 20 62 79 20 72 62 75 4c 6f 61 64 53 74 61 74 65   by rbuLoadState
17a30 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
17a40 69 64 20 72 62 75 46 72 65 65 53 74 61 74 65 28  id rbuFreeState(
17a50 52 62 75 53 74 61 74 65 20 2a 70 29 7b 0a 20 20  RbuState *p){.  
17a60 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c  if( p ){.    sql
17a70 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 54 62  ite3_free(p->zTb
17a80 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  l);.    sqlite3_
17a90 66 72 65 65 28 70 2d 3e 7a 49 64 78 29 3b 0a 20  free(p->zIdx);. 
17aa0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
17ab0 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
17ac0 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 52 62 75   Allocate an Rbu
17ad0 53 74 61 74 65 20 6f 62 6a 65 63 74 20 61 6e 64  State object and
17ae0 20 6c 6f 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   load the conten
17af0 74 73 20 6f 66 20 74 68 65 20 72 62 75 5f 73 74  ts of the rbu_st
17b00 61 74 65 20 0a 2a 2a 20 74 61 62 6c 65 20 69 6e  ate .** table in
17b10 74 6f 20 69 74 2e 20 52 65 74 75 72 6e 20 61 20  to it. Return a 
17b20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e  pointer to the n
17b30 65 77 20 6f 62 6a 65 63 74 2e 20 49 74 20 69 73  ew object. It is
17b40 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73   the .** respons
17b50 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
17b60 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
17b70 6c 6c 79 20 66 72 65 65 20 74 68 65 20 6f 62 6a  lly free the obj
17b80 65 63 74 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c  ect using.** sql
17b90 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2a 0a  ite3_free()..**.
17ba0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
17bb0 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20  ccurs, leave an 
17bc0 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 6d  error code and m
17bd0 65 73 73 61 67 65 20 69 6e 20 74 68 65 20 72 62  essage in the rb
17be0 75 20 68 61 6e 64 6c 65 0a 2a 2a 20 61 6e 64 20  u handle.** and 
17bf0 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
17c00 73 74 61 74 69 63 20 52 62 75 53 74 61 74 65 20  static RbuState 
17c10 2a 72 62 75 4c 6f 61 64 53 74 61 74 65 28 73 71  *rbuLoadState(sq
17c20 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20  lite3rbu *p){.  
17c30 52 62 75 53 74 61 74 65 20 2a 70 52 65 74 20 3d  RbuState *pRet =
17c40 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   0;.  sqlite3_st
17c50 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
17c60 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 72   int rc;.  int r
17c70 63 32 3b 0a 0a 20 20 70 52 65 74 20 3d 20 28 52  c2;..  pRet = (R
17c80 62 75 53 74 61 74 65 2a 29 72 62 75 4d 61 6c 6c  buState*)rbuMall
17c90 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 52 62 75  oc(p, sizeof(Rbu
17ca0 53 74 61 74 65 29 29 3b 0a 20 20 69 66 28 20 70  State));.  if( p
17cb0 52 65 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Ret==0 ) return 
17cc0 30 3b 0a 0a 20 20 72 63 20 3d 20 70 72 65 70 61  0;..  rc = prepa
17cd0 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74  reFreeAndCollect
17ce0 45 72 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20  Error(p->dbRbu, 
17cf0 26 70 53 74 6d 74 2c 20 26 70 2d 3e 7a 45 72 72  &pStmt, &p->zErr
17d00 6d 73 67 2c 20 0a 20 20 20 20 20 20 73 71 6c 69  msg, .      sqli
17d10 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c  te3_mprintf("SEL
17d20 45 43 54 20 6b 2c 20 76 20 46 52 4f 4d 20 25 73  ECT k, v FROM %s
17d30 2e 72 62 75 5f 73 74 61 74 65 22 2c 20 70 2d 3e  .rbu_state", p->
17d40 7a 53 74 61 74 65 44 62 29 0a 20 20 29 3b 0a 20  zStateDb).  );. 
17d50 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
17d60 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f  TE_OK && SQLITE_
17d70 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
17d80 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20  p(pStmt) ){.    
17d90 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f  switch( sqlite3_
17da0 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
17db0 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 63 61  , 0) ){.      ca
17dc0 73 65 20 52 42 55 5f 53 54 41 54 45 5f 53 54 41  se RBU_STATE_STA
17dd0 47 45 3a 0a 20 20 20 20 20 20 20 20 70 52 65 74  GE:.        pRet
17de0 2d 3e 65 53 74 61 67 65 20 3d 20 73 71 6c 69 74  ->eStage = sqlit
17df0 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
17e00 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  tmt, 1);.       
17e10 20 69 66 28 20 70 52 65 74 2d 3e 65 53 74 61 67   if( pRet->eStag
17e20 65 21 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c  e!=RBU_STAGE_OAL
17e30 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 52 65  .         && pRe
17e40 74 2d 3e 65 53 74 61 67 65 21 3d 52 42 55 5f 53  t->eStage!=RBU_S
17e50 54 41 47 45 5f 4d 4f 56 45 0a 20 20 20 20 20 20  TAGE_MOVE.      
17e60 20 20 20 26 26 20 70 52 65 74 2d 3e 65 53 74 61     && pRet->eSta
17e70 67 65 21 3d 52 42 55 5f 53 54 41 47 45 5f 43 4b  ge!=RBU_STAGE_CK
17e80 50 54 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  PT.        ){.  
17e90 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
17ea0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a  SQLITE_CORRUPT;.
17eb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17ec0 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
17ed0 63 61 73 65 20 52 42 55 5f 53 54 41 54 45 5f 54  case RBU_STATE_T
17ee0 42 4c 3a 0a 20 20 20 20 20 20 20 20 70 52 65 74  BL:.        pRet
17ef0 2d 3e 7a 54 62 6c 20 3d 20 72 62 75 53 74 72 6e  ->zTbl = rbuStrn
17f00 64 75 70 28 28 63 68 61 72 2a 29 73 71 6c 69 74  dup((char*)sqlit
17f10 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
17f20 53 74 6d 74 2c 20 31 29 2c 20 26 72 63 29 3b 0a  Stmt, 1), &rc);.
17f30 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a          break;..
17f40 20 20 20 20 20 20 63 61 73 65 20 52 42 55 5f 53        case RBU_S
17f50 54 41 54 45 5f 49 44 58 3a 0a 20 20 20 20 20 20  TATE_IDX:.      
17f60 20 20 70 52 65 74 2d 3e 7a 49 64 78 20 3d 20 72    pRet->zIdx = r
17f70 62 75 53 74 72 6e 64 75 70 28 28 63 68 61 72 2a  buStrndup((char*
17f80 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
17f90 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29 2c 20  text(pStmt, 1), 
17fa0 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 62 72  &rc);.        br
17fb0 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65  eak;..      case
17fc0 20 52 42 55 5f 53 54 41 54 45 5f 52 4f 57 3a 0a   RBU_STATE_ROW:.
17fd0 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 52          pRet->nR
17fe0 6f 77 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ow = sqlite3_col
17ff0 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31  umn_int(pStmt, 1
18000 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
18010 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 52 42  ;..      case RB
18020 55 5f 53 54 41 54 45 5f 50 52 4f 47 52 45 53 53  U_STATE_PROGRESS
18030 3a 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  :.        pRet->
18040 6e 50 72 6f 67 72 65 73 73 20 3d 20 73 71 6c 69  nProgress = sqli
18050 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
18060 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20  (pStmt, 1);.    
18070 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
18080 20 20 63 61 73 65 20 52 42 55 5f 53 54 41 54 45    case RBU_STATE
18090 5f 43 4b 50 54 3a 0a 20 20 20 20 20 20 20 20 70  _CKPT:.        p
180a0 52 65 74 2d 3e 69 57 61 6c 43 6b 73 75 6d 20 3d  Ret->iWalCksum =
180b0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
180c0 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31 29 3b  int64(pStmt, 1);
180d0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
180e0 0a 20 20 20 20 20 20 63 61 73 65 20 52 42 55 5f  .      case RBU_
180f0 53 54 41 54 45 5f 43 4f 4f 4b 49 45 3a 0a 20 20  STATE_COOKIE:.  
18100 20 20 20 20 20 20 70 52 65 74 2d 3e 69 43 6f 6f        pRet->iCoo
18110 6b 69 65 20 3d 20 28 75 33 32 29 73 71 6c 69 74  kie = (u32)sqlit
18120 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  e3_column_int64(
18130 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20  pStmt, 1);.     
18140 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20     break;..     
18150 20 63 61 73 65 20 52 42 55 5f 53 54 41 54 45 5f   case RBU_STATE_
18160 4f 41 4c 53 5a 3a 0a 20 20 20 20 20 20 20 20 70  OALSZ:.        p
18170 52 65 74 2d 3e 69 4f 61 6c 53 7a 20 3d 20 28 75  Ret->iOalSz = (u
18180 33 32 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  32)sqlite3_colum
18190 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31  n_int64(pStmt, 1
181a0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
181b0 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 52 42  ;..      case RB
181c0 55 5f 53 54 41 54 45 5f 50 48 41 53 45 4f 4e 45  U_STATE_PHASEONE
181d0 53 54 45 50 3a 0a 20 20 20 20 20 20 20 20 70 52  STEP:.        pR
181e0 65 74 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65  et->nPhaseOneSte
181f0 70 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  p = sqlite3_colu
18200 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  mn_int64(pStmt, 
18210 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  1);.        brea
18220 6b 3b 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c  k;..      defaul
18230 74 3a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t:.        rc = 
18240 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a  SQLITE_CORRUPT;.
18250 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
18260 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63 32 20 3d     }.  }.  rc2 =
18270 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
18280 65 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20  e(pStmt);.  if( 
18290 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
182a0 72 63 20 3d 20 72 63 32 3b 0a 0a 20 20 70 2d 3e  rc = rc2;..  p->
182b0 72 63 20 3d 20 72 63 3b 0a 20 20 72 65 74 75 72  rc = rc;.  retur
182c0 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
182d0 20 43 6f 6d 70 61 72 65 20 73 74 72 69 6e 67 73   Compare strings
182e0 20 7a 31 20 61 6e 64 20 7a 32 2c 20 72 65 74 75   z1 and z2, retu
182f0 72 6e 69 6e 67 20 30 20 69 66 20 74 68 65 79 20  rning 0 if they 
18300 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2c 20 6f  are identical, o
18310 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74  r non-zero.** ot
18320 68 65 72 77 69 73 65 2e 20 45 69 74 68 65 72 20  herwise. Either 
18330 6f 72 20 62 6f 74 68 20 61 72 67 75 6d 65 6e 74  or both argument
18340 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 54 77   may be NULL. Tw
18350 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72  o NULL values ar
18360 65 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20  e.** considered 
18370 65 71 75 61 6c 2c 20 61 6e 64 20 4e 55 4c 4c 20  equal, and NULL 
18380 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 64 69  is considered di
18390 73 74 69 6e 63 74 20 66 72 6f 6d 20 61 6c 6c 20  stinct from all 
183a0 6f 74 68 65 72 20 76 61 6c 75 65 73 2e 0a 2a 2f  other values..*/
183b0 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 53  .static int rbuS
183c0 74 72 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20  trCompare(const 
183d0 63 68 61 72 20 2a 7a 31 2c 20 63 6f 6e 73 74 20  char *z1, const 
183e0 63 68 61 72 20 2a 7a 32 29 7b 0a 20 20 69 66 28  char *z2){.  if(
183f0 20 7a 31 3d 3d 30 20 26 26 20 7a 32 3d 3d 30 20   z1==0 && z2==0 
18400 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
18410 28 20 7a 31 3d 3d 30 20 7c 7c 20 7a 32 3d 3d 30  ( z1==0 || z2==0
18420 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72   ) return 1;.  r
18430 65 74 75 72 6e 20 28 73 71 6c 69 74 65 33 5f 73  eturn (sqlite3_s
18440 74 72 69 63 6d 70 28 7a 31 2c 20 7a 32 29 21 3d  tricmp(z1, z2)!=
18450 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  0);.}../*.** Thi
18460 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
18470 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  lled as part of 
18480 73 71 6c 69 74 65 33 72 62 75 5f 6f 70 65 6e 28  sqlite3rbu_open(
18490 29 20 77 68 65 6e 20 69 6e 69 74 69 61 6c 69 7a  ) when initializ
184a0 69 6e 67 0a 2a 2a 20 61 6e 20 72 62 75 20 68 61  ing.** an rbu ha
184b0 6e 64 6c 65 20 69 6e 20 4f 41 4c 20 73 74 61 67  ndle in OAL stag
184c0 65 2e 20 49 66 20 74 68 65 20 72 62 75 20 75 70  e. If the rbu up
184d0 64 61 74 65 20 68 61 73 20 6e 6f 74 20 73 74 61  date has not sta
184e0 72 74 65 64 20 28 69 2e 65 2e 0a 2a 2a 20 74 68  rted (i.e..** th
184f0 65 20 72 62 75 5f 73 74 61 74 65 20 74 61 62 6c  e rbu_state tabl
18500 65 20 77 61 73 20 65 6d 70 74 79 29 20 69 74 20  e was empty) it 
18510 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65  is a no-op. Othe
18520 72 77 69 73 65 2c 20 69 74 20 61 72 72 61 6e 67  rwise, it arrang
18530 65 73 0a 2a 2a 20 74 68 69 6e 67 73 20 73 6f 20  es.** things so 
18540 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 63 61  that the next ca
18550 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 72 62 75  ll to sqlite3rbu
18560 5f 73 74 65 70 28 29 20 63 6f 6e 74 69 6e 75 65  _step() continue
18570 73 20 6f 6e 20 66 72 6f 6d 0a 2a 2a 20 77 68 65  s on from.** whe
18580 72 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  re the previous 
18590 72 62 75 20 68 61 6e 64 6c 65 20 6c 65 66 74 20  rbu handle left 
185a0 6f 66 66 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  off..**.** If an
185b0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
185c0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  n error code and
185d0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61   error message a
185e0 72 65 20 6c 65 66 74 20 69 6e 20 74 68 65 0a 2a  re left in the.*
185f0 2a 20 72 62 75 20 68 61 6e 64 6c 65 20 70 61 73  * rbu handle pas
18600 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
18610 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
18620 61 74 69 63 20 76 6f 69 64 20 72 62 75 53 65 74  atic void rbuSet
18630 75 70 4f 61 6c 28 73 71 6c 69 74 65 33 72 62 75  upOal(sqlite3rbu
18640 20 2a 70 2c 20 52 62 75 53 74 61 74 65 20 2a 70   *p, RbuState *p
18650 53 74 61 74 65 29 7b 0a 20 20 61 73 73 65 72 74  State){.  assert
18660 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
18670 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 53 74 61  OK );.  if( pSta
18680 74 65 2d 3e 7a 54 62 6c 20 29 7b 0a 20 20 20 20  te->zTbl ){.    
18690 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65  RbuObjIter *pIte
186a0 72 20 3d 20 26 70 2d 3e 6f 62 6a 69 74 65 72 3b  r = &p->objiter;
186b0 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51  .    int rc = SQ
186c0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 20 20 77 68  LITE_OK;..    wh
186d0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
186e0 4f 4b 20 26 26 20 70 49 74 65 72 2d 3e 7a 54 62  OK && pIter->zTb
186f0 6c 20 26 26 20 28 70 49 74 65 72 2d 3e 62 43 6c  l && (pIter->bCl
18700 65 61 6e 75 70 20 0a 20 20 20 20 20 20 20 7c 7c  eanup .       ||
18710 20 72 62 75 53 74 72 43 6f 6d 70 61 72 65 28 70   rbuStrCompare(p
18720 49 74 65 72 2d 3e 7a 49 64 78 2c 20 70 53 74 61  Iter->zIdx, pSta
18730 74 65 2d 3e 7a 49 64 78 29 0a 20 20 20 20 20 20  te->zIdx).      
18740 20 7c 7c 20 72 62 75 53 74 72 43 6f 6d 70 61 72   || rbuStrCompar
18750 65 28 70 49 74 65 72 2d 3e 7a 54 62 6c 2c 20 70  e(pIter->zTbl, p
18760 53 74 61 74 65 2d 3e 7a 54 62 6c 29 20 0a 20 20  State->zTbl) .  
18770 20 20 29 29 7b 0a 20 20 20 20 20 20 72 63 20 3d    )){.      rc =
18780 20 72 62 75 4f 62 6a 49 74 65 72 4e 65 78 74 28   rbuObjIterNext(
18790 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 7d  p, pIter);.    }
187a0 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
187b0 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 49 74 65  LITE_OK && !pIte
187c0 72 2d 3e 7a 54 62 6c 20 29 7b 0a 20 20 20 20 20  r->zTbl ){.     
187d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
187e0 4f 52 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72  OR;.      p->zEr
187f0 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rmsg = sqlite3_m
18800 70 72 69 6e 74 66 28 22 72 62 75 5f 73 74 61 74  printf("rbu_stat
18810 65 20 6d 69 73 6d 61 74 63 68 20 65 72 72 6f 72  e mismatch error
18820 22 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ");.    }..    i
18830 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18840 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 74   ){.      p->nSt
18850 65 70 20 3d 20 70 53 74 61 74 65 2d 3e 6e 52 6f  ep = pState->nRo
18860 77 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 62  w;.      rc = rb
18870 75 4f 62 6a 49 74 65 72 50 72 65 70 61 72 65 41  uObjIterPrepareA
18880 6c 6c 28 70 2c 20 26 70 2d 3e 6f 62 6a 69 74 65  ll(p, &p->objite
18890 72 2c 20 70 2d 3e 6e 53 74 65 70 29 3b 0a 20 20  r, p->nStep);.  
188a0 20 20 7d 0a 0a 20 20 20 20 70 2d 3e 72 63 20 3d    }..    p->rc =
188b0 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   rc;.  }.}../*.*
188c0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
188d0 22 2a 2d 6f 61 6c 22 20 66 69 6c 65 20 69 6e 20  "*-oal" file in 
188e0 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
188f0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
18900 20 74 68 65 0a 2a 2a 20 74 61 72 67 65 74 20 64   the.** target d
18910 61 74 61 62 61 73 65 20 69 6e 20 74 68 65 20 66  atabase in the f
18920 69 6c 65 2d 73 79 73 74 65 6d 2c 20 64 65 6c 65  ile-system, dele
18930 74 65 20 69 74 2e 20 49 66 20 61 6e 20 65 72 72  te it. If an err
18940 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 6c 65  or occurs,.** le
18950 61 76 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ave an error cod
18960 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73  e and error mess
18970 61 67 65 20 69 6e 20 74 68 65 20 72 62 75 20 68  age in the rbu h
18980 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
18990 20 76 6f 69 64 20 72 62 75 44 65 6c 65 74 65 4f   void rbuDeleteO
189a0 61 6c 46 69 6c 65 28 73 71 6c 69 74 65 33 72 62  alFile(sqlite3rb
189b0 75 20 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a  u *p){.  char *z
189c0 4f 61 6c 20 3d 20 72 62 75 4d 50 72 69 6e 74 66  Oal = rbuMPrintf
189d0 28 70 2c 20 22 25 73 2d 6f 61 6c 22 2c 20 70 2d  (p, "%s-oal", p-
189e0 3e 7a 54 61 72 67 65 74 29 3b 0a 20 20 69 66 28  >zTarget);.  if(
189f0 20 7a 4f 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c   zOal ){.    sql
18a00 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
18a10 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
18a20 64 28 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  d(0);.    assert
18a30 28 20 70 56 66 73 20 26 26 20 70 2d 3e 72 63 3d  ( pVfs && p->rc=
18a40 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d  =SQLITE_OK && p-
18a50 3e 7a 45 72 72 6d 73 67 3d 3d 30 20 29 3b 0a 20  >zErrmsg==0 );. 
18a60 20 20 20 70 56 66 73 2d 3e 78 44 65 6c 65 74 65     pVfs->xDelete
18a70 28 70 56 66 73 2c 20 7a 4f 61 6c 2c 20 30 29 3b  (pVfs, zOal, 0);
18a80 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
18a90 65 28 7a 4f 61 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a  e(zOal);.  }.}..
18aa0 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
18ab0 20 70 72 69 76 61 74 65 20 72 62 75 20 56 46 53   private rbu VFS
18ac0 20 66 6f 72 20 74 68 65 20 72 62 75 20 68 61 6e   for the rbu han
18ad0 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dle passed as th
18ae0 65 20 6f 6e 6c 79 0a 2a 2a 20 61 72 67 75 6d 65  e only.** argume
18af0 6e 74 2e 20 54 68 69 73 20 56 46 53 20 77 69 6c  nt. This VFS wil
18b00 6c 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73  l be used unless
18b10 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   the call to sql
18b20 69 74 65 33 72 62 75 5f 6f 70 65 6e 28 29 0a 2a  ite3rbu_open().*
18b30 2a 20 73 70 65 63 69 66 69 65 64 20 61 20 55 52  * specified a UR
18b40 49 20 77 69 74 68 20 61 20 76 66 73 3d 3f 20 6f  I with a vfs=? o
18b50 70 74 69 6f 6e 20 69 6e 20 70 6c 61 63 65 20 6f  ption in place o
18b60 66 20 61 20 74 61 72 67 65 74 20 64 61 74 61 62  f a target datab
18b70 61 73 65 0a 2a 2a 20 66 69 6c 65 20 6e 61 6d 65  ase.** file name
18b80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
18b90 20 72 62 75 43 72 65 61 74 65 56 66 73 28 73 71   rbuCreateVfs(sq
18ba0 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20  lite3rbu *p){.  
18bb0 69 6e 74 20 72 6e 64 3b 0a 20 20 63 68 61 72 20  int rnd;.  char 
18bc0 7a 52 6e 64 5b 36 34 5d 3b 0a 0a 20 20 61 73 73  zRnd[64];..  ass
18bd0 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
18be0 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74  TE_OK );.  sqlit
18bf0 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
18c00 7a 65 6f 66 28 69 6e 74 29 2c 20 28 76 6f 69 64  zeof(int), (void
18c10 2a 29 26 72 6e 64 29 3b 0a 20 20 73 71 6c 69 74  *)&rnd);.  sqlit
18c20 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
18c30 6f 66 28 7a 52 6e 64 29 2c 20 7a 52 6e 64 2c 20  of(zRnd), zRnd, 
18c40 22 72 62 75 5f 76 66 73 5f 25 64 22 2c 20 72 6e  "rbu_vfs_%d", rn
18c50 64 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71  d);.  p->rc = sq
18c60 6c 69 74 65 33 72 62 75 5f 63 72 65 61 74 65 5f  lite3rbu_create_
18c70 76 66 73 28 7a 52 6e 64 2c 20 30 29 3b 0a 20 20  vfs(zRnd, 0);.  
18c80 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
18c90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
18ca0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
18cb0 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
18cc0 28 7a 52 6e 64 29 3b 0a 20 20 20 20 61 73 73 65  (zRnd);.    asse
18cd0 72 74 28 20 70 56 66 73 20 29 3b 0a 20 20 20 20  rt( pVfs );.    
18ce0 70 2d 3e 7a 56 66 73 4e 61 6d 65 20 3d 20 70 56  p->zVfsName = pV
18cf0 66 73 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 7d  fs->zName;.  }.}
18d00 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f 79 20  ../*.** Destroy 
18d10 74 68 65 20 70 72 69 76 61 74 65 20 56 46 53 20  the private VFS 
18d20 63 72 65 61 74 65 64 20 66 6f 72 20 74 68 65 20  created for the 
18d30 72 62 75 20 68 61 6e 64 6c 65 20 70 61 73 73 65  rbu handle passe
18d40 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 0a 2a 2a  d as the only.**
18d50 20 61 72 67 75 6d 65 6e 74 20 62 79 20 61 6e 20   argument by an 
18d60 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20  earlier call to 
18d70 72 62 75 43 72 65 61 74 65 56 66 73 28 29 2e 0a  rbuCreateVfs()..
18d80 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
18d90 62 75 44 65 6c 65 74 65 56 66 73 28 73 71 6c 69  buDeleteVfs(sqli
18da0 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 69 66  te3rbu *p){.  if
18db0 28 20 70 2d 3e 7a 56 66 73 4e 61 6d 65 20 29 7b  ( p->zVfsName ){
18dc0 0a 20 20 20 20 73 71 6c 69 74 65 33 72 62 75 5f  .    sqlite3rbu_
18dd0 64 65 73 74 72 6f 79 5f 76 66 73 28 70 2d 3e 7a  destroy_vfs(p->z
18de0 56 66 73 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d  VfsName);.    p-
18df0 3e 7a 56 66 73 4e 61 6d 65 20 3d 20 30 3b 0a 20  >zVfsName = 0;. 
18e00 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
18e10 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 53 51   user-defined SQ
18e20 4c 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e  L function is in
18e30 76 6f 6b 65 64 20 77 69 74 68 20 61 20 73 69 6e  voked with a sin
18e40 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 2d 20 74  gle argument - t
18e50 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20  he.** name of a 
18e60 74 61 62 6c 65 20 65 78 70 65 63 74 65 64 20 74  table expected t
18e70 6f 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  o appear in the 
18e80 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65 2e  target database.
18e90 20 49 74 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74   It returns.** t
18ea0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 75 78  he number of aux
18eb0 69 6c 6c 69 61 72 79 20 69 6e 64 65 78 65 73 20  illiary indexes 
18ec0 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f  on the table..*/
18ed0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
18ee0 49 6e 64 65 78 43 6e 74 46 75 6e 63 28 0a 20 20  IndexCntFunc(.  
18ef0 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
18f00 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 56  *pCtx, .  int nV
18f10 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  al,.  sqlite3_va
18f20 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20  lue **apVal.){. 
18f30 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 20 3d   sqlite3rbu *p =
18f40 20 28 73 71 6c 69 74 65 33 72 62 75 2a 29 73 71   (sqlite3rbu*)sq
18f50 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28  lite3_user_data(
18f60 70 43 74 78 29 3b 0a 20 20 73 71 6c 69 74 65 33  pCtx);.  sqlite3
18f70 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
18f80 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 6d 73  ;.  char *zErrms
18f90 67 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  g = 0;.  int rc;
18fa0 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 56 61 6c  ..  assert( nVal
18fb0 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 72 63 20 3d  ==1 );.  .  rc =
18fc0 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43   prepareFreeAndC
18fd0 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64  ollectError(p->d
18fe0 62 4d 61 69 6e 2c 20 26 70 53 74 6d 74 2c 20 26  bMain, &pStmt, &
18ff0 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20 20  zErrmsg, .      
19000 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
19010 22 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 6c 69  "PRAGMA index_li
19020 73 74 20 3d 20 25 51 22 2c 20 73 71 6c 69 74 65  st = %Q", sqlite
19030 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56  3_value_text(apV
19040 61 6c 5b 30 5d 29 29 0a 20 20 29 3b 0a 20 20 69  al[0])).  );.  i
19050 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
19060 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
19070 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74  result_error(pCt
19080 78 2c 20 7a 45 72 72 6d 73 67 2c 20 2d 31 29 3b  x, zErrmsg, -1);
19090 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
190a0 74 20 6e 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  t nIndex = 0;.  
190b0 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f    while( SQLITE_
190c0 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
190d0 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20  p(pStmt) ){.    
190e0 20 20 6e 49 6e 64 65 78 2b 2b 3b 0a 20 20 20 20    nIndex++;.    
190f0 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
19100 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
19110 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  t);.    if( rc==
19120 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19130 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
19140 74 5f 69 6e 74 28 70 43 74 78 2c 20 6e 49 6e 64  t_int(pCtx, nInd
19150 65 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ex);.    }else{.
19160 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
19170 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c  sult_error(pCtx,
19180 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
19190 70 2d 3e 64 62 4d 61 69 6e 29 2c 20 2d 31 29 3b  p->dbMain), -1);
191a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71  .    }.  }..  sq
191b0 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 6d  lite3_free(zErrm
191c0 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  sg);.}../*.** If
191d0 20 74 68 65 20 52 42 55 20 64 61 74 61 62 61 73   the RBU databas
191e0 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 72  e contains the r
191f0 62 75 5f 63 6f 75 6e 74 20 74 61 62 6c 65 2c 20  bu_count table, 
19200 75 73 65 20 69 74 20 74 6f 20 69 6e 69 74 69 61  use it to initia
19210 6c 69 7a 65 0a 2a 2a 20 74 68 65 20 73 71 6c 69  lize.** the sqli
19220 74 65 33 72 62 75 2e 6e 50 68 61 73 65 4f 6e 65  te3rbu.nPhaseOne
19230 53 74 65 70 20 76 61 72 69 61 62 6c 65 2e 20 54  Step variable. T
19240 68 65 20 73 63 68 65 6d 61 20 6f 66 20 74 68 65  he schema of the
19250 20 72 62 75 5f 63 6f 75 6e 74 20 74 61 62 6c 65   rbu_count table
19260 0a 2a 2a 20 69 73 20 61 73 73 75 6d 65 64 20 74  .** is assumed t
19270 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 61  o contain the sa
19280 6d 65 20 63 6f 6c 75 6d 6e 73 20 61 73 3a 0a 2a  me columns as:.*
19290 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41  *.**   CREATE TA
192a0 42 4c 45 20 72 62 75 5f 63 6f 75 6e 74 28 74 62  BLE rbu_count(tb
192b0 6c 20 54 45 58 54 20 50 52 49 4d 41 52 59 20 4b  l TEXT PRIMARY K
192c0 45 59 2c 20 63 6e 74 20 49 4e 54 45 47 45 52 29  EY, cnt INTEGER)
192d0 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 3b 0a   WITHOUT ROWID;.
192e0 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 73 68 6f 75  **.** There shou
192f0 6c 64 20 62 65 20 6f 6e 65 20 72 6f 77 20 69 6e  ld be one row in
19300 20 74 68 65 20 74 61 62 6c 65 20 66 6f 72 20 65   the table for e
19310 61 63 68 20 64 61 74 61 5f 78 78 78 20 74 61 62  ach data_xxx tab
19320 6c 65 20 69 6e 20 74 68 65 0a 2a 2a 20 64 61 74  le in the.** dat
19330 61 62 61 73 65 2e 20 54 68 65 20 27 74 62 6c 27  abase. The 'tbl'
19340 20 63 6f 6c 75 6d 6e 20 73 68 6f 75 6c 64 20 63   column should c
19350 6f 6e 74 61 69 6e 20 74 68 65 20 6e 61 6d 65 20  ontain the name 
19360 6f 66 20 61 20 64 61 74 61 5f 78 78 78 20 74 61  of a data_xxx ta
19370 62 6c 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ble,.** and the 
19380 63 6e 74 20 63 6f 6c 75 6d 6e 20 74 68 65 20 6e  cnt column the n
19390 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 74  umber of rows it
193a0 20 63 6f 6e 74 61 69 6e 73 2e 0a 2a 2a 0a 2a 2a   contains..**.**
193b0 20 73 71 6c 69 74 65 33 72 62 75 2e 6e 50 68 61   sqlite3rbu.nPha
193c0 73 65 4f 6e 65 53 74 65 70 20 69 73 20 69 6e 69  seOneStep is ini
193d0 74 69 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20  tialized to the 
193e0 73 75 6d 20 6f 66 20 28 31 20 2b 20 6e 49 6e 64  sum of (1 + nInd
193f0 65 78 29 20 2a 20 63 6e 74 0a 2a 2a 20 66 6f 72  ex) * cnt.** for
19400 20 61 6c 6c 20 72 6f 77 73 20 69 6e 20 74 68 65   all rows in the
19410 20 72 62 75 5f 63 6f 75 6e 74 20 74 61 62 6c 65   rbu_count table
19420 2c 20 77 68 65 72 65 20 6e 49 6e 64 65 78 20 69  , where nIndex i
19430 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
19440 0a 2a 2a 20 69 6e 64 65 78 65 73 20 6f 6e 20 74  .** indexes on t
19450 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
19460 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65   target database
19470 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
19480 63 20 76 6f 69 64 20 72 62 75 49 6e 69 74 50 68  c void rbuInitPh
19490 61 73 65 4f 6e 65 53 74 65 70 73 28 73 71 6c 69  aseOneSteps(sqli
194a0 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 69 66  te3rbu *p){.  if
194b0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
194c0 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
194d0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
194e0 30 3b 0a 20 20 20 20 69 6e 74 20 62 45 78 69 73  0;.    int bExis
194f0 74 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ts = 0;         
19500 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
19510 66 20 72 62 75 5f 63 6f 75 6e 74 20 65 78 69 73  f rbu_count exis
19520 74 73 20 2a 2f 0a 0a 20 20 20 20 70 2d 3e 6e 50  ts */..    p->nP
19530 68 61 73 65 4f 6e 65 53 74 65 70 20 3d 20 2d 31  haseOneStep = -1
19540 3b 0a 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  ;..    p->rc = s
19550 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
19560 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 52 62 75 2c  nction(p->dbRbu,
19570 20 0a 20 20 20 20 20 20 20 20 22 72 62 75 5f 69   .        "rbu_i
19580 6e 64 65 78 5f 63 6e 74 22 2c 20 31 2c 20 53 51  ndex_cnt", 1, SQ
19590 4c 49 54 45 5f 55 54 46 38 2c 20 28 76 6f 69 64  LITE_UTF8, (void
195a0 2a 29 70 2c 20 72 62 75 49 6e 64 65 78 43 6e 74  *)p, rbuIndexCnt
195b0 46 75 6e 63 2c 20 30 2c 20 30 0a 20 20 20 20 29  Func, 0, 0.    )
195c0 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 43 68 65 63  ;.  .    /* Chec
195d0 6b 20 66 6f 72 20 74 68 65 20 72 62 75 5f 63 6f  k for the rbu_co
195e0 75 6e 74 20 74 61 62 6c 65 2e 20 49 66 20 69 74  unt table. If it
195f0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
19600 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 0a   or if an error.
19610 20 20 20 20 2a 2a 20 6f 63 63 75 72 73 2c 20 6e      ** occurs, n
19620 50 68 61 73 65 4f 6e 65 53 74 65 70 20 77 69 6c  PhaseOneStep wil
19630 6c 20 62 65 20 6c 65 66 74 20 73 65 74 20 74 6f  l be left set to
19640 20 2d 31 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   -1. */.    if( 
19650 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
19660 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
19670 3d 20 70 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c  = prepareAndColl
19680 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 52 62  ectError(p->dbRb
19690 75 2c 20 26 70 53 74 6d 74 2c 20 26 70 2d 3e 7a  u, &pStmt, &p->z
196a0 45 72 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20  Errmsg,.        
196b0 20 20 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d    "SELECT 1 FROM
196c0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57   sqlite_master W
196d0 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 20 3d 20  HERE tbl_name = 
196e0 27 72 62 75 5f 63 6f 75 6e 74 27 22 0a 20 20 20  'rbu_count'".   
196f0 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20     );.    }.    
19700 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
19710 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
19720 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ( SQLITE_ROW==sq
19730 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
19740 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 45 78  ) ){.        bEx
19750 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  ists = 1;.      
19760 7d 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  }.      p->rc = 
19770 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
19780 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20  (pStmt);.    }. 
19790 20 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d   .    if( p->rc=
197a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 45  =SQLITE_OK && bE
197b0 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 70  xists ){.      p
197c0 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 41 6e  ->rc = prepareAn
197d0 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d  dCollectError(p-
197e0 3e 64 62 52 62 75 2c 20 26 70 53 74 6d 74 2c 20  >dbRbu, &pStmt, 
197f0 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20  &p->zErrmsg,.   
19800 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 73         "SELECT s
19810 75 6d 28 63 6e 74 20 2a 20 28 31 20 2b 20 72 62  um(cnt * (1 + rb
19820 75 5f 69 6e 64 65 78 5f 63 6e 74 28 72 62 75 5f  u_index_cnt(rbu_
19830 74 61 72 67 65 74 5f 6e 61 6d 65 28 74 62 6c 29  target_name(tbl)
19840 29 29 29 22 0a 20 20 20 20 20 20 20 20 20 20 22  )))".          "
19850 46 52 4f 4d 20 72 62 75 5f 63 6f 75 6e 74 22 0a  FROM rbu_count".
19860 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69        );.      i
19870 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
19880 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
19890 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  f( SQLITE_ROW==s
198a0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
198b0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
198c0 70 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70  p->nPhaseOneStep
198d0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
198e0 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 30  n_int64(pStmt, 0
198f0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
19900 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c       p->rc = sql
19910 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
19920 74 6d 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tmt);.      }.  
19930 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
19940 20 4f 70 65 6e 20 61 6e 64 20 72 65 74 75 72 6e   Open and return
19950 20 61 20 6e 65 77 20 52 42 55 20 68 61 6e 64 6c   a new RBU handl
19960 65 2e 20 0a 2a 2f 0a 73 71 6c 69 74 65 33 72 62  e. .*/.sqlite3rb
19970 75 20 2a 73 71 6c 69 74 65 33 72 62 75 5f 6f 70  u *sqlite3rbu_op
19980 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  en(.  const char
19990 20 2a 7a 54 61 72 67 65 74 2c 20 0a 20 20 63 6f   *zTarget, .  co
199a0 6e 73 74 20 63 68 61 72 20 2a 7a 52 62 75 2c 0a  nst char *zRbu,.
199b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
199c0 74 61 74 65 0a 29 7b 0a 20 20 73 71 6c 69 74 65  tate.){.  sqlite
199d0 33 72 62 75 20 2a 70 3b 0a 20 20 73 69 7a 65 5f  3rbu *p;.  size_
199e0 74 20 6e 54 61 72 67 65 74 20 3d 20 73 74 72 6c  t nTarget = strl
199f0 65 6e 28 7a 54 61 72 67 65 74 29 3b 0a 20 20 73  en(zTarget);.  s
19a00 69 7a 65 5f 74 20 6e 52 62 75 20 3d 20 73 74 72  ize_t nRbu = str
19a10 6c 65 6e 28 7a 52 62 75 29 3b 0a 20 20 73 69 7a  len(zRbu);.  siz
19a20 65 5f 74 20 6e 53 74 61 74 65 20 3d 20 7a 53 74  e_t nState = zSt
19a30 61 74 65 20 3f 20 73 74 72 6c 65 6e 28 7a 53 74  ate ? strlen(zSt
19a40 61 74 65 29 20 3a 20 30 3b 0a 20 20 73 69 7a 65  ate) : 0;.  size
19a50 5f 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  _t nByte = sizeo
19a60 66 28 73 71 6c 69 74 65 33 72 62 75 29 20 2b 20  f(sqlite3rbu) + 
19a70 6e 54 61 72 67 65 74 2b 31 20 2b 20 6e 52 62 75  nTarget+1 + nRbu
19a80 2b 31 2b 20 6e 53 74 61 74 65 2b 31 3b 0a 0a 20  +1+ nState+1;.. 
19a90 20 70 20 3d 20 28 73 71 6c 69 74 65 33 72 62 75   p = (sqlite3rbu
19aa0 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
19ab0 36 34 28 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  64(nByte);.  if(
19ac0 20 70 20 29 7b 0a 20 20 20 20 52 62 75 53 74 61   p ){.    RbuSta
19ad0 74 65 20 2a 70 53 74 61 74 65 20 3d 20 30 3b 0a  te *pState = 0;.
19ae0 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74  .    /* Create t
19af0 68 65 20 63 75 73 74 6f 6d 20 56 46 53 2e 20 2a  he custom VFS. *
19b00 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20  /.    memset(p, 
19b10 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65  0, sizeof(sqlite
19b20 33 72 62 75 29 29 3b 0a 20 20 20 20 72 62 75 43  3rbu));.    rbuC
19b30 72 65 61 74 65 56 66 73 28 70 29 3b 0a 0a 20 20  reateVfs(p);..  
19b40 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 74 61    /* Open the ta
19b50 72 67 65 74 20 64 61 74 61 62 61 73 65 20 2a 2f  rget database */
19b60 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  .    if( p->rc==
19b70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19b80 20 20 20 70 2d 3e 7a 54 61 72 67 65 74 20 3d 20     p->zTarget = 
19b90 28 63 68 61 72 2a 29 26 70 5b 31 5d 3b 0a 20 20  (char*)&p[1];.  
19ba0 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 7a 54      memcpy(p->zT
19bb0 61 72 67 65 74 2c 20 7a 54 61 72 67 65 74 2c 20  arget, zTarget, 
19bc0 6e 54 61 72 67 65 74 2b 31 29 3b 0a 20 20 20 20  nTarget+1);.    
19bd0 20 20 70 2d 3e 7a 52 62 75 20 3d 20 26 70 2d 3e    p->zRbu = &p->
19be0 7a 54 61 72 67 65 74 5b 6e 54 61 72 67 65 74 2b  zTarget[nTarget+
19bf0 31 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  1];.      memcpy
19c00 28 70 2d 3e 7a 52 62 75 2c 20 7a 52 62 75 2c 20  (p->zRbu, zRbu, 
19c10 6e 52 62 75 2b 31 29 3b 0a 20 20 20 20 20 20 69  nRbu+1);.      i
19c20 66 28 20 7a 53 74 61 74 65 20 29 7b 0a 20 20 20  f( zState ){.   
19c30 20 20 20 20 20 70 2d 3e 7a 53 74 61 74 65 20 3d       p->zState =
19c40 20 26 70 2d 3e 7a 52 62 75 5b 6e 52 62 75 2b 31   &p->zRbu[nRbu+1
19c50 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ];.        memcp
19c60 79 28 70 2d 3e 7a 53 74 61 74 65 2c 20 7a 53 74  y(p->zState, zSt
19c70 61 74 65 2c 20 6e 53 74 61 74 65 2b 31 29 3b 0a  ate, nState+1);.
19c80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 62        }.      rb
19c90 75 4f 70 65 6e 44 61 74 61 62 61 73 65 28 70 29  uOpenDatabase(p)
19ca0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
19cb0 49 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c  If it has not al
19cc0 72 65 61 64 79 20 62 65 65 6e 20 63 72 65 61 74  ready been creat
19cd0 65 64 2c 20 63 72 65 61 74 65 20 74 68 65 20 72  ed, create the r
19ce0 62 75 5f 73 74 61 74 65 20 74 61 62 6c 65 20 2a  bu_state table *
19cf0 2f 0a 20 20 20 20 72 62 75 4d 50 72 69 6e 74 66  /.    rbuMPrintf
19d00 45 78 65 63 28 70 2c 20 70 2d 3e 64 62 52 62 75  Exec(p, p->dbRbu
19d10 2c 20 52 42 55 5f 43 52 45 41 54 45 5f 53 54 41  , RBU_CREATE_STA
19d20 54 45 2c 20 70 2d 3e 7a 53 74 61 74 65 44 62 29  TE, p->zStateDb)
19d30 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  ;..    if( p->rc
19d40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
19d50 20 20 20 20 20 70 53 74 61 74 65 20 3d 20 72 62       pState = rb
19d60 75 4c 6f 61 64 53 74 61 74 65 28 70 29 3b 0a 20  uLoadState(p);. 
19d70 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74       assert( pSt
19d80 61 74 65 20 7c 7c 20 70 2d 3e 72 63 21 3d 53 51  ate || p->rc!=SQ
19d90 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
19da0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
19db0 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 20 20  TE_OK ){..      
19dc0 20 20 69 66 28 20 70 53 74 61 74 65 2d 3e 65 53    if( pState->eS
19dd0 74 61 67 65 3d 3d 30 20 29 7b 20 0a 20 20 20 20  tage==0 ){ .    
19de0 20 20 20 20 20 20 72 62 75 44 65 6c 65 74 65 4f        rbuDeleteO
19df0 61 6c 46 69 6c 65 28 70 29 3b 0a 20 20 20 20 20  alFile(p);.     
19e00 20 20 20 20 20 72 62 75 49 6e 69 74 50 68 61 73       rbuInitPhas
19e10 65 4f 6e 65 53 74 65 70 73 28 70 29 3b 0a 20 20  eOneSteps(p);.  
19e20 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 67          p->eStag
19e30 65 20 3d 20 52 42 55 5f 53 54 41 47 45 5f 4f 41  e = RBU_STAGE_OA
19e40 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  L;.        }else
19e50 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 65  {.          p->e
19e60 53 74 61 67 65 20 3d 20 70 53 74 61 74 65 2d 3e  Stage = pState->
19e70 65 53 74 61 67 65 3b 0a 20 20 20 20 20 20 20 20  eStage;.        
19e80 20 20 70 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74    p->nPhaseOneSt
19e90 65 70 20 3d 20 70 53 74 61 74 65 2d 3e 6e 50 68  ep = pState->nPh
19ea0 61 73 65 4f 6e 65 53 74 65 70 3b 0a 20 20 20 20  aseOneStep;.    
19eb0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d      }.        p-
19ec0 3e 6e 50 72 6f 67 72 65 73 73 20 3d 20 70 53 74  >nProgress = pSt
19ed0 61 74 65 2d 3e 6e 50 72 6f 67 72 65 73 73 3b 0a  ate->nProgress;.
19ee0 20 20 20 20 20 20 20 20 70 2d 3e 69 4f 61 6c 53          p->iOalS
19ef0 7a 20 3d 20 70 53 74 61 74 65 2d 3e 69 4f 61 6c  z = pState->iOal
19f00 53 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Sz;.      }.    
19f10 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  }.    assert( p-
19f20 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc!=SQLITE_OK |
19f30 7c 20 70 2d 3e 65 53 74 61 67 65 21 3d 30 20 29  | p->eStage!=0 )
19f40 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  ;..    if( p->rc
19f50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
19f60 2d 3e 70 54 61 72 67 65 74 46 64 2d 3e 70 57 61  ->pTargetFd->pWa
19f70 6c 46 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28  lFd ){.      if(
19f80 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f   p->eStage==RBU_
19f90 53 54 41 47 45 5f 4f 41 4c 20 29 7b 0a 20 20 20  STAGE_OAL ){.   
19fa0 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c       p->rc = SQL
19fb0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
19fc0 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20     p->zErrmsg = 
19fd0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
19fe0 22 63 61 6e 6e 6f 74 20 75 70 64 61 74 65 20 77  "cannot update w
19ff0 61 6c 20 6d 6f 64 65 20 64 61 74 61 62 61 73 65  al mode database
1a000 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ");.      }else 
1a010 69 66 28 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52  if( p->eStage==R
1a020 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 20 29 7b  BU_STAGE_MOVE ){
1a030 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
1a040 67 65 20 3d 20 52 42 55 5f 53 54 41 47 45 5f 43  ge = RBU_STAGE_C
1a050 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  KPT;.        p->
1a060 6e 53 74 65 70 20 3d 20 30 3b 0a 20 20 20 20 20  nStep = 0;.     
1a070 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66   }.    }..    if
1a080 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1a090 4f 4b 0a 20 20 20 20 20 26 26 20 28 70 2d 3e 65  OK.     && (p->e
1a0a0 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45  Stage==RBU_STAGE
1a0b0 5f 4f 41 4c 20 7c 7c 20 70 2d 3e 65 53 74 61 67  _OAL || p->eStag
1a0c0 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56  e==RBU_STAGE_MOV
1a0d0 45 29 0a 20 20 20 20 20 26 26 20 70 53 74 61 74  E).     && pStat
1a0e0 65 2d 3e 65 53 74 61 67 65 21 3d 30 20 26 26 20  e->eStage!=0 && 
1a0f0 70 2d 3e 70 54 61 72 67 65 74 46 64 2d 3e 69 43  p->pTargetFd->iC
1a100 6f 6f 6b 69 65 21 3d 70 53 74 61 74 65 2d 3e 69  ookie!=pState->i
1a110 43 6f 6f 6b 69 65 0a 20 20 20 20 29 7b 20 20 20  Cookie.    ){   
1a120 0a 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69  .      /* At thi
1a130 73 20 70 6f 69 6e 74 20 28 70 54 61 72 67 65 74  s point (pTarget
1a140 46 64 2d 3e 69 43 6f 6f 6b 69 65 29 20 63 6f 6e  Fd->iCookie) con
1a150 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 20  tains the value 
1a160 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  of the.      ** 
1a170 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 63  change-counter c
1a180 6f 6f 6b 69 65 20 28 74 68 65 20 74 68 69 6e 67  ookie (the thing
1a190 20 74 68 61 74 20 67 65 74 73 20 69 6e 63 72 65   that gets incre
1a1a0 6d 65 6e 74 65 64 20 77 68 65 6e 20 61 20 0a 20  mented when a . 
1a1b0 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
1a1c0 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
1a1d0 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64   in rollback mod
1a1e0 65 29 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  e) currently sto
1a1f0 72 65 64 20 6f 6e 20 0a 20 20 20 20 20 20 2a 2a  red on .      **
1a200 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 64   page 1 of the d
1a210 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
1a220 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  .      p->rc = S
1a230 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
1a240 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73    p->zErrmsg = s
1a250 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1a260 64 61 74 61 62 61 73 65 20 6d 6f 64 69 66 69 65  database modifie
1a270 64 20 64 75 72 69 6e 67 20 72 62 75 20 75 70 64  d during rbu upd
1a280 61 74 65 22 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ate");.    }..  
1a290 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1a2a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a2b0 69 66 28 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52  if( p->eStage==R
1a2c0 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 29 7b 0a  BU_STAGE_OAL ){.
1a2d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 20          sqlite3 
1a2e0 2a 64 62 20 3d 20 70 2d 3e 64 62 4d 61 69 6e 3b  *db = p->dbMain;
1a2f0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  ..        /* Ope
1a300 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 62  n transactions b
1a310 6f 74 68 20 64 61 74 61 62 61 73 65 73 2e 20 54  oth databases. T
1a320 68 65 20 2a 2d 6f 61 6c 20 66 69 6c 65 20 69 73  he *-oal file is
1a330 20 6f 70 65 6e 65 64 20 6f 72 0a 20 20 20 20 20   opened or.     
1a340 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20 61 74     ** created at
1a350 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a   this point. */.
1a360 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
1a370 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
1a380 20 22 42 45 47 49 4e 20 49 4d 4d 45 44 49 41 54   "BEGIN IMMEDIAT
1a390 45 22 2c 20 30 2c 20 30 2c 20 26 70 2d 3e 7a 45  E", 0, 0, &p->zE
1a3a0 72 72 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  rrmsg);.        
1a3b0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1a3c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1a3d0 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
1a3e0 33 5f 65 78 65 63 28 70 2d 3e 64 62 52 62 75 2c  3_exec(p->dbRbu,
1a3f0 20 22 42 45 47 49 4e 20 49 4d 4d 45 44 49 41 54   "BEGIN IMMEDIAT
1a400 45 22 2c 20 30 2c 20 30 2c 20 26 70 2d 3e 7a 45  E", 0, 0, &p->zE
1a410 72 72 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  rrmsg);.        
1a420 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68  }..        /* Ch
1a430 65 63 6b 20 69 66 20 74 68 65 20 6d 61 69 6e 20  eck if the main 
1a440 64 61 74 61 62 61 73 65 20 69 73 20 61 20 7a 69  database is a zi
1a450 70 76 66 73 20 64 62 2e 20 49 66 20 69 74 20 69  pvfs db. If it i
1a460 73 2c 20 73 65 74 20 74 68 65 20 75 70 70 65 72  s, set the upper
1a470 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 65 76 65  .        ** leve
1a480 6c 20 70 61 67 65 72 20 74 6f 20 75 73 65 20 22  l pager to use "
1a490 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66  journal_mode=off
1a4a0 22 2e 20 54 68 69 73 20 70 72 65 76 65 6e 74 73  ". This prevents
1a4b0 20 69 74 20 66 72 6f 6d 20 0a 20 20 20 20 20 20   it from .      
1a4c0 20 20 2a 2a 20 67 65 6e 65 72 61 74 69 6e 67 20    ** generating 
1a4d0 61 20 6c 61 72 67 65 20 6a 6f 75 72 6e 61 6c 20  a large journal 
1a4e0 75 73 69 6e 67 20 61 20 74 65 6d 70 20 66 69 6c  using a temp fil
1a4f0 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  e.  */.        i
1a500 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1a510 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1a520 20 69 6e 74 20 66 72 63 20 3d 20 73 71 6c 69 74   int frc = sqlit
1a530 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
1a540 64 62 2c 20 22 6d 61 69 6e 22 2c 20 53 51 4c 49  db, "main", SQLI
1a550 54 45 5f 46 43 4e 54 4c 5f 5a 49 50 56 46 53 2c  TE_FCNTL_ZIPVFS,
1a560 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   0);.          i
1a570 66 28 20 66 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  f( frc==SQLITE_O
1a580 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
1a590 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
1a5a0 5f 65 78 65 63 28 64 62 2c 20 22 50 52 41 47 4d  _exec(db, "PRAGM
1a5b0 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f  A journal_mode=o
1a5c0 66 66 22 2c 30 2c 30 2c 26 70 2d 3e 7a 45 72 72  ff",0,0,&p->zErr
1a5d0 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  msg);.          
1a5e0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  }.        }..   
1a5f0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 20 74 68       /* Point th
1a600 65 20 6f 62 6a 65 63 74 20 69 74 65 72 61 74 6f  e object iterato
1a610 72 20 61 74 20 74 68 65 20 66 69 72 73 74 20 6f  r at the first o
1a620 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 20 20 20  bject */.       
1a630 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1a640 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1a650 20 20 20 70 2d 3e 72 63 20 3d 20 72 62 75 4f 62     p->rc = rbuOb
1a660 6a 49 74 65 72 46 69 72 73 74 28 70 2c 20 26 70  jIterFirst(p, &p
1a670 2d 3e 6f 62 6a 69 74 65 72 29 3b 0a 20 20 20 20  ->objiter);.    
1a680 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
1a690 2a 20 49 66 20 74 68 65 20 52 42 55 20 64 61 74  * If the RBU dat
1a6a0 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 73 20 6e  abase contains n
1a6b0 6f 20 64 61 74 61 5f 78 78 78 20 74 61 62 6c 65  o data_xxx table
1a6c0 73 2c 20 64 65 63 6c 61 72 65 20 74 68 65 20 52  s, declare the R
1a6d0 42 55 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 70  BU.        ** up
1a6e0 64 61 74 65 20 66 69 6e 69 73 68 65 64 2e 20 20  date finished.  
1a6f0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
1a700 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1a710 26 26 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 7a 54  && p->objiter.zT
1a720 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  bl==0 ){.       
1a730 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
1a740 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  E_DONE;.        
1a750 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  }..        if( p
1a760 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1a770 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 62 75  ){.          rbu
1a780 53 65 74 75 70 4f 61 6c 28 70 2c 20 70 53 74 61  SetupOal(p, pSta
1a790 74 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  te);.        }..
1a7a0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1a7b0 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53  p->eStage==RBU_S
1a7c0 54 41 47 45 5f 4d 4f 56 45 20 29 7b 0a 20 20 20  TAGE_MOVE ){.   
1a7d0 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f       /* no-op */
1a7e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1a7f0 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f   p->eStage==RBU_
1a800 53 54 41 47 45 5f 43 4b 50 54 20 29 7b 0a 20 20  STAGE_CKPT ){.  
1a810 20 20 20 20 20 20 72 62 75 53 65 74 75 70 43 68        rbuSetupCh
1a820 65 63 6b 70 6f 69 6e 74 28 70 2c 20 70 53 74 61  eckpoint(p, pSta
1a830 74 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  te);.      }else
1a840 20 69 66 28 20 70 2d 3e 65 53 74 61 67 65 3d 3d   if( p->eStage==
1a850 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45 20 29  RBU_STAGE_DONE )
1a860 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20  {.        p->rc 
1a870 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
1a880 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1a890 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
1a8a0 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  TE_CORRUPT;.    
1a8b0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72    }.    }..    r
1a8c0 62 75 46 72 65 65 53 74 61 74 65 28 70 53 74 61  buFreeState(pSta
1a8d0 74 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  te);.  }..  retu
1a8e0 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn p;.}.../*.** 
1a8f0 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 62  Return the datab
1a900 61 73 65 20 68 61 6e 64 6c 65 20 75 73 65 64 20  ase handle used 
1a910 62 79 20 70 52 62 75 2e 0a 2a 2f 0a 73 71 6c 69  by pRbu..*/.sqli
1a920 74 65 33 20 2a 73 71 6c 69 74 65 33 72 62 75 5f  te3 *sqlite3rbu_
1a930 64 62 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  db(sqlite3rbu *p
1a940 52 62 75 2c 20 69 6e 74 20 62 52 62 75 29 7b 0a  Rbu, int bRbu){.
1a950 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1a960 30 3b 0a 20 20 69 66 28 20 70 52 62 75 20 29 7b  0;.  if( pRbu ){
1a970 0a 20 20 20 20 64 62 20 3d 20 28 62 52 62 75 20  .    db = (bRbu 
1a980 3f 20 70 52 62 75 2d 3e 64 62 52 62 75 20 3a 20  ? pRbu->dbRbu : 
1a990 70 52 62 75 2d 3e 64 62 4d 61 69 6e 29 3b 0a 20  pRbu->dbMain);. 
1a9a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 3b 0a   }.  return db;.
1a9b0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  }.../*.** If the
1a9c0 20 65 72 72 6f 72 20 63 6f 64 65 20 63 75 72 72   error code curr
1a9d0 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20  ently stored in 
1a9e0 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65 20 69  the RBU handle i
1a9f0 73 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  s SQLITE_CONSTRA
1aa00 49 4e 54 2c 0a 2a 2a 20 74 68 65 6e 20 65 64 69  INT,.** then edi
1aa10 74 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73  t any error mess
1aa20 61 67 65 20 73 74 72 69 6e 67 20 73 6f 20 61 73  age string so as
1aa30 20 74 6f 20 72 65 6d 6f 76 65 20 61 6c 6c 20 6f   to remove all o
1aa40 63 63 75 72 72 65 6e 63 65 73 20 6f 66 0a 2a 2a  ccurrences of.**
1aa50 20 74 68 65 20 70 61 74 74 65 72 6e 20 22 72 62   the pattern "rb
1aa60 75 5f 69 6d 70 5f 5b 30 2d 39 5d 2a 22 2e 0a 2a  u_imp_[0-9]*"..*
1aa70 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62  /.static void rb
1aa80 75 45 64 69 74 45 72 72 6d 73 67 28 73 71 6c 69  uEditErrmsg(sqli
1aa90 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 69 66  te3rbu *p){.  if
1aaa0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1aab0 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 20 70 2d  CONSTRAINT && p-
1aac0 3e 7a 45 72 72 6d 73 67 20 29 7b 0a 20 20 20 20  >zErrmsg ){.    
1aad0 69 6e 74 20 69 3b 0a 20 20 20 20 73 69 7a 65 5f  int i;.    size_
1aae0 74 20 6e 45 72 72 6d 73 67 20 3d 20 73 74 72 6c  t nErrmsg = strl
1aaf0 65 6e 28 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a  en(p->zErrmsg);.
1ab00 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28      for(i=0; i<(
1ab10 6e 45 72 72 6d 73 67 2d 38 29 3b 20 69 2b 2b 29  nErrmsg-8); i++)
1ab20 7b 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63  {.      if( memc
1ab30 6d 70 28 26 70 2d 3e 7a 45 72 72 6d 73 67 5b 69  mp(&p->zErrmsg[i
1ab40 5d 2c 20 22 72 62 75 5f 69 6d 70 5f 22 2c 20 38  ], "rbu_imp_", 8
1ab50 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1ab60 69 6e 74 20 6e 44 65 6c 20 3d 20 38 3b 0a 20 20  int nDel = 8;.  
1ab70 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e        while( p->
1ab80 7a 45 72 72 6d 73 67 5b 69 2b 6e 44 65 6c 5d 3e  zErrmsg[i+nDel]>
1ab90 3d 27 30 27 20 26 26 20 70 2d 3e 7a 45 72 72 6d  ='0' && p->zErrm
1aba0 73 67 5b 69 2b 6e 44 65 6c 5d 3c 3d 27 39 27 20  sg[i+nDel]<='9' 
1abb0 29 20 6e 44 65 6c 2b 2b 3b 0a 20 20 20 20 20 20  ) nDel++;.      
1abc0 20 20 6d 65 6d 6d 6f 76 65 28 26 70 2d 3e 7a 45    memmove(&p->zE
1abd0 72 72 6d 73 67 5b 69 5d 2c 20 26 70 2d 3e 7a 45  rrmsg[i], &p->zE
1abe0 72 72 6d 73 67 5b 69 2b 6e 44 65 6c 5d 2c 20 6e  rrmsg[i+nDel], n
1abf0 45 72 72 6d 73 67 20 2b 20 31 20 2d 20 69 20 2d  Errmsg + 1 - i -
1ac00 20 6e 44 65 6c 29 3b 0a 20 20 20 20 20 20 20 20   nDel);.        
1ac10 6e 45 72 72 6d 73 67 20 2d 3d 20 6e 44 65 6c 3b  nErrmsg -= nDel;
1ac20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1ac30 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73   }.}../*.** Clos
1ac40 65 20 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65  e the RBU handle
1ac50 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1ac60 72 62 75 5f 63 6c 6f 73 65 28 73 71 6c 69 74 65  rbu_close(sqlite
1ac70 33 72 62 75 20 2a 70 2c 20 63 68 61 72 20 2a 2a  3rbu *p, char **
1ac80 70 7a 45 72 72 6d 73 67 29 7b 0a 20 20 69 6e 74  pzErrmsg){.  int
1ac90 20 72 63 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a   rc;.  if( p ){.
1aca0 0a 20 20 20 20 2f 2a 20 43 6f 6d 6d 69 74 20 74  .    /* Commit t
1acb0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  he transaction t
1acc0 6f 20 74 68 65 20 2a 2d 6f 61 6c 20 66 69 6c 65  o the *-oal file
1acd0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
1ace0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1acf0 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f   p->eStage==RBU_
1ad00 53 54 41 47 45 5f 4f 41 4c 20 29 7b 0a 20 20 20  STAGE_OAL ){.   
1ad10 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
1ad20 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 4d 61 69  e3_exec(p->dbMai
1ad30 6e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20  n, "COMMIT", 0, 
1ad40 30 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b  0, &p->zErrmsg);
1ad50 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 62 75 53  .    }..    rbuS
1ad60 61 76 65 53 74 61 74 65 28 70 2c 20 70 2d 3e 65  aveState(p, p->e
1ad70 53 74 61 67 65 29 3b 0a 0a 20 20 20 20 69 66 28  Stage);..    if(
1ad80 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1ad90 4b 20 26 26 20 70 2d 3e 65 53 74 61 67 65 3d 3d  K && p->eStage==
1ada0 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 29 7b  RBU_STAGE_OAL ){
1adb0 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  .      p->rc = s
1adc0 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
1add0 62 52 62 75 2c 20 22 43 4f 4d 4d 49 54 22 2c 20  bRbu, "COMMIT", 
1ade0 30 2c 20 30 2c 20 26 70 2d 3e 7a 45 72 72 6d 73  0, 0, &p->zErrms
1adf0 67 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  g);.    }..    /
1ae00 2a 20 43 6c 6f 73 65 20 61 6e 79 20 6f 70 65 6e  * Close any open
1ae10 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c   statement handl
1ae20 65 73 2e 20 2a 2f 0a 20 20 20 20 72 62 75 4f 62  es. */.    rbuOb
1ae30 6a 49 74 65 72 46 69 6e 61 6c 69 7a 65 28 26 70  jIterFinalize(&p
1ae40 2d 3e 6f 62 6a 69 74 65 72 29 3b 0a 0a 20 20 20  ->objiter);..   
1ae50 20 2f 2a 20 43 6c 6f 73 65 20 74 68 65 20 6f 70   /* Close the op
1ae60 65 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  en database hand
1ae70 6c 65 20 61 6e 64 20 56 46 53 20 6f 62 6a 65 63  le and VFS objec
1ae80 74 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  t. */.    sqlite
1ae90 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 4d 61 69  3_close(p->dbMai
1aea0 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  n);.    sqlite3_
1aeb0 63 6c 6f 73 65 28 70 2d 3e 64 62 52 62 75 29 3b  close(p->dbRbu);
1aec0 0a 20 20 20 20 72 62 75 44 65 6c 65 74 65 56 66  .    rbuDeleteVf
1aed0 73 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  s(p);.    sqlite
1aee0 33 5f 66 72 65 65 28 70 2d 3e 61 42 75 66 29 3b  3_free(p->aBuf);
1aef0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1af00 65 28 70 2d 3e 61 46 72 61 6d 65 29 3b 0a 0a 20  e(p->aFrame);.. 
1af10 20 20 20 72 62 75 45 64 69 74 45 72 72 6d 73 67     rbuEditErrmsg
1af20 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 2d  (p);.    rc = p-
1af30 3e 72 63 3b 0a 20 20 20 20 2a 70 7a 45 72 72 6d  >rc;.    *pzErrm
1af40 73 67 20 3d 20 70 2d 3e 7a 45 72 72 6d 73 67 3b  sg = p->zErrmsg;
1af50 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1af60 65 28 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  e(p);.  }else{. 
1af70 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1af80 4f 4d 45 4d 3b 0a 20 20 20 20 2a 70 7a 45 72 72  OMEM;.    *pzErr
1af90 6d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  msg = 0;.  }.  r
1afa0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1afb0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f  ** Return the to
1afc0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6b 65  tal number of ke
1afd0 79 2d 76 61 6c 75 65 20 6f 70 65 72 61 74 69 6f  y-value operatio
1afe0 6e 73 20 28 69 6e 73 65 72 74 73 2c 20 64 65 6c  ns (inserts, del
1aff0 65 74 65 73 20 6f 72 20 0a 2a 2a 20 75 70 64 61  etes or .** upda
1b000 74 65 73 29 20 74 68 61 74 20 68 61 76 65 20 62  tes) that have b
1b010 65 65 6e 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e  een performed on
1b020 20 74 68 65 20 74 61 72 67 65 74 20 64 61 74 61   the target data
1b030 62 61 73 65 20 73 69 6e 63 65 20 74 68 65 0a 2a  base since the.*
1b040 2a 20 63 75 72 72 65 6e 74 20 52 42 55 20 75 70  * current RBU up
1b050 64 61 74 65 20 77 61 73 20 73 74 61 72 74 65 64  date was started
1b060 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74  ..*/.sqlite3_int
1b070 36 34 20 73 71 6c 69 74 65 33 72 62 75 5f 70 72  64 sqlite3rbu_pr
1b080 6f 67 72 65 73 73 28 73 71 6c 69 74 65 33 72 62  ogress(sqlite3rb
1b090 75 20 2a 70 52 62 75 29 7b 0a 20 20 72 65 74 75  u *pRbu){.  retu
1b0a0 72 6e 20 70 52 62 75 2d 3e 6e 50 72 6f 67 72 65  rn pRbu->nProgre
1b0b0 73 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ss;.}../*.** Ret
1b0c0 75 72 6e 20 70 65 72 6d 79 72 69 61 64 61 67 65  urn permyriadage
1b0d0 20 70 72 6f 67 72 65 73 73 20 69 6e 64 69 63 61   progress indica
1b0e0 74 69 6f 6e 73 20 66 6f 72 20 74 68 65 20 74 77  tions for the tw
1b0f0 6f 20 6d 61 69 6e 20 73 74 61 67 65 73 20 6f 66  o main stages of
1b100 0a 2a 2a 20 61 6e 20 52 42 55 20 75 70 64 61 74  .** an RBU updat
1b110 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
1b120 65 33 72 62 75 5f 62 70 5f 70 72 6f 67 72 65 73  e3rbu_bp_progres
1b130 73 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c  s(sqlite3rbu *p,
1b140 20 69 6e 74 20 2a 70 6e 4f 6e 65 2c 20 69 6e 74   int *pnOne, int
1b150 20 2a 70 6e 54 77 6f 29 7b 0a 20 20 63 6f 6e 73   *pnTwo){.  cons
1b160 74 20 69 6e 74 20 4d 41 58 5f 50 52 4f 47 52 45  t int MAX_PROGRE
1b170 53 53 20 3d 20 31 30 30 30 30 3b 0a 20 20 73 77  SS = 10000;.  sw
1b180 69 74 63 68 28 20 70 2d 3e 65 53 74 61 67 65 20  itch( p->eStage 
1b190 29 7b 0a 20 20 20 20 63 61 73 65 20 52 42 55 5f  ){.    case RBU_
1b1a0 53 54 41 47 45 5f 4f 41 4c 3a 0a 20 20 20 20 20  STAGE_OAL:.     
1b1b0 20 69 66 28 20 70 2d 3e 6e 50 68 61 73 65 4f 6e   if( p->nPhaseOn
1b1c0 65 53 74 65 70 3e 30 20 29 7b 0a 20 20 20 20 20  eStep>0 ){.     
1b1d0 20 20 20 2a 70 6e 4f 6e 65 20 3d 20 28 69 6e 74     *pnOne = (int
1b1e0 29 28 4d 41 58 5f 50 52 4f 47 52 45 53 53 20 2a  )(MAX_PROGRESS *
1b1f0 20 28 69 36 34 29 70 2d 3e 6e 50 72 6f 67 72 65   (i64)p->nProgre
1b200 73 73 2f 28 69 36 34 29 70 2d 3e 6e 50 68 61 73  ss/(i64)p->nPhas
1b210 65 4f 6e 65 53 74 65 70 29 3b 0a 20 20 20 20 20  eOneStep);.     
1b220 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1b230 2a 70 6e 4f 6e 65 20 3d 20 2d 31 3b 0a 20 20 20  *pnOne = -1;.   
1b240 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 6e 54 77     }.      *pnTw
1b250 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  o = 0;.      bre
1b260 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 52 42  ak;..    case RB
1b270 55 5f 53 54 41 47 45 5f 4d 4f 56 45 3a 0a 20 20  U_STAGE_MOVE:.  
1b280 20 20 20 20 2a 70 6e 4f 6e 65 20 3d 20 4d 41 58      *pnOne = MAX
1b290 5f 50 52 4f 47 52 45 53 53 3b 0a 20 20 20 20 20  _PROGRESS;.     
1b2a0 20 2a 70 6e 54 77 6f 20 3d 20 30 3b 0a 20 20 20   *pnTwo = 0;.   
1b2b0 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
1b2c0 61 73 65 20 52 42 55 5f 53 54 41 47 45 5f 43 4b  ase RBU_STAGE_CK
1b2d0 50 54 3a 0a 20 20 20 20 20 20 2a 70 6e 4f 6e 65  PT:.      *pnOne
1b2e0 20 3d 20 4d 41 58 5f 50 52 4f 47 52 45 53 53 3b   = MAX_PROGRESS;
1b2f0 0a 20 20 20 20 20 20 2a 70 6e 54 77 6f 20 3d 20  .      *pnTwo = 
1b300 28 69 6e 74 29 28 4d 41 58 5f 50 52 4f 47 52 45  (int)(MAX_PROGRE
1b310 53 53 20 2a 20 28 69 36 34 29 70 2d 3e 6e 53 74  SS * (i64)p->nSt
1b320 65 70 20 2f 20 28 69 36 34 29 70 2d 3e 6e 46 72  ep / (i64)p->nFr
1b330 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ame);.      brea
1b340 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 52 42 55  k;..    case RBU
1b350 5f 53 54 41 47 45 5f 44 4f 4e 45 3a 0a 20 20 20  _STAGE_DONE:.   
1b360 20 20 20 2a 70 6e 4f 6e 65 20 3d 20 4d 41 58 5f     *pnOne = MAX_
1b370 50 52 4f 47 52 45 53 53 3b 0a 20 20 20 20 20 20  PROGRESS;.      
1b380 2a 70 6e 54 77 6f 20 3d 20 4d 41 58 5f 50 52 4f  *pnTwo = MAX_PRO
1b390 47 52 45 53 53 3b 0a 20 20 20 20 20 20 62 72 65  GRESS;.      bre
1b3a0 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74  ak;..    default
1b3b0 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
1b3c0 30 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 69 6e 74 20  0 );.  }.}..int 
1b3d0 73 71 6c 69 74 65 33 72 62 75 5f 73 61 76 65 73  sqlite3rbu_saves
1b3e0 74 61 74 65 28 73 71 6c 69 74 65 33 72 62 75 20  tate(sqlite3rbu 
1b3f0 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *p){.  int rc = 
1b400 70 2d 3e 72 63 3b 0a 20 20 0a 20 20 69 66 28 20  p->rc;.  .  if( 
1b410 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
1b420 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1b430 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
1b440 2d 3e 65 53 74 61 67 65 3e 3d 52 42 55 5f 53 54  ->eStage>=RBU_ST
1b450 41 47 45 5f 4f 41 4c 20 26 26 20 70 2d 3e 65 53  AGE_OAL && p->eS
1b460 74 61 67 65 3c 3d 52 42 55 5f 53 54 41 47 45 5f  tage<=RBU_STAGE_
1b470 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 2d  DONE );.  if( p-
1b480 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41  >eStage==RBU_STA
1b490 47 45 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 61 73  GE_OAL ){.    as
1b4a0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
1b4b0 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28  _DONE );.    if(
1b4c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1b4d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
1b4e0 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 43  ec(p->dbMain, "C
1b4f0 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 30 29  OMMIT", 0, 0, 0)
1b500 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 72 63 20 3d  ;.  }..  p->rc =
1b510 20 72 63 3b 0a 20 20 72 62 75 53 61 76 65 53 74   rc;.  rbuSaveSt
1b520 61 74 65 28 70 2c 20 70 2d 3e 65 53 74 61 67 65  ate(p, p->eStage
1b530 29 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 72 63 3b  );.  rc = p->rc;
1b540 0a 0a 20 20 69 66 28 20 70 2d 3e 65 53 74 61 67  ..  if( p->eStag
1b550 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c  e==RBU_STAGE_OAL
1b560 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1b570 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
1b580 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1b590 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
1b5a0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
1b5b0 64 62 52 62 75 2c 20 22 43 4f 4d 4d 49 54 22 2c  dbRbu, "COMMIT",
1b5c0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69   0, 0, 0);.    i
1b5d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1b5e0 20 29 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f   ) rc = sqlite3_
1b5f0 65 78 65 63 28 70 2d 3e 64 62 52 62 75 2c 20 22  exec(p->dbRbu, "
1b600 42 45 47 49 4e 20 49 4d 4d 45 44 49 41 54 45 22  BEGIN IMMEDIATE"
1b610 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
1b620 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1b630 4b 20 29 20 72 63 20 3d 20 73 71 6c 69 74 65 33  K ) rc = sqlite3
1b640 5f 65 78 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c  _exec(p->dbMain,
1b650 20 22 42 45 47 49 4e 20 49 4d 4d 45 44 49 41 54   "BEGIN IMMEDIAT
1b660 45 22 2c 20 30 2c 20 30 2c 30 29 3b 0a 20 20 7d  E", 0, 0,0);.  }
1b670 0a 0a 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a  ..  p->rc = rc;.
1b680 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1b690 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
1b6a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b6b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b6c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b6d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42  ***********.** B
1b6e0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 52 42 55 20  eginning of RBU 
1b6f0 56 46 53 20 73 68 69 6d 20 6d 65 74 68 6f 64 73  VFS shim methods
1b700 2e 20 54 68 65 20 56 46 53 20 73 68 69 6d 20 6d  . The VFS shim m
1b710 6f 64 69 66 69 65 73 20 74 68 65 20 62 65 68 61  odifies the beha
1b720 76 69 6f 75 72 0a 2a 2a 20 6f 66 20 61 20 73 74  viour.** of a st
1b730 61 6e 64 61 72 64 20 56 46 53 20 69 6e 20 74 68  andard VFS in th
1b740 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 61 79 73  e following ways
1b750 3a 0a 2a 2a 0a 2a 2a 20 31 2e 20 57 68 65 6e 65  :.**.** 1. Whene
1b760 76 65 72 20 74 68 65 20 66 69 72 73 74 20 70 61  ver the first pa
1b770 67 65 20 6f 66 20 61 20 6d 61 69 6e 20 64 61 74  ge of a main dat
1b780 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 72 65  abase file is re
1b790 61 64 20 6f 72 20 0a 2a 2a 20 20 20 20 77 72 69  ad or .**    wri
1b7a0 74 74 65 6e 2c 20 74 68 65 20 76 61 6c 75 65 20  tten, the value 
1b7b0 6f 66 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  of the change-co
1b7c0 75 6e 74 65 72 20 63 6f 6f 6b 69 65 20 69 73 20  unter cookie is 
1b7d0 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 20 20 20  stored in.**    
1b7e0 72 62 75 5f 66 69 6c 65 2e 69 43 6f 6f 6b 69 65  rbu_file.iCookie
1b7f0 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 74 68 65  . Similarly, the
1b800 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 22 77   value of the "w
1b810 72 69 74 65 2d 76 65 72 73 69 6f 6e 22 0a 2a 2a  rite-version".**
1b820 20 20 20 20 64 61 74 61 62 61 73 65 20 68 65 61      database hea
1b830 64 65 72 20 66 69 65 6c 64 20 69 73 20 73 74 6f  der field is sto
1b840 72 65 64 20 69 6e 20 72 62 75 5f 66 69 6c 65 2e  red in rbu_file.
1b850 69 57 72 69 74 65 56 65 72 2e 20 54 68 69 73 20  iWriteVer. This 
1b860 65 6e 73 75 72 65 73 0a 2a 2a 20 20 20 20 74 68  ensures.**    th
1b870 61 74 20 74 68 65 20 76 61 6c 75 65 73 20 61 72  at the values ar
1b880 65 20 61 6c 77 61 79 73 20 74 72 75 73 74 77 6f  e always trustwo
1b890 72 74 68 79 20 77 69 74 68 69 6e 20 61 6e 20 6f  rthy within an o
1b8a0 70 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  pen transaction.
1b8b0 0a 2a 2a 0a 2a 2a 20 32 2e 20 57 68 65 6e 65 76  .**.** 2. Whenev
1b8c0 65 72 20 61 6e 20 53 51 4c 49 54 45 5f 4f 50 45  er an SQLITE_OPE
1b8d0 4e 5f 57 41 4c 20 66 69 6c 65 20 69 73 20 6f 70  N_WAL file is op
1b8e0 65 6e 65 64 2c 20 74 68 65 20 28 72 62 75 5f 66  ened, the (rbu_f
1b8f0 69 6c 65 2e 70 57 61 6c 46 64 29 0a 2a 2a 20 20  ile.pWalFd).**  
1b900 20 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c    member variabl
1b910 65 20 6f 66 20 74 68 65 20 61 73 73 6f 63 69 61  e of the associa
1b920 74 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  ted database fil
1b930 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
1b940 73 65 74 0a 2a 2a 20 20 20 20 74 6f 20 70 6f 69  set.**    to poi
1b950 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 66 69  nt to the new fi
1b960 6c 65 2e 20 41 20 6d 75 74 65 78 20 70 72 6f 74  le. A mutex prot
1b970 65 63 74 65 64 20 6c 69 6e 6b 65 64 20 6c 69 73  ected linked lis
1b980 74 20 6f 66 20 61 6c 6c 20 6d 61 69 6e 20 0a 2a  t of all main .*
1b990 2a 20 20 20 20 64 62 20 66 64 73 20 6f 70 65 6e  *    db fds open
1b9a0 65 64 20 75 73 69 6e 67 20 61 20 70 61 72 74 69  ed using a parti
1b9b0 63 75 6c 61 72 20 52 42 55 20 56 46 53 20 69 73  cular RBU VFS is
1b9c0 20 6d 61 69 6e 74 61 69 6e 65 64 20 61 74 20 0a   maintained at .
1b9d0 2a 2a 20 20 20 20 72 62 75 5f 76 66 73 2e 70 4d  **    rbu_vfs.pM
1b9e0 61 69 6e 20 74 6f 20 66 61 63 69 6c 69 74 61 74  ain to facilitat
1b9f0 65 20 74 68 69 73 2e 0a 2a 2a 0a 2a 2a 20 33 2e  e this..**.** 3.
1ba00 20 55 73 69 6e 67 20 61 20 6e 65 77 20 66 69 6c   Using a new fil
1ba10 65 2d 63 6f 6e 74 72 6f 6c 20 22 53 51 4c 49 54  e-control "SQLIT
1ba20 45 5f 46 43 4e 54 4c 5f 52 42 55 22 2c 20 61 20  E_FCNTL_RBU", a 
1ba30 6d 61 69 6e 20 64 62 20 72 62 75 5f 66 69 6c 65  main db rbu_file
1ba40 20 0a 2a 2a 20 20 20 20 6f 62 6a 65 63 74 20 63   .**    object c
1ba50 61 6e 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  an be marked as 
1ba60 74 68 65 20 74 61 72 67 65 74 20 64 61 74 61 62  the target datab
1ba70 61 73 65 20 6f 66 20 61 6e 20 52 42 55 20 75 70  ase of an RBU up
1ba80 64 61 74 65 2e 20 54 68 69 73 0a 2a 2a 20 20 20  date. This.**   
1ba90 20 74 75 72 6e 73 20 6f 6e 20 74 68 65 20 66 6f   turns on the fo
1baa0 6c 6c 6f 77 69 6e 67 20 65 78 74 72 61 20 73 70  llowing extra sp
1bab0 65 63 69 61 6c 20 62 65 68 61 76 69 6f 75 72 3a  ecial behaviour:
1bac0 0a 2a 2a 0a 2a 2a 20 33 61 2e 20 49 66 20 78 41  .**.** 3a. If xA
1bad0 63 63 65 73 73 28 29 20 69 73 20 63 61 6c 6c 65  ccess() is calle
1bae0 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68  d to check if th
1baf0 65 72 65 20 65 78 69 73 74 73 20 61 20 2a 2d 77  ere exists a *-w
1bb00 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 20 20 20 20  al file .**     
1bb10 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1bb20 61 6e 20 52 42 55 20 74 61 72 67 65 74 20 64 61  an RBU target da
1bb30 74 61 62 61 73 65 20 63 75 72 72 65 6e 74 6c 79  tabase currently
1bb40 20 69 6e 20 52 42 55 5f 53 54 41 47 45 5f 4f 41   in RBU_STAGE_OA
1bb50 4c 0a 2a 2a 20 20 20 20 20 73 74 61 67 65 20 28  L.**     stage (
1bb60 70 72 65 70 61 72 69 6e 67 20 74 68 65 20 2a 2d  preparing the *-
1bb70 6f 61 6c 20 66 69 6c 65 29 2c 20 74 68 65 20 66  oal file), the f
1bb80 6f 6c 6c 6f 77 69 6e 67 20 73 70 65 63 69 61 6c  ollowing special
1bb90 20 68 61 6e 64 6c 69 6e 67 0a 2a 2a 20 20 20 20   handling.**    
1bba0 20 61 70 70 6c 69 65 73 3a 0a 2a 2a 0a 2a 2a 20   applies:.**.** 
1bbb0 20 20 20 20 20 2a 20 69 66 20 74 68 65 20 2a 2d       * if the *-
1bbc0 77 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 65 78  wal file does ex
1bbd0 69 73 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ist, return SQLI
1bbe0 54 45 5f 43 41 4e 54 4f 50 45 4e 2e 20 41 6e 20  TE_CANTOPEN. An 
1bbf0 52 42 55 0a 2a 2a 20 20 20 20 20 20 20 20 74 61  RBU.**        ta
1bc00 72 67 65 74 20 64 61 74 61 62 61 73 65 20 6d 61  rget database ma
1bc10 79 20 6e 6f 74 20 62 65 20 69 6e 20 77 61 6c 20  y not be in wal 
1bc20 6d 6f 64 65 20 61 6c 72 65 61 64 79 2e 0a 2a 2a  mode already..**
1bc30 0a 2a 2a 20 20 20 20 20 20 2a 20 69 66 20 74 68  .**      * if th
1bc40 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65  e *-wal file doe
1bc50 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 73 65 74  s not exist, set
1bc60 20 74 68 65 20 6f 75 74 70 75 74 20 70 61 72 61   the output para
1bc70 6d 65 74 65 72 20 74 6f 0a 2a 2a 20 20 20 20 20  meter to.**     
1bc80 20 20 20 6e 6f 6e 2d 7a 65 72 6f 20 28 74 6f 20     non-zero (to 
1bc90 74 65 6c 6c 20 53 51 4c 69 74 65 20 74 68 61 74  tell SQLite that
1bca0 20 69 74 20 64 6f 65 73 20 65 78 69 73 74 29 20   it does exist) 
1bcb0 61 6e 79 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 20 20  anyway..**.**   
1bcc0 20 20 54 68 65 6e 2c 20 77 68 65 6e 20 78 4f 70    Then, when xOp
1bcd0 65 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74  en() is called t
1bce0 6f 20 6f 70 65 6e 20 74 68 65 20 2a 2d 77 61 6c  o open the *-wal
1bcf0 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64   file associated
1bd00 20 77 69 74 68 0a 2a 2a 20 20 20 20 20 74 68 65   with.**     the
1bd10 20 52 42 55 20 74 61 72 67 65 74 20 69 6e 20 52   RBU target in R
1bd20 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 73 74 61  BU_STAGE_OAL sta
1bd30 67 65 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 6f  ge, instead of o
1bd40 70 65 6e 69 6e 67 20 74 68 65 20 2a 2d 77 61 6c  pening the *-wal
1bd50 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2c 20 74 68  .**     file, th
1bd60 65 20 72 62 75 20 76 66 73 20 6f 70 65 6e 73 20  e rbu vfs opens 
1bd70 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
1bd80 67 20 2a 2d 6f 61 6c 20 66 69 6c 65 20 69 6e 73  g *-oal file ins
1bd90 74 65 61 64 2e 20 0a 2a 2a 0a 2a 2a 20 33 62 2e  tead. .**.** 3b.
1bda0 20 54 68 65 20 2a 2d 73 68 6d 20 70 61 67 65 73   The *-shm pages
1bdb0 20 72 65 74 75 72 6e 65 64 20 62 79 20 78 53 68   returned by xSh
1bdc0 6d 4d 61 70 28 29 20 66 6f 72 20 61 20 74 61 72  mMap() for a tar
1bdd0 67 65 74 20 64 62 20 66 69 6c 65 20 69 6e 0a 2a  get db file in.*
1bde0 2a 20 20 20 20 20 52 42 55 5f 53 54 41 47 45 5f  *     RBU_STAGE_
1bdf0 4f 41 4c 20 6d 6f 64 65 20 61 72 65 20 61 63 74  OAL mode are act
1be00 75 61 6c 6c 79 20 73 74 6f 72 65 64 20 69 6e 20  ually stored in 
1be10 68 65 61 70 20 6d 65 6d 6f 72 79 2e 20 54 68 69  heap memory. Thi
1be20 73 20 69 73 20 74 6f 0a 2a 2a 20 20 20 20 20 61  s is to.**     a
1be30 76 6f 69 64 20 63 72 65 61 74 69 6e 67 20 61 20  void creating a 
1be40 2a 2d 73 68 6d 20 66 69 6c 65 20 6f 6e 20 64 69  *-shm file on di
1be50 73 6b 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79  sk. Additionally
1be60 2c 20 78 53 68 6d 4c 6f 63 6b 28 29 20 63 61 6c  , xShmLock() cal
1be70 6c 73 0a 2a 2a 20 20 20 20 20 61 72 65 20 6e 6f  ls.**     are no
1be80 2d 6f 70 73 20 6f 6e 20 74 61 72 67 65 74 20 64  -ops on target d
1be90 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 69 6e  atabase files in
1bea0 20 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 6d   RBU_STAGE_OAL m
1beb0 6f 64 65 2e 20 54 68 69 73 20 69 73 0a 2a 2a 20  ode. This is.** 
1bec0 20 20 20 20 62 65 63 61 75 73 65 20 61 73 73 65      because asse
1bed0 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
1bee0 69 6e 20 73 6f 6d 65 20 56 46 53 20 69 6d 70 6c  in some VFS impl
1bef0 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66 61 69 6c  ementations fail
1bf00 20 69 66 20 0a 2a 2a 20 20 20 20 20 78 53 68 6d   if .**     xShm
1bf10 4c 6f 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64  Lock() is called
1bf20 20 62 65 66 6f 72 65 20 78 53 68 6d 4d 61 70 28   before xShmMap(
1bf30 29 2e 0a 2a 2a 0a 2a 2a 20 33 63 2e 20 49 66 20  )..**.** 3c. If 
1bf40 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
1bf50 6b 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 6f  k is attempted o
1bf60 6e 20 61 20 74 61 72 67 65 74 20 64 61 74 61 62  n a target datab
1bf70 61 73 65 20 66 69 6c 65 20 69 6e 20 61 6e 79 0a  ase file in any.
1bf80 2a 2a 20 20 20 20 20 6d 6f 64 65 20 65 78 63 65  **     mode exce
1bf90 70 74 20 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e  pt RBU_STAGE_DON
1bfa0 45 20 28 61 6c 6c 20 77 6f 72 6b 20 63 6f 6d 70  E (all work comp
1bfb0 6c 65 74 65 64 20 61 6e 64 20 63 68 65 63 6b 70  leted and checkp
1bfc0 6f 69 6e 74 65 64 29 2c 20 69 74 20 0a 2a 2a 20  ointed), it .** 
1bfd0 20 20 20 20 66 61 69 6c 73 20 77 69 74 68 20 61      fails with a
1bfe0 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72  n SQLITE_BUSY er
1bff0 72 6f 72 2e 20 54 68 69 73 20 69 73 20 74 6f 20  ror. This is to 
1c000 73 74 6f 70 20 52 42 55 20 63 6f 6e 6e 65 63 74  stop RBU connect
1c010 69 6f 6e 73 0a 2a 2a 20 20 20 20 20 66 72 6f 6d  ions.**     from
1c020 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
1c030 68 65 63 6b 70 6f 69 6e 74 69 6e 67 20 61 20 2a  heckpointing a *
1c040 2d 77 61 6c 20 28 6f 72 20 2a 2d 6f 61 6c 29 20  -wal (or *-oal) 
1c050 66 69 6c 65 20 66 72 6f 6d 20 77 69 74 68 69 6e  file from within
1c060 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 5f  .**     sqlite3_
1c070 63 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 33  close()..**.** 3
1c080 64 2e 20 49 6e 20 52 42 55 5f 53 54 41 47 45 5f  d. In RBU_STAGE_
1c090 43 41 50 54 55 52 45 20 6d 6f 64 65 2c 20 61 6c  CAPTURE mode, al
1c0a0 6c 20 78 52 65 61 64 28 29 20 63 61 6c 6c 73 20  l xRead() calls 
1c0b0 6f 6e 20 74 68 65 20 77 61 6c 20 66 69 6c 65 2c  on the wal file,
1c0c0 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6c 6c 20   and.**     all 
1c0d0 78 57 72 69 74 65 28 29 20 63 61 6c 6c 73 20 6f  xWrite() calls o
1c0e0 6e 20 74 68 65 20 74 61 72 67 65 74 20 64 61 74  n the target dat
1c0f0 61 62 61 73 65 20 66 69 6c 65 20 70 65 72 66 6f  abase file perfo
1c100 72 6d 20 6e 6f 20 49 4f 2e 20 0a 2a 2a 20 20 20  rm no IO. .**   
1c110 20 20 49 6e 73 74 65 61 64 20 74 68 65 20 66 72    Instead the fr
1c120 61 6d 65 20 61 6e 64 20 70 61 67 65 20 6e 75 6d  ame and page num
1c130 62 65 72 73 20 74 68 61 74 20 77 6f 75 6c 64 20  bers that would 
1c140 62 65 20 72 65 61 64 20 61 6e 64 20 77 72 69 74  be read and writ
1c150 74 65 6e 0a 2a 2a 20 20 20 20 20 61 72 65 20 72  ten.**     are r
1c160 65 63 6f 72 64 65 64 2e 20 41 64 64 69 74 69 6f  ecorded. Additio
1c170 6e 61 6c 6c 79 2c 20 73 75 63 63 65 73 73 66 75  nally, successfu
1c180 6c 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 62  l attempts to ob
1c190 74 61 69 6e 20 65 78 63 6c 75 73 69 76 65 0a 2a  tain exclusive.*
1c1a0 2a 20 20 20 20 20 78 53 68 6d 4c 6f 63 6b 28 29  *     xShmLock()
1c1b0 20 57 52 49 54 45 52 2c 20 43 48 45 43 4b 50 4f   WRITER, CHECKPO
1c1c0 49 4e 54 45 52 20 61 6e 64 20 52 45 41 44 30 20  INTER and READ0 
1c1d0 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 74 61 72  locks on the tar
1c1e0 67 65 74 20 0a 2a 2a 20 20 20 20 20 64 61 74 61  get .**     data
1c1f0 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 72 65  base file are re
1c200 63 6f 72 64 65 64 2e 20 78 53 68 6d 4c 6f 63 6b  corded. xShmLock
1c210 28 29 20 63 61 6c 6c 73 20 74 6f 20 75 6e 6c 6f  () calls to unlo
1c220 63 6b 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 20  ck the same.**  
1c230 20 20 20 6c 6f 63 6b 73 20 61 72 65 20 6e 6f 2d     locks are no-
1c240 6f 70 73 20 28 73 6f 20 74 68 61 74 20 6f 6e 63  ops (so that onc
1c250 65 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 73  e obtained, thes
1c260 65 20 6c 6f 63 6b 73 20 61 72 65 20 6e 65 76 65  e locks are neve
1c270 72 0a 2a 2a 20 20 20 20 20 72 65 6c 69 6e 71 75  r.**     relinqu
1c280 69 73 68 65 64 29 2e 20 46 69 6e 61 6c 6c 79 2c  ished). Finally,
1c290 20 63 61 6c 6c 73 20 74 6f 20 78 53 79 6e 63 28   calls to xSync(
1c2a0 29 20 6f 6e 20 74 68 65 20 74 61 72 67 65 74 20  ) on the target 
1c2b0 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
1c2c0 66 69 6c 65 20 66 61 69 6c 20 77 69 74 68 20 53  file fail with S
1c2d0 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 20 65  QLITE_INTERNAL e
1c2e0 72 72 6f 72 73 2e 0a 2a 2f 0a 0a 73 74 61 74 69  rrors..*/..stati
1c2f0 63 20 76 6f 69 64 20 72 62 75 55 6e 6c 6f 63 6b  c void rbuUnlock
1c300 53 68 6d 28 72 62 75 5f 66 69 6c 65 20 2a 70 29  Shm(rbu_file *p)
1c310 7b 0a 20 20 69 66 28 20 70 2d 3e 70 52 62 75 20  {.  if( p->pRbu 
1c320 29 7b 0a 20 20 20 20 69 6e 74 20 28 2a 78 53 68  ){.    int (*xSh
1c330 6d 4c 6f 63 6b 29 28 73 71 6c 69 74 65 33 5f 66  mLock)(sqlite3_f
1c340 69 6c 65 2a 2c 69 6e 74 2c 69 6e 74 2c 69 6e 74  ile*,int,int,int
1c350 29 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d  ) = p->pReal->pM
1c360 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4c 6f 63 6b  ethods->xShmLock
1c370 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
1c380 20 66 6f 72 28 69 3d 30 3b 20 69 3c 53 51 4c 49   for(i=0; i<SQLI
1c390 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 3b 69 2b 2b  TE_SHM_NLOCK;i++
1c3a0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 31 3c  ){.      if( (1<
1c3b0 3c 69 29 20 26 20 70 2d 3e 70 52 62 75 2d 3e 6d  <i) & p->pRbu->m
1c3c0 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  Lock ){.        
1c3d0 78 53 68 6d 4c 6f 63 6b 28 70 2d 3e 70 52 65 61  xShmLock(p->pRea
1c3e0 6c 2c 20 69 2c 20 31 2c 20 53 51 4c 49 54 45 5f  l, i, 1, SQLITE_
1c3f0 53 48 4d 5f 55 4e 4c 4f 43 4b 7c 53 51 4c 49 54  SHM_UNLOCK|SQLIT
1c400 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
1c410 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1c420 20 20 20 20 70 2d 3e 70 52 62 75 2d 3e 6d 4c 6f      p->pRbu->mLo
1c430 63 6b 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ck = 0;.  }.}../
1c440 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 72 62  *.** Close an rb
1c450 75 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  u file..*/.stati
1c460 63 20 69 6e 74 20 72 62 75 56 66 73 43 6c 6f 73  c int rbuVfsClos
1c470 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
1c480 70 46 69 6c 65 29 7b 0a 20 20 72 62 75 5f 66 69  pFile){.  rbu_fi
1c490 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c  le *p = (rbu_fil
1c4a0 65 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20  e*)pFile;.  int 
1c4b0 72 63 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  rc;.  int i;..  
1c4c0 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e 74  /* Free the cont
1c4d0 65 6e 74 73 20 6f 66 20 74 68 65 20 61 70 53 68  ents of the apSh
1c4e0 6d 5b 5d 20 61 72 72 61 79 2e 20 41 6e 64 20 74  m[] array. And t
1c4f0 68 65 20 61 72 72 61 79 20 69 74 73 65 6c 66 2e  he array itself.
1c500 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
1c510 3c 70 2d 3e 6e 53 68 6d 3b 20 69 2b 2b 29 7b 0a  <p->nShm; i++){.
1c520 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1c530 28 70 2d 3e 61 70 53 68 6d 5b 69 5d 29 3b 0a 20  (p->apShm[i]);. 
1c540 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
1c550 65 28 70 2d 3e 61 70 53 68 6d 29 3b 0a 20 20 70  e(p->apShm);.  p
1c560 2d 3e 61 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73  ->apShm = 0;.  s
1c570 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a  qlite3_free(p->z
1c580 44 65 6c 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  Del);..  if( p->
1c590 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49  openFlags & SQLI
1c5a0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
1c5b0 29 7b 0a 20 20 20 20 72 62 75 5f 66 69 6c 65 20  ){.    rbu_file 
1c5c0 2a 2a 70 70 3b 0a 20 20 20 20 73 71 6c 69 74 65  **pp;.    sqlite
1c5d0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 2d  3_mutex_enter(p-
1c5e0 3e 70 52 62 75 56 66 73 2d 3e 6d 75 74 65 78 29  >pRbuVfs->mutex)
1c5f0 3b 0a 20 20 20 20 66 6f 72 28 70 70 3d 26 70 2d  ;.    for(pp=&p-
1c600 3e 70 52 62 75 56 66 73 2d 3e 70 4d 61 69 6e 3b  >pRbuVfs->pMain;
1c610 20 2a 70 70 21 3d 70 3b 20 70 70 3d 26 28 28 2a   *pp!=p; pp=&((*
1c620 70 70 29 2d 3e 70 4d 61 69 6e 4e 65 78 74 29 29  pp)->pMainNext))
1c630 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70  ;.    *pp = p->p
1c640 4d 61 69 6e 4e 65 78 74 3b 0a 20 20 20 20 73 71  MainNext;.    sq
1c650 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1c660 65 28 70 2d 3e 70 52 62 75 56 66 73 2d 3e 6d 75  e(p->pRbuVfs->mu
1c670 74 65 78 29 3b 0a 20 20 20 20 72 62 75 55 6e 6c  tex);.    rbuUnl
1c680 6f 63 6b 53 68 6d 28 70 29 3b 0a 20 20 20 20 70  ockShm(p);.    p
1c690 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
1c6a0 73 2d 3e 78 53 68 6d 55 6e 6d 61 70 28 70 2d 3e  s->xShmUnmap(p->
1c6b0 70 52 65 61 6c 2c 20 30 29 3b 0a 20 20 7d 0a 0a  pReal, 0);.  }..
1c6c0 20 20 2f 2a 20 43 6c 6f 73 65 20 74 68 65 20 75    /* Close the u
1c6d0 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 68  nderlying file h
1c6e0 61 6e 64 6c 65 20 2a 2f 0a 20 20 72 63 20 3d 20  andle */.  rc = 
1c6f0 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f  p->pReal->pMetho
1c700 64 73 2d 3e 78 43 6c 6f 73 65 28 70 2d 3e 70 52  ds->xClose(p->pR
1c710 65 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  eal);.  return r
1c720 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  c;.}.../*.** Rea
1c730 64 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20  d and return an 
1c740 75 6e 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20  unsigned 32-bit 
1c750 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
1c760 65 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66  er from the buff
1c770 65 72 20 0a 2a 2a 20 70 61 73 73 65 64 20 61 73  er .** passed as
1c780 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
1c790 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  nt..*/.static u3
1c7a0 32 20 72 62 75 47 65 74 55 33 32 28 75 38 20 2a  2 rbuGetU32(u8 *
1c7b0 61 42 75 66 29 7b 0a 20 20 72 65 74 75 72 6e 20  aBuf){.  return 
1c7c0 28 28 75 33 32 29 61 42 75 66 5b 30 5d 20 3c 3c  ((u32)aBuf[0] <<
1c7d0 20 32 34 29 0a 20 20 20 20 20 20 20 2b 20 28 28   24).       + ((
1c7e0 75 33 32 29 61 42 75 66 5b 31 5d 20 3c 3c 20 31  u32)aBuf[1] << 1
1c7f0 36 29 0a 20 20 20 20 20 20 20 2b 20 28 28 75 33  6).       + ((u3
1c800 32 29 61 42 75 66 5b 32 5d 20 3c 3c 20 20 38 29  2)aBuf[2] <<  8)
1c810 0a 20 20 20 20 20 20 20 2b 20 28 28 75 33 32 29  .       + ((u32)
1c820 61 42 75 66 5b 33 5d 29 3b 0a 7d 0a 0a 2f 2a 0a  aBuf[3]);.}../*.
1c830 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f  ** Read data fro
1c840 6d 20 61 6e 20 72 62 75 56 66 73 2d 66 69 6c 65  m an rbuVfs-file
1c850 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1c860 72 62 75 56 66 73 52 65 61 64 28 0a 20 20 73 71  rbuVfsRead(.  sq
1c870 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
1c880 65 2c 20 0a 20 20 76 6f 69 64 20 2a 7a 42 75 66  e, .  void *zBuf
1c890 2c 20 0a 20 20 69 6e 74 20 69 41 6d 74 2c 20 0a  , .  int iAmt, .
1c8a0 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69    sqlite_int64 i
1c8b0 4f 66 73 74 0a 29 7b 0a 20 20 72 62 75 5f 66 69  Ofst.){.  rbu_fi
1c8c0 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c  le *p = (rbu_fil
1c8d0 65 2a 29 70 46 69 6c 65 3b 0a 20 20 73 71 6c 69  e*)pFile;.  sqli
1c8e0 74 65 33 72 62 75 20 2a 70 52 62 75 20 3d 20 70  te3rbu *pRbu = p
1c8f0 2d 3e 70 52 62 75 3b 0a 20 20 69 6e 74 20 72 63  ->pRbu;.  int rc
1c900 3b 0a 0a 20 20 69 66 28 20 70 52 62 75 20 26 26  ;..  if( pRbu &&
1c910 20 70 52 62 75 2d 3e 65 53 74 61 67 65 3d 3d 52   pRbu->eStage==R
1c920 42 55 5f 53 54 41 47 45 5f 43 41 50 54 55 52 45  BU_STAGE_CAPTURE
1c930 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1c940 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53  p->openFlags & S
1c950 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29  QLITE_OPEN_WAL )
1c960 3b 0a 20 20 20 20 72 63 20 3d 20 72 62 75 43 61  ;.    rc = rbuCa
1c970 70 74 75 72 65 57 61 6c 52 65 61 64 28 70 2d 3e  ptureWalRead(p->
1c980 70 52 62 75 2c 20 69 4f 66 73 74 2c 20 69 41 6d  pRbu, iOfst, iAm
1c990 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
1c9a0 20 69 66 28 20 70 52 62 75 20 26 26 20 70 52 62   if( pRbu && pRb
1c9b0 75 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53  u->eStage==RBU_S
1c9c0 54 41 47 45 5f 4f 41 4c 20 0a 20 20 20 20 20 26  TAGE_OAL .     &
1c9d0 26 20 28 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20  & (p->openFlags 
1c9e0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  & SQLITE_OPEN_WA
1c9f0 4c 29 20 0a 20 20 20 20 20 26 26 20 69 4f 66 73  L) .     && iOfs
1ca00 74 3e 3d 70 52 62 75 2d 3e 69 4f 61 6c 53 7a 20  t>=pRbu->iOalSz 
1ca10 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63  .    ){.      rc
1ca20 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1ca30 20 20 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c      memset(zBuf,
1ca40 20 30 2c 20 69 41 6d 74 29 3b 0a 20 20 20 20 7d   0, iAmt);.    }
1ca50 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1ca60 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68   p->pReal->pMeth
1ca70 6f 64 73 2d 3e 78 52 65 61 64 28 70 2d 3e 70 52  ods->xRead(p->pR
1ca80 65 61 6c 2c 20 7a 42 75 66 2c 20 69 41 6d 74 2c  eal, zBuf, iAmt,
1ca90 20 69 4f 66 73 74 29 3b 0a 20 20 20 20 7d 0a 20   iOfst);.    }. 
1caa0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1cab0 45 5f 4f 4b 20 26 26 20 69 4f 66 73 74 3d 3d 30  E_OK && iOfst==0
1cac0 20 26 26 20 28 70 2d 3e 6f 70 65 6e 46 6c 61 67   && (p->openFlag
1cad0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
1cae0 4d 41 49 4e 5f 44 42 29 20 29 7b 0a 20 20 20 20  MAIN_DB) ){.    
1caf0 20 20 2f 2a 20 54 68 65 73 65 20 6c 6f 6f 6b 20    /* These look 
1cb00 6c 69 6b 65 20 6d 61 67 69 63 20 6e 75 6d 62 65  like magic numbe
1cb10 72 73 2e 20 42 75 74 20 74 68 65 79 20 61 72 65  rs. But they are
1cb20 20 73 74 61 62 6c 65 2c 20 61 73 20 74 68 65 79   stable, as they
1cb30 20 61 72 65 20 70 61 72 74 0a 20 20 20 20 20 20   are part.      
1cb40 20 2a 2a 20 6f 66 20 74 68 65 20 64 65 66 69 6e   ** of the defin
1cb50 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c  ition of the SQL
1cb60 69 74 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2c  ite file format,
1cb70 20 77 68 69 63 68 20 6d 61 79 20 6e 6f 74 20 63   which may not c
1cb80 68 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20  hange. */.      
1cb90 75 38 20 2a 70 42 75 66 20 3d 20 28 75 38 2a 29  u8 *pBuf = (u8*)
1cba0 7a 42 75 66 3b 0a 20 20 20 20 20 20 70 2d 3e 69  zBuf;.      p->i
1cbb0 43 6f 6f 6b 69 65 20 3d 20 72 62 75 47 65 74 55  Cookie = rbuGetU
1cbc0 33 32 28 26 70 42 75 66 5b 32 34 5d 29 3b 0a 20  32(&pBuf[24]);. 
1cbd0 20 20 20 20 20 70 2d 3e 69 57 72 69 74 65 56 65       p->iWriteVe
1cbe0 72 20 3d 20 70 42 75 66 5b 31 39 5d 3b 0a 20 20  r = pBuf[19];.  
1cbf0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1cc00 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72   rc;.}../*.** Wr
1cc10 69 74 65 20 64 61 74 61 20 74 6f 20 61 6e 20 72  ite data to an r
1cc20 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73  buVfs-file..*/.s
1cc30 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66 73  tatic int rbuVfs
1cc40 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65 33  Write(.  sqlite3
1cc50 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 0a 20  _file *pFile, . 
1cc60 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75   const void *zBu
1cc70 66 2c 20 0a 20 20 69 6e 74 20 69 41 6d 74 2c 20  f, .  int iAmt, 
1cc80 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  .  sqlite_int64 
1cc90 69 4f 66 73 74 0a 29 7b 0a 20 20 72 62 75 5f 66  iOfst.){.  rbu_f
1cca0 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69  ile *p = (rbu_fi
1ccb0 6c 65 2a 29 70 46 69 6c 65 3b 0a 20 20 73 71 6c  le*)pFile;.  sql
1ccc0 69 74 65 33 72 62 75 20 2a 70 52 62 75 20 3d 20  ite3rbu *pRbu = 
1ccd0 70 2d 3e 70 52 62 75 3b 0a 20 20 69 6e 74 20 72  p->pRbu;.  int r
1cce0 63 3b 0a 0a 20 20 69 66 28 20 70 52 62 75 20 26  c;..  if( pRbu &
1ccf0 26 20 70 52 62 75 2d 3e 65 53 74 61 67 65 3d 3d  & pRbu->eStage==
1cd00 52 42 55 5f 53 54 41 47 45 5f 43 41 50 54 55 52  RBU_STAGE_CAPTUR
1cd10 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  E ){.    assert(
1cd20 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20   p->openFlags & 
1cd30 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
1cd40 5f 44 42 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  _DB );.    rc = 
1cd50 72 62 75 43 61 70 74 75 72 65 44 62 57 72 69 74  rbuCaptureDbWrit
1cd60 65 28 70 2d 3e 70 52 62 75 2c 20 69 4f 66 73 74  e(p->pRbu, iOfst
1cd70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1cd80 69 66 28 20 70 52 62 75 20 26 26 20 70 52 62 75  if( pRbu && pRbu
1cd90 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  ->eStage==RBU_ST
1cda0 41 47 45 5f 4f 41 4c 20 0a 20 20 20 20 20 26 26  AGE_OAL .     &&
1cdb0 20 28 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26   (p->openFlags &
1cdc0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c   SQLITE_OPEN_WAL
1cdd0 29 20 0a 20 20 20 20 20 26 26 20 69 4f 66 73 74  ) .     && iOfst
1cde0 3e 3d 70 52 62 75 2d 3e 69 4f 61 6c 53 7a 0a 20  >=pRbu->iOalSz. 
1cdf0 20 20 20 29 7b 0a 20 20 20 20 20 20 70 52 62 75     ){.      pRbu
1ce00 2d 3e 69 4f 61 6c 53 7a 20 3d 20 69 41 6d 74 20  ->iOalSz = iAmt 
1ce10 2b 20 69 4f 66 73 74 3b 0a 20 20 20 20 7d 0a 20  + iOfst;.    }. 
1ce20 20 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c     rc = p->pReal
1ce30 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 57 72 69  ->pMethods->xWri
1ce40 74 65 28 70 2d 3e 70 52 65 61 6c 2c 20 7a 42 75  te(p->pReal, zBu
1ce50 66 2c 20 69 41 6d 74 2c 20 69 4f 66 73 74 29 3b  f, iAmt, iOfst);
1ce60 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1ce70 49 54 45 5f 4f 4b 20 26 26 20 69 4f 66 73 74 3d  ITE_OK && iOfst=
1ce80 3d 30 20 26 26 20 28 70 2d 3e 6f 70 65 6e 46 6c  =0 && (p->openFl
1ce90 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
1cea0 4e 5f 4d 41 49 4e 5f 44 42 29 20 29 7b 0a 20 20  N_MAIN_DB) ){.  
1ceb0 20 20 20 20 2f 2a 20 54 68 65 73 65 20 6c 6f 6f      /* These loo
1cec0 6b 20 6c 69 6b 65 20 6d 61 67 69 63 20 6e 75 6d  k like magic num
1ced0 62 65 72 73 2e 20 42 75 74 20 74 68 65 79 20 61  bers. But they a
1cee0 72 65 20 73 74 61 62 6c 65 2c 20 61 73 20 74 68  re stable, as th
1cef0 65 79 20 61 72 65 20 70 61 72 74 0a 20 20 20 20  ey are part.    
1cf00 20 20 2a 2a 20 6f 66 20 74 68 65 20 64 65 66 69    ** of the defi
1cf10 6e 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 53 51  nition of the SQ
1cf20 4c 69 74 65 20 66 69 6c 65 20 66 6f 72 6d 61 74  Lite file format
1cf30 2c 20 77 68 69 63 68 20 6d 61 79 20 6e 6f 74 20  , which may not 
1cf40 63 68 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 20  change. */.     
1cf50 20 75 38 20 2a 70 42 75 66 20 3d 20 28 75 38 2a   u8 *pBuf = (u8*
1cf60 29 7a 42 75 66 3b 0a 20 20 20 20 20 20 70 2d 3e  )zBuf;.      p->
1cf70 69 43 6f 6f 6b 69 65 20 3d 20 72 62 75 47 65 74  iCookie = rbuGet
1cf80 55 33 32 28 26 70 42 75 66 5b 32 34 5d 29 3b 0a  U32(&pBuf[24]);.
1cf90 20 20 20 20 20 20 70 2d 3e 69 57 72 69 74 65 56        p->iWriteV
1cfa0 65 72 20 3d 20 70 42 75 66 5b 31 39 5d 3b 0a 20  er = pBuf[19];. 
1cfb0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1cfc0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1cfd0 72 75 6e 63 61 74 65 20 61 6e 20 72 62 75 56 66  runcate an rbuVf
1cfe0 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  s-file..*/.stati
1cff0 63 20 69 6e 74 20 72 62 75 56 66 73 54 72 75 6e  c int rbuVfsTrun
1d000 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  cate(sqlite3_fil
1d010 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74 65  e *pFile, sqlite
1d020 5f 69 6e 74 36 34 20 73 69 7a 65 29 7b 0a 20 20  _int64 size){.  
1d030 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72  rbu_file *p = (r
1d040 62 75 5f 66 69 6c 65 2a 29 70 46 69 6c 65 3b 0a  bu_file*)pFile;.
1d050 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 52 65 61    return p->pRea
1d060 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 54 72  l->pMethods->xTr
1d070 75 6e 63 61 74 65 28 70 2d 3e 70 52 65 61 6c 2c  uncate(p->pReal,
1d080 20 73 69 7a 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   size);.}../*.**
1d090 20 53 79 6e 63 20 61 6e 20 72 62 75 56 66 73 2d   Sync an rbuVfs-
1d0a0 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
1d0b0 69 6e 74 20 72 62 75 56 66 73 53 79 6e 63 28 73  int rbuVfsSync(s
1d0c0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
1d0d0 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  le, int flags){.
1d0e0 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20    rbu_file *p = 
1d0f0 28 72 62 75 5f 66 69 6c 65 20 2a 29 70 46 69 6c  (rbu_file *)pFil
1d100 65 3b 0a 20 20 69 66 28 20 70 2d 3e 70 52 62 75  e;.  if( p->pRbu
1d110 20 26 26 20 70 2d 3e 70 52 62 75 2d 3e 65 53 74   && p->pRbu->eSt
1d120 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 43  age==RBU_STAGE_C
1d130 41 50 54 55 52 45 20 29 7b 0a 20 20 20 20 69 66  APTURE ){.    if
1d140 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26  ( p->openFlags &
1d150 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
1d160 4e 5f 44 42 20 29 7b 0a 20 20 20 20 20 20 72 65  N_DB ){.      re
1d170 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4e 54 45  turn SQLITE_INTE
1d180 52 4e 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RNAL;.    }.    
1d190 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1d1a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
1d1b0 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
1d1c0 73 2d 3e 78 53 79 6e 63 28 70 2d 3e 70 52 65 61  s->xSync(p->pRea
1d1d0 6c 2c 20 66 6c 61 67 73 29 3b 0a 7d 0a 0a 2f 2a  l, flags);.}../*
1d1e0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
1d1f0 75 72 72 65 6e 74 20 66 69 6c 65 2d 73 69 7a 65  urrent file-size
1d200 20 6f 66 20 61 6e 20 72 62 75 56 66 73 2d 66 69   of an rbuVfs-fi
1d210 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1d220 74 20 72 62 75 56 66 73 46 69 6c 65 53 69 7a 65  t rbuVfsFileSize
1d230 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
1d240 46 69 6c 65 2c 20 73 71 6c 69 74 65 5f 69 6e 74  File, sqlite_int
1d250 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 72 62  64 *pSize){.  rb
1d260 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75  u_file *p = (rbu
1d270 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20  _file *)pFile;. 
1d280 20 72 65 74 75 72 6e 20 70 2d 3e 70 52 65 61 6c   return p->pReal
1d290 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 46 69 6c  ->pMethods->xFil
1d2a0 65 53 69 7a 65 28 70 2d 3e 70 52 65 61 6c 2c 20  eSize(p->pReal, 
1d2b0 70 53 69 7a 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pSize);.}../*.**
1d2c0 20 4c 6f 63 6b 20 61 6e 20 72 62 75 56 66 73 2d   Lock an rbuVfs-
1d2d0 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
1d2e0 69 6e 74 20 72 62 75 56 66 73 4c 6f 63 6b 28 73  int rbuVfsLock(s
1d2f0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
1d300 6c 65 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a  le, int eLock){.
1d310 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20    rbu_file *p = 
1d320 28 72 62 75 5f 66 69 6c 65 2a 29 70 46 69 6c 65  (rbu_file*)pFile
1d330 3b 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a  ;.  sqlite3rbu *
1d340 70 52 62 75 20 3d 20 70 2d 3e 70 52 62 75 3b 0a  pRbu = p->pRbu;.
1d350 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1d360 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
1d370 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20   p->openFlags & 
1d380 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  (SQLITE_OPEN_MAI
1d390 4e 5f 44 42 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  N_DB|SQLITE_OPEN
1d3a0 5f 54 45 4d 50 5f 44 42 29 20 29 3b 0a 20 20 69  _TEMP_DB) );.  i
1d3b0 66 28 20 70 52 62 75 20 26 26 20 65 4c 6f 63 6b  f( pRbu && eLock
1d3c0 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 45 58  ==SQLITE_LOCK_EX
1d3d0 43 4c 55 53 49 56 45 20 26 26 20 70 52 62 75 2d  CLUSIVE && pRbu-
1d3e0 3e 65 53 74 61 67 65 21 3d 52 42 55 5f 53 54 41  >eStage!=RBU_STA
1d3f0 47 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 2f  GE_DONE ){.    /
1d400 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 45  * Do not allow E
1d410 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20  XCLUSIVE locks. 
1d420 50 72 65 76 65 6e 74 69 6e 67 20 53 51 4c 69 74  Preventing SQLit
1d430 65 20 66 72 6f 6d 20 74 61 6b 69 6e 67 20 74 68  e from taking th
1d440 69 73 20 0a 20 20 20 20 2a 2a 20 70 72 65 76 65  is .    ** preve
1d450 6e 74 73 20 69 74 20 66 72 6f 6d 20 63 68 65 63  nts it from chec
1d460 6b 70 6f 69 6e 74 69 6e 67 20 74 68 65 20 64 61  kpointing the da
1d470 74 61 62 61 73 65 20 66 72 6f 6d 20 73 71 6c 69  tabase from sqli
1d480 74 65 33 5f 63 6c 6f 73 65 28 29 2e 20 2a 2f 0a  te3_close(). */.
1d490 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1d4a0 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BUSY;.  }else{. 
1d4b0 20 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c     rc = p->pReal
1d4c0 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 4c 6f 63  ->pMethods->xLoc
1d4d0 6b 28 70 2d 3e 70 52 65 61 6c 2c 20 65 4c 6f 63  k(p->pReal, eLoc
1d4e0 6b 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  k);.  }..  retur
1d4f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  n rc;.}../*.** U
1d500 6e 6c 6f 63 6b 20 61 6e 20 72 62 75 56 66 73 2d  nlock an rbuVfs-
1d510 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
1d520 69 6e 74 20 72 62 75 56 66 73 55 6e 6c 6f 63 6b  int rbuVfsUnlock
1d530 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
1d540 46 69 6c 65 2c 20 69 6e 74 20 65 4c 6f 63 6b 29  File, int eLock)
1d550 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20  {.  rbu_file *p 
1d560 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a 29 70 46  = (rbu_file *)pF
1d570 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  ile;.  return p-
1d580 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73  >pReal->pMethods
1d590 2d 3e 78 55 6e 6c 6f 63 6b 28 70 2d 3e 70 52 65  ->xUnlock(p->pRe
1d5a0 61 6c 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f  al, eLock);.}../
1d5b0 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 61 6e  *.** Check if an
1d5c0 6f 74 68 65 72 20 66 69 6c 65 2d 68 61 6e 64 6c  other file-handl
1d5d0 65 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56  e holds a RESERV
1d5e0 45 44 20 6c 6f 63 6b 20 6f 6e 20 61 6e 20 72 62  ED lock on an rb
1d5f0 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74  uVfs-file..*/.st
1d600 61 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 43  atic int rbuVfsC
1d610 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
1d620 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
1d630 46 69 6c 65 2c 20 69 6e 74 20 2a 70 52 65 73 4f  File, int *pResO
1d640 75 74 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20  ut){.  rbu_file 
1d650 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a  *p = (rbu_file *
1d660 29 70 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e  )pFile;.  return
1d670 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68   p->pReal->pMeth
1d680 6f 64 73 2d 3e 78 43 68 65 63 6b 52 65 73 65 72  ods->xCheckReser
1d690 76 65 64 4c 6f 63 6b 28 70 2d 3e 70 52 65 61 6c  vedLock(p->pReal
1d6a0 2c 20 70 52 65 73 4f 75 74 29 3b 0a 7d 0a 0a 2f  , pResOut);.}../
1d6b0 2a 0a 2a 2a 20 46 69 6c 65 20 63 6f 6e 74 72 6f  *.** File contro
1d6c0 6c 20 6d 65 74 68 6f 64 2e 20 46 6f 72 20 63 75  l method. For cu
1d6d0 73 74 6f 6d 20 6f 70 65 72 61 74 69 6f 6e 73 20  stom operations 
1d6e0 6f 6e 20 61 6e 20 72 62 75 56 66 73 2d 66 69 6c  on an rbuVfs-fil
1d6f0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1d700 20 72 62 75 56 66 73 46 69 6c 65 43 6f 6e 74 72   rbuVfsFileContr
1d710 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ol(sqlite3_file 
1d720 2a 70 46 69 6c 65 2c 20 69 6e 74 20 6f 70 2c 20  *pFile, int op, 
1d730 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 72  void *pArg){.  r
1d740 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62  bu_file *p = (rb
1d750 75 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a  u_file *)pFile;.
1d760 20 20 69 6e 74 20 28 2a 78 43 6f 6e 74 72 6f 6c    int (*xControl
1d770 29 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  )(sqlite3_file*,
1d780 69 6e 74 2c 76 6f 69 64 2a 29 20 3d 20 70 2d 3e  int,void*) = p->
1d790 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d  pReal->pMethods-
1d7a0 3e 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 3b 0a 20  >xFileControl;. 
1d7b0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1d7c0 72 74 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73  rt( p->openFlags
1d7d0 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   & (SQLITE_OPEN_
1d7e0 4d 41 49 4e 5f 44 42 7c 53 51 4c 49 54 45 5f 4f  MAIN_DB|SQLITE_O
1d7f0 50 45 4e 5f 54 45 4d 50 5f 44 42 29 0a 20 20 20  PEN_TEMP_DB).   
1d800 20 20 20 20 7c 7c 20 70 2d 3e 6f 70 65 6e 46 6c      || p->openFl
1d810 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50  ags & (SQLITE_OP
1d820 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 7c  EN_TRANSIENT_DB|
1d830 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
1d840 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 29 3b 0a 20  _JOURNAL).  );. 
1d850 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f   if( op==SQLITE_
1d860 46 43 4e 54 4c 5f 52 42 55 20 29 7b 0a 20 20 20  FCNTL_RBU ){.   
1d870 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 52 62   sqlite3rbu *pRb
1d880 75 20 3d 20 28 73 71 6c 69 74 65 33 72 62 75 2a  u = (sqlite3rbu*
1d890 29 70 41 72 67 3b 0a 0a 20 20 20 20 2f 2a 20 46  )pArg;..    /* F
1d8a0 69 72 73 74 20 74 72 79 20 74 6f 20 66 69 6e 64  irst try to find
1d8b0 20 61 6e 6f 74 68 65 72 20 52 42 55 20 76 66 73   another RBU vfs
1d8c0 20 6c 6f 77 65 72 20 64 6f 77 6e 20 69 6e 20 74   lower down in t
1d8d0 68 65 20 76 66 73 20 73 74 61 63 6b 2e 20 49 66  he vfs stack. If
1d8e0 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 69 73 20 66  .    ** one is f
1d8f0 6f 75 6e 64 2c 20 74 68 69 73 20 76 66 73 20 77  ound, this vfs w
1d900 69 6c 6c 20 6f 70 65 72 61 74 65 20 69 6e 20 70  ill operate in p
1d910 61 73 73 2d 74 68 72 6f 75 67 68 20 6d 6f 64 65  ass-through mode
1d920 2e 20 54 68 65 20 6c 6f 77 65 72 0a 20 20 20 20  . The lower.    
1d930 2a 2a 20 6c 65 76 65 6c 20 76 66 73 20 77 69 6c  ** level vfs wil
1d940 6c 20 64 6f 20 74 68 65 20 73 70 65 63 69 61 6c  l do the special
1d950 20 52 42 55 20 68 61 6e 64 6c 69 6e 67 2e 20 20   RBU handling.  
1d960 2a 2f 0a 20 20 20 20 72 63 20 3d 20 78 43 6f 6e  */.    rc = xCon
1d970 74 72 6f 6c 28 70 2d 3e 70 52 65 61 6c 2c 20 6f  trol(p->pReal, o
1d980 70 2c 20 70 41 72 67 29 3b 0a 0a 20 20 20 20 69  p, pArg);..    i
1d990 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
1d9a0 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20  TFOUND ){.      
1d9b0 2f 2a 20 4e 6f 77 20 73 65 61 72 63 68 20 66 6f  /* Now search fo
1d9c0 72 20 61 20 7a 69 70 76 66 73 20 69 6e 73 74 61  r a zipvfs insta
1d9d0 6e 63 65 20 6c 6f 77 65 72 20 64 6f 77 6e 20 69  nce lower down i
1d9e0 6e 20 74 68 65 20 56 46 53 20 73 74 61 63 6b 2e  n the VFS stack.
1d9f0 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 65   If.      ** one
1da00 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 69 73 20   is found, this 
1da10 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 2f  is an error.  */
1da20 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 64 75 6d  .      void *dum
1da30 6d 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  my = 0;.      rc
1da40 20 3d 20 78 43 6f 6e 74 72 6f 6c 28 70 2d 3e 70   = xControl(p->p
1da50 52 65 61 6c 2c 20 53 51 4c 49 54 45 5f 46 43 4e  Real, SQLITE_FCN
1da60 54 4c 5f 5a 49 50 56 46 53 2c 20 26 64 75 6d 6d  TL_ZIPVFS, &dumm
1da70 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  y);.      if( rc
1da80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1da90 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1daa0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
1dab0 20 20 70 52 62 75 2d 3e 7a 45 72 72 6d 73 67 20    pRbu->zErrmsg 
1dac0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
1dad0 66 28 22 72 62 75 2f 7a 69 70 76 66 73 20 73 65  f("rbu/zipvfs se
1dae0 74 75 70 20 65 72 72 6f 72 22 29 3b 0a 20 20 20  tup error");.   
1daf0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
1db00 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  =SQLITE_NOTFOUND
1db10 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52 62 75   ){.        pRbu
1db20 2d 3e 70 54 61 72 67 65 74 46 64 20 3d 20 70 3b  ->pTargetFd = p;
1db30 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 52 62 75  .        p->pRbu
1db40 20 3d 20 70 52 62 75 3b 0a 20 20 20 20 20 20 20   = pRbu;.       
1db50 20 69 66 28 20 70 2d 3e 70 57 61 6c 46 64 20 29   if( p->pWalFd )
1db60 20 70 2d 3e 70 57 61 6c 46 64 2d 3e 70 52 62 75   p->pWalFd->pRbu
1db70 20 3d 20 70 52 62 75 3b 0a 20 20 20 20 20 20 20   = pRbu;.       
1db80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1db90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1dba0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1dbb0 7d 0a 0a 20 20 72 63 20 3d 20 78 43 6f 6e 74 72  }..  rc = xContr
1dbc0 6f 6c 28 70 2d 3e 70 52 65 61 6c 2c 20 6f 70 2c  ol(p->pReal, op,
1dbd0 20 70 41 72 67 29 3b 0a 20 20 69 66 28 20 72 63   pArg);.  if( rc
1dbe0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6f  ==SQLITE_OK && o
1dbf0 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  p==SQLITE_FCNTL_
1dc00 56 46 53 4e 41 4d 45 20 29 7b 0a 20 20 20 20 72  VFSNAME ){.    r
1dc10 62 75 5f 76 66 73 20 2a 70 52 62 75 56 66 73 20  bu_vfs *pRbuVfs 
1dc20 3d 20 70 2d 3e 70 52 62 75 56 66 73 3b 0a 20 20  = p->pRbuVfs;.  
1dc30 20 20 63 68 61 72 20 2a 7a 49 6e 20 3d 20 2a 28    char *zIn = *(
1dc40 63 68 61 72 2a 2a 29 70 41 72 67 3b 0a 20 20 20  char**)pArg;.   
1dc50 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71   char *zOut = sq
1dc60 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 72  lite3_mprintf("r
1dc70 62 75 28 25 73 29 2f 25 7a 22 2c 20 70 52 62 75  bu(%s)/%z", pRbu
1dc80 56 66 73 2d 3e 62 61 73 65 2e 7a 4e 61 6d 65 2c  Vfs->base.zName,
1dc90 20 7a 49 6e 29 3b 0a 20 20 20 20 2a 28 63 68 61   zIn);.    *(cha
1dca0 72 2a 2a 29 70 41 72 67 20 3d 20 7a 4f 75 74 3b  r**)pArg = zOut;
1dcb0 0a 20 20 20 20 69 66 28 20 7a 4f 75 74 3d 3d 30  .    if( zOut==0
1dcc0 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e   ) rc = SQLITE_N
1dcd0 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  OMEM;.  }..  ret
1dce0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1dcf0 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 63 74   Return the sect
1dd00 6f 72 2d 73 69 7a 65 20 69 6e 20 62 79 74 65 73  or-size in bytes
1dd10 20 66 6f 72 20 61 6e 20 72 62 75 56 66 73 2d 66   for an rbuVfs-f
1dd20 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
1dd30 6e 74 20 72 62 75 56 66 73 53 65 63 74 6f 72 53  nt rbuVfsSectorS
1dd40 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
1dd50 20 2a 70 46 69 6c 65 29 7b 0a 20 20 72 62 75 5f   *pFile){.  rbu_
1dd60 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66  file *p = (rbu_f
1dd70 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 72  ile *)pFile;.  r
1dd80 65 74 75 72 6e 20 70 2d 3e 70 52 65 61 6c 2d 3e  eturn p->pReal->
1dd90 70 4d 65 74 68 6f 64 73 2d 3e 78 53 65 63 74 6f  pMethods->xSecto
1dda0 72 53 69 7a 65 28 70 2d 3e 70 52 65 61 6c 29 3b  rSize(p->pReal);
1ddb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1ddc0 20 74 68 65 20 64 65 76 69 63 65 20 63 68 61 72   the device char
1ddd0 61 63 74 65 72 69 73 74 69 63 20 66 6c 61 67 73  acteristic flags
1dde0 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 61 6e   supported by an
1ddf0 20 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f   rbuVfs-file..*/
1de00 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56  .static int rbuV
1de10 66 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  fsDeviceCharacte
1de20 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f  ristics(sqlite3_
1de30 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  file *pFile){.  
1de40 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72  rbu_file *p = (r
1de50 62 75 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b  bu_file *)pFile;
1de60 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 52 65  .  return p->pRe
1de70 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 44  al->pMethods->xD
1de80 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1de90 74 69 63 73 28 70 2d 3e 70 52 65 61 6c 29 3b 0a  tics(p->pReal);.
1dea0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 61 6b 65 20 6f 72  }../*.** Take or
1deb0 20 72 65 6c 65 61 73 65 20 61 20 73 68 61 72 65   release a share
1dec0 64 2d 6d 65 6d 6f 72 79 20 6c 6f 63 6b 2e 0a 2a  d-memory lock..*
1ded0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75  /.static int rbu
1dee0 56 66 73 53 68 6d 4c 6f 63 6b 28 73 71 6c 69 74  VfsShmLock(sqlit
1def0 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
1df00 69 6e 74 20 6f 66 73 74 2c 20 69 6e 74 20 6e 2c  int ofst, int n,
1df10 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 72   int flags){.  r
1df20 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62  bu_file *p = (rb
1df30 75 5f 66 69 6c 65 2a 29 70 46 69 6c 65 3b 0a 20  u_file*)pFile;. 
1df40 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 52 62   sqlite3rbu *pRb
1df50 75 20 3d 20 70 2d 3e 70 52 62 75 3b 0a 20 20 69  u = p->pRbu;.  i
1df60 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1df70 4b 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  K;..#ifdef SQLIT
1df80 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a 20  E_AMALGAMATION. 
1df90 20 20 20 61 73 73 65 72 74 28 20 57 41 4c 5f 43     assert( WAL_C
1dfa0 4b 50 54 5f 4c 4f 43 4b 3d 3d 31 20 29 3b 0a 23  KPT_LOCK==1 );.#
1dfb0 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
1dfc0 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20   p->openFlags & 
1dfd0 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  (SQLITE_OPEN_MAI
1dfe0 4e 5f 44 42 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  N_DB|SQLITE_OPEN
1dff0 5f 54 45 4d 50 5f 44 42 29 20 29 3b 0a 20 20 69  _TEMP_DB) );.  i
1e000 66 28 20 70 52 62 75 20 26 26 20 28 70 52 62 75  f( pRbu && (pRbu
1e010 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  ->eStage==RBU_ST
1e020 41 47 45 5f 4f 41 4c 20 7c 7c 20 70 52 62 75 2d  AGE_OAL || pRbu-
1e030 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41  >eStage==RBU_STA
1e040 47 45 5f 4d 4f 56 45 29 20 29 7b 0a 20 20 20 20  GE_MOVE) ){.    
1e050 2f 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72 20  /* Magic number 
1e060 31 20 69 73 20 74 68 65 20 57 41 4c 5f 43 4b 50  1 is the WAL_CKP
1e070 54 5f 4c 4f 43 4b 20 6c 6f 63 6b 2e 20 50 72 65  T_LOCK lock. Pre
1e080 76 65 6e 74 69 6e 67 20 53 51 4c 69 74 65 20 66  venting SQLite f
1e090 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 61 6b 69 6e  rom.    ** takin
1e0a0 67 20 74 68 69 73 20 6c 6f 63 6b 20 61 6c 73 6f  g this lock also
1e0b0 20 70 72 65 76 65 6e 74 73 20 61 6e 79 20 63 68   prevents any ch
1e0c0 65 63 6b 70 6f 69 6e 74 73 20 66 72 6f 6d 20 6f  eckpoints from o
1e0d0 63 63 75 72 72 69 6e 67 2e 20 0a 20 20 20 20 2a  ccurring. .    *
1e0e0 2a 20 74 6f 64 6f 3a 20 72 65 61 6c 6c 79 2c 20  * todo: really, 
1e0f0 69 74 27 73 20 6e 6f 74 20 63 6c 65 61 72 20 77  it's not clear w
1e100 68 79 20 74 68 69 73 20 6d 69 67 68 74 20 6f 63  hy this might oc
1e110 63 75 72 2c 20 61 73 20 0a 20 20 20 20 2a 2a 20  cur, as .    ** 
1e120 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69  wal_autocheckpoi
1e130 6e 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20 74  nt ought to be t
1e140 75 72 6e 65 64 20 6f 66 66 2e 20 20 2a 2f 0a 20  urned off.  */. 
1e150 20 20 20 69 66 28 20 6f 66 73 74 3d 3d 57 41 4c     if( ofst==WAL
1e160 5f 4c 4f 43 4b 5f 43 4b 50 54 20 26 26 20 6e 3d  _LOCK_CKPT && n=
1e170 3d 31 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  =1 ) rc = SQLITE
1e180 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BUSY;.  }else{.
1e190 20 20 20 20 69 6e 74 20 62 43 61 70 74 75 72 65      int bCapture
1e1a0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 3d   = 0;.    if( n=
1e1b0 3d 31 20 26 26 20 28 66 6c 61 67 73 20 26 20 53  =1 && (flags & S
1e1c0 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53  QLITE_SHM_EXCLUS
1e1d0 49 56 45 29 0a 20 20 20 20 20 26 26 20 70 52 62  IVE).     && pRb
1e1e0 75 20 26 26 20 70 52 62 75 2d 3e 65 53 74 61 67  u && pRbu->eStag
1e1f0 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 43 41 50  e==RBU_STAGE_CAP
1e200 54 55 52 45 0a 20 20 20 20 20 26 26 20 28 6f 66  TURE.     && (of
1e210 73 74 3d 3d 57 41 4c 5f 4c 4f 43 4b 5f 57 52 49  st==WAL_LOCK_WRI
1e220 54 45 20 7c 7c 20 6f 66 73 74 3d 3d 57 41 4c 5f  TE || ofst==WAL_
1e230 4c 4f 43 4b 5f 43 4b 50 54 20 7c 7c 20 6f 66 73  LOCK_CKPT || ofs
1e240 74 3d 3d 57 41 4c 5f 4c 4f 43 4b 5f 52 45 41 44  t==WAL_LOCK_READ
1e250 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0).    ){.      
1e260 62 43 61 70 74 75 72 65 20 3d 20 31 3b 0a 20 20  bCapture = 1;.  
1e270 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 62 43 61    }..    if( bCa
1e280 70 74 75 72 65 3d 3d 30 20 7c 7c 20 30 3d 3d 28  pture==0 || 0==(
1e290 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
1e2a0 48 4d 5f 55 4e 4c 4f 43 4b 29 20 29 7b 0a 20 20  HM_UNLOCK) ){.  
1e2b0 20 20 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61      rc = p->pRea
1e2c0 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68  l->pMethods->xSh
1e2d0 6d 4c 6f 63 6b 28 70 2d 3e 70 52 65 61 6c 2c 20  mLock(p->pReal, 
1e2e0 6f 66 73 74 2c 20 6e 2c 20 66 6c 61 67 73 29 3b  ofst, n, flags);
1e2f0 0a 20 20 20 20 20 20 69 66 28 20 62 43 61 70 74  .      if( bCapt
1e300 75 72 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ure && rc==SQLIT
1e310 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1e320 70 52 62 75 2d 3e 6d 4c 6f 63 6b 20 7c 3d 20 28  pRbu->mLock |= (
1e330 31 20 3c 3c 20 6f 66 73 74 29 3b 0a 20 20 20 20  1 << ofst);.    
1e340 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
1e350 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1e360 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 70 6f  *.** Obtain a po
1e370 69 6e 74 65 72 20 74 6f 20 61 20 6d 61 70 70 69  inter to a mappi
1e380 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 33  ng of a single 3
1e390 32 4b 69 42 20 70 61 67 65 20 6f 66 20 74 68 65  2KiB page of the
1e3a0 20 2a 2d 73 68 6d 20 66 69 6c 65 2e 0a 2a 2f 0a   *-shm file..*/.
1e3b0 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66  static int rbuVf
1e3c0 73 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74  sShmMap(.  sqlit
1e3d0 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
1e3e0 0a 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20  .  int iRegion, 
1e3f0 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c  .  int szRegion,
1e400 20 0a 20 20 69 6e 74 20 69 73 57 72 69 74 65 2c   .  int isWrite,
1e410 20 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c   .  void volatil
1e420 65 20 2a 2a 70 70 0a 29 7b 0a 20 20 72 62 75 5f  e **pp.){.  rbu_
1e430 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66  file *p = (rbu_f
1e440 69 6c 65 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e  ile*)pFile;.  in
1e450 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1e460 3b 0a 20 20 69 6e 74 20 65 53 74 61 67 65 20 3d  ;.  int eStage =
1e470 20 28 70 2d 3e 70 52 62 75 20 3f 20 70 2d 3e 70   (p->pRbu ? p->p
1e480 52 62 75 2d 3e 65 53 74 61 67 65 20 3a 20 30 29  Rbu->eStage : 0)
1e490 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69  ;..  /* If not i
1e4a0 6e 20 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 2c  n RBU_STAGE_OAL,
1e4b0 20 61 6c 6c 6f 77 20 74 68 69 73 20 63 61 6c 6c   allow this call
1e4c0 20 74 6f 20 70 61 73 73 20 74 68 72 6f 75 67 68   to pass through
1e4d0 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 0a 20 20  . Or, if this.  
1e4e0 2a 2a 20 72 62 75 20 69 73 20 69 6e 20 74 68 65  ** rbu is in the
1e4f0 20 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 73   RBU_STAGE_OAL s
1e500 74 61 74 65 2c 20 75 73 65 20 68 65 61 70 20 6d  tate, use heap m
1e510 65 6d 6f 72 79 20 66 6f 72 20 2a 2d 73 68 6d 20  emory for *-shm 
1e520 73 70 61 63 65 20 0a 20 20 2a 2a 20 69 6e 73 74  space .  ** inst
1e530 65 61 64 20 6f 66 20 61 20 66 69 6c 65 20 6f 6e  ead of a file on
1e540 20 64 69 73 6b 2e 20 20 2a 2f 0a 20 20 61 73 73   disk.  */.  ass
1e550 65 72 74 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67  ert( p->openFlag
1e560 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s & (SQLITE_OPEN
1e570 5f 4d 41 49 4e 5f 44 42 7c 53 51 4c 49 54 45 5f  _MAIN_DB|SQLITE_
1e580 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 29 20 29 3b  OPEN_TEMP_DB) );
1e590 0a 20 20 69 66 28 20 65 53 74 61 67 65 3d 3d 52  .  if( eStage==R
1e5a0 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 7c 7c 20  BU_STAGE_OAL || 
1e5b0 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47  eStage==RBU_STAG
1e5c0 45 5f 4d 4f 56 45 20 29 7b 0a 20 20 20 20 69 66  E_MOVE ){.    if
1e5d0 28 20 69 52 65 67 69 6f 6e 3c 3d 70 2d 3e 6e 53  ( iRegion<=p->nS
1e5e0 68 6d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  hm ){.      int 
1e5f0 6e 42 79 74 65 20 3d 20 28 69 52 65 67 69 6f 6e  nByte = (iRegion
1e600 2b 31 29 20 2a 20 73 69 7a 65 6f 66 28 63 68 61  +1) * sizeof(cha
1e610 72 2a 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20  r*);.      char 
1e620 2a 2a 61 70 4e 65 77 20 3d 20 28 63 68 61 72 2a  **apNew = (char*
1e630 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  *)sqlite3_reallo
1e640 63 36 34 28 70 2d 3e 61 70 53 68 6d 2c 20 6e 42  c64(p->apShm, nB
1e650 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  yte);.      if( 
1e660 61 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20  apNew==0 ){.    
1e670 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1e680 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c  NOMEM;.      }el
1e690 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  se{.        mems
1e6a0 65 74 28 26 61 70 4e 65 77 5b 70 2d 3e 6e 53 68  et(&apNew[p->nSh
1e6b0 6d 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63 68  m], 0, sizeof(ch
1e6c0 61 72 2a 29 20 2a 20 28 31 20 2b 20 69 52 65 67  ar*) * (1 + iReg
1e6d0 69 6f 6e 20 2d 20 70 2d 3e 6e 53 68 6d 29 29 3b  ion - p->nShm));
1e6e0 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53 68  .        p->apSh
1e6f0 6d 20 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20 20  m = apNew;.     
1e700 20 20 20 70 2d 3e 6e 53 68 6d 20 3d 20 69 52 65     p->nShm = iRe
1e710 67 69 6f 6e 2b 31 3b 0a 20 20 20 20 20 20 7d 0a  gion+1;.      }.
1e720 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
1e730 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1e740 70 2d 3e 61 70 53 68 6d 5b 69 52 65 67 69 6f 6e  p->apShm[iRegion
1e750 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68  ]==0 ){.      ch
1e760 61 72 20 2a 70 4e 65 77 20 3d 20 28 63 68 61 72  ar *pNew = (char
1e770 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
1e780 36 34 28 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20  64(szRegion);.  
1e790 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
1e7a0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1e7b0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1e7c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e7d0 20 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20     memset(pNew, 
1e7e0 30 2c 20 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20  0, szRegion);.  
1e7f0 20 20 20 20 20 20 70 2d 3e 61 70 53 68 6d 5b 69        p->apShm[i
1e800 52 65 67 69 6f 6e 5d 20 3d 20 70 4e 65 77 3b 0a  Region] = pNew;.
1e810 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1e820 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1e830 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70  E_OK ){.      *p
1e840 70 20 3d 20 70 2d 3e 61 70 53 68 6d 5b 69 52 65  p = p->apShm[iRe
1e850 67 69 6f 6e 5d 3b 0a 20 20 20 20 7d 65 6c 73 65  gion];.    }else
1e860 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 30 3b  {.      *pp = 0;
1e870 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1e880 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
1e890 70 53 68 6d 3d 3d 30 20 29 3b 0a 20 20 20 20 72  pShm==0 );.    r
1e8a0 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d  c = p->pReal->pM
1e8b0 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4d 61 70 28  ethods->xShmMap(
1e8c0 70 2d 3e 70 52 65 61 6c 2c 20 69 52 65 67 69 6f  p->pReal, iRegio
1e8d0 6e 2c 20 73 7a 52 65 67 69 6f 6e 2c 20 69 73 57  n, szRegion, isW
1e8e0 72 69 74 65 2c 20 70 70 29 3b 0a 20 20 7d 0a 0a  rite, pp);.  }..
1e8f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1e900 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20 62 61 72  /*.** Memory bar
1e910 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rier..*/.static 
1e920 76 6f 69 64 20 72 62 75 56 66 73 53 68 6d 42 61  void rbuVfsShmBa
1e930 72 72 69 65 72 28 73 71 6c 69 74 65 33 5f 66 69  rrier(sqlite3_fi
1e940 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 72 62  le *pFile){.  rb
1e950 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75  u_file *p = (rbu
1e960 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20  _file *)pFile;. 
1e970 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68   p->pReal->pMeth
1e980 6f 64 73 2d 3e 78 53 68 6d 42 61 72 72 69 65 72  ods->xShmBarrier
1e990 28 70 2d 3e 70 52 65 61 6c 29 3b 0a 7d 0a 0a 2f  (p->pReal);.}../
1e9a0 2a 0a 2a 2a 20 54 68 65 20 78 53 68 6d 55 6e 6d  *.** The xShmUnm
1e9b0 61 70 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74  ap method..*/.st
1e9c0 61 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 53  atic int rbuVfsS
1e9d0 68 6d 55 6e 6d 61 70 28 73 71 6c 69 74 65 33 5f  hmUnmap(sqlite3_
1e9e0 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74  file *pFile, int
1e9f0 20 64 65 6c 46 6c 61 67 29 7b 0a 20 20 72 62 75   delFlag){.  rbu
1ea00 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f  _file *p = (rbu_
1ea10 66 69 6c 65 2a 29 70 46 69 6c 65 3b 0a 20 20 69  file*)pFile;.  i
1ea20 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1ea30 4b 3b 0a 20 20 69 6e 74 20 65 53 74 61 67 65 20  K;.  int eStage 
1ea40 3d 20 28 70 2d 3e 70 52 62 75 20 3f 20 70 2d 3e  = (p->pRbu ? p->
1ea50 70 52 62 75 2d 3e 65 53 74 61 67 65 20 3a 20 30  pRbu->eStage : 0
1ea60 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  );..  assert( p-
1ea70 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 28 53 51  >openFlags & (SQ
1ea80 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
1ea90 42 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  B|SQLITE_OPEN_TE
1eaa0 4d 50 5f 44 42 29 20 29 3b 0a 20 20 69 66 28 20  MP_DB) );.  if( 
1eab0 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47  eStage==RBU_STAG
1eac0 45 5f 4f 41 4c 20 7c 7c 20 65 53 74 61 67 65 3d  E_OAL || eStage=
1ead0 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 20  =RBU_STAGE_MOVE 
1eae0 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20  ){.    /* no-op 
1eaf0 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
1eb00 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 63  /* Release the c
1eb10 68 65 63 6b 70 6f 69 6e 74 65 72 20 61 6e 64 20  heckpointer and 
1eb20 77 72 69 74 65 72 20 6c 6f 63 6b 73 20 2a 2f 0a  writer locks */.
1eb30 20 20 20 20 72 62 75 55 6e 6c 6f 63 6b 53 68 6d      rbuUnlockShm
1eb40 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 2d  (p);.    rc = p-
1eb50 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73  >pReal->pMethods
1eb60 2d 3e 78 53 68 6d 55 6e 6d 61 70 28 70 2d 3e 70  ->xShmUnmap(p->p
1eb70 52 65 61 6c 2c 20 64 65 6c 46 6c 61 67 29 3b 0a  Real, delFlag);.
1eb80 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1eb90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
1eba0 74 68 61 74 20 7a 57 61 6c 20 70 6f 69 6e 74 73  that zWal points
1ebb0 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
1ebc0 74 61 69 6e 69 6e 67 20 61 20 77 61 6c 20 66 69  taining a wal fi
1ebd0 6c 65 20 6e 61 6d 65 20 70 61 73 73 65 64 20 74  le name passed t
1ebe0 6f 20 0a 2a 2a 20 65 69 74 68 65 72 20 74 68 65  o .** either the
1ebf0 20 78 4f 70 65 6e 28 29 20 6f 72 20 78 41 63 63   xOpen() or xAcc
1ec00 65 73 73 28 29 20 56 46 53 20 6d 65 74 68 6f 64  ess() VFS method
1ec10 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  , return a point
1ec20 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 66 69 6c  er to the.** fil
1ec30 65 2d 68 61 6e 64 6c 65 20 6f 70 65 6e 65 64 20  e-handle opened 
1ec40 62 79 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  by the same data
1ec50 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1ec60 6f 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  on the correspon
1ec70 64 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65  ding.** database
1ec80 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
1ec90 20 72 62 75 5f 66 69 6c 65 20 2a 72 62 75 46 69   rbu_file *rbuFi
1eca0 6e 64 4d 61 69 6e 64 62 28 72 62 75 5f 76 66 73  ndMaindb(rbu_vfs
1ecb0 20 2a 70 52 62 75 56 66 73 2c 20 63 6f 6e 73 74   *pRbuVfs, const
1ecc0 20 63 68 61 72 20 2a 7a 57 61 6c 29 7b 0a 20 20   char *zWal){.  
1ecd0 72 62 75 5f 66 69 6c 65 20 2a 70 44 62 3b 0a 20  rbu_file *pDb;. 
1ece0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1ecf0 6e 74 65 72 28 70 52 62 75 56 66 73 2d 3e 6d 75  nter(pRbuVfs->mu
1ed00 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 44 62 3d  tex);.  for(pDb=
1ed10 70 52 62 75 56 66 73 2d 3e 70 4d 61 69 6e 3b 20  pRbuVfs->pMain; 
1ed20 70 44 62 20 26 26 20 70 44 62 2d 3e 7a 57 61 6c  pDb && pDb->zWal
1ed30 21 3d 7a 57 61 6c 3b 20 70 44 62 3d 70 44 62 2d  !=zWal; pDb=pDb-
1ed40 3e 70 4d 61 69 6e 4e 65 78 74 29 7b 7d 0a 20 20  >pMainNext){}.  
1ed50 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1ed60 61 76 65 28 70 52 62 75 56 66 73 2d 3e 6d 75 74  ave(pRbuVfs->mut
1ed70 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 44  ex);.  return pD
1ed80 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  b;.}../*.** Open
1ed90 20 61 6e 20 72 62 75 20 66 69 6c 65 20 68 61 6e   an rbu file han
1eda0 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  dle..*/.static i
1edb0 6e 74 20 72 62 75 56 66 73 4f 70 65 6e 28 0a 20  nt rbuVfsOpen(. 
1edc0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
1edd0 66 73 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  fs,.  const char
1ede0 20 2a 7a 4e 61 6d 65 2c 0a 20 20 73 71 6c 69 74   *zName,.  sqlit
1edf0 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 0a  e3_file *pFile,.
1ee00 20 20 69 6e 74 20 66 6c 61 67 73 2c 0a 20 20 69    int flags,.  i
1ee10 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 0a 29 7b  nt *pOutFlags.){
1ee20 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65  .  static sqlite
1ee30 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 72 62 75  3_io_methods rbu
1ee40 76 66 73 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 3d  vfs_io_methods =
1ee50 20 7b 0a 20 20 20 20 32 2c 20 20 20 20 20 20 20   {.    2,       
1ee60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee70 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
1ee80 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 43 6c   */.    rbuVfsCl
1ee90 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
1eea0 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
1eeb0 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 52 65 61  */.    rbuVfsRea
1eec0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
1eed0 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f       /* xRead */
1eee0 0a 20 20 20 20 72 62 75 56 66 73 57 72 69 74 65  .    rbuVfsWrite
1eef0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1ef00 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 0a     /* xWrite */.
1ef10 20 20 20 20 72 62 75 56 66 73 54 72 75 6e 63 61      rbuVfsTrunca
1ef20 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
1ef30 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a    /* xTruncate *
1ef40 2f 0a 20 20 20 20 72 62 75 56 66 73 53 79 6e 63  /.    rbuVfsSync
1ef50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1ef60 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a      /* xSync */.
1ef70 20 20 20 20 72 62 75 56 66 73 46 69 6c 65 53 69      rbuVfsFileSi
1ef80 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
1ef90 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a    /* xFileSize *
1efa0 2f 0a 20 20 20 20 72 62 75 56 66 73 4c 6f 63 6b  /.    rbuVfsLock
1efb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1efc0 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a      /* xLock */.
1efd0 20 20 20 20 72 62 75 56 66 73 55 6e 6c 6f 63 6b      rbuVfsUnlock
1efe0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1eff0 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a    /* xUnlock */.
1f000 20 20 20 20 72 62 75 56 66 73 43 68 65 63 6b 52      rbuVfsCheckR
1f010 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20  eservedLock,    
1f020 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
1f030 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20 20 20 72  vedLock */.    r
1f040 62 75 56 66 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  buVfsFileControl
1f050 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
1f060 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a  xFileControl */.
1f070 20 20 20 20 72 62 75 56 66 73 53 65 63 74 6f 72      rbuVfsSector
1f080 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
1f090 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65    /* xSectorSize
1f0a0 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 44 65   */.    rbuVfsDe
1f0b0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1f0c0 69 63 73 2c 20 20 2f 2a 20 78 44 65 76 69 63 65  ics,  /* xDevice
1f0d0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
1f0e0 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 53 68 6d  */.    rbuVfsShm
1f0f0 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  Map,            
1f100 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
1f110 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 53 68 6d  */.    rbuVfsShm
1f120 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
1f130 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b       /* xShmLock
1f140 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 53 68   */.    rbuVfsSh
1f150 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20 20 20  mBarrier,       
1f160 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72        /* xShmBar
1f170 72 69 65 72 20 2a 2f 0a 20 20 20 20 72 62 75 56  rier */.    rbuV
1f180 66 73 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20  fsShmUnmap,     
1f190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
1f1a0 6d 55 6e 6d 61 70 20 2a 2f 0a 20 20 20 20 30 2c  mUnmap */.    0,
1f1b0 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
1f1c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1f1d0 46 65 74 63 68 2c 20 78 55 6e 66 65 74 63 68 20  Fetch, xUnfetch 
1f1e0 2a 2f 0a 20 20 7d 3b 0a 20 20 72 62 75 5f 76 66  */.  };.  rbu_vf
1f1f0 73 20 2a 70 52 62 75 56 66 73 20 3d 20 28 72 62  s *pRbuVfs = (rb
1f200 75 5f 76 66 73 2a 29 70 56 66 73 3b 0a 20 20 73  u_vfs*)pVfs;.  s
1f210 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65 61  qlite3_vfs *pRea
1f220 6c 56 66 73 20 3d 20 70 52 62 75 56 66 73 2d 3e  lVfs = pRbuVfs->
1f230 70 52 65 61 6c 56 66 73 3b 0a 20 20 72 62 75 5f  pRealVfs;.  rbu_
1f240 66 69 6c 65 20 2a 70 46 64 20 3d 20 28 72 62 75  file *pFd = (rbu
1f250 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20  _file *)pFile;. 
1f260 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1f270 5f 4f 4b 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  _OK;.  const cha
1f280 72 20 2a 7a 4f 70 65 6e 20 3d 20 7a 4e 61 6d 65  r *zOpen = zName
1f290 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70 46 64 2c  ;..  memset(pFd,
1f2a0 20 30 2c 20 73 69 7a 65 6f 66 28 72 62 75 5f 66   0, sizeof(rbu_f
1f2b0 69 6c 65 29 29 3b 0a 20 20 70 46 64 2d 3e 70 52  ile));.  pFd->pR
1f2c0 65 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  eal = (sqlite3_f
1f2d0 69 6c 65 2a 29 26 70 46 64 5b 31 5d 3b 0a 20 20  ile*)&pFd[1];.  
1f2e0 70 46 64 2d 3e 70 52 62 75 56 66 73 20 3d 20 70  pFd->pRbuVfs = p
1f2f0 52 62 75 56 66 73 3b 0a 20 20 70 46 64 2d 3e 6f  RbuVfs;.  pFd->o
1f300 70 65 6e 46 6c 61 67 73 20 3d 20 66 6c 61 67 73  penFlags = flags
1f310 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b  ;.  if( zName ){
1f320 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26  .    if( flags &
1f330 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
1f340 4e 5f 44 42 20 29 7b 0a 20 20 20 20 20 20 2f 2a  N_DB ){.      /*
1f350 20 41 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65   A main database
1f360 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 6f   has just been o
1f370 70 65 6e 65 64 2e 20 54 68 65 20 66 6f 6c 6c 6f  pened. The follo
1f380 77 69 6e 67 20 62 6c 6f 63 6b 20 73 65 74 73 0a  wing block sets.
1f390 20 20 20 20 20 20 2a 2a 20 28 70 46 64 2d 3e 7a        ** (pFd->z
1f3a0 57 61 6c 29 20 74 6f 20 70 6f 69 6e 74 20 74 6f  Wal) to point to
1f3b0 20 61 20 62 75 66 66 65 72 20 6f 77 6e 65 64 20   a buffer owned 
1f3c0 62 79 20 53 51 4c 69 74 65 20 74 68 61 74 20 63  by SQLite that c
1f3d0 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a  ontains.      **
1f3e0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
1f3f0 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68 69 73   *-wal file this
1f400 20 64 62 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77   db connection w
1f410 69 6c 6c 20 75 73 65 2e 20 53 51 4c 69 74 65 0a  ill use. SQLite.
1f420 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65 6e 73        ** happens
1f430 20 74 6f 20 70 61 73 73 20 61 20 70 6f 69 6e 74   to pass a point
1f440 65 72 20 74 6f 20 74 68 69 73 20 62 75 66 66 65  er to this buffe
1f450 72 20 77 68 65 6e 20 75 73 69 6e 67 20 78 41 63  r when using xAc
1f460 63 65 73 73 28 29 0a 20 20 20 20 20 20 2a 2a 20  cess().      ** 
1f470 6f 72 20 78 4f 70 65 6e 28 29 20 74 6f 20 6f 70  or xOpen() to op
1f480 65 72 61 74 65 20 6f 6e 20 74 68 65 20 2a 2d 77  erate on the *-w
1f490 61 6c 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20  al file.  */.   
1f4a0 20 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29     int n = (int)
1f4b0 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20  strlen(zName);. 
1f4c0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1f4d0 2a 7a 20 3d 20 26 7a 4e 61 6d 65 5b 6e 5d 3b 0a  *z = &zName[n];.
1f4e0 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 73 20        if( flags 
1f4f0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  & SQLITE_OPEN_UR
1f500 49 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  I ){.        int
1f510 20 6f 64 64 20 3d 20 30 3b 0a 20 20 20 20 20 20   odd = 0;.      
1f520 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
1f530 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d          if( z[0]
1f540 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1f550 20 20 20 6f 64 64 20 3d 20 31 20 2d 20 6f 64 64     odd = 1 - odd
1f560 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
1f570 28 20 6f 64 64 20 26 26 20 7a 5b 31 5d 3d 3d 30  ( odd && z[1]==0
1f580 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
1f590 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1f5a0 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  z++;.        }. 
1f5b0 20 20 20 20 20 20 20 7a 20 2b 3d 20 32 3b 0a 20         z += 2;. 
1f5c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f5d0 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 3d 3d 30      while( *z==0
1f5e0 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a   ) z++;.      }.
1f5f0 20 20 20 20 20 20 7a 20 2b 3d 20 28 6e 20 2b 20        z += (n + 
1f600 38 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 70 46  8 + 1);.      pF
1f610 64 2d 3e 7a 57 61 6c 20 3d 20 7a 3b 0a 20 20 20  d->zWal = z;.   
1f620 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20   }.    else if( 
1f630 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
1f640 50 45 4e 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20  PEN_WAL ){.     
1f650 20 72 62 75 5f 66 69 6c 65 20 2a 70 44 62 20 3d   rbu_file *pDb =
1f660 20 72 62 75 46 69 6e 64 4d 61 69 6e 64 62 28 70   rbuFindMaindb(p
1f670 52 62 75 56 66 73 2c 20 7a 4e 61 6d 65 29 3b 0a  RbuVfs, zName);.
1f680 20 20 20 20 20 20 69 66 28 20 70 44 62 20 29 7b        if( pDb ){
1f690 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 44 62  .        if( pDb
1f6a0 2d 3e 70 52 62 75 20 26 26 20 70 44 62 2d 3e 70  ->pRbu && pDb->p
1f6b0 52 62 75 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55  Rbu->eStage==RBU
1f6c0 5f 53 54 41 47 45 5f 4f 41 4c 20 29 7b 0a 20 20  _STAGE_OAL ){.  
1f6d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
1f6e0 63 61 6c 6c 20 69 73 20 74 6f 20 6f 70 65 6e 20  call is to open 
1f6f0 61 20 2a 2d 77 61 6c 20 66 69 6c 65 2e 20 49 6e  a *-wal file. In
1f700 74 65 61 64 2c 20 6f 70 65 6e 20 74 68 65 20 2a  tead, open the *
1f710 2d 6f 61 6c 2e 20 54 68 69 73 0a 20 20 20 20 20  -oal. This.     
1f720 20 20 20 20 20 2a 2a 20 63 6f 64 65 20 65 6e 73       ** code ens
1f730 75 72 65 73 20 74 68 61 74 20 74 68 65 20 73 74  ures that the st
1f740 72 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20 78  ring passed to x
1f750 4f 70 65 6e 28 29 20 69 73 20 74 65 72 6d 69 6e  Open() is termin
1f760 61 74 65 64 20 62 79 20 61 0a 20 20 20 20 20 20  ated by a.      
1f770 20 20 20 20 2a 2a 20 70 61 69 72 20 6f 66 20 27      ** pair of '
1f780 5c 30 27 20 62 79 74 65 73 20 69 6e 20 63 61 73  \0' bytes in cas
1f790 65 20 74 68 65 20 56 46 53 20 61 74 74 65 6d 70  e the VFS attemp
1f7a0 74 73 20 74 6f 20 65 78 74 72 61 63 74 20 61 20  ts to extract a 
1f7b0 55 52 49 20 0a 20 20 20 20 20 20 20 20 20 20 2a  URI .          *
1f7c0 2a 20 70 61 72 61 6d 65 74 65 72 20 66 72 6f 6d  * parameter from
1f7d0 20 69 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20   it.  */.       
1f7e0 20 20 20 73 69 7a 65 5f 74 20 6e 43 6f 70 79 20     size_t nCopy 
1f7f0 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b  = strlen(zName);
1f800 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
1f810 2a 7a 43 6f 70 79 20 3d 20 73 71 6c 69 74 65 33  *zCopy = sqlite3
1f820 5f 6d 61 6c 6c 6f 63 36 34 28 6e 43 6f 70 79 2b  _malloc64(nCopy+
1f830 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  2);.          if
1f840 28 20 7a 43 6f 70 79 20 29 7b 0a 20 20 20 20 20  ( zCopy ){.     
1f850 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 43         memcpy(zC
1f860 6f 70 79 2c 20 7a 4e 61 6d 65 2c 20 6e 43 6f 70  opy, zName, nCop
1f870 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
1f880 7a 43 6f 70 79 5b 6e 43 6f 70 79 2d 33 5d 20 3d  zCopy[nCopy-3] =
1f890 20 27 6f 27 3b 0a 20 20 20 20 20 20 20 20 20 20   'o';.          
1f8a0 20 20 7a 43 6f 70 79 5b 6e 43 6f 70 79 5d 20 3d    zCopy[nCopy] =
1f8b0 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 20   '\0';.         
1f8c0 20 20 20 7a 43 6f 70 79 5b 6e 43 6f 70 79 2b 31     zCopy[nCopy+1
1f8d0 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20  ] = '\0';.      
1f8e0 20 20 20 20 20 20 7a 4f 70 65 6e 20 3d 20 28 63        zOpen = (c
1f8f0 6f 6e 73 74 20 63 68 61 72 2a 29 28 70 46 64 2d  onst char*)(pFd-
1f900 3e 7a 44 65 6c 20 3d 20 7a 43 6f 70 79 29 3b 0a  >zDel = zCopy);.
1f910 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1f920 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
1f930 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1f940 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1f950 20 20 20 20 20 20 70 46 64 2d 3e 70 52 62 75 20        pFd->pRbu 
1f960 3d 20 70 44 62 2d 3e 70 52 62 75 3b 0a 20 20 20  = pDb->pRbu;.   
1f970 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
1f980 44 62 2d 3e 70 57 61 6c 46 64 20 3d 20 70 46 64  Db->pWalFd = pFd
1f990 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f9a0 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
1f9b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f9c0 72 63 20 3d 20 70 52 65 61 6c 56 66 73 2d 3e 78  rc = pRealVfs->x
1f9d0 4f 70 65 6e 28 70 52 65 61 6c 56 66 73 2c 20 7a  Open(pRealVfs, z
1f9e0 4f 70 65 6e 2c 20 70 46 64 2d 3e 70 52 65 61 6c  Open, pFd->pReal
1f9f0 2c 20 66 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61  , flags, pOutFla
1fa00 67 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  gs);.  }.  if( p
1fa10 46 64 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68  Fd->pReal->pMeth
1fa20 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ods ){.    /* Th
1fa30 65 20 78 4f 70 65 6e 28 29 20 6f 70 65 72 61 74  e xOpen() operat
1fa40 69 6f 6e 20 68 61 73 20 73 75 63 63 65 65 64 65  ion has succeede
1fa50 64 2e 20 53 65 74 20 74 68 65 20 73 71 6c 69 74  d. Set the sqlit
1fa60 65 33 5f 66 69 6c 65 2e 70 4d 65 74 68 6f 64 73  e3_file.pMethods
1fa70 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20  .    ** pointer 
1fa80 61 6e 64 2c 20 69 66 20 74 68 65 20 66 69 6c 65  and, if the file
1fa90 20 69 73 20 61 20 6d 61 69 6e 20 64 61 74 61 62   is a main datab
1faa0 61 73 65 20 66 69 6c 65 2c 20 6c 69 6e 6b 20 69  ase file, link i
1fab0 74 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a  t into the.    *
1fac0 2a 20 6d 75 74 65 78 20 70 72 6f 74 65 63 74 65  * mutex protecte
1fad0 64 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  d linked list of
1fae0 20 61 6c 6c 20 73 75 63 68 20 66 69 6c 65 73 2e   all such files.
1faf0 20 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e    */.    pFile->
1fb00 70 4d 65 74 68 6f 64 73 20 3d 20 26 72 62 75 76  pMethods = &rbuv
1fb10 66 73 5f 69 6f 5f 6d 65 74 68 6f 64 73 3b 0a 20  fs_io_methods;. 
1fb20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53     if( flags & S
1fb30 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
1fb40 44 42 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  DB ){.      sqli
1fb50 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1fb60 70 52 62 75 56 66 73 2d 3e 6d 75 74 65 78 29 3b  pRbuVfs->mutex);
1fb70 0a 20 20 20 20 20 20 70 46 64 2d 3e 70 4d 61 69  .      pFd->pMai
1fb80 6e 4e 65 78 74 20 3d 20 70 52 62 75 56 66 73 2d  nNext = pRbuVfs-
1fb90 3e 70 4d 61 69 6e 3b 0a 20 20 20 20 20 20 70 52  >pMain;.      pR
1fba0 62 75 56 66 73 2d 3e 70 4d 61 69 6e 20 3d 20 70  buVfs->pMain = p
1fbb0 46 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  Fd;.      sqlite
1fbc0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 52  3_mutex_leave(pR
1fbd0 62 75 56 66 73 2d 3e 6d 75 74 65 78 29 3b 0a 20  buVfs->mutex);. 
1fbe0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1fbf0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1fc00 46 64 2d 3e 7a 44 65 6c 29 3b 0a 20 20 7d 0a 0a  Fd->zDel);.  }..
1fc10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1fc20 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
1fc30 20 66 69 6c 65 20 6c 6f 63 61 74 65 64 20 61 74   file located at
1fc40 20 7a 50 61 74 68 2e 0a 2a 2f 0a 73 74 61 74 69   zPath..*/.stati
1fc50 63 20 69 6e 74 20 72 62 75 56 66 73 44 65 6c 65  c int rbuVfsDele
1fc60 74 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  te(sqlite3_vfs *
1fc70 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72  pVfs, const char
1fc80 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 64 69 72   *zPath, int dir
1fc90 53 79 6e 63 29 7b 0a 20 20 73 71 6c 69 74 65 33  Sync){.  sqlite3
1fca0 5f 76 66 73 20 2a 70 52 65 61 6c 56 66 73 20 3d  _vfs *pRealVfs =
1fcb0 20 28 28 72 62 75 5f 76 66 73 2a 29 70 56 66 73   ((rbu_vfs*)pVfs
1fcc0 29 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20 72  )->pRealVfs;.  r
1fcd0 65 74 75 72 6e 20 70 52 65 61 6c 56 66 73 2d 3e  eturn pRealVfs->
1fce0 78 44 65 6c 65 74 65 28 70 52 65 61 6c 56 66 73  xDelete(pRealVfs
1fcf0 2c 20 7a 50 61 74 68 2c 20 64 69 72 53 79 6e 63  , zPath, dirSync
1fd00 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74  );.}../*.** Test
1fd10 20 66 6f 72 20 61 63 63 65 73 73 20 70 65 72 6d   for access perm
1fd20 69 73 73 69 6f 6e 73 2e 20 52 65 74 75 72 6e 20  issions. Return 
1fd30 74 72 75 65 20 69 66 20 74 68 65 20 72 65 71 75  true if the requ
1fd40 65 73 74 65 64 20 70 65 72 6d 69 73 73 69 6f 6e  ested permission
1fd50 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65  .** is available
1fd60 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72  , or false other
1fd70 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
1fd80 69 6e 74 20 72 62 75 56 66 73 41 63 63 65 73 73  int rbuVfsAccess
1fd90 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
1fda0 2a 70 56 66 73 2c 20 0a 20 20 63 6f 6e 73 74 20  *pVfs, .  const 
1fdb0 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 0a 20 20  char *zPath, .  
1fdc0 69 6e 74 20 66 6c 61 67 73 2c 20 0a 20 20 69 6e  int flags, .  in
1fdd0 74 20 2a 70 52 65 73 4f 75 74 0a 29 7b 0a 20 20  t *pResOut.){.  
1fde0 72 62 75 5f 76 66 73 20 2a 70 52 62 75 56 66 73  rbu_vfs *pRbuVfs
1fdf0 20 3d 20 28 72 62 75 5f 76 66 73 2a 29 70 56 66   = (rbu_vfs*)pVf
1fe00 73 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  s;.  sqlite3_vfs
1fe10 20 2a 70 52 65 61 6c 56 66 73 20 3d 20 70 52 62   *pRealVfs = pRb
1fe20 75 56 66 73 2d 3e 70 52 65 61 6c 56 66 73 3b 0a  uVfs->pRealVfs;.
1fe30 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20    int rc;..  rc 
1fe40 3d 20 70 52 65 61 6c 56 66 73 2d 3e 78 41 63 63  = pRealVfs->xAcc
1fe50 65 73 73 28 70 52 65 61 6c 56 66 73 2c 20 7a 50  ess(pRealVfs, zP
1fe60 61 74 68 2c 20 66 6c 61 67 73 2c 20 70 52 65 73  ath, flags, pRes
1fe70 4f 75 74 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Out);..  /* If t
1fe80 68 69 73 20 63 61 6c 6c 20 69 73 20 74 6f 20 63  his call is to c
1fe90 68 65 63 6b 20 69 66 20 61 20 2a 2d 77 61 6c 20  heck if a *-wal 
1fea0 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  file associated 
1feb0 77 69 74 68 20 61 6e 20 52 42 55 20 74 61 72 67  with an RBU targ
1fec0 65 74 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  et.  ** database
1fed0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 65 78 69 73   connection exis
1fee0 74 73 2c 20 61 6e 64 20 74 68 65 20 52 42 55 20  ts, and the RBU 
1fef0 75 70 64 61 74 65 20 69 73 20 69 6e 20 52 42 55  update is in RBU
1ff00 5f 53 54 41 47 45 5f 4f 41 4c 2c 0a 20 20 2a 2a  _STAGE_OAL,.  **
1ff10 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
1ff20 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 20  pecial handling 
1ff30 69 73 20 61 63 74 69 76 61 74 65 64 3a 0a 20 20  is activated:.  
1ff40 2a 2a 0a 20 20 2a 2a 20 20 20 61 29 20 69 66 20  **.  **   a) if 
1ff50 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64  the *-wal file d
1ff60 6f 65 73 20 65 78 69 73 74 2c 20 72 65 74 75 72  oes exist, retur
1ff70 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
1ff80 4e 2e 20 54 68 69 73 0a 20 20 2a 2a 20 20 20 20  N. This.  **    
1ff90 20 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74    ensures that t
1ffa0 68 65 20 52 42 55 20 65 78 74 65 6e 73 69 6f 6e  he RBU extension
1ffb0 20 6e 65 76 65 72 20 74 72 69 65 73 20 74 6f 20   never tries to 
1ffc0 75 70 64 61 74 65 20 61 20 64 61 74 61 62 61 73  update a databas
1ffd0 65 0a 20 20 2a 2a 20 20 20 20 20 20 69 6e 20 77  e.  **      in w
1ffe0 61 6c 20 6d 6f 64 65 2c 20 65 76 65 6e 20 69 66  al mode, even if
1fff0 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
20000 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
20010 66 69 6c 65 20 68 61 73 0a 20 20 2a 2a 20 20 20  file has.  **   
20020 20 20 20 62 65 65 6e 20 64 61 6d 61 67 65 64 2e     been damaged.
20030 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 62 29   .  **.  **   b)
20040 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69   if the *-wal fi
20050 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  le does not exis
20060 74 2c 20 63 6c 61 69 6d 20 74 68 61 74 20 69 74  t, claim that it
20070 20 64 6f 65 73 20 61 6e 79 77 61 79 2c 0a 20 20   does anyway,.  
20080 2a 2a 20 20 20 20 20 20 63 61 75 73 69 6e 67 20  **      causing 
20090 53 51 4c 69 74 65 20 74 6f 20 63 61 6c 6c 20 78  SQLite to call x
200a0 4f 70 65 6e 28 29 20 74 6f 20 6f 70 65 6e 20 69  Open() to open i
200b0 74 2e 20 54 68 69 73 20 63 61 6c 6c 20 77 69 6c  t. This call wil
200c0 6c 20 61 6c 73 6f 0a 20 20 2a 2a 20 20 20 20 20  l also.  **     
200d0 20 62 65 20 69 6e 74 65 72 63 65 70 74 65 64 20   be intercepted 
200e0 28 73 65 65 20 74 68 65 20 72 62 75 56 66 73 4f  (see the rbuVfsO
200f0 70 65 6e 28 29 20 66 75 6e 63 74 69 6f 6e 29 20  pen() function) 
20100 61 6e 64 20 74 68 65 20 2a 2d 6f 61 6c 0a 20 20  and the *-oal.  
20110 2a 2a 20 20 20 20 20 20 66 69 6c 65 20 6f 70 65  **      file ope
20120 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 20 20 2a  ned instead..  *
20130 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
20140 54 45 5f 4f 4b 20 26 26 20 66 6c 61 67 73 3d 3d  TE_OK && flags==
20150 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
20160 49 53 54 53 20 29 7b 0a 20 20 20 20 72 62 75 5f  ISTS ){.    rbu_
20170 66 69 6c 65 20 2a 70 44 62 20 3d 20 72 62 75 46  file *pDb = rbuF
20180 69 6e 64 4d 61 69 6e 64 62 28 70 52 62 75 56 66  indMaindb(pRbuVf
20190 73 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 69  s, zPath);.    i
201a0 66 28 20 70 44 62 20 26 26 20 70 44 62 2d 3e 70  f( pDb && pDb->p
201b0 52 62 75 20 26 26 20 70 44 62 2d 3e 70 52 62 75  Rbu && pDb->pRbu
201c0 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  ->eStage==RBU_ST
201d0 41 47 45 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 20  AGE_OAL ){.     
201e0 20 69 66 28 20 2a 70 52 65 73 4f 75 74 20 29 7b   if( *pResOut ){
201f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
20200 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20  LITE_CANTOPEN;. 
20210 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
20220 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 31      *pResOut = 1
20230 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
20240 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
20250 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c  ;.}../*.** Popul
20260 61 74 65 20 62 75 66 66 65 72 20 7a 4f 75 74 20  ate buffer zOut 
20270 77 69 74 68 20 74 68 65 20 66 75 6c 6c 20 63 61  with the full ca
20280 6e 6f 6e 69 63 61 6c 20 70 61 74 68 6e 61 6d 65  nonical pathname
20290 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
202a0 2a 20 74 6f 20 74 68 65 20 70 61 74 68 6e 61 6d  * to the pathnam
202b0 65 20 69 6e 20 7a 50 61 74 68 2e 20 7a 4f 75 74  e in zPath. zOut
202c0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
202d0 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  o point to a buf
202e0 66 65 72 0a 2a 2a 20 6f 66 20 61 74 20 6c 65 61  fer.** of at lea
202f0 73 74 20 28 44 45 56 53 59 4d 5f 4d 41 58 5f 50  st (DEVSYM_MAX_P
20300 41 54 48 4e 41 4d 45 2b 31 29 20 62 79 74 65 73  ATHNAME+1) bytes
20310 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
20320 72 62 75 56 66 73 46 75 6c 6c 50 61 74 68 6e 61  rbuVfsFullPathna
20330 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  me(.  sqlite3_vf
20340 73 20 2a 70 56 66 73 2c 20 0a 20 20 63 6f 6e 73  s *pVfs, .  cons
20350 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 0a  t char *zPath, .
20360 20 20 69 6e 74 20 6e 4f 75 74 2c 20 0a 20 20 63    int nOut, .  c
20370 68 61 72 20 2a 7a 4f 75 74 0a 29 7b 0a 20 20 73  har *zOut.){.  s
20380 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65 61  qlite3_vfs *pRea
20390 6c 56 66 73 20 3d 20 28 28 72 62 75 5f 76 66 73  lVfs = ((rbu_vfs
203a0 2a 29 70 56 66 73 29 2d 3e 70 52 65 61 6c 56 66  *)pVfs)->pRealVf
203b0 73 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 61  s;.  return pRea
203c0 6c 56 66 73 2d 3e 78 46 75 6c 6c 50 61 74 68 6e  lVfs->xFullPathn
203d0 61 6d 65 28 70 52 65 61 6c 56 66 73 2c 20 7a 50  ame(pRealVfs, zP
203e0 61 74 68 2c 20 6e 4f 75 74 2c 20 7a 4f 75 74 29  ath, nOut, zOut)
203f0 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
20400 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
20410 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 4f 70  TENSION./*.** Op
20420 65 6e 20 74 68 65 20 64 79 6e 61 6d 69 63 20 6c  en the dynamic l
20430 69 62 72 61 72 79 20 6c 6f 63 61 74 65 64 20 61  ibrary located a
20440 74 20 7a 50 61 74 68 20 61 6e 64 20 72 65 74 75  t zPath and retu
20450 72 6e 20 61 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  rn a handle..*/.
20460 73 74 61 74 69 63 20 76 6f 69 64 20 2a 72 62 75  static void *rbu
20470 56 66 73 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65  VfsDlOpen(sqlite
20480 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e  3_vfs *pVfs, con
20490 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 29 7b  st char *zPath){
204a0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
204b0 70 52 65 61 6c 56 66 73 20 3d 20 28 28 72 62 75  pRealVfs = ((rbu
204c0 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e 70 52 65  _vfs*)pVfs)->pRe
204d0 61 6c 56 66 73 3b 0a 20 20 72 65 74 75 72 6e 20  alVfs;.  return 
204e0 70 52 65 61 6c 56 66 73 2d 3e 78 44 6c 4f 70 65  pRealVfs->xDlOpe
204f0 6e 28 70 52 65 61 6c 56 66 73 2c 20 7a 50 61 74  n(pRealVfs, zPat
20500 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70  h);.}../*.** Pop
20510 75 6c 61 74 65 20 74 68 65 20 62 75 66 66 65 72  ulate the buffer
20520 20 7a 45 72 72 4d 73 67 20 28 73 69 7a 65 20 6e   zErrMsg (size n
20530 42 79 74 65 20 62 79 74 65 73 29 20 77 69 74 68  Byte bytes) with
20540 20 61 20 68 75 6d 61 6e 20 72 65 61 64 61 62 6c   a human readabl
20550 65 0a 2a 2a 20 75 74 66 2d 38 20 73 74 72 69 6e  e.** utf-8 strin
20560 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65  g describing the
20570 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 65 72 72   most recent err
20580 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61  or encountered a
20590 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20 77 69  ssociated .** wi
205a0 74 68 20 64 79 6e 61 6d 69 63 20 6c 69 62 72 61  th dynamic libra
205b0 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ries..*/.static 
205c0 76 6f 69 64 20 72 62 75 56 66 73 44 6c 45 72 72  void rbuVfsDlErr
205d0 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  or(sqlite3_vfs *
205e0 70 56 66 73 2c 20 69 6e 74 20 6e 42 79 74 65 2c  pVfs, int nByte,
205f0 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 29 7b   char *zErrMsg){
20600 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
20610 70 52 65 61 6c 56 66 73 20 3d 20 28 28 72 62 75  pRealVfs = ((rbu
20620 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e 70 52 65  _vfs*)pVfs)->pRe
20630 61 6c 56 66 73 3b 0a 20 20 70 52 65 61 6c 56 66  alVfs;.  pRealVf
20640 73 2d 3e 78 44 6c 45 72 72 6f 72 28 70 52 65 61  s->xDlError(pRea
20650 6c 56 66 73 2c 20 6e 42 79 74 65 2c 20 7a 45 72  lVfs, nByte, zEr
20660 72 4d 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rMsg);.}../*.** 
20670 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
20680 20 74 6f 20 74 68 65 20 73 79 6d 62 6f 6c 20 7a   to the symbol z
20690 53 79 6d 62 6f 6c 20 69 6e 20 74 68 65 20 64 79  Symbol in the dy
206a0 6e 61 6d 69 63 20 6c 69 62 72 61 72 79 20 70 48  namic library pH
206b0 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
206c0 20 76 6f 69 64 20 28 2a 72 62 75 56 66 73 44 6c   void (*rbuVfsDl
206d0 53 79 6d 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  Sym(.  sqlite3_v
206e0 66 73 20 2a 70 56 66 73 2c 20 0a 20 20 76 6f 69  fs *pVfs, .  voi
206f0 64 20 2a 70 41 72 67 2c 20 0a 20 20 63 6f 6e 73  d *pArg, .  cons
20700 74 20 63 68 61 72 20 2a 7a 53 79 6d 0a 29 29 28  t char *zSym.))(
20710 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
20720 5f 76 66 73 20 2a 70 52 65 61 6c 56 66 73 20 3d  _vfs *pRealVfs =
20730 20 28 28 72 62 75 5f 76 66 73 2a 29 70 56 66 73   ((rbu_vfs*)pVfs
20740 29 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20 72  )->pRealVfs;.  r
20750 65 74 75 72 6e 20 70 52 65 61 6c 56 66 73 2d 3e  eturn pRealVfs->
20760 78 44 6c 53 79 6d 28 70 52 65 61 6c 56 66 73 2c  xDlSym(pRealVfs,
20770 20 70 41 72 67 2c 20 7a 53 79 6d 29 3b 0a 7d 0a   pArg, zSym);.}.
20780 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65  ./*.** Close the
20790 20 64 79 6e 61 6d 69 63 20 6c 69 62 72 61 72 79   dynamic library
207a0 20 68 61 6e 64 6c 65 20 70 48 61 6e 64 6c 65 2e   handle pHandle.
207b0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
207c0 72 62 75 56 66 73 44 6c 43 6c 6f 73 65 28 73 71  rbuVfsDlClose(sq
207d0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
207e0 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b   void *pHandle){
207f0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
20800 70 52 65 61 6c 56 66 73 20 3d 20 28 28 72 62 75  pRealVfs = ((rbu
20810 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e 70 52 65  _vfs*)pVfs)->pRe
20820 61 6c 56 66 73 3b 0a 20 20 70 52 65 61 6c 56 66  alVfs;.  pRealVf
20830 73 2d 3e 78 44 6c 43 6c 6f 73 65 28 70 52 65 61  s->xDlClose(pRea
20840 6c 56 66 73 2c 20 70 48 61 6e 64 6c 65 29 3b 0a  lVfs, pHandle);.
20850 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
20860 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
20870 45 4e 53 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ENSION */../*.**
20880 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 62 75   Populate the bu
20890 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20  ffer pointed to 
208a0 62 79 20 7a 42 75 66 4f 75 74 20 77 69 74 68 20  by zBufOut with 
208b0 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 0a  nByte bytes of .
208c0 2a 2a 20 72 61 6e 64 6f 6d 20 64 61 74 61 2e 0a  ** random data..
208d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62  */.static int rb
208e0 75 56 66 73 52 61 6e 64 6f 6d 6e 65 73 73 28 73  uVfsRandomness(s
208f0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
20900 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 63 68 61  , int nByte, cha
20910 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 73  r *zBufOut){.  s
20920 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65 61  qlite3_vfs *pRea
20930 6c 56 66 73 20 3d 20 28 28 72 62 75 5f 76 66 73  lVfs = ((rbu_vfs
20940 2a 29 70 56 66 73 29 2d 3e 70 52 65 61 6c 56 66  *)pVfs)->pRealVf
20950 73 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 61  s;.  return pRea
20960 6c 56 66 73 2d 3e 78 52 61 6e 64 6f 6d 6e 65 73  lVfs->xRandomnes
20970 73 28 70 52 65 61 6c 56 66 73 2c 20 6e 42 79 74  s(pRealVfs, nByt
20980 65 2c 20 7a 42 75 66 4f 75 74 29 3b 0a 7d 0a 0a  e, zBufOut);.}..
20990 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20  /*.** Sleep for 
209a0 6e 4d 69 63 72 6f 20 6d 69 63 72 6f 73 65 63 6f  nMicro microseco
209b0 6e 64 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20  nds. Return the 
209c0 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73  number of micros
209d0 65 63 6f 6e 64 73 20 0a 2a 2a 20 61 63 74 75 61  econds .** actua
209e0 6c 6c 79 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74  lly slept..*/.st
209f0 61 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 53  atic int rbuVfsS
20a00 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73  leep(sqlite3_vfs
20a10 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 4d 69 63   *pVfs, int nMic
20a20 72 6f 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ro){.  sqlite3_v
20a30 66 73 20 2a 70 52 65 61 6c 56 66 73 20 3d 20 28  fs *pRealVfs = (
20a40 28 72 62 75 5f 76 66 73 2a 29 70 56 66 73 29 2d  (rbu_vfs*)pVfs)-
20a50 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20 72 65 74  >pRealVfs;.  ret
20a60 75 72 6e 20 70 52 65 61 6c 56 66 73 2d 3e 78 53  urn pRealVfs->xS
20a70 6c 65 65 70 28 70 52 65 61 6c 56 66 73 2c 20 6e  leep(pRealVfs, n
20a80 4d 69 63 72 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Micro);.}../*.**
20a90 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
20aa0 65 6e 74 20 74 69 6d 65 20 61 73 20 61 20 4a 75  ent time as a Ju
20ab0 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20  lian Day number 
20ac0 69 6e 20 2a 70 54 69 6d 65 4f 75 74 2e 0a 2a 2f  in *pTimeOut..*/
20ad0 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56  .static int rbuV
20ae0 66 73 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71  fsCurrentTime(sq
20af0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
20b00 20 64 6f 75 62 6c 65 20 2a 70 54 69 6d 65 4f 75   double *pTimeOu
20b10 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  t){.  sqlite3_vf
20b20 73 20 2a 70 52 65 61 6c 56 66 73 20 3d 20 28 28  s *pRealVfs = ((
20b30 72 62 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e  rbu_vfs*)pVfs)->
20b40 70 52 65 61 6c 56 66 73 3b 0a 20 20 72 65 74 75  pRealVfs;.  retu
20b50 72 6e 20 70 52 65 61 6c 56 66 73 2d 3e 78 43 75  rn pRealVfs->xCu
20b60 72 72 65 6e 74 54 69 6d 65 28 70 52 65 61 6c 56  rrentTime(pRealV
20b70 66 73 2c 20 70 54 69 6d 65 4f 75 74 29 3b 0a 7d  fs, pTimeOut);.}
20b80 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 2e 0a 2a  ../*.** No-op..*
20b90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75  /.static int rbu
20ba0 56 66 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28  VfsGetLastError(
20bb0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
20bc0 73 2c 20 69 6e 74 20 61 2c 20 63 68 61 72 20 2a  s, int a, char *
20bd0 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  b){.  return 0;.
20be0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 72 65 67 69 73  }../*.** Deregis
20bf0 74 65 72 20 61 6e 64 20 64 65 73 74 72 6f 79 20  ter and destroy 
20c00 61 6e 20 52 42 55 20 76 66 73 20 63 72 65 61 74  an RBU vfs creat
20c10 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ed by an earlier
20c20 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69   call to.** sqli
20c30 74 65 33 72 62 75 5f 63 72 65 61 74 65 5f 76 66  te3rbu_create_vf
20c40 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  s()..*/.void sql
20c50 69 74 65 33 72 62 75 5f 64 65 73 74 72 6f 79 5f  ite3rbu_destroy_
20c60 76 66 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  vfs(const char *
20c70 7a 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65  zName){.  sqlite
20c80 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 73 71  3_vfs *pVfs = sq
20c90 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a  lite3_vfs_find(z
20ca0 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 56 66  Name);.  if( pVf
20cb0 73 20 26 26 20 70 56 66 73 2d 3e 78 4f 70 65 6e  s && pVfs->xOpen
20cc0 3d 3d 72 62 75 56 66 73 4f 70 65 6e 20 29 7b 0a  ==rbuVfsOpen ){.
20cd0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
20ce0 78 5f 66 72 65 65 28 28 28 72 62 75 5f 76 66 73  x_free(((rbu_vfs
20cf0 2a 29 70 56 66 73 29 2d 3e 6d 75 74 65 78 29 3b  *)pVfs)->mutex);
20d00 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
20d10 5f 75 6e 72 65 67 69 73 74 65 72 28 70 56 66 73  _unregister(pVfs
20d20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
20d30 72 65 65 28 70 56 66 73 29 3b 0a 20 20 7d 0a 7d  ree(pVfs);.  }.}
20d40 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
20d50 6e 20 52 42 55 20 56 46 53 20 6e 61 6d 65 64 20  n RBU VFS named 
20d60 7a 4e 61 6d 65 20 74 68 61 74 20 61 63 63 65 73  zName that acces
20d70 73 65 73 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ses the underlyi
20d80 6e 67 20 66 69 6c 65 2d 73 79 73 74 65 6d 0a 2a  ng file-system.*
20d90 2a 20 76 69 61 20 65 78 69 73 74 69 6e 67 20 56  * via existing V
20da0 46 53 20 7a 50 61 72 65 6e 74 2e 20 54 68 65 20  FS zParent. The 
20db0 6e 65 77 20 6f 62 6a 65 63 74 20 69 73 20 72 65  new object is re
20dc0 67 69 73 74 65 72 65 64 20 61 73 20 61 20 6e 6f  gistered as a no
20dd0 6e 2d 64 65 66 61 75 6c 74 0a 2a 2a 20 56 46 53  n-default.** VFS
20de0 20 77 69 74 68 20 53 51 4c 69 74 65 20 62 65 66   with SQLite bef
20df0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
20e00 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 72 62 75  /.int sqlite3rbu
20e10 5f 63 72 65 61 74 65 5f 76 66 73 28 63 6f 6e 73  _create_vfs(cons
20e20 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63  t char *zName, c
20e30 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 65  onst char *zPare
20e40 6e 74 29 7b 0a 0a 20 20 2f 2a 20 54 65 6d 70 6c  nt){..  /* Templ
20e50 61 74 65 20 66 6f 72 20 56 46 53 20 2a 2f 0a 20  ate for VFS */. 
20e60 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f   static sqlite3_
20e70 76 66 73 20 76 66 73 5f 74 65 6d 70 6c 61 74 65  vfs vfs_template
20e80 20 3d 20 7b 0a 20 20 20 20 31 2c 20 20 20 20 20   = {.    1,     
20e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ea0 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
20eb0 6f 6e 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20  on */.    0,    
20ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ed0 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46          /* szOsF
20ee0 69 6c 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20  ile */.    0,   
20ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f00 20 20 20 20 20 20 20 20 20 2f 2a 20 6d 78 50 61           /* mxPa
20f10 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c  thname */.    0,
20f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
20f40 4e 65 78 74 20 2a 2f 0a 20 20 20 20 30 2c 20 20  Next */.    0,  
20f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61            /* zNa
20f70 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20  me */.    0,    
20f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f90 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44          /* pAppD
20fa0 61 74 61 20 2a 2f 0a 20 20 20 20 72 62 75 56 66  ata */.    rbuVf
20fb0 73 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  sOpen,          
20fc0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65           /* xOpe
20fd0 6e 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 44  n */.    rbuVfsD
20fe0 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20 20  elete,          
20ff0 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74         /* xDelet
21000 65 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 41  e */.    rbuVfsA
21010 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 20  ccess,          
21020 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73         /* xAcces
21030 73 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 46  s */.    rbuVfsF
21040 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20  ullPathname,    
21050 20 20 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50         /* xFullP
21060 61 74 68 6e 61 6d 65 20 2a 2f 0a 0a 23 69 66 6e  athname */..#ifn
21070 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21080 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20  LOAD_EXTENSION. 
21090 20 20 20 72 62 75 56 66 73 44 6c 4f 70 65 6e 2c     rbuVfsDlOpen,
210a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210b0 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20   /* xDlOpen */. 
210c0 20 20 20 72 62 75 56 66 73 44 6c 45 72 72 6f 72     rbuVfsDlError
210d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
210e0 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a   /* xDlError */.
210f0 20 20 20 20 72 62 75 56 66 73 44 6c 53 79 6d 2c      rbuVfsDlSym,
21100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21110 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20    /* xDlSym */. 
21120 20 20 20 72 62 75 56 66 73 44 6c 43 6c 6f 73 65     rbuVfsDlClose
21130 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21140 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a   /* xDlClose */.
21150 23 65 6c 73 65 0a 20 20 20 20 30 2c 20 30 2c 20  #else.    0, 0, 
21160 30 2c 20 30 2c 0a 23 65 6e 64 69 66 0a 0a 20 20  0, 0,.#endif..  
21170 20 20 72 62 75 56 66 73 52 61 6e 64 6f 6d 6e 65    rbuVfsRandomne
21180 73 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ss,             
21190 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a  /* xRandomness *
211a0 2f 0a 20 20 20 20 72 62 75 56 66 73 53 6c 65 65  /.    rbuVfsSlee
211b0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
211c0 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f      /* xSleep */
211d0 0a 20 20 20 20 72 62 75 56 66 73 43 75 72 72 65  .    rbuVfsCurre
211e0 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 20 20 20  ntTime,         
211f0 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69     /* xCurrentTi
21200 6d 65 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73  me */.    rbuVfs
21210 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20  GetLastError,   
21220 20 20 20 20 20 20 20 20 2f 2a 20 78 47 65 74 4c          /* xGetL
21230 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20  astError */.    
21240 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
21250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21260 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74   xCurrentTimeInt
21270 36 34 20 28 76 65 72 73 69 6f 6e 20 32 29 20 2a  64 (version 2) *
21280 2f 0a 20 20 20 20 30 2c 20 30 2c 20 30 20 20 20  /.    0, 0, 0   
21290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212a0 20 20 20 20 2f 2a 20 55 6e 69 6d 70 6c 65 6d 65      /* Unimpleme
212b0 6e 74 65 64 20 76 65 72 73 69 6f 6e 20 33 20 6d  nted version 3 m
212c0 65 74 68 6f 64 73 20 2a 2f 0a 20 20 7d 3b 0a 0a  ethods */.  };..
212d0 20 20 72 62 75 5f 76 66 73 20 2a 70 4e 65 77 20    rbu_vfs *pNew 
212e0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
212f0 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63    /* Newly alloc
21300 61 74 65 64 20 56 46 53 20 2a 2f 0a 20 20 69 6e  ated VFS */.  in
21310 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
21320 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 4e 61 6d 65  ;.  size_t nName
21330 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 42 79 74 65  ;.  size_t nByte
21340 3b 0a 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 74 72  ;..  nName = str
21350 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e 42  len(zName);.  nB
21360 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 72 62 75  yte = sizeof(rbu
21370 5f 76 66 73 29 20 2b 20 6e 4e 61 6d 65 20 2b 20  _vfs) + nName + 
21380 31 3b 0a 20 20 70 4e 65 77 20 3d 20 28 72 62 75  1;.  pNew = (rbu
21390 5f 76 66 73 2a 29 73 71 6c 69 74 65 33 5f 6d 61  _vfs*)sqlite3_ma
213a0 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29 3b 0a 20  lloc64(nByte);. 
213b0 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
213c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
213d0 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NOMEM;.  }else{.
213e0 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
213f0 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20  *pParent;       
21400 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 56 46      /* Parent VF
21410 53 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  S */.    memset(
21420 70 4e 65 77 2c 20 30 2c 20 6e 42 79 74 65 29 3b  pNew, 0, nByte);
21430 0a 20 20 20 20 70 50 61 72 65 6e 74 20 3d 20 73  .    pParent = s
21440 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
21450 7a 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 69 66  zParent);.    if
21460 28 20 70 50 61 72 65 6e 74 3d 3d 30 20 29 7b 0a  ( pParent==0 ){.
21470 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
21480 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 20 20  E_NOTFOUND;.    
21490 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
214a0 72 20 2a 7a 53 70 61 63 65 3b 0a 20 20 20 20 20  r *zSpace;.     
214b0 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e 62   memcpy(&pNew->b
214c0 61 73 65 2c 20 26 76 66 73 5f 74 65 6d 70 6c 61  ase, &vfs_templa
214d0 74 65 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74  te, sizeof(sqlit
214e0 65 33 5f 76 66 73 29 29 3b 0a 20 20 20 20 20 20  e3_vfs));.      
214f0 70 4e 65 77 2d 3e 62 61 73 65 2e 6d 78 50 61 74  pNew->base.mxPat
21500 68 6e 61 6d 65 20 3d 20 70 50 61 72 65 6e 74 2d  hname = pParent-
21510 3e 6d 78 50 61 74 68 6e 61 6d 65 3b 0a 20 20 20  >mxPathname;.   
21520 20 20 20 70 4e 65 77 2d 3e 62 61 73 65 2e 73 7a     pNew->base.sz
21530 4f 73 46 69 6c 65 20 3d 20 73 69 7a 65 6f 66 28  OsFile = sizeof(
21540 72 62 75 5f 66 69 6c 65 29 20 2b 20 70 50 61 72  rbu_file) + pPar
21550 65 6e 74 2d 3e 73 7a 4f 73 46 69 6c 65 3b 0a 20  ent->szOsFile;. 
21560 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 65 61 6c       pNew->pReal
21570 56 66 73 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20  Vfs = pParent;. 
21580 20 20 20 20 20 70 4e 65 77 2d 3e 62 61 73 65 2e       pNew->base.
21590 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63  zName = (const c
215a0 68 61 72 2a 29 28 7a 53 70 61 63 65 20 3d 20 28  har*)(zSpace = (
215b0 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 29 3b  char*)&pNew[1]);
215c0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 53  .      memcpy(zS
215d0 70 61 63 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  pace, zName, nNa
215e0 6d 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 41  me);..      /* A
215f0 6c 6c 6f 63 61 74 65 20 74 68 65 20 6d 75 74 65  llocate the mute
21600 78 20 61 6e 64 20 72 65 67 69 73 74 65 72 20 74  x and register t
21610 68 65 20 6e 65 77 20 56 46 53 20 28 6e 6f 74 20  he new VFS (not 
21620 61 73 20 74 68 65 20 64 65 66 61 75 6c 74 29 20  as the default) 
21630 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6d  */.      pNew->m
21640 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d  utex = sqlite3_m
21650 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54  utex_alloc(SQLIT
21660 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56  E_MUTEX_RECURSIV
21670 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  E);.      if( pN
21680 65 77 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a  ew->mutex==0 ){.
21690 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
216a0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
216b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
216c0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73  rc = sqlite3_vfs
216d0 5f 72 65 67 69 73 74 65 72 28 26 70 4e 65 77 2d  _register(&pNew-
216e0 3e 62 61 73 65 2c 20 30 29 3b 0a 20 20 20 20 20  >base, 0);.     
216f0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66   }.    }..    if
21700 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
21710 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
21720 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 4e 65 77  _mutex_free(pNew
21730 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  ->mutex);.      
21740 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
21750 77 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  w);.    }.  }.. 
21760 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
21770 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
21780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
217a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
217b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 65  ***********/..#e
217c0 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
217d0 28 53 51 4c 49 54 45 5f 43 4f 52 45 29 20 7c 7c  (SQLITE_CORE) ||
217e0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
217f0 45 4e 41 42 4c 45 5f 52 42 55 29 20 2a 2f 0a     ENABLE_RBU) */.