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

Artifact 9097f1d95666dbef72ca61d5b6a13a84660735ac:


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 69 66 28 20 70 49 74 65 72 2d   }..  if( pIter-
9cc0: 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 57  >eType==RBU_PK_W
9cd0: 49 54 48 4f 55 54 5f 52 4f 57 49 44 20 29 7b 0a  ITHOUT_ROWID ){.
9ce0: 20 20 20 20 2f 2a 20 22 50 52 41 47 4d 41 20 69      /* "PRAGMA i
9cf0: 6e 64 65 78 5f 6c 69 73 74 22 20 69 6e 63 6c 75  ndex_list" inclu
9d00: 64 65 73 20 74 68 65 20 6d 61 69 6e 20 50 4b 20  des the main PK 
9d10: 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 70 49  b-tree */.    pI
9d20: 74 65 72 2d 3e 6e 49 6e 64 65 78 2d 2d 3b 0a 20  ter->nIndex--;. 
9d30: 20 7d 0a 0a 20 20 72 62 75 46 69 6e 61 6c 69 7a   }..  rbuFinaliz
9d40: 65 28 70 2c 20 70 4c 69 73 74 29 3b 0a 20 20 69  e(p, pList);.  i
9d50: 66 28 20 62 49 6e 64 65 78 3d 3d 30 20 29 20 70  f( bIndex==0 ) p
9d60: 49 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64 20  Iter->abIndexed 
9d70: 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  = 0;.}.../*.** I
9d80: 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 61  f they are not a
9d90: 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64  lready populated
9da0: 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 70  , populate the p
9db0: 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 5d  Iter->azTblCol[]
9dc0: 2c 0a 2a 2a 20 70 49 74 65 72 2d 3e 61 62 54 62  ,.** pIter->abTb
9dd0: 6c 50 6b 5b 5d 2c 20 70 49 74 65 72 2d 3e 6e 54  lPk[], pIter->nT
9de0: 62 6c 43 6f 6c 20 61 6e 64 20 70 49 74 65 72 2d  blCol and pIter-
9df0: 3e 62 52 6f 77 69 64 20 76 61 72 69 61 62 6c 65  >bRowid variable
9e00: 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 0a 2a  s according to.*
9e10: 2a 20 74 68 65 20 74 61 62 6c 65 20 28 6e 6f 74  * the table (not
9e20: 20 69 6e 64 65 78 29 20 74 68 61 74 20 74 68 65   index) that the
9e30: 20 69 74 65 72 61 74 6f 72 20 63 75 72 72 65 6e   iterator curren
9e40: 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a  tly points to..*
9e50: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
9e60: 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  TE_OK if success
9e70: 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74  ful, or an SQLit
9e80: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  e error code oth
9e90: 65 72 77 69 73 65 2e 20 49 66 0a 2a 2a 20 61 6e  erwise. If.** an
9ea0: 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75   error does occu
9eb0: 72 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  r, an error code
9ec0: 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61   and error messa
9ed0: 67 65 20 61 72 65 20 61 6c 73 6f 20 6c 65 66 74  ge are also left
9ee0: 20 69 6e 20 0a 2a 2a 20 74 68 65 20 52 42 55 20   in .** the RBU 
9ef0: 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  handle..*/.stati
9f00: 63 20 69 6e 74 20 72 62 75 4f 62 6a 49 74 65 72  c int rbuObjIter
9f10: 43 61 63 68 65 54 61 62 6c 65 49 6e 66 6f 28 73  CacheTableInfo(s
9f20: 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62  qlite3rbu *p, Rb
9f30: 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 29  uObjIter *pIter)
9f40: 7b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 61  {.  if( pIter->a
9f50: 7a 54 62 6c 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20  zTblCol==0 ){.  
9f60: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
9f70: 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 69  pStmt = 0;.    i
9f80: 6e 74 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  nt nCol = 0;.   
9f90: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
9fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9fb0: 2a 20 66 6f 72 28 29 20 6c 6f 6f 70 20 69 74 65  * for() loop ite
9fc0: 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a  rator variable *
9fd0: 2f 0a 20 20 20 20 69 6e 74 20 62 52 62 75 52 6f  /.    int bRbuRo
9fe0: 77 69 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  wid = 0;        
9ff0: 20 20 20 20 2f 2a 20 49 66 20 69 6e 70 75 74 20      /* If input 
a000: 74 61 62 6c 65 20 68 61 73 20 63 6f 6c 75 6d 6e  table has column
a010: 20 22 72 62 75 5f 72 6f 77 69 64 22 20 2a 2f 0a   "rbu_rowid" */.
a020: 20 20 20 20 69 6e 74 20 69 4f 72 64 65 72 20 3d      int iOrder =
a030: 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 54 6e 75   0;.    int iTnu
a040: 6d 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 46  m = 0;..    /* F
a050: 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 74 79  igure out the ty
a060: 70 65 20 6f 66 20 74 61 62 6c 65 20 74 68 69 73  pe of table this
a070: 20 73 74 65 70 20 77 69 6c 6c 20 64 65 61 6c 20   step will deal 
a080: 77 69 74 68 2e 20 2a 2f 0a 20 20 20 20 61 73 73  with. */.    ass
a090: 65 72 74 28 20 70 49 74 65 72 2d 3e 65 54 79 70  ert( pIter->eTyp
a0a0: 65 3d 3d 30 20 29 3b 0a 20 20 20 20 72 62 75 54  e==0 );.    rbuT
a0b0: 61 62 6c 65 54 79 70 65 28 70 2c 20 70 49 74 65  ableType(p, pIte
a0c0: 72 2d 3e 7a 54 62 6c 2c 20 26 70 49 74 65 72 2d  r->zTbl, &pIter-
a0d0: 3e 65 54 79 70 65 2c 20 26 69 54 6e 75 6d 2c 20  >eType, &iTnum, 
a0e0: 26 70 49 74 65 72 2d 3e 69 50 6b 54 6e 75 6d 29  &pIter->iPkTnum)
a0f0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  ;.    if( p->rc=
a100: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49  =SQLITE_OK && pI
a110: 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f  ter->eType==RBU_
a120: 50 4b 5f 4e 4f 54 41 42 4c 45 20 29 7b 0a 20 20  PK_NOTABLE ){.  
a130: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
a140: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
a150: 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c  p->zErrmsg = sql
a160: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f  ite3_mprintf("no
a170: 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22   such table: %s"
a180: 2c 20 70 49 74 65 72 2d 3e 7a 54 62 6c 29 3b 0a  , pIter->zTbl);.
a190: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
a1a0: 3e 72 63 20 29 20 72 65 74 75 72 6e 20 70 2d 3e  >rc ) return p->
a1b0: 72 63 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  rc;.    if( pIte
a1c0: 72 2d 3e 7a 49 64 78 3d 3d 30 20 29 20 70 49 74  r->zIdx==0 ) pIt
a1d0: 65 72 2d 3e 69 54 6e 75 6d 20 3d 20 69 54 6e 75  er->iTnum = iTnu
a1e0: 6d 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  m;..    assert( 
a1f0: 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
a200: 55 5f 50 4b 5f 4e 4f 4e 45 20 7c 7c 20 70 49 74  U_PK_NONE || pIt
a210: 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
a220: 4b 5f 49 50 4b 20 0a 20 20 20 20 20 20 20 20 20  K_IPK .         
a230: 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  || pIter->eType=
a240: 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c  =RBU_PK_EXTERNAL
a250: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65   || pIter->eType
a260: 3d 3d 52 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54  ==RBU_PK_WITHOUT
a270: 5f 52 4f 57 49 44 0a 20 20 20 20 20 20 20 20 20  _ROWID.         
a280: 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  || pIter->eType=
a290: 3d 52 42 55 5f 50 4b 5f 56 54 41 42 0a 20 20 20  =RBU_PK_VTAB.   
a2a0: 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75   );..    /* Popu
a2b0: 6c 61 74 65 20 74 68 65 20 61 7a 54 62 6c 43 6f  late the azTblCo
a2c0: 6c 5b 5d 20 61 6e 64 20 6e 54 62 6c 43 6f 6c 20  l[] and nTblCol 
a2d0: 76 61 72 69 61 62 6c 65 73 20 62 61 73 65 64 20  variables based 
a2e0: 6f 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 73 0a 20  on the columns. 
a2f0: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e 70     ** of the inp
a300: 75 74 20 74 61 62 6c 65 2e 20 49 67 6e 6f 72 65  ut table. Ignore
a310: 20 61 6e 79 20 69 6e 70 75 74 20 74 61 62 6c 65   any input table
a320: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 62 65   columns that be
a330: 67 69 6e 20 77 69 74 68 0a 20 20 20 20 2a 2a 20  gin with.    ** 
a340: 22 72 62 75 5f 22 2e 20 20 2a 2f 0a 20 20 20 20  "rbu_".  */.    
a350: 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46  p->rc = prepareF
a360: 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  reeAndCollectErr
a370: 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20 26 70 53  or(p->dbRbu, &pS
a380: 74 6d 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  tmt, &p->zErrmsg
a390: 2c 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  , .        sqlit
a3a0: 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45  e3_mprintf("SELE
a3b0: 43 54 20 2a 20 46 52 4f 4d 20 27 25 71 27 22 2c  CT * FROM '%q'",
a3c0: 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c   pIter->zDataTbl
a3d0: 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  ).    );.    if(
a3e0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
a3f0: 4b 20 29 7b 0a 20 20 20 20 20 20 6e 43 6f 6c 20  K ){.      nCol 
a400: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
a410: 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20  _count(pStmt);. 
a420: 20 20 20 20 20 72 62 75 41 6c 6c 6f 63 61 74 65       rbuAllocate
a430: 49 74 65 72 41 72 72 61 79 73 28 70 2c 20 70 49  IterArrays(p, pI
a440: 74 65 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  ter, nCol);.    
a450: 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 70  }.    for(i=0; p
a460: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
a470: 26 26 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  && i<nCol; i++){
a480: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
a490: 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73  r *zName = (cons
a4a0: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
a4b0: 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d  column_name(pStm
a4c0: 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  t, i);.      if(
a4d0: 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d   sqlite3_strnicm
a4e0: 70 28 22 72 62 75 5f 22 2c 20 7a 4e 61 6d 65 2c  p("rbu_", zName,
a4f0: 20 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63   4) ){.        c
a500: 68 61 72 20 2a 7a 43 6f 70 79 20 3d 20 72 62 75  har *zCopy = rbu
a510: 53 74 72 6e 64 75 70 28 7a 4e 61 6d 65 2c 20 26  Strndup(zName, &
a520: 70 2d 3e 72 63 29 3b 0a 20 20 20 20 20 20 20 20  p->rc);.        
a530: 70 49 74 65 72 2d 3e 61 69 53 72 63 4f 72 64 65  pIter->aiSrcOrde
a540: 72 5b 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c  r[pIter->nTblCol
a550: 5d 20 3d 20 70 49 74 65 72 2d 3e 6e 54 62 6c 43  ] = pIter->nTblC
a560: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65  ol;.        pIte
a570: 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 70 49 74 65  r->azTblCol[pIte
a580: 72 2d 3e 6e 54 62 6c 43 6f 6c 2b 2b 5d 20 3d 20  r->nTblCol++] = 
a590: 7a 43 6f 70 79 3b 0a 20 20 20 20 20 20 7d 0a 20  zCopy;.      }. 
a5a0: 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 30 3d       else if( 0=
a5b0: 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70  =sqlite3_stricmp
a5c0: 28 22 72 62 75 5f 72 6f 77 69 64 22 2c 20 7a 4e  ("rbu_rowid", zN
a5d0: 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ame) ){.        
a5e0: 62 52 62 75 52 6f 77 69 64 20 3d 20 31 3b 0a 20  bRbuRowid = 1;. 
a5f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
a600: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
a610: 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 70 53  e(pStmt);.    pS
a620: 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  tmt = 0;..    if
a630: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
a640: 4f 4b 0a 20 20 20 20 20 26 26 20 62 52 62 75 52  OK.     && bRbuR
a650: 6f 77 69 64 21 3d 28 70 49 74 65 72 2d 3e 65 54  owid!=(pIter->eT
a660: 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 56 54 41 42  ype==RBU_PK_VTAB
a670: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65   || pIter->eType
a680: 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 29 0a 20  ==RBU_PK_NONE). 
a690: 20 20 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72     ){.      p->r
a6a0: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
a6b0: 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 6d  ;.      p->zErrm
a6c0: 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
a6d0: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
a6e0: 22 74 61 62 6c 65 20 25 71 20 25 73 20 72 62 75  "table %q %s rbu
a6f0: 5f 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 22 2c 20  _rowid column", 
a700: 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 2c  pIter->zDataTbl,
a710: 0a 20 20 20 20 20 20 20 20 20 20 28 62 52 62 75  .          (bRbu
a720: 52 6f 77 69 64 20 3f 20 22 6d 61 79 20 6e 6f 74  Rowid ? "may not
a730: 20 68 61 76 65 22 20 3a 20 22 72 65 71 75 69 72   have" : "requir
a740: 65 73 22 29 0a 20 20 20 20 20 20 29 3b 0a 20 20  es").      );.  
a750: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
a760: 6b 20 74 68 61 74 20 61 6c 6c 20 6e 6f 6e 2d 48  k that all non-H
a770: 49 44 44 45 4e 20 63 6f 6c 75 6d 6e 73 20 69 6e  IDDEN columns in
a780: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
a790: 20 74 61 62 6c 65 20 61 72 65 20 61 6c 73 6f 0a   table are also.
a7a0: 20 20 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 69      ** present i
a7b0: 6e 20 74 68 65 20 69 6e 70 75 74 20 74 61 62 6c  n the input tabl
a7c0: 65 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  e. Populate the 
a7d0: 61 62 54 62 6c 50 6b 5b 5d 2c 20 61 7a 54 62 6c  abTblPk[], azTbl
a7e0: 54 79 70 65 5b 5d 20 61 6e 64 0a 20 20 20 20 2a  Type[] and.    *
a7f0: 2a 20 61 69 54 62 6c 4f 72 64 65 72 5b 5d 20 61  * aiTblOrder[] a
a800: 72 72 61 79 73 20 61 74 20 74 68 65 20 73 61 6d  rrays at the sam
a810: 65 20 74 69 6d 65 2e 20 20 2a 2f 0a 20 20 20 20  e time.  */.    
a820: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
a830: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
a840: 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65  >rc = prepareFre
a850: 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72  eAndCollectError
a860: 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 53 74  (p->dbMain, &pSt
a870: 6d 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c  mt, &p->zErrmsg,
a880: 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69   .          sqli
a890: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41  te3_mprintf("PRA
a8a0: 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 28 25  GMA table_info(%
a8b0: 51 29 22 2c 20 70 49 74 65 72 2d 3e 7a 54 62 6c  Q)", pIter->zTbl
a8c0: 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  ).      );.    }
a8d0: 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72  .    while( p->r
a8e0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
a8f0: 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
a900: 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20  te3_step(pStmt) 
a910: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
a920: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f  har *zName = (co
a930: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
a940: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
a950: 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  tmt, 1);.      i
a960: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72  f( zName==0 ) br
a970: 65 61 6b 3b 20 20 2f 2a 20 41 6e 20 4f 4f 4d 20  eak;  /* An OOM 
a980: 2d 20 66 69 6e 61 6c 69 7a 65 28 29 20 62 65 6c  - finalize() bel
a990: 6f 77 20 72 65 74 75 72 6e 73 20 53 5f 4e 4f 4d  ow returns S_NOM
a9a0: 45 4d 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28  EM */.      for(
a9b0: 69 3d 69 4f 72 64 65 72 3b 20 69 3c 70 49 74 65  i=iOrder; i<pIte
a9c0: 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69 2b 2b 29  r->nTblCol; i++)
a9d0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d  {.        if( 0=
a9e0: 3d 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 70  =strcmp(zName, p
a9f0: 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69  Iter->azTblCol[i
aa00: 5d 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ]) ) break;.    
aa10: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3d    }.      if( i=
aa20: 3d 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20  =pIter->nTblCol 
aa30: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63  ){.        p->rc
aa40: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
aa50: 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72  .        p->zErr
aa60: 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  msg = sqlite3_mp
aa70: 72 69 6e 74 66 28 22 63 6f 6c 75 6d 6e 20 6d 69  rintf("column mi
aa80: 73 73 69 6e 67 20 66 72 6f 6d 20 25 71 3a 20 25  ssing from %q: %
aa90: 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
aaa0: 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 2c  pIter->zDataTbl,
aab0: 20 7a 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 29   zName.        )
aac0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
aad0: 20 20 20 20 20 20 20 69 6e 74 20 69 50 6b 20 3d         int iPk =
aae0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
aaf0: 69 6e 74 28 70 53 74 6d 74 2c 20 35 29 3b 0a 20  int(pStmt, 5);. 
ab00: 20 20 20 20 20 20 20 69 6e 74 20 62 4e 6f 74 4e         int bNotN
ab10: 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ull = sqlite3_co
ab20: 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20  lumn_int(pStmt, 
ab30: 33 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  3);.        cons
ab40: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20  t char *zType = 
ab50: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
ab60: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
ab70: 28 70 53 74 6d 74 2c 20 32 29 3b 0a 0a 20 20 20  (pStmt, 2);..   
ab80: 20 20 20 20 20 69 66 28 20 69 21 3d 69 4f 72 64       if( i!=iOrd
ab90: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  er ){.          
aba0: 53 57 41 50 28 69 6e 74 2c 20 70 49 74 65 72 2d  SWAP(int, pIter-
abb0: 3e 61 69 53 72 63 4f 72 64 65 72 5b 69 5d 2c 20  >aiSrcOrder[i], 
abc0: 70 49 74 65 72 2d 3e 61 69 53 72 63 4f 72 64 65  pIter->aiSrcOrde
abd0: 72 5b 69 4f 72 64 65 72 5d 29 3b 0a 20 20 20 20  r[iOrder]);.    
abe0: 20 20 20 20 20 20 53 57 41 50 28 63 68 61 72 2a        SWAP(char*
abf0: 2c 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f  , pIter->azTblCo
ac00: 6c 5b 69 5d 2c 20 70 49 74 65 72 2d 3e 61 7a 54  l[i], pIter->azT
ac10: 62 6c 43 6f 6c 5b 69 4f 72 64 65 72 5d 29 3b 0a  blCol[iOrder]);.
ac20: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
ac30: 20 20 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 54     pIter->azTblT
ac40: 79 70 65 5b 69 4f 72 64 65 72 5d 20 3d 20 72 62  ype[iOrder] = rb
ac50: 75 53 74 72 6e 64 75 70 28 7a 54 79 70 65 2c 20  uStrndup(zType, 
ac60: 26 70 2d 3e 72 63 29 3b 0a 20 20 20 20 20 20 20  &p->rc);.       
ac70: 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b   pIter->abTblPk[
ac80: 69 4f 72 64 65 72 5d 20 3d 20 28 69 50 6b 21 3d  iOrder] = (iPk!=
ac90: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65  0);.        pIte
aca0: 72 2d 3e 61 62 4e 6f 74 4e 75 6c 6c 5b 69 4f 72  r->abNotNull[iOr
acb0: 64 65 72 5d 20 3d 20 28 75 38 29 62 4e 6f 74 4e  der] = (u8)bNotN
acc0: 75 6c 6c 20 7c 7c 20 28 69 50 6b 21 3d 30 29 3b  ull || (iPk!=0);
acd0: 0a 20 20 20 20 20 20 20 20 69 4f 72 64 65 72 2b  .        iOrder+
ace0: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
acf0: 0a 0a 20 20 20 20 72 62 75 46 69 6e 61 6c 69 7a  ..    rbuFinaliz
ad00: 65 28 70 2c 20 70 53 74 6d 74 29 3b 0a 20 20 20  e(p, pStmt);.   
ad10: 20 72 62 75 4f 62 6a 49 74 65 72 43 61 63 68 65   rbuObjIterCache
ad20: 49 6e 64 65 78 65 64 43 6f 6c 73 28 70 2c 20 70  IndexedCols(p, p
ad30: 49 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  Iter);.    asser
ad40: 74 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65 21  t( pIter->eType!
ad50: 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20 7c 7c 20  =RBU_PK_VTAB || 
ad60: 70 49 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64  pIter->abIndexed
ad70: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
ad80: 74 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65 21  t( pIter->eType!
ad90: 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20 7c 7c 20  =RBU_PK_VTAB || 
ada0: 70 49 74 65 72 2d 3e 6e 49 6e 64 65 78 3d 3d 30  pIter->nIndex==0
adb0: 20 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72   );.  }..  retur
adc0: 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  n p->rc;.}../*.*
add0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
ade0: 63 6f 6e 73 74 72 75 63 74 73 20 61 6e 64 20 72  constructs and r
adf0: 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
ae00: 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e   to a nul-termin
ae10: 61 74 65 64 20 0a 2a 2a 20 73 74 72 69 6e 67 20  ated .** string 
ae20: 63 6f 6e 74 61 69 6e 69 6e 67 20 73 6f 6d 65 20  containing some 
ae30: 53 51 4c 20 63 6c 61 75 73 65 20 6f 72 20 6c 69  SQL clause or li
ae40: 73 74 20 62 61 73 65 64 20 6f 6e 20 6f 6e 65 20  st based on one 
ae50: 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 0a  or more of the .
ae60: 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ** column names 
ae70: 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64  currently stored
ae80: 20 69 6e 20 74 68 65 20 70 49 74 65 72 2d 3e 61   in the pIter->a
ae90: 7a 54 62 6c 43 6f 6c 5b 5d 20 61 72 72 61 79 2e  zTblCol[] array.
aea0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
aeb0: 2a 72 62 75 4f 62 6a 49 74 65 72 47 65 74 43 6f  *rbuObjIterGetCo
aec0: 6c 6c 69 73 74 28 0a 20 20 73 71 6c 69 74 65 33  llist(.  sqlite3
aed0: 72 62 75 20 2a 70 2c 20 20 20 20 20 20 20 20 20  rbu *p,         
aee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 42 55 20           /* RBU 
aef0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 52 62 75 4f  object */.  RbuO
af00: 62 6a 49 74 65 72 20 2a 70 49 74 65 72 20 20 20  bjIter *pIter   
af10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
af20: 62 6a 65 63 74 20 69 74 65 72 61 74 6f 72 20 66  bject iterator f
af30: 6f 72 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  or column names 
af40: 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c  */.){.  char *zL
af50: 69 73 74 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74  ist = 0;.  const
af60: 20 63 68 61 72 20 2a 7a 53 65 70 20 3d 20 22 22   char *zSep = ""
af70: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
af80: 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e  (i=0; i<pIter->n
af90: 54 62 6c 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  TblCol; i++){.  
afa0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
afb0: 3d 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f  = pIter->azTblCo
afc0: 6c 5b 69 5d 3b 0a 20 20 20 20 7a 4c 69 73 74 20  l[i];.    zList 
afd0: 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20  = rbuMPrintf(p, 
afe0: 22 25 7a 25 73 5c 22 25 77 5c 22 22 2c 20 7a 4c  "%z%s\"%w\"", zL
aff0: 69 73 74 2c 20 7a 53 65 70 2c 20 7a 29 3b 0a 20  ist, zSep, z);. 
b000: 20 20 20 7a 53 65 70 20 3d 20 22 2c 20 22 3b 0a     zSep = ", ";.
b010: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4c 69    }.  return zLi
b020: 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  st;.}../*.** Thi
b030: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
b040: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 53  ed to create a S
b050: 45 4c 45 43 54 20 6c 69 73 74 20 28 74 68 65 20  ELECT list (the 
b060: 6c 69 73 74 20 6f 66 20 53 51 4c 20 0a 2a 2a 20  list of SQL .** 
b070: 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74  expressions that
b080: 20 66 6f 6c 6c 6f 77 73 20 61 20 53 45 4c 45 43   follows a SELEC
b090: 54 20 6b 65 79 77 6f 72 64 29 20 66 6f 72 20 61  T keyword) for a
b0a0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
b0b0: 74 20 0a 2a 2a 20 75 73 65 64 20 74 6f 20 72 65  t .** used to re
b0c0: 61 64 20 66 72 6f 6d 20 61 6e 20 64 61 74 61 5f  ad from an data_
b0d0: 78 78 78 20 6f 72 20 72 62 75 5f 74 6d 70 5f 78  xxx or rbu_tmp_x
b0e0: 78 78 20 74 61 62 6c 65 20 77 68 69 6c 65 20 75  xx table while u
b0f0: 70 64 61 74 69 6e 67 20 74 68 65 20 0a 2a 2a 20  pdating the .** 
b100: 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 63 75 72  index object cur
b110: 72 65 6e 74 6c 79 20 69 6e 64 69 63 61 74 65 64  rently indicated
b120: 20 62 79 20 74 68 65 20 69 74 65 72 61 74 6f 72   by the iterator
b130: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
b140: 73 20 74 68 65 20 0a 2a 2a 20 73 65 63 6f 6e 64  s the .** second
b150: 20 61 72 67 75 6d 65 6e 74 2e 20 41 20 22 50 52   argument. A "PR
b160: 41 47 4d 41 20 69 6e 64 65 78 5f 78 69 6e 66 6f  AGMA index_xinfo
b170: 20 3d 20 3c 69 64 78 6e 61 6d 65 3e 22 20 73 74   = <idxname>" st
b180: 61 74 65 6d 65 6e 74 20 69 73 20 75 73 65 64 20  atement is used 
b190: 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  .** to obtain th
b1a0: 65 20 72 65 71 75 69 72 65 64 20 69 6e 66 6f 72  e required infor
b1b0: 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  mation..**.** If
b1c0: 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6f 66   the index is of
b1d0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
b1e0: 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45  orm:.**.**   CRE
b1f0: 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
b200: 74 31 28 63 2c 20 62 20 43 4f 4c 4c 41 54 45 20  t1(c, b COLLATE 
b210: 6e 6f 63 61 73 65 29 3b 0a 2a 2a 0a 2a 2a 20 61  nocase);.**.** a
b220: 6e 64 20 22 74 31 22 20 69 73 20 61 20 74 61 62  nd "t1" is a tab
b230: 6c 65 20 77 69 74 68 20 61 6e 20 65 78 70 6c 69  le with an expli
b240: 63 69 74 20 49 4e 54 45 47 45 52 20 50 52 49 4d  cit INTEGER PRIM
b250: 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 0a  ARY KEY column .
b260: 2a 2a 20 22 69 70 6b 22 2c 20 74 68 65 20 72 65  ** "ipk", the re
b270: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73  turned string is
b280: 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 60 63 60 20 43  :.**.**   "`c` C
b290: 4f 4c 4c 41 54 45 20 27 42 49 4e 41 52 59 27 2c  OLLATE 'BINARY',
b2a0: 20 60 62 60 20 43 4f 4c 4c 41 54 45 20 27 4e 4f   `b` COLLATE 'NO
b2b0: 43 41 53 45 27 2c 20 60 69 70 6b 60 20 43 4f 4c  CASE', `ipk` COL
b2c0: 4c 41 54 45 20 27 42 49 4e 41 52 59 27 22 0a 2a  LATE 'BINARY'".*
b2d0: 2a 0a 2a 2a 20 41 73 20 77 65 6c 6c 20 61 73 20  *.** As well as 
b2e0: 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  the returned str
b2f0: 69 6e 67 2c 20 74 68 72 65 65 20 6f 74 68 65 72  ing, three other
b300: 20 6d 61 6c 6c 6f 63 27 64 20 73 74 72 69 6e 67   malloc'd string
b310: 73 20 61 72 65 20 0a 2a 2a 20 72 65 74 75 72 6e  s are .** return
b320: 65 64 20 76 69 61 20 6f 75 74 70 75 74 20 70 61  ed via output pa
b330: 72 61 6d 65 74 65 72 73 2e 20 41 73 20 66 6f 6c  rameters. As fol
b340: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 70 7a  lows:.**.**   pz
b350: 49 6d 70 6f 73 74 65 72 43 6f 6c 73 3a 20 2e 2e  ImposterCols: ..
b360: 2e 0a 2a 2a 20 20 20 70 7a 49 6d 70 6f 73 74 65  ..**   pzImposte
b370: 72 50 6b 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 70 7a  rPk: ....**   pz
b380: 57 68 65 72 65 3a 20 2e 2e 2e 0a 2a 2f 0a 73 74  Where: ....*/.st
b390: 61 74 69 63 20 63 68 61 72 20 2a 72 62 75 4f 62  atic char *rbuOb
b3a0: 6a 49 74 65 72 47 65 74 49 6e 64 65 78 43 6f 6c  jIterGetIndexCol
b3b0: 73 28 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20  s(.  sqlite3rbu 
b3c0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
b3d0: 20 20 20 20 20 2f 2a 20 52 42 55 20 6f 62 6a 65       /* RBU obje
b3e0: 63 74 20 2a 2f 0a 20 20 52 62 75 4f 62 6a 49 74  ct */.  RbuObjIt
b3f0: 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20  er *pIter,      
b400: 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63          /* Objec
b410: 74 20 69 74 65 72 61 74 6f 72 20 66 6f 72 20 63  t iterator for c
b420: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
b430: 20 63 68 61 72 20 2a 2a 70 7a 49 6d 70 6f 73 74   char **pzImpost
b440: 65 72 43 6f 6c 73 2c 20 20 20 20 20 20 20 20 20  erCols,         
b450: 20 2f 2a 20 4f 55 54 3a 20 43 6f 6c 75 6d 6e 73   /* OUT: Columns
b460: 20 66 6f 72 20 69 6d 70 6f 73 74 65 72 20 74 61   for imposter ta
b470: 62 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  ble */.  char **
b480: 70 7a 49 6d 70 6f 73 74 65 72 50 6b 2c 20 20 20  pzImposterPk,   
b490: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
b4a0: 20 49 6d 70 6f 73 74 65 72 20 50 4b 20 63 6c 61   Imposter PK cla
b4b0: 75 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  use */.  char **
b4c0: 70 7a 57 68 65 72 65 2c 20 20 20 20 20 20 20 20  pzWhere,        
b4d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
b4e0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
b4f0: 0a 20 20 69 6e 74 20 2a 70 6e 42 69 6e 64 20 20  .  int *pnBind  
b500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b510: 20 20 20 2f 2a 20 4f 55 54 3a 20 54 72 62 75 6c     /* OUT: Trbul
b520: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
b530: 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ns */.){.  int r
b540: 63 20 3d 20 70 2d 3e 72 63 3b 20 20 20 20 20 20  c = p->rc;      
b550: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72             /* Er
b560: 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  ror code */.  in
b570: 74 20 72 63 32 3b 20 20 20 20 20 20 20 20 20 20  t rc2;          
b580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b590: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
b5a0: 65 28 29 20 72 65 74 75 72 6e 20 63 6f 64 65 20  e() return code 
b5b0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 20  */.  char *zRet 
b5c0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
b5d0: 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 74       /* String t
b5e0: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 63 68  o return */.  ch
b5f0: 61 72 20 2a 7a 49 6d 70 43 6f 6c 73 20 3d 20 30  ar *zImpCols = 0
b600: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
b610: 20 53 74 72 69 6e 67 20 74 6f 20 72 65 74 75 72   String to retur
b620: 6e 20 76 69 61 20 2a 70 7a 49 6d 70 6f 73 74 65  n via *pzImposte
b630: 72 43 6f 6c 73 20 2a 2f 0a 20 20 63 68 61 72 20  rCols */.  char 
b640: 2a 7a 49 6d 70 50 4b 20 3d 20 30 3b 20 20 20 20  *zImpPK = 0;    
b650: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
b660: 72 69 6e 67 20 74 6f 20 72 65 74 75 72 6e 20 76  ring to return v
b670: 69 61 20 2a 70 7a 49 6d 70 6f 73 74 65 72 50 4b  ia *pzImposterPK
b680: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57 68 65   */.  char *zWhe
b690: 72 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  re = 0;         
b6a0: 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20        /* String 
b6b0: 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70  to return via *p
b6c0: 7a 57 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  zWhere */.  int 
b6d0: 6e 42 69 6e 64 20 3d 20 30 3b 20 20 20 20 20 20  nBind = 0;      
b6e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
b6f0: 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76  alue to return v
b700: 69 61 20 2a 70 6e 42 69 6e 64 20 2a 2f 0a 20 20  ia *pnBind */.  
b710: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d  const char *zCom
b720: 20 3d 20 22 22 3b 20 20 20 20 20 20 20 20 20 20   = "";          
b730: 2f 2a 20 53 65 74 20 74 6f 20 22 2c 20 22 20 6c  /* Set to ", " l
b740: 61 74 65 72 20 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  ater on */.  con
b750: 73 74 20 63 68 61 72 20 2a 7a 41 6e 64 20 3d 20  st char *zAnd = 
b760: 22 22 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  "";          /* 
b770: 53 65 74 20 74 6f 20 22 20 41 4e 44 20 22 20 6c  Set to " AND " l
b780: 61 74 65 72 20 6f 6e 20 2a 2f 0a 20 20 73 71 6c  ater on */.  sql
b790: 69 74 65 33 5f 73 74 6d 74 20 2a 70 58 49 6e 66  ite3_stmt *pXInf
b7a0: 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  o = 0;       /* 
b7b0: 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 78 69 6e  PRAGMA index_xin
b7c0: 66 6f 20 3d 20 3f 20 2a 2f 0a 0a 20 20 69 66 28  fo = ? */..  if(
b7d0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
b7e0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
b7f0: 3e 7a 45 72 72 6d 73 67 3d 3d 30 20 29 3b 0a 20  >zErrmsg==0 );. 
b800: 20 20 20 72 63 20 3d 20 70 72 65 70 61 72 65 46     rc = prepareF
b810: 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  reeAndCollectErr
b820: 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70  or(p->dbMain, &p
b830: 58 49 6e 66 6f 2c 20 26 70 2d 3e 7a 45 72 72 6d  XInfo, &p->zErrm
b840: 73 67 2c 0a 20 20 20 20 20 20 20 20 73 71 6c 69  sg,.        sqli
b850: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41  te3_mprintf("PRA
b860: 47 4d 41 20 6d 61 69 6e 2e 69 6e 64 65 78 5f 78  GMA main.index_x
b870: 69 6e 66 6f 20 3d 20 25 51 22 2c 20 70 49 74 65  info = %Q", pIte
b880: 72 2d 3e 7a 49 64 78 29 0a 20 20 20 20 29 3b 0a  r->zIdx).    );.
b890: 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63    }..  while( rc
b8a0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53  ==SQLITE_OK && S
b8b0: 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
b8c0: 65 33 5f 73 74 65 70 28 70 58 49 6e 66 6f 29 20  e3_step(pXInfo) 
b8d0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 69 64 20  ){.    int iCid 
b8e0: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
b8f0: 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20 31 29 3b  _int(pXInfo, 1);
b900: 0a 20 20 20 20 69 6e 74 20 62 44 65 73 63 20 3d  .    int bDesc =
b910: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
b920: 69 6e 74 28 70 58 49 6e 66 6f 2c 20 33 29 3b 0a  int(pXInfo, 3);.
b930: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
b940: 7a 43 6f 6c 6c 61 74 65 20 3d 20 28 63 6f 6e 73  zCollate = (cons
b950: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
b960: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 58 49 6e  column_text(pXIn
b970: 66 6f 2c 20 34 29 3b 0a 20 20 20 20 63 6f 6e 73  fo, 4);.    cons
b980: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20  t char *zCol;.  
b990: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
b9a0: 79 70 65 3b 0a 0a 20 20 20 20 69 66 28 20 69 43  ype;..    if( iC
b9b0: 69 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  id<0 ){.      /*
b9c0: 20 41 6e 20 69 6e 74 65 67 65 72 20 70 72 69 6d   An integer prim
b9d0: 61 72 79 20 6b 65 79 2e 20 49 66 20 74 68 65 20  ary key. If the 
b9e0: 74 61 62 6c 65 20 68 61 73 20 61 6e 20 65 78 70  table has an exp
b9f0: 6c 69 63 69 74 20 49 50 4b 2c 20 75 73 65 0a 20  licit IPK, use. 
ba00: 20 20 20 20 20 2a 2a 20 69 74 73 20 6e 61 6d 65       ** its name
ba10: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65  . Otherwise, use
ba20: 20 22 72 62 75 5f 72 6f 77 69 64 22 2e 20 20 2a   "rbu_rowid".  *
ba30: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  /.      if( pIte
ba40: 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
ba50: 5f 49 50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  _IPK ){.        
ba60: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66  int i;.        f
ba70: 6f 72 28 69 3d 30 3b 20 70 49 74 65 72 2d 3e 61  or(i=0; pIter->a
ba80: 62 54 62 6c 50 6b 5b 69 5d 3d 3d 30 3b 20 69 2b  bTblPk[i]==0; i+
ba90: 2b 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +);.        asse
baa0: 72 74 28 20 69 3c 70 49 74 65 72 2d 3e 6e 54 62  rt( i<pIter->nTb
bab0: 6c 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20 20  lCol );.        
bac0: 7a 43 6f 6c 20 3d 20 70 49 74 65 72 2d 3e 61 7a  zCol = pIter->az
bad0: 54 62 6c 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20  TblCol[i];.     
bae0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
baf0: 7a 43 6f 6c 20 3d 20 22 72 62 75 5f 72 6f 77 69  zCol = "rbu_rowi
bb00: 64 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  d";.      }.    
bb10: 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47    zType = "INTEG
bb20: 45 52 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ER";.    }else{.
bb30: 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 49 74        zCol = pIt
bb40: 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 43 69  er->azTblCol[iCi
bb50: 64 5d 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20  d];.      zType 
bb60: 3d 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 54 79  = pIter->azTblTy
bb70: 70 65 5b 69 43 69 64 5d 3b 0a 20 20 20 20 7d 0a  pe[iCid];.    }.
bb80: 0a 20 20 20 20 7a 52 65 74 20 3d 20 73 71 6c 69  .    zRet = sqli
bb90: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 25  te3_mprintf("%z%
bba0: 73 5c 22 25 77 5c 22 20 43 4f 4c 4c 41 54 45 20  s\"%w\" COLLATE 
bbb0: 25 51 22 2c 20 7a 52 65 74 2c 20 7a 43 6f 6d 2c  %Q", zRet, zCom,
bbc0: 20 7a 43 6f 6c 2c 20 7a 43 6f 6c 6c 61 74 65 29   zCol, zCollate)
bbd0: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
bbe0: 3e 62 55 6e 69 71 75 65 3d 3d 30 20 7c 7c 20 73  >bUnique==0 || s
bbf0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
bc00: 74 28 70 58 49 6e 66 6f 2c 20 35 29 20 29 7b 0a  t(pXInfo, 5) ){.
bc10: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
bc20: 20 2a 7a 4f 72 64 65 72 20 3d 20 28 62 44 65 73   *zOrder = (bDes
bc30: 63 20 3f 20 22 20 44 45 53 43 22 20 3a 20 22 22  c ? " DESC" : ""
bc40: 29 3b 0a 20 20 20 20 20 20 7a 49 6d 70 50 4b 20  );.      zImpPK 
bc50: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
bc60: 66 28 22 25 7a 25 73 5c 22 72 62 75 5f 69 6d 70  f("%z%s\"rbu_imp
bc70: 5f 25 64 25 77 5c 22 25 73 22 2c 20 0a 20 20 20  _%d%w\"%s", .   
bc80: 20 20 20 20 20 20 20 7a 49 6d 70 50 4b 2c 20 7a         zImpPK, z
bc90: 43 6f 6d 2c 20 6e 42 69 6e 64 2c 20 7a 43 6f 6c  Com, nBind, zCol
bca0: 2c 20 7a 4f 72 64 65 72 0a 20 20 20 20 20 20 29  , zOrder.      )
bcb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 49 6d 70  ;.    }.    zImp
bcc0: 43 6f 6c 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Cols = sqlite3_m
bcd0: 70 72 69 6e 74 66 28 22 25 7a 25 73 5c 22 72 62  printf("%z%s\"rb
bce0: 75 5f 69 6d 70 5f 25 64 25 77 5c 22 20 25 73 20  u_imp_%d%w\" %s 
bcf0: 43 4f 4c 4c 41 54 45 20 25 51 22 2c 20 0a 20 20  COLLATE %Q", .  
bd00: 20 20 20 20 20 20 7a 49 6d 70 43 6f 6c 73 2c 20        zImpCols, 
bd10: 7a 43 6f 6d 2c 20 6e 42 69 6e 64 2c 20 7a 43 6f  zCom, nBind, zCo
bd20: 6c 2c 20 7a 54 79 70 65 2c 20 7a 43 6f 6c 6c 61  l, zType, zColla
bd30: 74 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 7a 57  te.    );.    zW
bd40: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  here = sqlite3_m
bd50: 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
bd60: 22 25 7a 25 73 5c 22 72 62 75 5f 69 6d 70 5f 25  "%z%s\"rbu_imp_%
bd70: 64 25 77 5c 22 20 49 53 20 3f 22 2c 20 7a 57 68  d%w\" IS ?", zWh
bd80: 65 72 65 2c 20 7a 41 6e 64 2c 20 6e 42 69 6e 64  ere, zAnd, nBind
bd90: 2c 20 7a 43 6f 6c 0a 20 20 20 20 29 3b 0a 20 20  , zCol.    );.  
bda0: 20 20 69 66 28 20 7a 52 65 74 3d 3d 30 20 7c 7c    if( zRet==0 ||
bdb0: 20 7a 49 6d 70 50 4b 3d 3d 30 20 7c 7c 20 7a 49   zImpPK==0 || zI
bdc0: 6d 70 43 6f 6c 73 3d 3d 30 20 7c 7c 20 7a 57 68  mpCols==0 || zWh
bdd0: 65 72 65 3d 3d 30 20 29 20 72 63 20 3d 20 53 51  ere==0 ) rc = SQ
bde0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
bdf0: 7a 43 6f 6d 20 3d 20 22 2c 20 22 3b 0a 20 20 20  zCom = ", ";.   
be00: 20 7a 41 6e 64 20 3d 20 22 20 41 4e 44 20 22 3b   zAnd = " AND ";
be10: 0a 20 20 20 20 6e 42 69 6e 64 2b 2b 3b 0a 20 20  .    nBind++;.  
be20: 7d 0a 0a 20 20 72 63 32 20 3d 20 73 71 6c 69 74  }..  rc2 = sqlit
be30: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 58 49 6e  e3_finalize(pXIn
be40: 66 6f 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  fo);.  if( rc==S
be50: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
be60: 72 63 32 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d  rc2;..  if( rc!=
be70: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
be80: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 52   sqlite3_free(zR
be90: 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  et);.    sqlite3
bea0: 5f 66 72 65 65 28 7a 49 6d 70 43 6f 6c 73 29 3b  _free(zImpCols);
beb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
bec0: 65 28 7a 49 6d 70 50 4b 29 3b 0a 20 20 20 20 73  e(zImpPK);.    s
bed0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 68 65  qlite3_free(zWhe
bee0: 72 65 29 3b 0a 20 20 20 20 7a 52 65 74 20 3d 20  re);.    zRet = 
bef0: 30 3b 0a 20 20 20 20 7a 49 6d 70 43 6f 6c 73 20  0;.    zImpCols 
bf00: 3d 20 30 3b 0a 20 20 20 20 7a 49 6d 70 50 4b 20  = 0;.    zImpPK 
bf10: 3d 20 30 3b 0a 20 20 20 20 7a 57 68 65 72 65 20  = 0;.    zWhere 
bf20: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  = 0;.    p->rc =
bf30: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2a 70 7a 49   rc;.  }..  *pzI
bf40: 6d 70 6f 73 74 65 72 43 6f 6c 73 20 3d 20 7a 49  mposterCols = zI
bf50: 6d 70 43 6f 6c 73 3b 0a 20 20 2a 70 7a 49 6d 70  mpCols;.  *pzImp
bf60: 6f 73 74 65 72 50 6b 20 3d 20 7a 49 6d 70 50 4b  osterPk = zImpPK
bf70: 3b 0a 20 20 2a 70 7a 57 68 65 72 65 20 3d 20 7a  ;.  *pzWhere = z
bf80: 57 68 65 72 65 3b 0a 20 20 2a 70 6e 42 69 6e 64  Where;.  *pnBind
bf90: 20 3d 20 6e 42 69 6e 64 3b 0a 20 20 72 65 74 75   = nBind;.  retu
bfa0: 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn zRet;.}../*.*
bfb0: 2a 20 41 73 73 75 6d 69 6e 67 20 74 68 65 20 63  * Assuming the c
bfc0: 75 72 72 65 6e 74 20 74 61 62 6c 65 20 63 6f 6c  urrent table col
bfd0: 75 6d 6e 73 20 61 72 65 20 22 61 22 2c 20 22 62  umns are "a", "b
bfe0: 22 20 61 6e 64 20 22 63 22 2c 20 61 6e 64 20 74  " and "c", and t
bff0: 68 65 20 7a 4f 62 6a 0a 2a 2a 20 70 61 72 61 6d  he zObj.** param
c000: 74 65 72 20 69 73 20 70 61 73 73 65 64 20 22 6f  ter is passed "o
c010: 6c 64 22 2c 20 72 65 74 75 72 6e 20 61 20 73 74  ld", return a st
c020: 72 69 6e 67 20 6f 66 20 74 68 65 20 66 6f 72 6d  ring of the form
c030: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 22 6f 6c 64  :.**.**     "old
c040: 2e 61 2c 20 6f 6c 64 2e 62 2c 20 6f 6c 64 2e 62  .a, old.b, old.b
c050: 22 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68 65  ".**.** With the
c060: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 65 73   column names es
c070: 63 61 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  caped..**.** For
c080: 20 74 61 62 6c 65 73 20 77 69 74 68 20 69 6d 70   tables with imp
c090: 6c 69 63 69 74 20 72 6f 77 69 64 73 20 2d 20 52  licit rowids - R
c0a0: 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 61  BU_PK_EXTERNAL a
c0b0: 6e 64 20 52 42 55 5f 50 4b 5f 4e 4f 4e 45 2c 20  nd RBU_PK_NONE, 
c0c0: 61 70 70 65 6e 64 0a 2a 2a 20 74 68 65 20 74 65  append.** the te
c0d0: 78 74 20 22 2c 20 6f 6c 64 2e 5f 72 6f 77 69 64  xt ", old._rowid
c0e0: 5f 22 20 74 6f 20 74 68 65 20 72 65 74 75 72 6e  _" to the return
c0f0: 65 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61  ed value..*/.sta
c100: 74 69 63 20 63 68 61 72 20 2a 72 62 75 4f 62 6a  tic char *rbuObj
c110: 49 74 65 72 47 65 74 4f 6c 64 6c 69 73 74 28 0a  IterGetOldlist(.
c120: 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c    sqlite3rbu *p,
c130: 20 0a 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a   .  RbuObjIter *
c140: 70 49 74 65 72 2c 0a 20 20 63 6f 6e 73 74 20 63  pIter,.  const c
c150: 68 61 72 20 2a 7a 4f 62 6a 0a 29 7b 0a 20 20 63  har *zObj.){.  c
c160: 68 61 72 20 2a 7a 4c 69 73 74 20 3d 20 30 3b 0a  har *zList = 0;.
c170: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
c180: 49 54 45 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d  ITE_OK && pIter-
c190: 3e 61 62 49 6e 64 65 78 65 64 20 29 7b 0a 20 20  >abIndexed ){.  
c1a0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
c1b0: 20 3d 20 22 22 3b 0a 20 20 20 20 69 6e 74 20 69   = "";.    int i
c1c0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
c1d0: 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b  <pIter->nTblCol;
c1e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
c1f0: 20 70 49 74 65 72 2d 3e 61 62 49 6e 64 65 78 65   pIter->abIndexe
c200: 64 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  d[i] ){.        
c210: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
c220: 20 3d 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43   = pIter->azTblC
c230: 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7a  ol[i];.        z
c240: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d  List = sqlite3_m
c250: 70 72 69 6e 74 66 28 22 25 7a 25 73 25 73 2e 5c  printf("%z%s%s.\
c260: 22 25 77 5c 22 22 2c 20 7a 4c 69 73 74 2c 20 7a  "%w\"", zList, z
c270: 53 2c 20 7a 4f 62 6a 2c 20 7a 43 6f 6c 29 3b 0a  S, zObj, zCol);.
c280: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
c290: 20 20 20 20 20 7a 4c 69 73 74 20 3d 20 73 71 6c       zList = sql
c2a0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a  ite3_mprintf("%z
c2b0: 25 73 4e 55 4c 4c 22 2c 20 7a 4c 69 73 74 2c 20  %sNULL", zList, 
c2c0: 7a 53 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  zS);.      }.   
c2d0: 20 20 20 7a 53 20 3d 20 22 2c 20 22 3b 0a 20 20     zS = ", ";.  
c2e0: 20 20 20 20 69 66 28 20 7a 4c 69 73 74 3d 3d 30      if( zList==0
c2f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   ){.        p->r
c300: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
c310: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
c320: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
c330: 20 20 20 20 2f 2a 20 46 6f 72 20 61 20 74 61 62      /* For a tab
c340: 6c 65 20 77 69 74 68 20 69 6d 70 6c 69 63 69 74  le with implicit
c350: 20 72 6f 77 69 64 73 2c 20 61 70 70 65 6e 64 20   rowids, append 
c360: 22 6f 6c 64 2e 5f 72 6f 77 69 64 5f 22 20 74 6f  "old._rowid_" to
c370: 20 74 68 65 20 6c 69 73 74 2e 20 2a 2f 0a 20 20   the list. */.  
c380: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 65 54 79    if( pIter->eTy
c390: 70 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52  pe==RBU_PK_EXTER
c3a0: 4e 41 4c 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54  NAL || pIter->eT
c3b0: 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45  ype==RBU_PK_NONE
c3c0: 20 29 7b 0a 20 20 20 20 20 20 7a 4c 69 73 74 20   ){.      zList 
c3d0: 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20  = rbuMPrintf(p, 
c3e0: 22 25 7a 2c 20 25 73 2e 5f 72 6f 77 69 64 5f 22  "%z, %s._rowid_"
c3f0: 2c 20 7a 4c 69 73 74 2c 20 7a 4f 62 6a 29 3b 0a  , zList, zObj);.
c400: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
c410: 72 6e 20 7a 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn zList;.}../*.
c420: 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 78 70  ** Return an exp
c430: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 61 6e  ression that can
c440: 20 62 65 20 75 73 65 64 20 69 6e 20 61 20 57 48   be used in a WH
c450: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 6d 61  ERE clause to ma
c460: 74 63 68 20 74 68 65 0a 2a 2a 20 70 72 69 6d 61  tch the.** prima
c470: 72 79 20 6b 65 79 20 6f 66 20 74 68 65 20 63 75  ry key of the cu
c480: 72 72 65 6e 74 20 74 61 62 6c 65 2e 20 46 6f 72  rrent table. For
c490: 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
c4a0: 20 74 61 62 6c 65 20 69 73 3a 0a 2a 2a 0a 2a 2a   table is:.**.**
c4b0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
c4c0: 74 31 28 61 2c 20 62 2c 20 63 2c 20 50 52 49 4d  t1(a, b, c, PRIM
c4d0: 41 52 59 20 4b 45 59 28 62 2c 20 63 29 29 3b 0a  ARY KEY(b, c));.
c4e0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
c4f0: 20 73 74 72 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20   string:.**.**  
c500: 20 22 62 20 3d 20 3f 31 20 41 4e 44 20 63 20 3d   "b = ?1 AND c =
c510: 20 3f 32 22 0a 2a 2f 0a 73 74 61 74 69 63 20 63   ?2".*/.static c
c520: 68 61 72 20 2a 72 62 75 4f 62 6a 49 74 65 72 47  har *rbuObjIterG
c530: 65 74 57 68 65 72 65 28 0a 20 20 73 71 6c 69 74  etWhere(.  sqlit
c540: 65 33 72 62 75 20 2a 70 2c 20 0a 20 20 52 62 75  e3rbu *p, .  Rbu
c550: 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 0a 29  ObjIter *pIter.)
c560: 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 69 73 74 20  {.  char *zList 
c570: 3d 20 30 3b 0a 20 20 69 66 28 20 70 49 74 65 72  = 0;.  if( pIter
c580: 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
c590: 56 54 41 42 20 7c 7c 20 70 49 74 65 72 2d 3e 65  VTAB || pIter->e
c5a0: 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e  Type==RBU_PK_NON
c5b0: 45 20 29 7b 0a 20 20 20 20 7a 4c 69 73 74 20 3d  E ){.    zList =
c5c0: 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22   rbuMPrintf(p, "
c5d0: 5f 72 6f 77 69 64 5f 20 3d 20 3f 25 64 22 2c 20  _rowid_ = ?%d", 
c5e0: 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 2b 31  pIter->nTblCol+1
c5f0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
c600: 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55  Iter->eType==RBU
c610: 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 29 7b 0a  _PK_EXTERNAL ){.
c620: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
c630: 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 69  zSep = "";.    i
c640: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
c650: 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 54 62 6c  0; i<pIter->nTbl
c660: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
c670: 20 69 66 28 20 70 49 74 65 72 2d 3e 61 62 54 62   if( pIter->abTb
c680: 6c 50 6b 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  lPk[i] ){.      
c690: 20 20 7a 4c 69 73 74 20 3d 20 72 62 75 4d 50 72    zList = rbuMPr
c6a0: 69 6e 74 66 28 70 2c 20 22 25 7a 25 73 63 25 64  intf(p, "%z%sc%d
c6b0: 3d 3f 25 64 22 2c 20 7a 4c 69 73 74 2c 20 7a 53  =?%d", zList, zS
c6c0: 65 70 2c 20 69 2c 20 69 2b 31 29 3b 0a 20 20 20  ep, i, i+1);.   
c6d0: 20 20 20 20 20 7a 53 65 70 20 3d 20 22 20 41 4e       zSep = " AN
c6e0: 44 20 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  D ";.      }.   
c6f0: 20 7d 0a 20 20 20 20 7a 4c 69 73 74 20 3d 20 72   }.    zList = r
c700: 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 0a 20 20  buMPrintf(p, .  
c710: 20 20 20 20 20 20 22 5f 72 6f 77 69 64 5f 20 3d        "_rowid_ =
c720: 20 28 53 45 4c 45 43 54 20 69 64 20 46 52 4f 4d   (SELECT id FROM
c730: 20 72 62 75 5f 69 6d 70 6f 73 74 65 72 32 20 57   rbu_imposter2 W
c740: 48 45 52 45 20 25 7a 29 22 2c 20 7a 4c 69 73 74  HERE %z)", zList
c750: 0a 20 20 20 20 29 3b 0a 0a 20 20 7d 65 6c 73 65  .    );..  }else
c760: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
c770: 20 2a 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20   *zSep = "";.   
c780: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
c790: 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 54  i=0; i<pIter->nT
c7a0: 62 6c 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  blCol; i++){.   
c7b0: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 61 62     if( pIter->ab
c7c0: 54 62 6c 50 6b 5b 69 5d 20 29 7b 0a 20 20 20 20  TblPk[i] ){.    
c7d0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
c7e0: 7a 43 6f 6c 20 3d 20 70 49 74 65 72 2d 3e 61 7a  zCol = pIter->az
c7f0: 54 62 6c 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20  TblCol[i];.     
c800: 20 20 20 7a 4c 69 73 74 20 3d 20 72 62 75 4d 50     zList = rbuMP
c810: 72 69 6e 74 66 28 70 2c 20 22 25 7a 25 73 5c 22  rintf(p, "%z%s\"
c820: 25 77 5c 22 3d 3f 25 64 22 2c 20 7a 4c 69 73 74  %w\"=?%d", zList
c830: 2c 20 7a 53 65 70 2c 20 7a 43 6f 6c 2c 20 69 2b  , zSep, zCol, i+
c840: 31 29 3b 0a 20 20 20 20 20 20 20 20 7a 53 65 70  1);.        zSep
c850: 20 3d 20 22 20 41 4e 44 20 22 3b 0a 20 20 20 20   = " AND ";.    
c860: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
c870: 72 65 74 75 72 6e 20 7a 4c 69 73 74 3b 0a 7d 0a  return zList;.}.
c880: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 53 45 4c 45 43  ./*.** The SELEC
c890: 54 20 73 74 61 74 65 6d 65 6e 74 20 69 74 65 72  T statement iter
c8a0: 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68  ating through th
c8b0: 65 20 6b 65 79 73 20 66 6f 72 20 74 68 65 20 63  e keys for the c
c8c0: 75 72 72 65 6e 74 20 6f 62 6a 65 63 74 0a 2a 2a  urrent object.**
c8d0: 20 28 70 2d 3e 6f 62 6a 69 74 65 72 2e 70 53 65   (p->objiter.pSe
c8e0: 6c 65 63 74 29 20 63 75 72 72 65 6e 74 6c 79 20  lect) currently 
c8f0: 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 69  points to a vali
c900: 64 20 72 6f 77 2e 20 48 6f 77 65 76 65 72 2c 20  d row. However, 
c910: 74 68 65 72 65 0a 2a 2a 20 69 73 20 73 6f 6d 65  there.** is some
c920: 74 68 69 6e 67 20 77 72 6f 6e 67 20 77 69 74 68  thing wrong with
c930: 20 74 68 65 20 72 62 75 5f 63 6f 6e 74 72 6f 6c   the rbu_control
c940: 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 72 62   value in the rb
c950: 75 5f 63 6f 6e 74 72 6f 6c 20 76 61 6c 75 65 0a  u_control value.
c960: 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ** stored in the
c970: 20 28 70 2d 3e 6e 43 6f 6c 2b 31 29 27 74 68 20   (p->nCol+1)'th 
c980: 63 6f 6c 75 6d 6e 2e 20 53 65 74 20 74 68 65 20  column. Set the 
c990: 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65  error code and e
c9a0: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20  rror message.** 
c9b0: 6f 66 20 74 68 65 20 52 42 55 20 68 61 6e 64 6c  of the RBU handl
c9c0: 65 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 20 72  e to something r
c9d0: 65 66 6c 65 63 74 69 6e 67 20 74 68 69 73 2e 0a  eflecting this..
c9e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
c9f0: 62 75 42 61 64 43 6f 6e 74 72 6f 6c 45 72 72 6f  buBadControlErro
ca00: 72 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29  r(sqlite3rbu *p)
ca10: 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49  {.  p->rc = SQLI
ca20: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 70 2d 3e 7a  TE_ERROR;.  p->z
ca30: 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33  Errmsg = sqlite3
ca40: 5f 6d 70 72 69 6e 74 66 28 22 69 6e 76 61 6c 69  _mprintf("invali
ca50: 64 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 76 61  d rbu_control va
ca60: 6c 75 65 22 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  lue");.}.../*.**
ca70: 20 52 65 74 75 72 6e 20 61 20 6e 75 6c 2d 74 65   Return a nul-te
ca80: 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20  rminated string 
ca90: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
caa0: 6f 6d 6d 61 20 73 65 70 61 72 61 74 65 64 20 6c  omma separated l
cab0: 69 73 74 20 6f 66 0a 2a 2a 20 61 73 73 69 67 6e  ist of.** assign
cac0: 6d 65 6e 74 73 20 74 68 61 74 20 73 68 6f 75 6c  ments that shoul
cad0: 64 20 62 65 20 69 6e 63 6c 75 64 65 64 20 66 6f  d be included fo
cae0: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 22 53 45 54  llowing the "SET
caf0: 22 20 6b 65 79 77 6f 72 64 20 6f 66 0a 2a 2a 20  " keyword of.** 
cb00: 61 6e 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  an UPDATE statem
cb10: 65 6e 74 20 75 73 65 64 20 74 6f 20 75 70 64 61  ent used to upda
cb20: 74 65 20 74 68 65 20 74 61 62 6c 65 20 6f 62 6a  te the table obj
cb30: 65 63 74 20 74 68 61 74 20 74 68 65 20 69 74 65  ect that the ite
cb40: 72 61 74 6f 72 0a 2a 2a 20 70 61 73 73 65 64 20  rator.** passed 
cb50: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
cb60: 67 75 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79  gument currently
cb70: 20 70 6f 69 6e 74 73 20 74 6f 20 69 66 20 74 68   points to if th
cb80: 65 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 0a 2a 2a  e rbu_control.**
cb90: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 64   column of the d
cba0: 61 74 61 5f 78 78 78 20 74 61 62 6c 65 20 65 6e  ata_xxx table en
cbb0: 74 72 79 20 69 73 20 73 65 74 20 74 6f 20 7a 4d  try is set to zM
cbc0: 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  ask..**.** The m
cbd0: 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 72 65  emory for the re
cbe0: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73  turned string is
cbf0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
cc00: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
cc10: 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72 65  .** It is the re
cc20: 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
cc30: 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  the caller to ev
cc40: 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 69 74  entually free it
cc50: 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65   using.** sqlite
cc60: 33 5f 66 72 65 65 28 29 2e 20 0a 2a 2a 0a 2a 2a  3_free(). .**.**
cc70: 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   If an OOM error
cc80: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
cc90: 77 68 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67 20  when allocating 
cca0: 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65  space for the ne
ccb0: 77 0a 2a 2a 20 73 74 72 69 6e 67 2c 20 61 6e 20  w.** string, an 
ccc0: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65  error code is le
ccd0: 66 74 20 69 6e 20 74 68 65 20 72 62 75 20 68 61  ft in the rbu ha
cce0: 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74  ndle passed as t
ccf0: 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75  he first.** argu
cd00: 6d 65 6e 74 20 61 6e 64 20 4e 55 4c 4c 20 69 73  ment and NULL is
cd10: 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69   returned. Or, i
cd20: 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61  f an error has a
cd30: 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 0a  lready occurred.
cd40: 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ** when this fun
cd50: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
cd60: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
cd70: 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 77  d immediately, w
cd80: 69 74 68 6f 75 74 0a 2a 2a 20 61 74 74 65 6d 70  ithout.** attemp
cd90: 74 69 6e 67 20 74 68 65 20 61 6c 6c 6f 63 61 74  ting the allocat
cda0: 69 6f 6e 20 6f 72 20 6d 6f 64 69 66 79 69 6e 67  ion or modifying
cdb0: 20 74 68 65 20 73 74 6f 72 65 64 20 65 72 72 6f   the stored erro
cdc0: 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
cdd0: 63 20 63 68 61 72 20 2a 72 62 75 4f 62 6a 49 74  c char *rbuObjIt
cde0: 65 72 47 65 74 53 65 74 6c 69 73 74 28 0a 20 20  erGetSetlist(.  
cdf0: 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 0a 20  sqlite3rbu *p,. 
ce00: 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74   RbuObjIter *pIt
ce10: 65 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  er,.  const char
ce20: 20 2a 7a 4d 61 73 6b 0a 29 7b 0a 20 20 63 68 61   *zMask.){.  cha
ce30: 72 20 2a 7a 4c 69 73 74 20 3d 20 30 3b 0a 20 20  r *zList = 0;.  
ce40: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
ce50: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
ce60: 69 3b 0a 0a 20 20 20 20 69 66 28 20 28 69 6e 74  i;..    if( (int
ce70: 29 73 74 72 6c 65 6e 28 7a 4d 61 73 6b 29 21 3d  )strlen(zMask)!=
ce80: 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20 29  pIter->nTblCol )
ce90: 7b 0a 20 20 20 20 20 20 72 62 75 42 61 64 43 6f  {.      rbuBadCo
cea0: 6e 74 72 6f 6c 45 72 72 6f 72 28 70 29 3b 0a 20  ntrolError(p);. 
ceb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
cec0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70  const char *zSep
ced0: 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 66 6f 72   = "";.      for
cee0: 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e  (i=0; i<pIter->n
cef0: 54 62 6c 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  TblCol; i++){.  
cf00: 20 20 20 20 20 20 63 68 61 72 20 63 20 3d 20 7a        char c = z
cf10: 4d 61 73 6b 5b 70 49 74 65 72 2d 3e 61 69 53 72  Mask[pIter->aiSr
cf20: 63 4f 72 64 65 72 5b 69 5d 5d 3b 0a 20 20 20 20  cOrder[i]];.    
cf30: 20 20 20 20 69 66 28 20 63 3d 3d 27 78 27 20 29      if( c=='x' )
cf40: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4c 69 73  {.          zLis
cf50: 74 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70  t = rbuMPrintf(p
cf60: 2c 20 22 25 7a 25 73 5c 22 25 77 5c 22 3d 3f 25  , "%z%s\"%w\"=?%
cf70: 64 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  d", .           
cf80: 20 20 20 7a 4c 69 73 74 2c 20 7a 53 65 70 2c 20     zList, zSep, 
cf90: 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b  pIter->azTblCol[
cfa0: 69 5d 2c 20 69 2b 31 0a 20 20 20 20 20 20 20 20  i], i+1.        
cfb0: 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a    );.          z
cfc0: 53 65 70 20 3d 20 22 2c 20 22 3b 0a 20 20 20 20  Sep = ", ";.    
cfd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 65 6c      }.        el
cfe0: 73 65 20 69 66 28 20 63 3d 3d 27 64 27 20 29 7b  se if( c=='d' ){
cff0: 0a 20 20 20 20 20 20 20 20 20 20 7a 4c 69 73 74  .          zList
d000: 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c   = rbuMPrintf(p,
d010: 20 22 25 7a 25 73 5c 22 25 77 5c 22 3d 72 62 75   "%z%s\"%w\"=rbu
d020: 5f 64 65 6c 74 61 28 5c 22 25 77 5c 22 2c 20 3f  _delta(\"%w\", ?
d030: 25 64 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20  %d)", .         
d040: 20 20 20 20 20 7a 4c 69 73 74 2c 20 7a 53 65 70       zList, zSep
d050: 2c 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f  , pIter->azTblCo
d060: 6c 5b 69 5d 2c 20 70 49 74 65 72 2d 3e 61 7a 54  l[i], pIter->azT
d070: 62 6c 43 6f 6c 5b 69 5d 2c 20 69 2b 31 0a 20 20  blCol[i], i+1.  
d080: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
d090: 20 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 20 22       zSep = ", "
d0a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d0b0: 20 20 20 20 65 6c 73 65 20 69 66 28 20 63 3d 3d      else if( c==
d0c0: 27 66 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  'f' ){.         
d0d0: 20 7a 4c 69 73 74 20 3d 20 72 62 75 4d 50 72 69   zList = rbuMPri
d0e0: 6e 74 66 28 70 2c 20 22 25 7a 25 73 5c 22 25 77  ntf(p, "%z%s\"%w
d0f0: 5c 22 3d 72 62 75 5f 66 6f 73 73 69 6c 5f 64 65  \"=rbu_fossil_de
d100: 6c 74 61 28 5c 22 25 77 5c 22 2c 20 3f 25 64 29  lta(\"%w\", ?%d)
d110: 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
d120: 20 20 7a 4c 69 73 74 2c 20 7a 53 65 70 2c 20 70    zList, zSep, p
d130: 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69  Iter->azTblCol[i
d140: 5d 2c 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43  ], pIter->azTblC
d150: 6f 6c 5b 69 5d 2c 20 69 2b 31 0a 20 20 20 20 20  ol[i], i+1.     
d160: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
d170: 20 20 7a 53 65 70 20 3d 20 22 2c 20 22 3b 0a 20    zSep = ", ";. 
d180: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
d190: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
d1a0: 75 72 6e 20 7a 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn zList;.}../*
d1b0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6e 75 6c  .** Return a nul
d1c0: 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
d1d0: 6e 67 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66  ng consisting of
d1e0: 20 6e 42 79 74 65 20 63 6f 6d 6d 61 20 73 65 70   nByte comma sep
d1f0: 61 72 61 74 65 64 0a 2a 2a 20 22 3f 22 20 65 78  arated.** "?" ex
d200: 70 72 65 73 73 69 6f 6e 73 2e 20 46 6f 72 20 65  pressions. For e
d210: 78 61 6d 70 6c 65 2c 20 69 66 20 6e 42 79 74 65  xample, if nByte
d220: 20 69 73 20 33 2c 20 72 65 74 75 72 6e 20 61 20   is 3, return a 
d230: 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 61 20  pointer to.** a 
d240: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
d250: 67 20 74 68 65 20 73 74 72 69 6e 67 20 22 3f 2c  g the string "?,
d260: 3f 2c 3f 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ?,?"..**.** The 
d270: 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 72  memory for the r
d280: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
d290: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
d2a0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
d2b0: 2e 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72  ..** It is the r
d2c0: 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
d2d0: 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65   the caller to e
d2e0: 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 69  ventually free i
d2f0: 74 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74  t using.** sqlit
d300: 65 33 5f 66 72 65 65 28 29 2e 20 0a 2a 2a 0a 2a  e3_free(). .**.*
d310: 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  * If an OOM erro
d320: 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
d330: 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67   when allocating
d340: 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e   space for the n
d350: 65 77 0a 2a 2a 20 73 74 72 69 6e 67 2c 20 61 6e  ew.** string, an
d360: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c   error code is l
d370: 65 66 74 20 69 6e 20 74 68 65 20 72 62 75 20 68  eft in the rbu h
d380: 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20  andle passed as 
d390: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67  the first.** arg
d3a0: 75 6d 65 6e 74 20 61 6e 64 20 4e 55 4c 4c 20 69  ument and NULL i
d3b0: 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20  s returned. Or, 
d3c0: 69 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  if an error has 
d3d0: 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
d3e0: 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75  .** when this fu
d3f0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
d400: 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
d410: 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20  ed immediately, 
d420: 77 69 74 68 6f 75 74 0a 2a 2a 20 61 74 74 65 6d  without.** attem
d430: 70 74 69 6e 67 20 74 68 65 20 61 6c 6c 6f 63 61  pting the alloca
d440: 74 69 6f 6e 20 6f 72 20 6d 6f 64 69 66 79 69 6e  tion or modifyin
d450: 67 20 74 68 65 20 73 74 6f 72 65 64 20 65 72 72  g the stored err
d460: 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
d470: 69 63 20 63 68 61 72 20 2a 72 62 75 4f 62 6a 49  ic char *rbuObjI
d480: 74 65 72 47 65 74 42 69 6e 64 6c 69 73 74 28 73  terGetBindlist(s
d490: 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 69 6e  qlite3rbu *p, in
d4a0: 74 20 6e 42 69 6e 64 29 7b 0a 20 20 63 68 61 72  t nBind){.  char
d4b0: 20 2a 7a 52 65 74 20 3d 20 30 3b 0a 20 20 69 6e   *zRet = 0;.  in
d4c0: 74 20 6e 42 79 74 65 20 3d 20 6e 42 69 6e 64 2a  t nByte = nBind*
d4d0: 32 20 2b 20 31 3b 0a 0a 20 20 7a 52 65 74 20 3d  2 + 1;..  zRet =
d4e0: 20 28 63 68 61 72 2a 29 72 62 75 4d 61 6c 6c 6f   (char*)rbuMallo
d4f0: 63 28 70 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69  c(p, nByte);.  i
d500: 66 28 20 7a 52 65 74 20 29 7b 0a 20 20 20 20 69  f( zRet ){.    i
d510: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
d520: 30 3b 20 69 3c 6e 42 69 6e 64 3b 20 69 2b 2b 29  0; i<nBind; i++)
d530: 7b 0a 20 20 20 20 20 20 7a 52 65 74 5b 69 2a 32  {.      zRet[i*2
d540: 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20 20 20 7a  ] = '?';.      z
d550: 52 65 74 5b 69 2a 32 2b 31 5d 20 3d 20 28 69 2b  Ret[i*2+1] = (i+
d560: 31 3d 3d 6e 42 69 6e 64 29 20 3f 20 27 5c 30 27  1==nBind) ? '\0'
d570: 20 3a 20 27 2c 27 3b 0a 20 20 20 20 7d 0a 20 20   : ',';.    }.  
d580: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b  }.  return zRet;
d590: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 74  .}../*.** The it
d5a0: 65 72 61 74 6f 72 20 63 75 72 72 65 6e 74 6c 79  erator currently
d5b0: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 74 61 62   points to a tab
d5c0: 6c 65 20 28 6e 6f 74 20 69 6e 64 65 78 29 20 6f  le (not index) o
d5d0: 66 20 74 79 70 65 20 0a 2a 2a 20 52 42 55 5f 50  f type .** RBU_P
d5e0: 4b 5f 57 49 54 48 4f 55 54 5f 52 4f 57 49 44 2e  K_WITHOUT_ROWID.
d5f0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
d600: 72 65 61 74 65 73 20 74 68 65 20 50 52 49 4d 41  reates the PRIMA
d610: 52 59 20 4b 45 59 20 0a 2a 2a 20 64 65 63 6c 61  RY KEY .** decla
d620: 72 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 63  ration for the c
d630: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69 6d 70  orresponding imp
d640: 6f 73 74 65 72 20 74 61 62 6c 65 2e 20 46 6f 72  oster table. For
d650: 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 69 66 20   example,.** if 
d660: 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69  the iterator poi
d670: 6e 74 73 20 74 6f 20 61 20 74 61 62 6c 65 20 63  nts to a table c
d680: 72 65 61 74 65 64 20 61 73 3a 0a 2a 2a 0a 2a 2a  reated as:.**.**
d690: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
d6a0: 74 31 28 61 2c 20 62 2c 20 63 2c 20 50 52 49 4d  t1(a, b, c, PRIM
d6b0: 41 52 59 20 4b 45 59 28 62 2c 20 61 20 44 45 53  ARY KEY(b, a DES
d6c0: 43 29 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49  C)) WITHOUT ROWI
d6d0: 44 0a 2a 2a 0a 2a 2a 20 74 68 69 73 20 66 75 6e  D.**.** this fun
d6e0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 3a 0a 2a  ction returns:.*
d6f0: 2a 0a 2a 2a 20 20 20 50 52 49 4d 41 52 59 20 4b  *.**   PRIMARY K
d700: 45 59 28 22 62 22 2c 20 22 61 22 20 44 45 53 43  EY("b", "a" DESC
d710: 29 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ).*/.static char
d720: 20 2a 72 62 75 57 69 74 68 6f 75 74 52 6f 77 69   *rbuWithoutRowi
d730: 64 50 4b 28 73 71 6c 69 74 65 33 72 62 75 20 2a  dPK(sqlite3rbu *
d740: 70 2c 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70  p, RbuObjIter *p
d750: 49 74 65 72 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Iter){.  char *z
d760: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
d770: 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d 30 20 29  pIter->zIdx==0 )
d780: 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
d790: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
d7a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70  const char *zSep
d7b0: 20 3d 20 22 50 52 49 4d 41 52 59 20 4b 45 59 28   = "PRIMARY KEY(
d7c0: 22 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ";.    sqlite3_s
d7d0: 74 6d 74 20 2a 70 58 4c 69 73 74 20 3d 20 30 3b  tmt *pXList = 0;
d7e0: 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 69       /* PRAGMA i
d7f0: 6e 64 65 78 5f 6c 69 73 74 20 3d 20 28 70 49 74  ndex_list = (pIt
d800: 65 72 2d 3e 7a 54 62 6c 29 20 2a 2f 0a 20 20 20  er->zTbl) */.   
d810: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
d820: 58 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 2f  XInfo = 0;     /
d830: 2a 20 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 78  * PRAGMA index_x
d840: 69 6e 66 6f 20 3d 20 3c 70 6b 2d 69 6e 64 65 78  info = <pk-index
d850: 3e 20 2a 2f 0a 20 20 20 0a 20 20 20 20 70 2d 3e  > */.   .    p->
d860: 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65  rc = prepareFree
d870: 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
d880: 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 58 4c 69  p->dbMain, &pXLi
d890: 73 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c  st, &p->zErrmsg,
d8a0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d8b0: 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41  _mprintf("PRAGMA
d8c0: 20 6d 61 69 6e 2e 69 6e 64 65 78 5f 6c 69 73 74   main.index_list
d8d0: 20 3d 20 25 51 22 2c 20 70 49 74 65 72 2d 3e 7a   = %Q", pIter->z
d8e0: 54 62 6c 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  Tbl).    );.    
d8f0: 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51  while( p->rc==SQ
d900: 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54  LITE_OK && SQLIT
d910: 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
d920: 74 65 70 28 70 58 4c 69 73 74 29 20 29 7b 0a 20  tep(pXList) ){. 
d930: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
d940: 2a 7a 4f 72 69 67 20 3d 20 28 63 6f 6e 73 74 20  *zOrig = (const 
d950: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
d960: 6c 75 6d 6e 5f 74 65 78 74 28 70 58 4c 69 73 74  lumn_text(pXList
d970: 2c 33 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  ,3);.      if( z
d980: 4f 72 69 67 20 26 26 20 73 74 72 63 6d 70 28 7a  Orig && strcmp(z
d990: 4f 72 69 67 2c 20 22 70 6b 22 29 3d 3d 30 20 29  Orig, "pk")==0 )
d9a0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
d9b0: 63 68 61 72 20 2a 7a 49 64 78 20 3d 20 28 63 6f  char *zIdx = (co
d9c0: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
d9d0: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 58  3_column_text(pX
d9e0: 4c 69 73 74 2c 31 29 3b 0a 20 20 20 20 20 20 20  List,1);.       
d9f0: 20 69 66 28 20 7a 49 64 78 20 29 7b 0a 20 20 20   if( zIdx ){.   
da00: 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70         p->rc = p
da10: 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c  repareFreeAndCol
da20: 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d  lectError(p->dbM
da30: 61 69 6e 2c 20 26 70 58 49 6e 66 6f 2c 20 26 70  ain, &pXInfo, &p
da40: 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20 20  ->zErrmsg,.     
da50: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
da60: 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41  _mprintf("PRAGMA
da70: 20 6d 61 69 6e 2e 69 6e 64 65 78 5f 78 69 6e 66   main.index_xinf
da80: 6f 20 3d 20 25 51 22 2c 20 7a 49 64 78 29 0a 20  o = %Q", zIdx). 
da90: 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
daa0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
dab0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
dac0: 20 7d 0a 20 20 20 20 72 62 75 46 69 6e 61 6c 69   }.    rbuFinali
dad0: 7a 65 28 70 2c 20 70 58 4c 69 73 74 29 3b 0a 0a  ze(p, pXList);..
dae0: 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63      while( p->rc
daf0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53  ==SQLITE_OK && S
db00: 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
db10: 65 33 5f 73 74 65 70 28 70 58 49 6e 66 6f 29 20  e3_step(pXInfo) 
db20: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( 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 35 29 20 29 7b 0a 20 20  pXInfo, 5) ){.  
db50: 20 20 20 20 20 20 2f 2a 20 69 6e 74 20 69 43 69        /* int iCi
db60: 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  d = sqlite3_colu
db70: 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20 30  mn_int(pXInfo, 0
db80: 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f  ); */.        co
db90: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d  nst char *zCol =
dba0: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
dbb0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
dbc0: 74 28 70 58 49 6e 66 6f 2c 20 32 29 3b 0a 20 20  t(pXInfo, 2);.  
dbd0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
dbe0: 20 2a 7a 44 65 73 63 20 3d 20 73 71 6c 69 74 65   *zDesc = sqlite
dbf0: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49  3_column_int(pXI
dc00: 6e 66 6f 2c 20 33 29 20 3f 20 22 20 44 45 53 43  nfo, 3) ? " DESC
dc10: 22 20 3a 20 22 22 3b 0a 20 20 20 20 20 20 20 20  " : "";.        
dc20: 7a 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70  z = rbuMPrintf(p
dc30: 2c 20 22 25 7a 25 73 5c 22 25 77 5c 22 25 73 22  , "%z%s\"%w\"%s"
dc40: 2c 20 7a 2c 20 7a 53 65 70 2c 20 7a 43 6f 6c 2c  , z, zSep, zCol,
dc50: 20 7a 44 65 73 63 29 3b 0a 20 20 20 20 20 20 20   zDesc);.       
dc60: 20 7a 53 65 70 20 3d 20 22 2c 20 22 3b 0a 20 20   zSep = ", ";.  
dc70: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
dc80: 7a 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70  z = rbuMPrintf(p
dc90: 2c 20 22 25 7a 29 22 2c 20 7a 29 3b 0a 20 20 20  , "%z)", z);.   
dca0: 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20   rbuFinalize(p, 
dcb0: 70 58 49 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72  pXInfo);.  }.  r
dcc0: 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn z;.}../*.*
dcd0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
dce0: 63 72 65 61 74 65 73 20 74 68 65 20 73 65 63 6f  creates the seco
dcf0: 6e 64 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  nd imposter tabl
dd00: 65 20 75 73 65 64 20 77 68 65 6e 20 77 72 69 74  e used when writ
dd10: 69 6e 67 20 74 6f 0a 2a 2a 20 61 20 74 61 62 6c  ing to.** a tabl
dd20: 65 20 62 2d 74 72 65 65 20 77 68 65 72 65 20 74  e b-tree where t
dd30: 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20  he table has an 
dd40: 65 78 74 65 72 6e 61 6c 20 70 72 69 6d 61 72 79  external primary
dd50: 20 6b 65 79 2e 20 49 66 20 74 68 65 0a 2a 2a 20   key. If the.** 
dd60: 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20  iterator passed 
dd70: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
dd80: 67 75 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20  gument does not 
dd90: 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 20  currently point 
dda0: 74 6f 0a 2a 2a 20 61 20 74 61 62 6c 65 20 28 6e  to.** a table (n
ddb0: 6f 74 20 69 6e 64 65 78 29 20 77 69 74 68 20 61  ot index) with a
ddc0: 6e 20 65 78 74 65 72 6e 61 6c 20 70 72 69 6d 61  n external prima
ddd0: 72 79 20 6b 65 79 2c 20 74 68 69 73 20 66 75 6e  ry key, this fun
dde0: 63 74 69 6f 6e 20 69 73 20 61 0a 2a 2a 20 6e 6f  ction is a.** no
ddf0: 2d 6f 70 2e 20 0a 2a 2a 0a 2a 2a 20 41 73 73 75  -op. .**.** Assu
de00: 6d 69 6e 67 20 74 68 65 20 69 74 65 72 61 74 6f  ming the iterato
de10: 72 20 64 6f 65 73 20 70 6f 69 6e 74 20 74 6f 20  r does point to 
de20: 61 20 74 61 62 6c 65 20 77 69 74 68 20 61 6e 20  a table with an 
de30: 65 78 74 65 72 6e 61 6c 20 50 4b 2c 20 74 68 69  external PK, thi
de40: 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 63 72  s.** function cr
de50: 65 61 74 65 73 20 61 20 57 49 54 48 4f 55 54 20  eates a WITHOUT 
de60: 52 4f 57 49 44 20 69 6d 70 6f 73 74 65 72 20 74  ROWID imposter t
de70: 61 62 6c 65 20 6e 61 6d 65 64 20 22 72 62 75 5f  able named "rbu_
de80: 69 6d 70 6f 73 74 65 72 32 22 0a 2a 2a 20 75 73  imposter2".** us
de90: 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 61  ed to access tha
dea0: 74 20 50 4b 20 69 6e 64 65 78 2e 20 46 6f 72 20  t PK index. For 
deb0: 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
dec0: 74 61 72 67 65 74 20 74 61 62 6c 65 20 69 73 0a  target table is.
ded0: 2a 2a 20 64 65 63 6c 61 72 65 64 20 61 73 20 66  ** declared as f
dee0: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
def0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
df00: 61 2c 20 62 20 54 45 58 54 2c 20 63 20 52 45 41  a, b TEXT, c REA
df10: 4c 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 62  L, PRIMARY KEY(b
df20: 2c 20 63 29 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65  , c));.**.** the
df30: 6e 20 74 68 65 20 69 6d 70 6f 73 74 65 72 20 74  n the imposter t
df40: 61 62 6c 65 20 73 63 68 65 6d 61 20 69 73 3a 0a  able schema is:.
df50: 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54  **.**   CREATE T
df60: 41 42 4c 45 20 72 62 75 5f 69 6d 70 6f 73 74 65  ABLE rbu_imposte
df70: 72 32 28 63 31 20 54 45 58 54 2c 20 63 32 20 52  r2(c1 TEXT, c2 R
df80: 45 41 4c 2c 20 69 64 20 49 4e 54 45 47 45 52 29  EAL, id INTEGER)
df90: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 3b 0a   WITHOUT ROWID;.
dfa0: 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  **.*/.static voi
dfb0: 64 20 72 62 75 43 72 65 61 74 65 49 6d 70 6f 73  d rbuCreateImpos
dfc0: 74 65 72 54 61 62 6c 65 32 28 73 71 6c 69 74 65  terTable2(sqlite
dfd0: 33 72 62 75 20 2a 70 2c 20 52 62 75 4f 62 6a 49  3rbu *p, RbuObjI
dfe0: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
dff0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
e000: 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d 3e 65 54  _OK && pIter->eT
e010: 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45  ype==RBU_PK_EXTE
e020: 52 4e 41 4c 20 29 7b 0a 20 20 20 20 69 6e 74 20  RNAL ){.    int 
e030: 74 6e 75 6d 20 3d 20 70 49 74 65 72 2d 3e 69 50  tnum = pIter->iP
e040: 6b 54 6e 75 6d 3b 20 20 20 20 2f 2a 20 52 6f 6f  kTnum;    /* Roo
e050: 74 20 70 61 67 65 20 6f 66 20 50 4b 20 69 6e 64  t page of PK ind
e060: 65 78 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ex */.    sqlite
e070: 33 5f 73 74 6d 74 20 2a 70 51 75 65 72 79 20 3d  3_stmt *pQuery =
e080: 20 30 3b 20 20 20 20 20 2f 2a 20 53 45 4c 45 43   0;     /* SELEC
e090: 54 20 6e 61 6d 65 20 2e 2e 2e 20 57 48 45 52 45  T name ... WHERE
e0a0: 20 72 6f 6f 74 70 61 67 65 20 3d 20 24 74 6e 75   rootpage = $tnu
e0b0: 6d 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63  m */.    const c
e0c0: 68 61 72 20 2a 7a 49 64 78 20 3d 20 30 3b 20 20  har *zIdx = 0;  
e0d0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
e0e0: 66 20 50 4b 20 69 6e 64 65 78 20 2a 2f 0a 20 20  f PK index */.  
e0f0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
e100: 70 58 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20  pXInfo = 0;     
e110: 2f 2a 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 69  /* PRAGMA main.i
e120: 6e 64 65 78 5f 78 69 6e 66 6f 20 3d 20 24 7a 49  ndex_xinfo = $zI
e130: 64 78 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  dx */.    const 
e140: 63 68 61 72 20 2a 7a 43 6f 6d 6d 61 20 3d 20 22  char *zComma = "
e150: 22 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  ";.    char *zCo
e160: 6c 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ls = 0;         
e170: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
e180: 62 75 69 6c 64 20 75 70 20 6c 69 73 74 20 6f 66  build up list of
e190: 20 74 61 62 6c 65 20 63 6f 6c 73 20 2a 2f 0a 20   table cols */. 
e1a0: 20 20 20 63 68 61 72 20 2a 7a 50 6b 20 3d 20 30     char *zPk = 0
e1b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e1c0: 20 2f 2a 20 55 73 65 64 20 74 6f 20 62 75 69 6c   /* Used to buil
e1d0: 64 20 75 70 20 74 61 62 6c 65 20 50 4b 20 64 65  d up table PK de
e1e0: 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20  claration */..  
e1f0: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
e200: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
e210: 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65  primary key inde
e220: 78 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  x for the curren
e230: 74 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20  t table..    ** 
e240: 54 68 69 73 20 69 73 20 6e 65 65 64 65 64 20 66  This is needed f
e250: 6f 72 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  or the argument 
e260: 74 6f 20 22 50 52 41 47 4d 41 20 69 6e 64 65 78  to "PRAGMA index
e270: 5f 78 69 6e 66 6f 22 2e 20 53 65 74 0a 20 20 20  _xinfo". Set.   
e280: 20 2a 2a 20 7a 49 64 78 20 74 6f 20 70 6f 69 6e   ** zIdx to poin
e290: 74 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69  t to a nul-termi
e2a0: 6e 61 74 65 64 20 73 74 72 69 6e 67 20 63 6f 6e  nated string con
e2b0: 74 61 69 6e 69 6e 67 20 74 68 69 73 20 6e 61 6d  taining this nam
e2c0: 65 2e 20 2a 2f 0a 20 20 20 20 70 2d 3e 72 63 20  e. */.    p->rc 
e2d0: 3d 20 70 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c  = prepareAndColl
e2e0: 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61  ectError(p->dbMa
e2f0: 69 6e 2c 20 26 70 51 75 65 72 79 2c 20 26 70 2d  in, &pQuery, &p-
e300: 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20  >zErrmsg, .     
e310: 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20     "SELECT name 
e320: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
e330: 65 72 20 57 48 45 52 45 20 72 6f 6f 74 70 61 67  er WHERE rootpag
e340: 65 20 3d 20 3f 22 0a 20 20 20 20 29 3b 0a 20 20  e = ?".    );.  
e350: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
e360: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
e370: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
e380: 28 70 51 75 65 72 79 2c 20 31 2c 20 74 6e 75 6d  (pQuery, 1, tnum
e390: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  );.      if( SQL
e3a0: 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
e3b0: 5f 73 74 65 70 28 70 51 75 65 72 79 29 20 29 7b  _step(pQuery) ){
e3c0: 0a 20 20 20 20 20 20 20 20 7a 49 64 78 20 3d 20  .        zIdx = 
e3d0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
e3e0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
e3f0: 28 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20  (pQuery, 0);.   
e400: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
e410: 66 28 20 7a 49 64 78 20 29 7b 0a 20 20 20 20 20  f( zIdx ){.     
e420: 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65   p->rc = prepare
e430: 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  FreeAndCollectEr
e440: 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26  ror(p->dbMain, &
e450: 70 58 49 6e 66 6f 2c 20 26 70 2d 3e 7a 45 72 72  pXInfo, &p->zErr
e460: 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20 73  msg,.          s
e470: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
e480: 50 52 41 47 4d 41 20 6d 61 69 6e 2e 69 6e 64 65  PRAGMA main.inde
e490: 78 5f 78 69 6e 66 6f 20 3d 20 25 51 22 2c 20 7a  x_xinfo = %Q", z
e4a0: 49 64 78 29 0a 20 20 20 20 20 20 29 3b 0a 20 20  Idx).      );.  
e4b0: 20 20 7d 0a 20 20 20 20 72 62 75 46 69 6e 61 6c    }.    rbuFinal
e4c0: 69 7a 65 28 70 2c 20 70 51 75 65 72 79 29 3b 0a  ize(p, pQuery);.
e4d0: 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72  .    while( p->r
e4e0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
e4f0: 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
e500: 74 65 33 5f 73 74 65 70 28 70 58 49 6e 66 6f 29  te3_step(pXInfo)
e510: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 4b   ){.      int bK
e520: 65 79 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ey = sqlite3_col
e530: 75 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20  umn_int(pXInfo, 
e540: 35 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4b  5);.      if( bK
e550: 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ey ){.        in
e560: 74 20 69 43 69 64 20 3d 20 73 71 6c 69 74 65 33  t iCid = sqlite3
e570: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49 6e  _column_int(pXIn
e580: 66 6f 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  fo, 1);.        
e590: 69 6e 74 20 62 44 65 73 63 20 3d 20 73 71 6c 69  int bDesc = sqli
e5a0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
e5b0: 58 49 6e 66 6f 2c 20 33 29 3b 0a 20 20 20 20 20  XInfo, 3);.     
e5c0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
e5d0: 43 6f 6c 6c 61 74 65 20 3d 20 28 63 6f 6e 73 74  Collate = (const
e5e0: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
e5f0: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 58 49 6e 66  olumn_text(pXInf
e600: 6f 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7a  o, 4);.        z
e610: 43 6f 6c 73 20 3d 20 72 62 75 4d 50 72 69 6e 74  Cols = rbuMPrint
e620: 66 28 70 2c 20 22 25 7a 25 73 63 25 64 20 25 73  f(p, "%z%sc%d %s
e630: 20 43 4f 4c 4c 41 54 45 20 25 73 22 2c 20 7a 43   COLLATE %s", zC
e640: 6f 6c 73 2c 20 7a 43 6f 6d 6d 61 2c 20 0a 20 20  ols, zComma, .  
e650: 20 20 20 20 20 20 20 20 20 20 69 43 69 64 2c 20            iCid, 
e660: 70 49 74 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65  pIter->azTblType
e670: 5b 69 43 69 64 5d 2c 20 7a 43 6f 6c 6c 61 74 65  [iCid], zCollate
e680: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
e690: 20 20 20 20 7a 50 6b 20 3d 20 72 62 75 4d 50 72      zPk = rbuMPr
e6a0: 69 6e 74 66 28 70 2c 20 22 25 7a 25 73 63 25 64  intf(p, "%z%sc%d
e6b0: 25 73 22 2c 20 7a 50 6b 2c 20 7a 43 6f 6d 6d 61  %s", zPk, zComma
e6c0: 2c 20 69 43 69 64 2c 20 62 44 65 73 63 3f 22 20  , iCid, bDesc?" 
e6d0: 44 45 53 43 22 3a 22 22 29 3b 0a 20 20 20 20 20  DESC":"");.     
e6e0: 20 20 20 7a 43 6f 6d 6d 61 20 3d 20 22 2c 20 22     zComma = ", "
e6f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e700: 20 20 20 20 7a 43 6f 6c 73 20 3d 20 72 62 75 4d      zCols = rbuM
e710: 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 2c 20 69  Printf(p, "%z, i
e720: 64 20 49 4e 54 45 47 45 52 22 2c 20 7a 43 6f 6c  d INTEGER", zCol
e730: 73 29 3b 0a 20 20 20 20 72 62 75 46 69 6e 61 6c  s);.    rbuFinal
e740: 69 7a 65 28 70 2c 20 70 58 49 6e 66 6f 29 3b 0a  ize(p, pXInfo);.
e750: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73  .    sqlite3_tes
e760: 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
e770: 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54  _TESTCTRL_IMPOST
e780: 45 52 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22  ER, p->dbMain, "
e790: 6d 61 69 6e 22 2c 20 31 2c 20 74 6e 75 6d 29 3b  main", 1, tnum);
e7a0: 0a 20 20 20 20 72 62 75 4d 50 72 69 6e 74 66 45  .    rbuMPrintfE
e7b0: 78 65 63 28 70 2c 20 70 2d 3e 64 62 4d 61 69 6e  xec(p, p->dbMain
e7c0: 2c 0a 20 20 20 20 20 20 20 20 22 43 52 45 41 54  ,.        "CREAT
e7d0: 45 20 54 41 42 4c 45 20 72 62 75 5f 69 6d 70 6f  E TABLE rbu_impo
e7e0: 73 74 65 72 32 28 25 7a 2c 20 50 52 49 4d 41 52  ster2(%z, PRIMAR
e7f0: 59 20 4b 45 59 28 25 7a 29 29 20 57 49 54 48 4f  Y KEY(%z)) WITHO
e800: 55 54 20 52 4f 57 49 44 22 2c 20 0a 20 20 20 20  UT ROWID", .    
e810: 20 20 20 20 7a 43 6f 6c 73 2c 20 7a 50 6b 0a 20      zCols, zPk. 
e820: 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
e830: 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
e840: 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
e850: 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 4d 61  MPOSTER, p->dbMa
e860: 69 6e 2c 20 22 6d 61 69 6e 22 2c 20 30 2c 20 30  in, "main", 0, 0
e870: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
e880: 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  If an error has 
e890: 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
e8a0: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
e8b0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
e8c0: 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  t .** immediatel
e8d0: 79 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 28  y returns zero (
e8e0: 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
e8f0: 79 20 77 6f 72 6b 29 2e 20 4f 72 2c 20 69 66 20  y work). Or, if 
e900: 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75  an error.** occu
e910: 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 65 78  rs during the ex
e920: 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20  ecution of this 
e930: 66 75 6e 63 74 69 6f 6e 2c 20 69 74 20 73 65 74  function, it set
e940: 73 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  s the error code
e950: 0a 2a 2a 20 69 6e 20 74 68 65 20 73 71 6c 69 74  .** in the sqlit
e960: 65 33 72 62 75 20 6f 62 6a 65 63 74 20 69 6e 64  e3rbu object ind
e970: 69 63 61 74 65 64 20 62 79 20 74 68 65 20 66 69  icated by the fi
e980: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 61 6e 64  rst argument and
e990: 20 72 65 74 75 72 6e 73 0a 2a 2a 20 7a 65 72 6f   returns.** zero
e9a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72  ..**.** The iter
e9b0: 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  ator passed as t
e9c0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
e9d0: 6e 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  nt is guaranteed
e9e0: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20   to point to.** 
e9f0: 61 20 74 61 62 6c 65 20 28 6e 6f 74 20 61 6e 20  a table (not an 
ea00: 69 6e 64 65 78 29 20 77 68 65 6e 20 74 68 69 73  index) when this
ea10: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
ea20: 6c 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69  led. This functi
ea30: 6f 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74  on.** attempts t
ea40: 6f 20 63 72 65 61 74 65 20 61 6e 79 20 69 6d 70  o create any imp
ea50: 6f 73 74 65 72 20 74 61 62 6c 65 20 72 65 71 75  oster table requ
ea60: 69 72 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f  ired to write to
ea70: 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 74 61 62   the main.** tab
ea80: 6c 65 20 62 2d 74 72 65 65 20 6f 66 20 74 68 65  le b-tree of the
ea90: 20 74 61 62 6c 65 20 62 65 66 6f 72 65 20 72 65   table before re
eaa0: 74 75 72 6e 69 6e 67 2e 20 4e 6f 6e 2d 7a 65 72  turning. Non-zer
eab0: 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  o is returned if
eac0: 0a 2a 2a 20 61 6e 20 69 6d 70 6f 73 74 65 72 20  .** an imposter 
ead0: 74 61 62 6c 65 20 61 72 65 20 63 72 65 61 74 65  table are create
eae0: 64 2c 20 6f 72 20 7a 65 72 6f 20 6f 74 68 65 72  d, or zero other
eaf0: 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69  wise..**.** An i
eb00: 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20 69 73  mposter table is
eb10: 20 72 65 71 75 69 72 65 64 20 69 6e 20 61 6c 6c   required in all
eb20: 20 63 61 73 65 73 20 65 78 63 65 70 74 20 52 42   cases except RB
eb30: 55 5f 50 4b 5f 56 54 41 42 2e 20 4f 6e 6c 79 0a  U_PK_VTAB. Only.
eb40: 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ** virtual table
eb50: 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 74 6f  s are written to
eb60: 20 64 69 72 65 63 74 6c 79 2e 20 54 68 65 20 69   directly. The i
eb70: 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20 68 61  mposter table ha
eb80: 73 20 74 68 65 20 0a 2a 2a 20 73 61 6d 65 20 73  s the .** same s
eb90: 63 68 65 6d 61 20 61 73 20 74 68 65 20 61 63 74  chema as the act
eba0: 75 61 6c 20 74 61 72 67 65 74 20 74 61 62 6c 65  ual target table
ebb0: 20 28 6c 65 73 73 20 61 6e 79 20 55 4e 49 51 55   (less any UNIQU
ebc0: 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 29 2e 20  E constraints). 
ebd0: 0a 2a 2a 20 4d 6f 72 65 20 70 72 65 63 69 73 65  .** More precise
ebe0: 6c 79 2c 20 74 68 65 20 22 73 61 6d 65 20 73 63  ly, the "same sc
ebf0: 68 65 6d 61 22 20 6d 65 61 6e 73 20 74 68 65 20  hema" means the 
ec00: 73 61 6d 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 79  same columns, ty
ec10: 70 65 73 2c 20 0a 2a 2a 20 63 6f 6c 6c 61 74 69  pes, .** collati
ec20: 6f 6e 20 73 65 71 75 65 6e 63 65 73 2e 20 46 6f  on sequences. Fo
ec30: 72 20 74 61 62 6c 65 73 20 74 68 61 74 20 64 6f  r tables that do
ec40: 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 65 78 74   not have an ext
ec50: 65 72 6e 61 6c 20 50 52 49 4d 41 52 59 0a 2a 2a  ernal PRIMARY.**
ec60: 20 4b 45 59 2c 20 69 74 20 61 6c 73 6f 20 6d 65   KEY, it also me
ec70: 61 6e 73 20 74 68 65 20 73 61 6d 65 20 50 52 49  ans the same PRI
ec80: 4d 41 52 59 20 4b 45 59 20 64 65 63 6c 61 72 61  MARY KEY declara
ec90: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
eca0: 76 6f 69 64 20 72 62 75 43 72 65 61 74 65 49 6d  void rbuCreateIm
ecb0: 70 6f 73 74 65 72 54 61 62 6c 65 28 73 71 6c 69  posterTable(sqli
ecc0: 74 65 33 72 62 75 20 2a 70 2c 20 52 62 75 4f 62  te3rbu *p, RbuOb
ecd0: 6a 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  jIter *pIter){. 
ece0: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
ecf0: 54 45 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d 3e  TE_OK && pIter->
ed00: 65 54 79 70 65 21 3d 52 42 55 5f 50 4b 5f 56 54  eType!=RBU_PK_VT
ed10: 41 42 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 6e  AB ){.    int tn
ed20: 75 6d 20 3d 20 70 49 74 65 72 2d 3e 69 54 6e 75  um = pIter->iTnu
ed30: 6d 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  m;.    const cha
ed40: 72 20 2a 7a 43 6f 6d 6d 61 20 3d 20 22 22 3b 0a  r *zComma = "";.
ed50: 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d      char *zSql =
ed60: 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c   0;.    int iCol
ed70: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65  ;.    sqlite3_te
ed80: 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
ed90: 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53  E_TESTCTRL_IMPOS
eda0: 54 45 52 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20  TER, p->dbMain, 
edb0: 22 6d 61 69 6e 22 2c 20 30 2c 20 31 29 3b 0a 0a  "main", 0, 1);..
edc0: 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
edd0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
ede0: 20 26 26 20 69 43 6f 6c 3c 70 49 74 65 72 2d 3e   && iCol<pIter->
edf0: 6e 54 62 6c 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29  nTblCol; iCol++)
ee00: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
ee10: 61 72 20 2a 7a 50 6b 20 3d 20 22 22 3b 0a 20 20  ar *zPk = "";.  
ee20: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
ee30: 7a 43 6f 6c 20 3d 20 70 49 74 65 72 2d 3e 61 7a  zCol = pIter->az
ee40: 54 62 6c 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20  TblCol[iCol];.  
ee50: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
ee60: 7a 43 6f 6c 6c 20 3d 20 30 3b 0a 0a 20 20 20 20  zColl = 0;..    
ee70: 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
ee80: 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  3_table_column_m
ee90: 65 74 61 64 61 74 61 28 0a 20 20 20 20 20 20 20  etadata(.       
eea0: 20 20 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d     p->dbMain, "m
eeb0: 61 69 6e 22 2c 20 70 49 74 65 72 2d 3e 7a 54 62  ain", pIter->zTb
eec0: 6c 2c 20 7a 43 6f 6c 2c 20 30 2c 20 26 7a 43 6f  l, zCol, 0, &zCo
eed0: 6c 6c 2c 20 30 2c 20 30 2c 20 30 0a 20 20 20 20  ll, 0, 0, 0.    
eee0: 20 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20    );..      if( 
eef0: 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
ef00: 55 5f 50 4b 5f 49 50 4b 20 26 26 20 70 49 74 65  U_PK_IPK && pIte
ef10: 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 43 6f 6c 5d  r->abTblPk[iCol]
ef20: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
ef30: 66 20 74 68 65 20 74 61 72 67 65 74 20 74 61 62  f the target tab
ef40: 6c 65 20 63 6f 6c 75 6d 6e 20 69 73 20 61 6e 20  le column is an 
ef50: 22 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59  "INTEGER PRIMARY
ef60: 20 4b 45 59 22 2c 20 61 64 64 0a 20 20 20 20 20   KEY", add.     
ef70: 20 20 20 2a 2a 20 22 50 52 49 4d 41 52 59 20 4b     ** "PRIMARY K
ef80: 45 59 22 20 74 6f 20 74 68 65 20 69 6d 70 6f 73  EY" to the impos
ef90: 74 65 72 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  ter table column
efa0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 2e 20 2a 2f   declaration. */
efb0: 0a 20 20 20 20 20 20 20 20 7a 50 6b 20 3d 20 22  .        zPk = "
efc0: 50 52 49 4d 41 52 59 20 4b 45 59 20 22 3b 0a 20  PRIMARY KEY ";. 
efd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 53 71       }.      zSq
efe0: 6c 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70  l = rbuMPrintf(p
eff0: 2c 20 22 25 7a 25 73 5c 22 25 77 5c 22 20 25 73  , "%z%s\"%w\" %s
f000: 20 25 73 43 4f 4c 4c 41 54 45 20 25 73 25 73 22   %sCOLLATE %s%s"
f010: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 7a 53 71  , .          zSq
f020: 6c 2c 20 7a 43 6f 6d 6d 61 2c 20 7a 43 6f 6c 2c  l, zComma, zCol,
f030: 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 54 79 70   pIter->azTblTyp
f040: 65 5b 69 43 6f 6c 5d 2c 20 7a 50 6b 2c 20 7a 43  e[iCol], zPk, zC
f050: 6f 6c 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 28  oll,.          (
f060: 70 49 74 65 72 2d 3e 61 62 4e 6f 74 4e 75 6c 6c  pIter->abNotNull
f070: 5b 69 43 6f 6c 5d 20 3f 20 22 20 4e 4f 54 20 4e  [iCol] ? " NOT N
f080: 55 4c 4c 22 20 3a 20 22 22 29 0a 20 20 20 20 20  ULL" : "").     
f090: 20 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6d 6d 61   );.      zComma
f0a0: 20 3d 20 22 2c 20 22 3b 0a 20 20 20 20 7d 0a 0a   = ", ";.    }..
f0b0: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 65      if( pIter->e
f0c0: 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 57 49 54  Type==RBU_PK_WIT
f0d0: 48 4f 55 54 5f 52 4f 57 49 44 20 29 7b 0a 20 20  HOUT_ROWID ){.  
f0e0: 20 20 20 20 63 68 61 72 20 2a 7a 50 6b 20 3d 20      char *zPk = 
f0f0: 72 62 75 57 69 74 68 6f 75 74 52 6f 77 69 64 50  rbuWithoutRowidP
f100: 4b 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  K(p, pIter);.   
f110: 20 20 20 69 66 28 20 7a 50 6b 20 29 7b 0a 20 20     if( zPk ){.  
f120: 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 72 62 75        zSql = rbu
f130: 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 2c 20  MPrintf(p, "%z, 
f140: 25 7a 22 2c 20 7a 53 71 6c 2c 20 7a 50 6b 29 3b  %z", zSql, zPk);
f150: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
f160: 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74      sqlite3_test
f170: 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
f180: 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45  TESTCTRL_IMPOSTE
f190: 52 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d  R, p->dbMain, "m
f1a0: 61 69 6e 22 2c 20 31 2c 20 74 6e 75 6d 29 3b 0a  ain", 1, tnum);.
f1b0: 20 20 20 20 72 62 75 4d 50 72 69 6e 74 66 45 78      rbuMPrintfEx
f1c0: 65 63 28 70 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c  ec(p, p->dbMain,
f1d0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 5c   "CREATE TABLE \
f1e0: 22 72 62 75 5f 69 6d 70 5f 25 77 5c 22 28 25 7a  "rbu_imp_%w\"(%z
f1f0: 29 25 73 22 2c 20 0a 20 20 20 20 20 20 20 20 70  )%s", .        p
f200: 49 74 65 72 2d 3e 7a 54 62 6c 2c 20 7a 53 71 6c  Iter->zTbl, zSql
f210: 2c 20 0a 20 20 20 20 20 20 20 20 28 70 49 74 65  , .        (pIte
f220: 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
f230: 5f 57 49 54 48 4f 55 54 5f 52 4f 57 49 44 20 3f  _WITHOUT_ROWID ?
f240: 20 22 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44   " WITHOUT ROWID
f250: 22 20 3a 20 22 22 29 0a 20 20 20 20 29 3b 0a 20  " : "").    );. 
f260: 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
f270: 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
f280: 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52  ESTCTRL_IMPOSTER
f290: 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61  , p->dbMain, "ma
f2a0: 69 6e 22 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  in", 0, 0);.  }.
f2b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65  }../*.** Prepare
f2c0: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 75 73 65   a statement use
f2d0: 64 20 74 6f 20 69 6e 73 65 72 74 20 72 6f 77 73  d to insert rows
f2e0: 20 69 6e 74 6f 20 74 68 65 20 22 72 62 75 5f 74   into the "rbu_t
f2f0: 6d 70 5f 78 78 78 22 20 74 61 62 6c 65 2e 0a 2a  mp_xxx" table..*
f300: 2a 20 53 70 65 63 69 66 69 63 61 6c 6c 79 20 61  * Specifically a
f310: 20 73 74 61 74 65 6d 65 6e 74 20 6f 66 20 74 68   statement of th
f320: 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
f330: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 72 62    INSERT INTO rb
f340: 75 5f 74 6d 70 5f 78 78 78 20 56 41 4c 55 45 53  u_tmp_xxx VALUES
f350: 28 3f 2c 20 3f 2c 20 3f 20 2e 2e 2e 29 3b 0a 2a  (?, ?, ? ...);.*
f360: 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20  *.** The number 
f370: 6f 66 20 62 6f 75 6e 64 20 76 61 72 69 61 62 6c  of bound variabl
f380: 65 73 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74  es is equal to t
f390: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
f3a0: 75 6d 6e 73 20 69 6e 0a 2a 2a 20 74 68 65 20 74  umns in.** the t
f3b0: 61 72 67 65 74 20 74 61 62 6c 65 2c 20 70 6c 75  arget table, plu
f3c0: 73 20 6f 6e 65 20 28 66 6f 72 20 74 68 65 20 72  s one (for the r
f3d0: 62 75 5f 63 6f 6e 74 72 6f 6c 20 63 6f 6c 75 6d  bu_control colum
f3e0: 6e 29 2c 20 70 6c 75 73 20 6f 6e 65 20 6d 6f 72  n), plus one mor
f3f0: 65 20 0a 2a 2a 20 28 66 6f 72 20 74 68 65 20 72  e .** (for the r
f400: 62 75 5f 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 29  bu_rowid column)
f410: 20 69 66 20 74 68 65 20 74 61 72 67 65 74 20 74   if the target t
f420: 61 62 6c 65 20 69 73 20 61 6e 20 69 6d 70 6c 69  able is an impli
f430: 63 69 74 20 49 50 4b 20 6f 72 20 0a 2a 2a 20 76  cit IPK or .** v
f440: 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f  irtual table..*/
f450: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
f460: 4f 62 6a 49 74 65 72 50 72 65 70 61 72 65 54 6d  ObjIterPrepareTm
f470: 70 49 6e 73 65 72 74 28 0a 20 20 73 71 6c 69 74  pInsert(.  sqlit
f480: 65 33 72 62 75 20 2a 70 2c 20 0a 20 20 52 62 75  e3rbu *p, .  Rbu
f490: 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 2c 0a  ObjIter *pIter,.
f4a0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
f4b0: 6f 6c 6c 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20  ollist,.  const 
f4c0: 63 68 61 72 20 2a 7a 52 62 75 52 6f 77 69 64 0a  char *zRbuRowid.
f4d0: 29 7b 0a 20 20 69 6e 74 20 62 52 62 75 52 6f 77  ){.  int bRbuRow
f4e0: 69 64 20 3d 20 28 70 49 74 65 72 2d 3e 65 54 79  id = (pIter->eTy
f4f0: 70 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52  pe==RBU_PK_EXTER
f500: 4e 41 4c 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54  NAL || pIter->eT
f510: 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45  ype==RBU_PK_NONE
f520: 29 3b 0a 20 20 63 68 61 72 20 2a 7a 42 69 6e 64  );.  char *zBind
f530: 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 47 65 74   = rbuObjIterGet
f540: 42 69 6e 64 6c 69 73 74 28 70 2c 20 70 49 74 65  Bindlist(p, pIte
f550: 72 2d 3e 6e 54 62 6c 43 6f 6c 20 2b 20 31 20 2b  r->nTblCol + 1 +
f560: 20 62 52 62 75 52 6f 77 69 64 29 3b 0a 20 20 69   bRbuRowid);.  i
f570: 66 28 20 7a 42 69 6e 64 20 29 7b 0a 20 20 20 20  f( zBind ){.    
f580: 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70  assert( pIter->p
f590: 54 6d 70 49 6e 73 65 72 74 3d 3d 30 20 29 3b 0a  TmpInsert==0 );.
f5a0: 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70      p->rc = prep
f5b0: 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63  areFreeAndCollec
f5c0: 74 45 72 72 6f 72 28 0a 20 20 20 20 20 20 20 20  tError(.        
f5d0: 70 2d 3e 64 62 52 62 75 2c 20 26 70 49 74 65 72  p->dbRbu, &pIter
f5e0: 2d 3e 70 54 6d 70 49 6e 73 65 72 74 2c 20 26 70  ->pTmpInsert, &p
f5f0: 2d 3e 7a 45 72 72 6d 73 67 2c 20 73 71 6c 69 74  ->zErrmsg, sqlit
f600: 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
f610: 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e        "INSERT IN
f620: 54 4f 20 25 73 2e 27 72 62 75 5f 74 6d 70 5f 25  TO %s.'rbu_tmp_%
f630: 71 27 28 72 62 75 5f 63 6f 6e 74 72 6f 6c 2c 25  q'(rbu_control,%
f640: 73 25 73 29 20 56 41 4c 55 45 53 28 25 7a 29 22  s%s) VALUES(%z)"
f650: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  , .          p->
f660: 7a 53 74 61 74 65 44 62 2c 20 70 49 74 65 72 2d  zStateDb, pIter-
f670: 3e 7a 44 61 74 61 54 62 6c 2c 20 7a 43 6f 6c 6c  >zDataTbl, zColl
f680: 69 73 74 2c 20 7a 52 62 75 52 6f 77 69 64 2c 20  ist, zRbuRowid, 
f690: 7a 42 69 6e 64 0a 20 20 20 20 29 29 3b 0a 20 20  zBind.    ));.  
f6a0: 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
f6b0: 20 72 62 75 54 6d 70 49 6e 73 65 72 74 46 75 6e   rbuTmpInsertFun
f6c0: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
f6d0: 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69  text *pCtx, .  i
f6e0: 6e 74 20 6e 56 61 6c 2c 0a 20 20 73 71 6c 69 74  nt nVal,.  sqlit
f6f0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c  e3_value **apVal
f700: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 72 62 75  .){.  sqlite3rbu
f710: 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 5f 75 73   *p = sqlite3_us
f720: 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20  er_data(pCtx);. 
f730: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
f740: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  _OK;.  int i;.. 
f750: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
f760: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c  _value_int(apVal
f770: 5b 30 5d 29 21 3d 30 0a 20 20 20 20 20 20 7c 7c  [0])!=0.      ||
f780: 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 65 54 79 70   p->objiter.eTyp
f790: 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e  e==RBU_PK_EXTERN
f7a0: 41 4c 20 0a 20 20 20 20 20 20 7c 7c 20 70 2d 3e  AL .      || p->
f7b0: 6f 62 6a 69 74 65 72 2e 65 54 79 70 65 3d 3d 52  objiter.eType==R
f7c0: 42 55 5f 50 4b 5f 4e 4f 4e 45 20 0a 20 20 29 3b  BU_PK_NONE .  );
f7d0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76  .  if( sqlite3_v
f7e0: 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 30  alue_int(apVal[0
f7f0: 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  ])!=0 ){.    p->
f800: 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20 2b 3d  nPhaseOneStep +=
f810: 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 6e 49 6e 64   p->objiter.nInd
f820: 65 78 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69  ex;.  }..  for(i
f830: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
f840: 4b 20 26 26 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b  K && i<nVal; i++
f850: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
f860: 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70  te3_bind_value(p
f870: 2d 3e 6f 62 6a 69 74 65 72 2e 70 54 6d 70 49 6e  ->objiter.pTmpIn
f880: 73 65 72 74 2c 20 69 2b 31 2c 20 61 70 56 61 6c  sert, i+1, apVal
f890: 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  [i]);.  }.  if( 
f8a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
f8b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65  .    sqlite3_ste
f8c0: 70 28 70 2d 3e 6f 62 6a 69 74 65 72 2e 70 54 6d  p(p->objiter.pTm
f8d0: 70 49 6e 73 65 72 74 29 3b 0a 20 20 20 20 72 63  pInsert);.    rc
f8e0: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
f8f0: 28 70 2d 3e 6f 62 6a 69 74 65 72 2e 70 54 6d 70  (p->objiter.pTmp
f900: 49 6e 73 65 72 74 29 3b 0a 20 20 7d 0a 0a 20 20  Insert);.  }..  
f910: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
f920: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
f930: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f  _result_error_co
f940: 64 65 28 70 43 74 78 2c 20 72 63 29 3b 0a 20 20  de(pCtx, rc);.  
f950: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72  }.}../*.** Ensur
f960: 65 20 74 68 61 74 20 74 68 65 20 53 51 4c 69 74  e that the SQLit
f970: 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64  e statement hand
f980: 6c 65 73 20 72 65 71 75 69 72 65 64 20 74 6f 20  les required to 
f990: 75 70 64 61 74 65 20 74 68 65 20 0a 2a 2a 20 74  update the .** t
f9a0: 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20 6f  arget database o
f9b0: 62 6a 65 63 74 20 63 75 72 72 65 6e 74 6c 79 20  bject currently 
f9c0: 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65  indicated by the
f9d0: 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
f9e0: 20 0a 2a 2a 20 61 73 20 74 68 65 20 73 65 63 6f   .** as the seco
f9f0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 61 72 65 20  nd argument are 
fa00: 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 73 74  available..*/.st
fa10: 61 74 69 63 20 69 6e 74 20 72 62 75 4f 62 6a 49  atic int rbuObjI
fa20: 74 65 72 50 72 65 70 61 72 65 41 6c 6c 28 0a 20  terPrepareAll(. 
fa30: 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20   sqlite3rbu *p, 
fa40: 0a 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70  .  RbuObjIter *p
fa50: 49 74 65 72 2c 0a 20 20 69 6e 74 20 6e 4f 66 66  Iter,.  int nOff
fa60: 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20  set             
fa70: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 22          /* Add "
fa80: 4c 49 4d 49 54 20 2d 31 20 4f 46 46 53 45 54 20  LIMIT -1 OFFSET 
fa90: 24 6e 4f 66 66 73 65 74 22 20 74 6f 20 53 45 4c  $nOffset" to SEL
faa0: 45 43 54 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  ECT */.){.  asse
fab0: 72 74 28 20 70 49 74 65 72 2d 3e 62 43 6c 65 61  rt( pIter->bClea
fac0: 6e 75 70 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  nup==0 );.  if( 
fad0: 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 3d 3d  pIter->pSelect==
fae0: 30 20 26 26 20 72 62 75 4f 62 6a 49 74 65 72 43  0 && rbuObjIterC
faf0: 61 63 68 65 54 61 62 6c 65 49 6e 66 6f 28 70 2c  acheTableInfo(p,
fb00: 20 70 49 74 65 72 29 3d 3d 53 51 4c 49 54 45 5f   pIter)==SQLITE_
fb10: 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  OK ){.    const 
fb20: 69 6e 74 20 74 6e 75 6d 20 3d 20 70 49 74 65 72  int tnum = pIter
fb30: 2d 3e 69 54 6e 75 6d 3b 0a 20 20 20 20 63 68 61  ->iTnum;.    cha
fb40: 72 20 2a 7a 43 6f 6c 6c 69 73 74 20 3d 20 30 3b  r *zCollist = 0;
fb50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
fb60: 73 74 20 6f 66 20 69 6e 64 65 78 65 64 20 63 6f  st of indexed co
fb70: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 63 68 61  lumns */.    cha
fb80: 72 20 2a 2a 70 7a 20 3d 20 26 70 2d 3e 7a 45 72  r **pz = &p->zEr
fb90: 72 6d 73 67 3b 0a 20 20 20 20 63 6f 6e 73 74 20  rmsg;.    const 
fba0: 63 68 61 72 20 2a 7a 49 64 78 20 3d 20 70 49 74  char *zIdx = pIt
fbb0: 65 72 2d 3e 7a 49 64 78 3b 0a 20 20 20 20 63 68  er->zIdx;.    ch
fbc0: 61 72 20 2a 7a 4c 69 6d 69 74 20 3d 20 30 3b 0a  ar *zLimit = 0;.
fbd0: 0a 20 20 20 20 69 66 28 20 6e 4f 66 66 73 65 74  .    if( nOffset
fbe0: 20 29 7b 0a 20 20 20 20 20 20 7a 4c 69 6d 69 74   ){.      zLimit
fbf0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
fc00: 74 66 28 22 20 4c 49 4d 49 54 20 2d 31 20 4f 46  tf(" LIMIT -1 OF
fc10: 46 53 45 54 20 25 64 22 2c 20 6e 4f 66 66 73 65  FSET %d", nOffse
fc20: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a  t);.      if( !z
fc30: 4c 69 6d 69 74 20 29 20 70 2d 3e 72 63 20 3d 20  Limit ) p->rc = 
fc40: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
fc50: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 7a 49 64    }..    if( zId
fc60: 78 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  x ){.      const
fc70: 20 63 68 61 72 20 2a 7a 54 62 6c 20 3d 20 70 49   char *zTbl = pI
fc80: 74 65 72 2d 3e 7a 54 62 6c 3b 0a 20 20 20 20 20  ter->zTbl;.     
fc90: 20 63 68 61 72 20 2a 7a 49 6d 70 6f 73 74 65 72   char *zImposter
fca0: 43 6f 6c 73 20 3d 20 30 3b 20 20 20 20 2f 2a 20  Cols = 0;    /* 
fcb0: 43 6f 6c 75 6d 6e 73 20 66 6f 72 20 69 6d 70 6f  Columns for impo
fcc0: 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ster table */.  
fcd0: 20 20 20 20 63 68 61 72 20 2a 7a 49 6d 70 6f 73      char *zImpos
fce0: 74 65 72 50 4b 20 3d 20 30 3b 20 20 20 20 20 20  terPK = 0;      
fcf0: 2f 2a 20 50 72 69 6d 61 72 79 20 6b 65 79 20 64  /* Primary key d
fd00: 65 63 6c 61 72 61 74 69 6f 6e 20 66 6f 72 20 69  eclaration for i
fd10: 6d 70 6f 73 74 65 72 20 2a 2f 0a 20 20 20 20 20  mposter */.     
fd20: 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20   char *zWhere = 
fd30: 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
fd40: 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20  WHERE clause on 
fd50: 50 4b 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  PK columns */.  
fd60: 20 20 20 20 63 68 61 72 20 2a 7a 42 69 6e 64 20      char *zBind 
fd70: 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  = 0;.      int n
fd80: 42 69 6e 64 20 3d 20 30 3b 0a 0a 20 20 20 20 20  Bind = 0;..     
fd90: 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
fda0: 65 54 79 70 65 21 3d 52 42 55 5f 50 4b 5f 56 54  eType!=RBU_PK_VT
fdb0: 41 42 20 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c  AB );.      zCol
fdc0: 6c 69 73 74 20 3d 20 72 62 75 4f 62 6a 49 74 65  list = rbuObjIte
fdd0: 72 47 65 74 49 6e 64 65 78 43 6f 6c 73 28 0a 20  rGetIndexCols(. 
fde0: 20 20 20 20 20 20 20 20 20 70 2c 20 70 49 74 65           p, pIte
fdf0: 72 2c 20 26 7a 49 6d 70 6f 73 74 65 72 43 6f 6c  r, &zImposterCol
fe00: 73 2c 20 26 7a 49 6d 70 6f 73 74 65 72 50 4b 2c  s, &zImposterPK,
fe10: 20 26 7a 57 68 65 72 65 2c 20 26 6e 42 69 6e 64   &zWhere, &nBind
fe20: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
fe30: 7a 42 69 6e 64 20 3d 20 72 62 75 4f 62 6a 49 74  zBind = rbuObjIt
fe40: 65 72 47 65 74 42 69 6e 64 6c 69 73 74 28 70 2c  erGetBindlist(p,
fe50: 20 6e 42 69 6e 64 29 3b 0a 0a 20 20 20 20 20 20   nBind);..      
fe60: 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 69 6d  /* Create the im
fe70: 70 6f 73 74 65 72 20 74 61 62 6c 65 20 75 73 65  poster table use
fe80: 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  d to write to th
fe90: 69 73 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 20  is index. */.   
fea0: 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
feb0: 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
fec0: 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52  ESTCTRL_IMPOSTER
fed0: 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61  , p->dbMain, "ma
fee0: 69 6e 22 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20  in", 0, 1);.    
fef0: 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
ff00: 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
ff10: 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c  STCTRL_IMPOSTER,
ff20: 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69   p->dbMain, "mai
ff30: 6e 22 2c 20 31 2c 74 6e 75 6d 29 3b 0a 20 20 20  n", 1,tnum);.   
ff40: 20 20 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65     rbuMPrintfExe
ff50: 63 28 70 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 0a  c(p, p->dbMain,.
ff60: 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54            "CREAT
ff70: 45 20 54 41 42 4c 45 20 5c 22 72 62 75 5f 69 6d  E TABLE \"rbu_im
ff80: 70 5f 25 77 5c 22 28 20 25 73 2c 20 50 52 49 4d  p_%w\"( %s, PRIM
ff90: 41 52 59 20 4b 45 59 28 20 25 73 20 29 20 29 20  ARY KEY( %s ) ) 
ffa0: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 22 2c 0a  WITHOUT ROWID",.
ffb0: 20 20 20 20 20 20 20 20 20 20 7a 54 62 6c 2c 20            zTbl, 
ffc0: 7a 49 6d 70 6f 73 74 65 72 43 6f 6c 73 2c 20 7a  zImposterCols, z
ffd0: 49 6d 70 6f 73 74 65 72 50 4b 0a 20 20 20 20 20  ImposterPK.     
ffe0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
fff0: 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
10000 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
10010 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 4d 61  MPOSTER, p->dbMa
10020 69 6e 2c 20 22 6d 61 69 6e 22 2c 20 30 2c 20 30  in, "main", 0, 0
10030 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65  );..      /* Cre
10040 61 74 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ate the statemen
10050 74 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 64 65  t to insert inde
10060 78 20 65 6e 74 72 69 65 73 20 2a 2f 0a 20 20 20  x entries */.   
10070 20 20 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 20 3d     pIter->nCol =
10080 20 6e 42 69 6e 64 3b 0a 20 20 20 20 20 20 69 66   nBind;.      if
10090 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
100a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  OK ){.        p-
100b0 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65  >rc = prepareFre
100c0 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72  eAndCollectError
100d0 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  (.            p-
100e0 3e 64 62 4d 61 69 6e 2c 20 26 70 49 74 65 72 2d  >dbMain, &pIter-
100f0 3e 70 49 6e 73 65 72 74 2c 20 26 70 2d 3e 7a 45  >pInsert, &p->zE
10100 72 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 20  rrmsg,.         
10110 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
10120 28 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5c 22  ("INSERT INTO \"
10130 72 62 75 5f 69 6d 70 5f 25 77 5c 22 20 56 41 4c  rbu_imp_%w\" VAL
10140 55 45 53 28 25 73 29 22 2c 20 7a 54 62 6c 2c 20  UES(%s)", zTbl, 
10150 7a 42 69 6e 64 29 0a 20 20 20 20 20 20 20 20 29  zBind).        )
10160 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
10170 20 2f 2a 20 41 6e 64 20 74 6f 20 64 65 6c 65 74   /* And to delet
10180 65 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20  e index entries 
10190 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  */.      if( p->
101a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
101b0 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
101c0 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43   prepareFreeAndC
101d0 6f 6c 6c 65 63 74 45 72 72 6f 72 28 0a 20 20 20  ollectError(.   
101e0 20 20 20 20 20 20 20 20 20 70 2d 3e 64 62 4d 61           p->dbMa
101f0 69 6e 2c 20 26 70 49 74 65 72 2d 3e 70 44 65 6c  in, &pIter->pDel
10200 65 74 65 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  ete, &p->zErrmsg
10210 2c 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ,.          sqli
10220 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 44 45 4c  te3_mprintf("DEL
10230 45 54 45 20 46 52 4f 4d 20 5c 22 72 62 75 5f 69  ETE FROM \"rbu_i
10240 6d 70 5f 25 77 5c 22 20 57 48 45 52 45 20 25 73  mp_%w\" WHERE %s
10250 22 2c 20 7a 54 62 6c 2c 20 7a 57 68 65 72 65 29  ", zTbl, zWhere)
10260 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
10270 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72    }..      /* Cr
10280 65 61 74 65 20 74 68 65 20 53 45 4c 45 43 54 20  eate the SELECT 
10290 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 72 65 61  statement to rea
102a0 64 20 6b 65 79 73 20 69 6e 20 73 6f 72 74 65 64  d keys in sorted
102b0 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20   order */.      
102c0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
102d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
102e0 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20  char *zSql;.    
102f0 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 65      if( pIter->e
10300 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54  Type==RBU_PK_EXT
10310 45 52 4e 41 4c 20 7c 7c 20 70 49 74 65 72 2d 3e  ERNAL || pIter->
10320 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f  eType==RBU_PK_NO
10330 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NE ){.          
10340 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
10350 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
10360 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 25 73        "SELECT %s
10370 2c 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 46 52  , rbu_control FR
10380 4f 4d 20 25 73 2e 27 72 62 75 5f 74 6d 70 5f 25  OM %s.'rbu_tmp_%
10390 71 27 20 4f 52 44 45 52 20 42 59 20 25 73 25 73  q' ORDER BY %s%s
103a0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
103b0 20 7a 43 6f 6c 6c 69 73 74 2c 20 70 2d 3e 7a 53   zCollist, p->zS
103c0 74 61 74 65 44 62 2c 20 70 49 74 65 72 2d 3e 7a  tateDb, pIter->z
103d0 44 61 74 61 54 62 6c 2c 0a 20 20 20 20 20 20 20  DataTbl,.       
103e0 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74 2c         zCollist,
103f0 20 7a 4c 69 6d 69 74 0a 20 20 20 20 20 20 20 20   zLimit.        
10400 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c    );.        }el
10410 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 53  se{.          zS
10420 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
10430 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
10440 20 20 20 20 22 53 45 4c 45 43 54 20 25 73 2c 20      "SELECT %s, 
10450 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 46 52 4f 4d  rbu_control FROM
10460 20 25 73 2e 27 72 62 75 5f 74 6d 70 5f 25 71 27   %s.'rbu_tmp_%q'
10470 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
10480 20 22 55 4e 49 4f 4e 20 41 4c 4c 20 22 0a 20 20   "UNION ALL ".  
10490 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c              "SEL
104a0 45 43 54 20 25 73 2c 20 72 62 75 5f 63 6f 6e 74  ECT %s, rbu_cont
104b0 72 6f 6c 20 46 52 4f 4d 20 27 25 71 27 20 22 0a  rol FROM '%q' ".
104c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 57                "W
104d0 48 45 52 45 20 74 79 70 65 6f 66 28 72 62 75 5f  HERE typeof(rbu_
104e0 63 6f 6e 74 72 6f 6c 29 3d 27 69 6e 74 65 67 65  control)='intege
104f0 72 27 20 41 4e 44 20 72 62 75 5f 63 6f 6e 74 72  r' AND rbu_contr
10500 6f 6c 21 3d 31 20 22 0a 20 20 20 20 20 20 20 20  ol!=1 ".        
10510 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20        "ORDER BY 
10520 25 73 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  %s%s",.         
10530 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74 2c 20 70       zCollist, p
10540 2d 3e 7a 53 74 61 74 65 44 62 2c 20 70 49 74 65  ->zStateDb, pIte
10550 72 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 0a 20 20  r->zDataTbl, .  
10560 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
10570 6c 69 73 74 2c 20 70 49 74 65 72 2d 3e 7a 44 61  list, pIter->zDa
10580 74 61 54 62 6c 2c 20 0a 20 20 20 20 20 20 20 20  taTbl, .        
10590 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74 2c 20        zCollist, 
105a0 7a 4c 69 6d 69 74 0a 20 20 20 20 20 20 20 20 20  zLimit.         
105b0 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
105c0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72        p->rc = pr
105d0 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c  epareFreeAndColl
105e0 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 52 62  ectError(p->dbRb
105f0 75 2c 20 26 70 49 74 65 72 2d 3e 70 53 65 6c 65  u, &pIter->pSele
10600 63 74 2c 20 70 7a 2c 20 7a 53 71 6c 29 3b 0a 20  ct, pz, zSql);. 
10610 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 71       }..      sq
10620 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6d 70 6f  lite3_free(zImpo
10630 73 74 65 72 43 6f 6c 73 29 3b 0a 20 20 20 20 20  sterCols);.     
10640 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 49   sqlite3_free(zI
10650 6d 70 6f 73 74 65 72 50 4b 29 3b 0a 20 20 20 20  mposterPK);.    
10660 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
10670 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 73 71  Where);.      sq
10680 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 69 6e 64  lite3_free(zBind
10690 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
106a0 20 20 20 20 69 6e 74 20 62 52 62 75 52 6f 77 69      int bRbuRowi
106b0 64 20 3d 20 28 70 49 74 65 72 2d 3e 65 54 79 70  d = (pIter->eTyp
106c0 65 3d 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20 7c  e==RBU_PK_VTAB |
106d0 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  | pIter->eType==
106e0 52 42 55 5f 50 4b 5f 4e 4f 4e 45 29 3b 0a 20 20  RBU_PK_NONE);.  
106f0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
10700 7a 54 62 6c 20 3d 20 70 49 74 65 72 2d 3e 7a 54  zTbl = pIter->zT
10710 62 6c 3b 20 20 20 20 20 20 20 2f 2a 20 54 61 62  bl;       /* Tab
10720 6c 65 20 74 68 69 73 20 73 74 65 70 20 61 70 70  le this step app
10730 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20 20 20 20  lies to */.     
10740 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 72   const char *zWr
10750 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ite;            
10760 20 20 20 20 20 20 20 2f 2a 20 49 6d 70 6f 73 74         /* Impost
10770 65 72 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f  er table name */
10780 0a 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42  ..      char *zB
10790 69 6e 64 69 6e 67 73 20 3d 20 72 62 75 4f 62 6a  indings = rbuObj
107a0 49 74 65 72 47 65 74 42 69 6e 64 6c 69 73 74 28  IterGetBindlist(
107b0 70 2c 20 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f  p, pIter->nTblCo
107c0 6c 20 2b 20 62 52 62 75 52 6f 77 69 64 29 3b 0a  l + bRbuRowid);.
107d0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 57 68 65        char *zWhe
107e0 72 65 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 47  re = rbuObjIterG
107f0 65 74 57 68 65 72 65 28 70 2c 20 70 49 74 65 72  etWhere(p, pIter
10800 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  );.      char *z
10810 4f 6c 64 6c 69 73 74 20 3d 20 72 62 75 4f 62 6a  Oldlist = rbuObj
10820 49 74 65 72 47 65 74 4f 6c 64 6c 69 73 74 28 70  IterGetOldlist(p
10830 2c 20 70 49 74 65 72 2c 20 22 6f 6c 64 22 29 3b  , pIter, "old");
10840 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 65  .      char *zNe
10850 77 6c 69 73 74 20 3d 20 72 62 75 4f 62 6a 49 74  wlist = rbuObjIt
10860 65 72 47 65 74 4f 6c 64 6c 69 73 74 28 70 2c 20  erGetOldlist(p, 
10870 70 49 74 65 72 2c 20 22 6e 65 77 22 29 3b 0a 0a  pIter, "new");..
10880 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74 20 3d        zCollist =
10890 20 72 62 75 4f 62 6a 49 74 65 72 47 65 74 43 6f   rbuObjIterGetCo
108a0 6c 6c 69 73 74 28 70 2c 20 70 49 74 65 72 29 3b  llist(p, pIter);
108b0 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 43  .      pIter->nC
108c0 6f 6c 20 3d 20 70 49 74 65 72 2d 3e 6e 54 62 6c  ol = pIter->nTbl
108d0 43 6f 6c 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  Col;..      /* C
108e0 72 65 61 74 65 20 74 68 65 20 69 6d 70 6f 73 74  reate the impost
108f0 65 72 20 74 61 62 6c 65 20 6f 72 20 74 61 62 6c  er table or tabl
10900 65 73 20 28 69 66 20 72 65 71 75 69 72 65 64 29  es (if required)
10910 2e 20 2a 2f 0a 20 20 20 20 20 20 72 62 75 43 72  . */.      rbuCr
10920 65 61 74 65 49 6d 70 6f 73 74 65 72 54 61 62 6c  eateImposterTabl
10930 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  e(p, pIter);.   
10940 20 20 20 72 62 75 43 72 65 61 74 65 49 6d 70 6f     rbuCreateImpo
10950 73 74 65 72 54 61 62 6c 65 32 28 70 2c 20 70 49  sterTable2(p, pI
10960 74 65 72 29 3b 0a 20 20 20 20 20 20 7a 57 72 69  ter);.      zWri
10970 74 65 20 3d 20 28 70 49 74 65 72 2d 3e 65 54 79  te = (pIter->eTy
10980 70 65 3d 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20  pe==RBU_PK_VTAB 
10990 3f 20 22 22 20 3a 20 22 72 62 75 5f 69 6d 70 5f  ? "" : "rbu_imp_
109a0 22 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72  ");..      /* Cr
109b0 65 61 74 65 20 74 68 65 20 49 4e 53 45 52 54 20  eate the INSERT 
109c0 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 77 72 69  statement to wri
109d0 74 65 20 74 6f 20 74 68 65 20 74 61 72 67 65 74  te to the target
109e0 20 50 4b 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20   PK b-tree */.  
109f0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
10a00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10a10 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70      p->rc = prep
10a20 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63  areFreeAndCollec
10a30 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e  tError(p->dbMain
10a40 2c 20 26 70 49 74 65 72 2d 3e 70 49 6e 73 65 72  , &pIter->pInser
10a50 74 2c 20 70 7a 2c 0a 20 20 20 20 20 20 20 20 20  t, pz,.         
10a60 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e     sqlite3_mprin
10a70 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  tf(.            
10a80 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5c    "INSERT INTO \
10a90 22 25 73 25 77 5c 22 28 25 73 25 73 29 20 56 41  "%s%w\"(%s%s) VA
10aa0 4c 55 45 53 28 25 73 29 22 2c 20 0a 20 20 20 20  LUES(%s)", .    
10ab0 20 20 20 20 20 20 20 20 20 20 7a 57 72 69 74 65            zWrite
10ac0 2c 20 7a 54 62 6c 2c 20 7a 43 6f 6c 6c 69 73 74  , zTbl, zCollist
10ad0 2c 20 28 62 52 62 75 52 6f 77 69 64 20 3f 20 22  , (bRbuRowid ? "
10ae0 2c 20 5f 72 6f 77 69 64 5f 22 20 3a 20 22 22 29  , _rowid_" : "")
10af0 2c 20 7a 42 69 6e 64 69 6e 67 73 0a 20 20 20 20  , zBindings.    
10b00 20 20 20 20 20 20 20 20 29 0a 20 20 20 20 20 20          ).      
10b10 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20    );.      }..  
10b20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68      /* Create th
10b30 65 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  e DELETE stateme
10b40 6e 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  nt to write to t
10b50 68 65 20 74 61 72 67 65 74 20 50 4b 20 62 2d 74  he target PK b-t
10b60 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ree */.      if(
10b70 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
10b80 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  K ){.        p->
10b90 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65  rc = prepareFree
10ba0 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
10bb0 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 49 74 65  p->dbMain, &pIte
10bc0 72 2d 3e 70 44 65 6c 65 74 65 2c 20 70 7a 2c 0a  r->pDelete, pz,.
10bd0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
10be0 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
10bf0 20 20 20 20 20 20 20 20 20 20 20 22 44 45 4c 45             "DELE
10c00 54 45 20 46 52 4f 4d 20 5c 22 25 73 25 77 5c 22  TE FROM \"%s%w\"
10c10 20 57 48 45 52 45 20 25 73 22 2c 20 7a 57 72 69   WHERE %s", zWri
10c20 74 65 2c 20 7a 54 62 6c 2c 20 7a 57 68 65 72 65  te, zTbl, zWhere
10c30 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 0a 20  .            ). 
10c40 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
10c50 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  }..      if( pIt
10c60 65 72 2d 3e 61 62 49 6e 64 65 78 65 64 20 29 7b  er->abIndexed ){
10c70 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
10c80 68 61 72 20 2a 7a 52 62 75 52 6f 77 69 64 20 3d  har *zRbuRowid =
10c90 20 22 22 3b 0a 20 20 20 20 20 20 20 20 69 66 28   "";.        if(
10ca0 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52   pIter->eType==R
10cb0 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 7c  BU_PK_EXTERNAL |
10cc0 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  | pIter->eType==
10cd0 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 29 7b 0a 20  RBU_PK_NONE ){. 
10ce0 20 20 20 20 20 20 20 20 20 7a 52 62 75 52 6f 77           zRbuRow
10cf0 69 64 20 3d 20 22 2c 20 72 62 75 5f 72 6f 77 69  id = ", rbu_rowi
10d00 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  d";.        }.. 
10d10 20 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65         /* Create
10d20 20 74 68 65 20 72 62 75 5f 74 6d 70 5f 78 78 78   the rbu_tmp_xxx
10d30 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 20 74   table and the t
10d40 72 69 67 67 65 72 73 20 74 6f 20 70 6f 70 75 6c  riggers to popul
10d50 61 74 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 20  ate it. */.     
10d60 20 20 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65     rbuMPrintfExe
10d70 63 28 70 2c 20 70 2d 3e 64 62 52 62 75 2c 0a 20  c(p, p->dbRbu,. 
10d80 20 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41             "CREA
10d90 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20  TE TABLE IF NOT 
10da0 45 58 49 53 54 53 20 25 73 2e 27 72 62 75 5f 74  EXISTS %s.'rbu_t
10db0 6d 70 5f 25 71 27 20 41 53 20 22 0a 20 20 20 20  mp_%q' AS ".    
10dc0 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
10dd0 2a 25 73 20 46 52 4f 4d 20 27 25 71 27 20 57 48  *%s FROM '%q' WH
10de0 45 52 45 20 30 3b 22 0a 20 20 20 20 20 20 20 20  ERE 0;".        
10df0 20 20 20 20 2c 20 70 2d 3e 7a 53 74 61 74 65 44      , p->zStateD
10e00 62 2c 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54  b, pIter->zDataT
10e10 62 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 2c  bl.            ,
10e20 20 28 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d   (pIter->eType==
10e30 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20  RBU_PK_EXTERNAL 
10e40 3f 20 22 2c 20 30 20 41 53 20 72 62 75 5f 72 6f  ? ", 0 AS rbu_ro
10e50 77 69 64 22 20 3a 20 22 22 29 0a 20 20 20 20 20  wid" : "").     
10e60 20 20 20 20 20 20 20 2c 20 70 49 74 65 72 2d 3e         , pIter->
10e70 7a 44 61 74 61 54 62 6c 0a 20 20 20 20 20 20 20  zDataTbl.       
10e80 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 72 62 75   );..        rbu
10e90 4d 50 72 69 6e 74 66 45 78 65 63 28 70 2c 20 70  MPrintfExec(p, p
10ea0 2d 3e 64 62 4d 61 69 6e 2c 0a 20 20 20 20 20 20  ->dbMain,.      
10eb0 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54 45        "CREATE TE
10ec0 4d 50 20 54 52 49 47 47 45 52 20 72 62 75 5f 64  MP TRIGGER rbu_d
10ed0 65 6c 65 74 65 5f 74 72 20 42 45 46 4f 52 45 20  elete_tr BEFORE 
10ee0 44 45 4c 45 54 45 20 4f 4e 20 5c 22 25 73 25 77  DELETE ON \"%s%w
10ef0 5c 22 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  \" ".           
10f00 20 22 42 45 47 49 4e 20 22 0a 20 20 20 20 20 20   "BEGIN ".      
10f10 20 20 20 20 20 20 22 20 20 53 45 4c 45 43 54 20        "  SELECT 
10f20 72 62 75 5f 74 6d 70 5f 69 6e 73 65 72 74 28 33  rbu_tmp_insert(3
10f30 2c 20 25 73 29 3b 22 0a 20 20 20 20 20 20 20 20  , %s);".        
10f40 20 20 20 20 22 45 4e 44 3b 22 0a 0a 20 20 20 20      "END;"..    
10f50 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20          "CREATE 
10f60 54 45 4d 50 20 54 52 49 47 47 45 52 20 72 62 75  TEMP TRIGGER rbu
10f70 5f 75 70 64 61 74 65 31 5f 74 72 20 42 45 46 4f  _update1_tr BEFO
10f80 52 45 20 55 50 44 41 54 45 20 4f 4e 20 5c 22 25  RE UPDATE ON \"%
10f90 73 25 77 5c 22 20 22 0a 20 20 20 20 20 20 20 20  s%w\" ".        
10fa0 20 20 20 20 22 42 45 47 49 4e 20 22 0a 20 20 20      "BEGIN ".   
10fb0 20 20 20 20 20 20 20 20 20 22 20 20 53 45 4c 45           "  SELE
10fc0 43 54 20 72 62 75 5f 74 6d 70 5f 69 6e 73 65 72  CT rbu_tmp_inser
10fd0 74 28 33 2c 20 25 73 29 3b 22 0a 20 20 20 20 20  t(3, %s);".     
10fe0 20 20 20 20 20 20 20 22 45 4e 44 3b 22 0a 0a 20         "END;".. 
10ff0 20 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41             "CREA
11000 54 45 20 54 45 4d 50 20 54 52 49 47 47 45 52 20  TE TEMP TRIGGER 
11010 72 62 75 5f 75 70 64 61 74 65 32 5f 74 72 20 41  rbu_update2_tr A
11020 46 54 45 52 20 55 50 44 41 54 45 20 4f 4e 20 5c  FTER UPDATE ON \
11030 22 25 73 25 77 5c 22 20 22 0a 20 20 20 20 20 20  "%s%w\" ".      
11040 20 20 20 20 20 20 22 42 45 47 49 4e 20 22 0a 20        "BEGIN ". 
11050 20 20 20 20 20 20 20 20 20 20 20 22 20 20 53 45             "  SE
11060 4c 45 43 54 20 72 62 75 5f 74 6d 70 5f 69 6e 73  LECT rbu_tmp_ins
11070 65 72 74 28 34 2c 20 25 73 29 3b 22 0a 20 20 20  ert(4, %s);".   
11080 20 20 20 20 20 20 20 20 20 22 45 4e 44 3b 22 2c           "END;",
11090 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 57 72  .            zWr
110a0 69 74 65 2c 20 7a 54 62 6c 2c 20 7a 4f 6c 64 6c  ite, zTbl, zOldl
110b0 69 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ist,.           
110c0 20 7a 57 72 69 74 65 2c 20 7a 54 62 6c 2c 20 7a   zWrite, zTbl, z
110d0 4f 6c 64 6c 69 73 74 2c 0a 20 20 20 20 20 20 20  Oldlist,.       
110e0 20 20 20 20 20 7a 57 72 69 74 65 2c 20 7a 54 62       zWrite, zTb
110f0 6c 2c 20 7a 4e 65 77 6c 69 73 74 0a 20 20 20 20  l, zNewlist.    
11100 20 20 20 20 29 3b 0a 0a 20 20 20 20 20 20 20 20      );..        
11110 69 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65  if( pIter->eType
11120 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41  ==RBU_PK_EXTERNA
11130 4c 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70  L || pIter->eTyp
11140 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 29  e==RBU_PK_NONE )
11150 7b 0a 20 20 20 20 20 20 20 20 20 20 72 62 75 4d  {.          rbuM
11160 50 72 69 6e 74 66 45 78 65 63 28 70 2c 20 70 2d  PrintfExec(p, p-
11170 3e 64 62 4d 61 69 6e 2c 0a 20 20 20 20 20 20 20  >dbMain,.       
11180 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54         "CREATE T
11190 45 4d 50 20 54 52 49 47 47 45 52 20 72 62 75 5f  EMP TRIGGER rbu_
111a0 69 6e 73 65 72 74 5f 74 72 20 41 46 54 45 52 20  insert_tr AFTER 
111b0 49 4e 53 45 52 54 20 4f 4e 20 5c 22 25 73 25 77  INSERT ON \"%s%w
111c0 5c 22 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  \" ".           
111d0 20 20 20 22 42 45 47 49 4e 20 22 0a 20 20 20 20     "BEGIN ".    
111e0 20 20 20 20 20 20 20 20 20 20 22 20 20 53 45 4c            "  SEL
111f0 45 43 54 20 72 62 75 5f 74 6d 70 5f 69 6e 73 65  ECT rbu_tmp_inse
11200 72 74 28 30 2c 20 25 73 29 3b 22 0a 20 20 20 20  rt(0, %s);".    
11210 20 20 20 20 20 20 20 20 20 20 22 45 4e 44 3b 22            "END;"
11220 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11230 7a 57 72 69 74 65 2c 20 7a 54 62 6c 2c 20 7a 4e  zWrite, zTbl, zN
11240 65 77 6c 69 73 74 0a 20 20 20 20 20 20 20 20 20  ewlist.         
11250 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   );.        }.. 
11260 20 20 20 20 20 20 20 72 62 75 4f 62 6a 49 74 65         rbuObjIte
11270 72 50 72 65 70 61 72 65 54 6d 70 49 6e 73 65 72  rPrepareTmpInser
11280 74 28 70 2c 20 70 49 74 65 72 2c 20 7a 43 6f 6c  t(p, pIter, zCol
11290 6c 69 73 74 2c 20 7a 52 62 75 52 6f 77 69 64 29  list, zRbuRowid)
112a0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
112b0 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 53   /* Create the S
112c0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
112d0 74 6f 20 72 65 61 64 20 6b 65 79 73 20 66 72 6f  to read keys fro
112e0 6d 20 64 61 74 61 5f 78 78 78 20 2a 2f 0a 20 20  m data_xxx */.  
112f0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
11300 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11310 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70      p->rc = prep
11320 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63  areFreeAndCollec
11330 74 45 72 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c  tError(p->dbRbu,
11340 20 26 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74   &pIter->pSelect
11350 2c 20 70 7a 2c 0a 20 20 20 20 20 20 20 20 20 20  , pz,.          
11360 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
11370 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  f(.             
11380 20 22 53 45 4c 45 43 54 20 25 73 2c 20 72 62 75   "SELECT %s, rbu
11390 5f 63 6f 6e 74 72 6f 6c 25 73 20 46 52 4f 4d 20  _control%s FROM 
113a0 27 25 71 27 25 73 22 2c 20 0a 20 20 20 20 20 20  '%q'%s", .      
113b0 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74          zCollist
113c0 2c 20 28 62 52 62 75 52 6f 77 69 64 20 3f 20 22  , (bRbuRowid ? "
113d0 2c 20 72 62 75 5f 72 6f 77 69 64 22 20 3a 20 22  , rbu_rowid" : "
113e0 22 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  "), .           
113f0 20 20 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54     pIter->zDataT
11400 62 6c 2c 20 7a 4c 69 6d 69 74 0a 20 20 20 20 20  bl, zLimit.     
11410 20 20 20 20 20 20 20 29 0a 20 20 20 20 20 20 20         ).       
11420 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   );.      }..   
11430 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
11440 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 73  zWhere);.      s
11450 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 6c 64  qlite3_free(zOld
11460 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  list);.      sql
11470 69 74 65 33 5f 66 72 65 65 28 7a 4e 65 77 6c 69  ite3_free(zNewli
11480 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
11490 65 33 5f 66 72 65 65 28 7a 42 69 6e 64 69 6e 67  e3_free(zBinding
114a0 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  s);.    }.    sq
114b0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6c 6c  lite3_free(zColl
114c0 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
114d0 33 5f 66 72 65 65 28 7a 4c 69 6d 69 74 29 3b 0a  3_free(zLimit);.
114e0 20 20 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e 20    }.  .  return 
114f0 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p->rc;.}../*.** 
11500 53 65 74 20 6f 75 74 70 75 74 20 76 61 72 69 61  Set output varia
11510 62 6c 65 20 2a 70 70 53 74 6d 74 20 74 6f 20 70  ble *ppStmt to p
11520 6f 69 6e 74 20 74 6f 20 61 6e 20 55 50 44 41 54  oint to an UPDAT
11530 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  E statement that
11540 20 6d 61 79 0a 2a 2a 20 62 65 20 75 73 65 64 20   may.** be used 
11550 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 69 6d  to update the im
11560 70 6f 73 74 65 72 20 74 61 62 6c 65 20 66 6f 72  poster table for
11570 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 20   the main table 
11580 62 2d 74 72 65 65 20 6f 66 20 74 68 65 0a 2a 2a  b-tree of the.**
11590 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 74 68   table object th
115a0 61 74 20 70 49 74 65 72 20 63 75 72 72 65 6e 74  at pIter current
115b0 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2c 20 61 73  ly points to, as
115c0 73 75 6d 69 6e 67 20 74 68 61 74 20 74 68 65 20  suming that the 
115d0 0a 2a 2a 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20  .** rbu_control 
115e0 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 64 61  column of the da
115f0 74 61 5f 78 79 7a 20 74 61 62 6c 65 20 63 6f 6e  ta_xyz table con
11600 74 61 69 6e 73 20 7a 4d 61 73 6b 2e 0a 2a 2a 20  tains zMask..** 
11610 0a 2a 2a 20 49 66 20 74 68 65 20 7a 4d 61 73 6b  .** If the zMask
11620 20 73 74 72 69 6e 67 20 64 6f 65 73 20 6e 6f 74   string does not
11630 20 73 70 65 63 69 66 79 20 61 6e 79 20 63 6f 6c   specify any col
11640 75 6d 6e 73 20 74 6f 20 75 70 64 61 74 65 2c 20  umns to update, 
11650 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 69 73 20  then this.** is 
11660 6e 6f 74 20 61 6e 20 65 72 72 6f 72 2e 20 4f 75  not an error. Ou
11670 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a 70  tput variable *p
11680 70 53 74 6d 74 20 69 73 20 73 65 74 20 74 6f 20  pStmt is set to 
11690 4e 55 4c 4c 20 69 6e 20 74 68 69 73 20 63 61 73  NULL in this cas
116a0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
116b0 20 72 62 75 47 65 74 55 70 64 61 74 65 53 74 6d   rbuGetUpdateStm
116c0 74 28 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20  t(.  sqlite3rbu 
116d0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
116e0 20 20 20 20 20 2f 2a 20 52 42 55 20 68 61 6e 64       /* RBU hand
116f0 6c 65 20 2a 2f 0a 20 20 52 62 75 4f 62 6a 49 74  le */.  RbuObjIt
11700 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20  er *pIter,      
11710 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63          /* Objec
11720 74 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20  t iterator */.  
11730 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
11740 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
11750 2f 2a 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 76  /* rbu_control v
11760 61 6c 75 65 20 28 27 78 2e 78 2e 27 29 20 2a 2f  alue ('x.x.') */
11770 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
11780 2a 2a 70 70 53 74 6d 74 20 20 20 20 20 20 20 20  **ppStmt        
11790 20 20 20 2f 2a 20 4f 55 54 3a 20 55 50 44 41 54     /* OUT: UPDAT
117a0 45 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64  E statement hand
117b0 6c 65 20 2a 2f 0a 29 7b 0a 20 20 52 62 75 55 70  le */.){.  RbuUp
117c0 64 61 74 65 53 74 6d 74 20 2a 2a 70 70 3b 0a 20  dateStmt **pp;. 
117d0 20 52 62 75 55 70 64 61 74 65 53 74 6d 74 20 2a   RbuUpdateStmt *
117e0 70 55 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  pUp = 0;.  int n
117f0 55 70 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 6e  Up = 0;..  /* In
11800 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f   case an error o
11810 63 63 75 72 73 20 2a 2f 0a 20 20 2a 70 70 53 74  ccurs */.  *ppSt
11820 6d 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 65  mt = 0;..  /* Se
11830 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73  arch for an exis
11840 74 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 2e 20  ting statement. 
11850 49 66 20 6f 6e 65 20 69 73 20 66 6f 75 6e 64 2c  If one is found,
11860 20 73 68 69 66 74 20 69 74 20 74 6f 20 74 68 65   shift it to the
11870 20 66 72 6f 6e 74 0a 20 20 2a 2a 20 6f 66 20 74   front.  ** of t
11880 68 65 20 4c 52 55 20 71 75 65 75 65 20 61 6e 64  he LRU queue and
11890 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74   return immediat
118a0 65 6c 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ely. Otherwise, 
118b0 6c 65 61 76 65 20 6e 55 70 20 70 6f 69 6e 74 69  leave nUp pointi
118c0 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6e  ng.  ** to the n
118d0 75 6d 62 65 72 20 6f 66 20 73 74 61 74 65 6d 65  umber of stateme
118e0 6e 74 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  nts currently in
118f0 20 74 68 65 20 63 61 63 68 65 20 61 6e 64 20 70   the cache and p
11900 55 70 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c  Up to the.  ** l
11910 61 73 74 20 6f 62 6a 65 63 74 20 69 6e 20 74 68  ast object in th
11920 65 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 66 6f  e list.  */.  fo
11930 72 28 70 70 3d 26 70 49 74 65 72 2d 3e 70 52 62  r(pp=&pIter->pRb
11940 75 55 70 64 61 74 65 3b 20 2a 70 70 3b 20 70 70  uUpdate; *pp; pp
11950 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29  =&((*pp)->pNext)
11960 29 7b 0a 20 20 20 20 70 55 70 20 3d 20 2a 70 70  ){.    pUp = *pp
11970 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  ;.    if( strcmp
11980 28 70 55 70 2d 3e 7a 4d 61 73 6b 2c 20 7a 4d 61  (pUp->zMask, zMa
11990 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
119a0 2a 70 70 20 3d 20 70 55 70 2d 3e 70 4e 65 78 74  *pp = pUp->pNext
119b0 3b 0a 20 20 20 20 20 20 70 55 70 2d 3e 70 4e 65  ;.      pUp->pNe
119c0 78 74 20 3d 20 70 49 74 65 72 2d 3e 70 52 62 75  xt = pIter->pRbu
119d0 55 70 64 61 74 65 3b 0a 20 20 20 20 20 20 70 49  Update;.      pI
119e0 74 65 72 2d 3e 70 52 62 75 55 70 64 61 74 65 20  ter->pRbuUpdate 
119f0 3d 20 70 55 70 3b 0a 20 20 20 20 20 20 2a 70 70  = pUp;.      *pp
11a00 53 74 6d 74 20 3d 20 70 55 70 2d 3e 70 55 70 64  Stmt = pUp->pUpd
11a10 61 74 65 3b 20 0a 20 20 20 20 20 20 72 65 74 75  ate; .      retu
11a20 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
11a30 20 20 7d 0a 20 20 20 20 6e 55 70 2b 2b 3b 0a 20    }.    nUp++;. 
11a40 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 55 70   }.  assert( pUp
11a50 3d 3d 30 20 7c 7c 20 70 55 70 2d 3e 70 4e 65 78  ==0 || pUp->pNex
11a60 74 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 6e  t==0 );..  if( n
11a70 55 70 3e 3d 53 51 4c 49 54 45 5f 52 42 55 5f 55  Up>=SQLITE_RBU_U
11a80 50 44 41 54 45 5f 43 41 43 48 45 53 49 5a 45 20  PDATE_CACHESIZE 
11a90 29 7b 0a 20 20 20 20 66 6f 72 28 70 70 3d 26 70  ){.    for(pp=&p
11aa0 49 74 65 72 2d 3e 70 52 62 75 55 70 64 61 74 65  Iter->pRbuUpdate
11ab0 3b 20 2a 70 70 21 3d 70 55 70 3b 20 70 70 3d 26  ; *pp!=pUp; pp=&
11ac0 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b  ((*pp)->pNext));
11ad0 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20  .    *pp = 0;.  
11ae0 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
11af0 7a 65 28 70 55 70 2d 3e 70 55 70 64 61 74 65 29  ze(pUp->pUpdate)
11b00 3b 0a 20 20 20 20 70 55 70 2d 3e 70 55 70 64 61  ;.    pUp->pUpda
11b10 74 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  te = 0;.  }else{
11b20 0a 20 20 20 20 70 55 70 20 3d 20 28 52 62 75 55  .    pUp = (RbuU
11b30 70 64 61 74 65 53 74 6d 74 2a 29 72 62 75 4d 61  pdateStmt*)rbuMa
11b40 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 52  lloc(p, sizeof(R
11b50 62 75 55 70 64 61 74 65 53 74 6d 74 29 2b 70 49  buUpdateStmt)+pI
11b60 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 2b 31 29 3b  ter->nTblCol+1);
11b70 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 55 70 20  .  }..  if( pUp 
11b80 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 57 68  ){.    char *zWh
11b90 65 72 65 20 3d 20 72 62 75 4f 62 6a 49 74 65 72  ere = rbuObjIter
11ba0 47 65 74 57 68 65 72 65 28 70 2c 20 70 49 74 65  GetWhere(p, pIte
11bb0 72 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53  r);.    char *zS
11bc0 65 74 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 47  et = rbuObjIterG
11bd0 65 74 53 65 74 6c 69 73 74 28 70 2c 20 70 49 74  etSetlist(p, pIt
11be0 65 72 2c 20 7a 4d 61 73 6b 29 3b 0a 20 20 20 20  er, zMask);.    
11bf0 63 68 61 72 20 2a 7a 55 70 64 61 74 65 20 3d 20  char *zUpdate = 
11c00 30 3b 0a 0a 20 20 20 20 70 55 70 2d 3e 7a 4d 61  0;..    pUp->zMa
11c10 73 6b 20 3d 20 28 63 68 61 72 2a 29 26 70 55 70  sk = (char*)&pUp
11c20 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  [1];.    memcpy(
11c30 70 55 70 2d 3e 7a 4d 61 73 6b 2c 20 7a 4d 61 73  pUp->zMask, zMas
11c40 6b 2c 20 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f  k, pIter->nTblCo
11c50 6c 29 3b 0a 20 20 20 20 70 55 70 2d 3e 70 4e 65  l);.    pUp->pNe
11c60 78 74 20 3d 20 70 49 74 65 72 2d 3e 70 52 62 75  xt = pIter->pRbu
11c70 55 70 64 61 74 65 3b 0a 20 20 20 20 70 49 74 65  Update;.    pIte
11c80 72 2d 3e 70 52 62 75 55 70 64 61 74 65 20 3d 20  r->pRbuUpdate = 
11c90 70 55 70 3b 0a 0a 20 20 20 20 69 66 28 20 7a 53  pUp;..    if( zS
11ca0 65 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  et ){.      cons
11cb0 74 20 63 68 61 72 20 2a 7a 50 72 65 66 69 78 20  t char *zPrefix 
11cc0 3d 20 22 22 3b 0a 0a 20 20 20 20 20 20 69 66 28  = "";..      if(
11cd0 20 70 49 74 65 72 2d 3e 65 54 79 70 65 21 3d 52   pIter->eType!=R
11ce0 42 55 5f 50 4b 5f 56 54 41 42 20 29 20 7a 50 72  BU_PK_VTAB ) zPr
11cf0 65 66 69 78 20 3d 20 22 72 62 75 5f 69 6d 70 5f  efix = "rbu_imp_
11d00 22 3b 0a 20 20 20 20 20 20 7a 55 70 64 61 74 65  ";.      zUpdate
11d10 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
11d20 74 66 28 22 55 50 44 41 54 45 20 5c 22 25 73 25  tf("UPDATE \"%s%
11d30 77 5c 22 20 53 45 54 20 25 73 20 57 48 45 52 45  w\" SET %s WHERE
11d40 20 25 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20   %s", .         
11d50 20 7a 50 72 65 66 69 78 2c 20 70 49 74 65 72 2d   zPrefix, pIter-
11d60 3e 7a 54 62 6c 2c 20 7a 53 65 74 2c 20 7a 57 68  >zTbl, zSet, zWh
11d70 65 72 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ere.      );.   
11d80 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61     p->rc = prepa
11d90 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74  reFreeAndCollect
11da0 45 72 72 6f 72 28 0a 20 20 20 20 20 20 20 20 20  Error(.         
11db0 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 55 70   p->dbMain, &pUp
11dc0 2d 3e 70 55 70 64 61 74 65 2c 20 26 70 2d 3e 7a  ->pUpdate, &p->z
11dd0 45 72 72 6d 73 67 2c 20 7a 55 70 64 61 74 65 0a  Errmsg, zUpdate.
11de0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 2a        );.      *
11df0 70 70 53 74 6d 74 20 3d 20 70 55 70 2d 3e 70 55  ppStmt = pUp->pU
11e00 70 64 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20  pdate;.    }.   
11e10 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57   sqlite3_free(zW
11e20 68 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  here);.    sqlit
11e30 65 33 5f 66 72 65 65 28 7a 53 65 74 29 3b 0a 20  e3_free(zSet);. 
11e40 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e   }..  return p->
11e50 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73 71  rc;.}..static sq
11e60 6c 69 74 65 33 20 2a 72 62 75 4f 70 65 6e 44 62  lite3 *rbuOpenDb
11e70 68 61 6e 64 6c 65 28 73 71 6c 69 74 65 33 72 62  handle(sqlite3rb
11e80 75 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  u *p, const char
11e90 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69   *zName){.  sqli
11ea0 74 65 33 20 2a 64 62 20 3d 20 30 3b 0a 20 20 69  te3 *db = 0;.  i
11eb0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
11ec0 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  _OK ){.    const
11ed0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 53 51 4c   int flags = SQL
11ee0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
11ef0 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
11f00 52 45 41 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  REATE|SQLITE_OPE
11f10 4e 5f 55 52 49 3b 0a 20 20 20 20 70 2d 3e 72 63  N_URI;.    p->rc
11f20 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f   = sqlite3_open_
11f30 76 32 28 7a 4e 61 6d 65 2c 20 26 64 62 2c 20 66  v2(zName, &db, f
11f40 6c 61 67 73 2c 20 70 2d 3e 7a 56 66 73 4e 61 6d  lags, p->zVfsNam
11f50 65 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72  e);.    if( p->r
11f60 63 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 7a 45  c ){.      p->zE
11f70 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrmsg = sqlite3_
11f80 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71  mprintf("%s", sq
11f90 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
11fa0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11fb0 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20 20  _close(db);.    
11fc0 20 20 64 62 20 3d 20 30 3b 0a 20 20 20 20 7d 0a    db = 0;.    }.
11fd0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 3b    }.  return db;
11fe0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74  .}../*.** Open t
11ff0 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
12000 6c 65 20 61 6e 64 20 61 74 74 61 63 68 20 74 68  le and attach th
12010 65 20 52 42 55 20 64 61 74 61 62 61 73 65 20 61  e RBU database a
12020 73 20 22 72 62 75 22 2e 20 49 66 20 61 6e 0a 2a  s "rbu". If an.*
12030 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  * error occurs, 
12040 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 63  leave an error c
12050 6f 64 65 20 61 6e 64 20 6d 65 73 73 61 67 65 20  ode and message 
12060 69 6e 20 74 68 65 20 52 42 55 20 68 61 6e 64 6c  in the RBU handl
12070 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
12080 64 20 72 62 75 4f 70 65 6e 44 61 74 61 62 61 73  d rbuOpenDatabas
12090 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29  e(sqlite3rbu *p)
120a0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  {.  assert( p->r
120b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
120c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 4d    assert( p->dbM
120d0 61 69 6e 3d 3d 30 20 26 26 20 70 2d 3e 64 62 52  ain==0 && p->dbR
120e0 62 75 3d 3d 30 20 29 3b 0a 0a 20 20 70 2d 3e 65  bu==0 );..  p->e
120f0 53 74 61 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e  Stage = 0;.  p->
12100 64 62 4d 61 69 6e 20 3d 20 72 62 75 4f 70 65 6e  dbMain = rbuOpen
12110 44 62 68 61 6e 64 6c 65 28 70 2c 20 70 2d 3e 7a  Dbhandle(p, p->z
12120 54 61 72 67 65 74 29 3b 0a 20 20 70 2d 3e 64 62  Target);.  p->db
12130 52 62 75 20 3d 20 72 62 75 4f 70 65 6e 44 62 68  Rbu = rbuOpenDbh
12140 61 6e 64 6c 65 28 70 2c 20 70 2d 3e 7a 52 62 75  andle(p, p->zRbu
12150 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 75 73 69 6e  );..  /* If usin
12160 67 20 73 65 70 61 72 61 74 65 20 52 42 55 20 61  g separate RBU a
12170 6e 64 20 73 74 61 74 65 20 64 61 74 61 62 61 73  nd state databas
12180 65 73 2c 20 61 74 74 61 63 68 20 74 68 65 20 73  es, attach the s
12190 74 61 74 65 20 64 61 74 61 62 61 73 65 20 74 6f  tate database to
121a0 0a 20 20 2a 2a 20 74 68 65 20 52 42 55 20 64 62  .  ** the RBU db
121b0 20 68 61 6e 64 6c 65 20 6e 6f 77 2e 20 20 2a 2f   handle now.  */
121c0 0a 20 20 69 66 28 20 70 2d 3e 7a 53 74 61 74 65  .  if( p->zState
121d0 20 29 7b 0a 20 20 20 20 72 62 75 4d 50 72 69 6e   ){.    rbuMPrin
121e0 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64 62 52  tfExec(p, p->dbR
121f0 62 75 2c 20 22 41 54 54 41 43 48 20 25 51 20 41  bu, "ATTACH %Q A
12200 53 20 73 74 61 74 22 2c 20 70 2d 3e 7a 53 74 61  S stat", p->zSta
12210 74 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  te);.    memcpy(
12220 70 2d 3e 7a 53 74 61 74 65 44 62 2c 20 22 73 74  p->zStateDb, "st
12230 61 74 22 2c 20 34 29 3b 0a 20 20 7d 65 6c 73 65  at", 4);.  }else
12240 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e  {.    memcpy(p->
12250 7a 53 74 61 74 65 44 62 2c 20 22 6d 61 69 6e 22  zStateDb, "main"
12260 2c 20 34 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  , 4);.  }..  if(
12270 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
12280 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  K ){.    p->rc =
12290 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
122a0 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 4d 61  function(p->dbMa
122b0 69 6e 2c 20 0a 20 20 20 20 20 20 20 20 22 72 62  in, .        "rb
122c0 75 5f 74 6d 70 5f 69 6e 73 65 72 74 22 2c 20 2d  u_tmp_insert", -
122d0 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
122e0 28 76 6f 69 64 2a 29 70 2c 20 72 62 75 54 6d 70  (void*)p, rbuTmp
122f0 49 6e 73 65 72 74 46 75 6e 63 2c 20 30 2c 20 30  InsertFunc, 0, 0
12300 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69  .    );.  }..  i
12310 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
12320 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  _OK ){.    p->rc
12330 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
12340 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62  e_function(p->db
12350 4d 61 69 6e 2c 20 0a 20 20 20 20 20 20 20 20 22  Main, .        "
12360 72 62 75 5f 66 6f 73 73 69 6c 5f 64 65 6c 74 61  rbu_fossil_delta
12370 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 2, SQLITE_UTF
12380 38 2c 20 30 2c 20 72 62 75 46 6f 73 73 69 6c 44  8, 0, rbuFossilD
12390 65 6c 74 61 46 75 6e 63 2c 20 30 2c 20 30 0a 20  eltaFunc, 0, 0. 
123a0 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28     );.  }..  if(
123b0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
123c0 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  K ){.    p->rc =
123d0 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
123e0 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 52 62  function(p->dbRb
123f0 75 2c 20 0a 20 20 20 20 20 20 20 20 22 72 62 75  u, .        "rbu
12400 5f 74 61 72 67 65 74 5f 6e 61 6d 65 22 2c 20 31  _target_name", 1
12410 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 28  , SQLITE_UTF8, (
12420 76 6f 69 64 2a 29 70 2c 20 72 62 75 54 61 72 67  void*)p, rbuTarg
12430 65 74 4e 61 6d 65 46 75 6e 63 2c 20 30 2c 20 30  etNameFunc, 0, 0
12440 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69  .    );.  }..  i
12450 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
12460 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  _OK ){.    p->rc
12470 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
12480 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62 4d 61 69  control(p->dbMai
12490 6e 2c 20 22 6d 61 69 6e 22 2c 20 53 51 4c 49 54  n, "main", SQLIT
124a0 45 5f 46 43 4e 54 4c 5f 52 42 55 2c 20 28 76 6f  E_FCNTL_RBU, (vo
124b0 69 64 2a 29 70 29 3b 0a 20 20 7d 0a 20 20 72 62  id*)p);.  }.  rb
124c0 75 4d 50 72 69 6e 74 66 45 78 65 63 28 70 2c 20  uMPrintfExec(p, 
124d0 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 53 45 4c 45  p->dbMain, "SELE
124e0 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65  CT * FROM sqlite
124f0 5f 6d 61 73 74 65 72 22 29 3b 0a 0a 20 20 2f 2a  _master");..  /*
12500 20 4d 61 72 6b 20 74 68 65 20 64 61 74 61 62 61   Mark the databa
12510 73 65 20 66 69 6c 65 20 6a 75 73 74 20 6f 70 65  se file just ope
12520 6e 65 64 20 61 73 20 61 6e 20 52 42 55 20 74 61  ned as an RBU ta
12530 72 67 65 74 20 64 61 74 61 62 61 73 65 2e 20 49  rget database. I
12540 66 20 0a 20 20 2a 2a 20 74 68 69 73 20 63 61 6c  f .  ** this cal
12550 6c 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  l returns SQLITE
12560 5f 4e 4f 54 46 4f 55 4e 44 2c 20 74 68 65 6e 20  _NOTFOUND, then 
12570 74 68 65 20 52 42 55 20 76 66 73 20 69 73 20 6e  the RBU vfs is n
12580 6f 74 20 69 6e 20 75 73 65 2e 0a 20 20 2a 2a 20  ot in use..  ** 
12590 54 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72  This is an error
125a0 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72  .  */.  if( p->r
125b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
125c0 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
125d0 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
125e0 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69  (p->dbMain, "mai
125f0 6e 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  n", SQLITE_FCNTL
12600 5f 52 42 55 2c 20 28 76 6f 69 64 2a 29 70 29 3b  _RBU, (void*)p);
12610 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72  .  }..  if( p->r
12620 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  c==SQLITE_NOTFOU
12630 4e 44 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ND ){.    p->rc 
12640 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
12650 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d      p->zErrmsg =
12660 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
12670 28 22 72 62 75 20 76 66 73 20 6e 6f 74 20 66 6f  ("rbu vfs not fo
12680 75 6e 64 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  und");.  }.}../*
12690 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
126a0 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68   is a copy of th
126b0 65 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66  e sqlite3FileSuf
126c0 66 69 78 33 28 29 20 72 6f 75 74 69 6e 65 20 66  fix3() routine f
126d0 72 6f 6d 20 74 68 65 20 63 6f 72 65 2e 0a 2a 2a  rom the core..**
126e0 20 49 74 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75   It is a no-op u
126f0 6e 6c 65 73 73 20 53 51 4c 49 54 45 5f 45 4e 41  nless SQLITE_ENA
12700 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20 69 73  BLE_8_3_NAMES is
12710 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20   defined..**.** 
12720 49 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  If SQLITE_ENABLE
12730 5f 38 5f 33 5f 4e 41 4d 45 53 20 69 73 20 73 65  _8_3_NAMES is se
12740 74 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  t at compile-tim
12750 65 20 61 6e 64 20 69 66 20 74 68 65 20 64 61 74  e and if the dat
12760 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 6e 61 6d  abase.** filenam
12770 65 20 69 6e 20 7a 42 61 73 65 46 69 6c 65 6e 61  e in zBaseFilena
12780 6d 65 20 69 73 20 61 20 55 52 49 20 77 69 74 68  me is a URI with
12790 20 74 68 65 20 22 38 5f 33 5f 6e 61 6d 65 73 3d   the "8_3_names=
127a0 31 22 20 70 61 72 61 6d 65 74 65 72 20 61 6e 64  1" parameter and
127b0 0a 2a 2a 20 69 66 20 66 69 6c 65 6e 61 6d 65 20  .** if filename 
127c0 69 6e 20 7a 5b 5d 20 68 61 73 20 61 20 73 75 66  in z[] has a suf
127d0 66 69 78 20 28 61 2e 6b 2e 61 2e 20 22 65 78 74  fix (a.k.a. "ext
127e0 65 6e 73 69 6f 6e 22 29 20 74 68 61 74 20 69 73  ension") that is
127f0 20 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 2a 2a 20   longer than.** 
12800 74 68 72 65 65 20 63 68 61 72 61 63 74 65 72 73  three characters
12810 2c 20 74 68 65 6e 20 73 68 6f 72 74 65 6e 20 74  , then shorten t
12820 68 65 20 73 75 66 66 69 78 20 6f 6e 20 7a 5b 5d  he suffix on z[]
12830 20 74 6f 20 62 65 20 74 68 65 20 6c 61 73 74 20   to be the last 
12840 74 68 72 65 65 0a 2a 2a 20 63 68 61 72 61 63 74  three.** charact
12850 65 72 73 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ers of the origi
12860 6e 61 6c 20 73 75 66 66 69 78 2e 0a 2a 2a 0a 2a  nal suffix..**.*
12870 2a 20 49 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  * If SQLITE_ENAB
12880 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20 69 73 20  LE_8_3_NAMES is 
12890 73 65 74 20 74 6f 20 32 20 61 74 20 63 6f 6d 70  set to 2 at comp
128a0 69 6c 65 2d 74 69 6d 65 2c 20 74 68 65 6e 20 61  ile-time, then a
128b0 6c 77 61 79 73 0a 2a 2a 20 64 6f 20 74 68 65 20  lways.** do the 
128c0 73 75 66 66 69 78 20 73 68 6f 72 74 65 6e 69 6e  suffix shortenin
128d0 67 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  g regardless of 
128e0 55 52 49 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  URI parameter..*
128f0 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 3a 0a 2a  *.** Examples:.*
12900 2a 0a 2a 2a 20 20 20 20 20 74 65 73 74 2e 64 62  *.**     test.db
12910 2d 6a 6f 75 72 6e 61 6c 20 20 20 20 3d 3e 20 20  -journal    =>  
12920 20 74 65 73 74 2e 6e 61 6c 0a 2a 2a 20 20 20 20   test.nal.**    
12930 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 20 20 20   test.db-wal    
12940 20 20 20 20 3d 3e 20 20 20 74 65 73 74 2e 77 61      =>   test.wa
12950 6c 0a 2a 2a 20 20 20 20 20 74 65 73 74 2e 64 62  l.**     test.db
12960 2d 73 68 6d 20 20 20 20 20 20 20 20 3d 3e 20 20  -shm        =>  
12970 20 74 65 73 74 2e 73 68 6d 0a 2a 2a 20 20 20 20   test.shm.**    
12980 20 74 65 73 74 2e 64 62 2d 6d 6a 37 66 33 33 31   test.db-mj7f331
12990 39 66 61 20 3d 3e 20 20 20 74 65 73 74 2e 39 66  9fa =>   test.9f
129a0 61 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  a.*/.static void
129b0 20 72 62 75 46 69 6c 65 53 75 66 66 69 78 33 28   rbuFileSuffix3(
129c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 61 73  const char *zBas
129d0 65 2c 20 63 68 61 72 20 2a 7a 29 7b 0a 23 69 66  e, char *z){.#if
129e0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
129f0 45 5f 38 5f 33 5f 4e 41 4d 45 53 0a 23 69 66 20  E_8_3_NAMES.#if 
12a00 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f  SQLITE_ENABLE_8_
12a10 33 5f 4e 41 4d 45 53 3c 32 0a 20 20 69 66 28 20  3_NAMES<2.  if( 
12a20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c  sqlite3_uri_bool
12a30 65 61 6e 28 7a 42 61 73 65 2c 20 22 38 5f 33 5f  ean(zBase, "8_3_
12a40 6e 61 6d 65 73 22 2c 20 30 29 20 29 0a 23 65 6e  names", 0) ).#en
12a50 64 69 66 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  dif.  {.    int 
12a60 69 2c 20 73 7a 3b 0a 20 20 20 20 73 7a 20 3d 20  i, sz;.    sz = 
12a70 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
12a80 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 73 7a  z);.    for(i=sz
12a90 2d 31 3b 20 69 3e 30 20 26 26 20 7a 5b 69 5d 21  -1; i>0 && z[i]!
12aa0 3d 27 2f 27 20 26 26 20 7a 5b 69 5d 21 3d 27 2e  ='/' && z[i]!='.
12ab0 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 20 20 69 66  '; i--){}.    if
12ac0 28 20 7a 5b 69 5d 3d 3d 27 2e 27 20 26 26 20 41  ( z[i]=='.' && A
12ad0 4c 57 41 59 53 28 73 7a 3e 69 2b 34 29 20 29 20  LWAYS(sz>i+4) ) 
12ae0 6d 65 6d 6d 6f 76 65 28 26 7a 5b 69 2b 31 5d 2c  memmove(&z[i+1],
12af0 20 26 7a 5b 73 7a 2d 33 5d 2c 20 34 29 3b 0a 20   &z[sz-3], 4);. 
12b00 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
12b10 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75  ** Return the cu
12b20 72 72 65 6e 74 20 77 61 6c 2d 69 6e 64 65 78 20  rrent wal-index 
12b30 68 65 61 64 65 72 20 63 68 65 63 6b 73 75 6d 20  header checksum 
12b40 66 6f 72 20 74 68 65 20 74 61 72 67 65 74 20 64  for the target d
12b50 61 74 61 62 61 73 65 20 0a 2a 2a 20 61 73 20 61  atabase .** as a
12b60 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 2e   64-bit integer.
12b70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 68 65 63 6b  .**.** The check
12b80 73 75 6d 20 69 73 20 73 74 6f 72 65 20 69 6e 20  sum is store in 
12b90 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
12ba0 66 20 78 53 68 6d 4d 61 70 20 6d 65 6d 6f 72 79  f xShmMap memory
12bb0 20 61 73 20 61 6e 20 38 2d 62 79 74 65 20 0a 2a   as an 8-byte .*
12bc0 2a 20 62 6c 6f 62 20 73 74 61 72 74 69 6e 67 20  * blob starting 
12bd0 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 34  at byte offset 4
12be0 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34  0..*/.static i64
12bf0 20 72 62 75 53 68 6d 43 68 65 63 6b 73 75 6d 28   rbuShmChecksum(
12c00 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a  sqlite3rbu *p){.
12c10 20 20 69 36 34 20 69 52 65 74 20 3d 20 30 3b 0a    i64 iRet = 0;.
12c20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
12c30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
12c40 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 44 62 20  lite3_file *pDb 
12c50 3d 20 70 2d 3e 70 54 61 72 67 65 74 46 64 2d 3e  = p->pTargetFd->
12c60 70 52 65 61 6c 3b 0a 20 20 20 20 75 33 32 20 76  pReal;.    u32 v
12c70 6f 6c 61 74 69 6c 65 20 2a 70 74 72 3b 0a 20 20  olatile *ptr;.  
12c80 20 20 70 2d 3e 72 63 20 3d 20 70 44 62 2d 3e 70    p->rc = pDb->p
12c90 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4d 61 70  Methods->xShmMap
12ca0 28 70 44 62 2c 20 30 2c 20 33 32 2a 31 30 32 34  (pDb, 0, 32*1024
12cb0 2c 20 30 2c 20 28 76 6f 69 64 20 76 6f 6c 61 74  , 0, (void volat
12cc0 69 6c 65 2a 2a 29 26 70 74 72 29 3b 0a 20 20 20  ile**)&ptr);.   
12cd0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
12ce0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
12cf0 52 65 74 20 3d 20 28 28 69 36 34 29 70 74 72 5b  Ret = ((i64)ptr[
12d00 31 30 5d 20 3c 3c 20 33 32 29 20 2b 20 70 74 72  10] << 32) + ptr
12d10 5b 31 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  [11];.    }.  }.
12d20 20 20 72 65 74 75 72 6e 20 69 52 65 74 3b 0a 7d    return iRet;.}
12d30 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
12d40 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
12d50 61 73 20 70 61 72 74 20 6f 66 20 69 6e 69 74 69  as part of initi
12d60 61 6c 69 7a 69 6e 67 20 6f 72 20 72 65 69 6e 69  alizing or reini
12d70 74 69 61 6c 69 7a 69 6e 67 20 61 6e 0a 2a 2a 20  tializing an.** 
12d80 69 6e 63 72 65 6d 65 6e 74 61 6c 20 63 68 65 63  incremental chec
12d90 6b 70 6f 69 6e 74 2e 20 0a 2a 2a 0a 2a 2a 20 49  kpoint. .**.** I
12da0 74 20 70 6f 70 75 6c 61 74 65 73 20 74 68 65 20  t populates the 
12db0 73 71 6c 69 74 65 33 72 62 75 2e 61 46 72 61 6d  sqlite3rbu.aFram
12dc0 65 5b 5d 20 61 72 72 61 79 20 77 69 74 68 20 74  e[] array with t
12dd0 68 65 20 73 65 74 20 6f 66 20 0a 2a 2a 20 28 77  he set of .** (w
12de0 61 6c 20 66 72 61 6d 65 20 2d 3e 20 64 62 20 70  al frame -> db p
12df0 61 67 65 29 20 63 6f 70 79 20 6f 70 65 72 61 74  age) copy operat
12e00 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 74 6f  ions required to
12e10 20 63 68 65 63 6b 70 6f 69 6e 74 20 74 68 65 20   checkpoint the 
12e20 0a 2a 2a 20 63 75 72 72 65 6e 74 20 77 61 6c 20  .** current wal 
12e30 66 69 6c 65 2c 20 61 6e 64 20 6f 62 74 61 69 6e  file, and obtain
12e40 73 20 74 68 65 20 73 65 74 20 6f 66 20 73 68 6d  s the set of shm
12e50 20 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 64 20   locks required 
12e60 74 6f 20 73 61 66 65 6c 79 20 0a 2a 2a 20 70 65  to safely .** pe
12e70 72 66 6f 72 6d 20 74 68 65 20 63 6f 70 79 20 6f  rform the copy o
12e80 70 65 72 61 74 69 6f 6e 73 20 64 69 72 65 63 74  perations direct
12e90 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 2d 73  ly on the file-s
12ea0 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ystem..**.** If 
12eb0 61 72 67 75 6d 65 6e 74 20 70 53 74 61 74 65 20  argument pState 
12ec0 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
12ed0 6e 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61  n the incrementa
12ee0 6c 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 0a  l checkpoint is.
12ef0 2a 2a 20 62 65 69 6e 67 20 72 65 73 75 6d 65 64  ** being resumed
12f00 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
12f10 69 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  if the checksum 
12f20 6f 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78  of the wal-index
12f30 2d 68 65 61 64 65 72 0a 2a 2a 20 66 6f 6c 6c 6f  -header.** follo
12f40 77 69 6e 67 20 72 65 63 6f 76 65 72 79 20 69 73  wing recovery is
12f50 20 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 61 73   not the same as
12f60 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 73 61   the checksum sa
12f70 76 65 64 20 69 6e 20 74 68 65 20 52 62 75 53 74  ved in the RbuSt
12f80 61 74 65 0a 2a 2a 20 6f 62 6a 65 63 74 2c 20 74  ate.** object, t
12f90 68 65 6e 20 74 68 65 20 72 62 75 20 68 61 6e 64  hen the rbu hand
12fa0 6c 65 20 69 73 20 73 65 74 20 74 6f 20 44 4f 4e  le is set to DON
12fb0 45 20 73 74 61 74 65 2e 20 54 68 69 73 20 6f 63  E state. This oc
12fc0 63 75 72 73 20 69 66 20 73 6f 6d 65 0a 2a 2a 20  curs if some.** 
12fd0 6f 74 68 65 72 20 63 6c 69 65 6e 74 20 61 70 70  other client app
12fe0 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74 69  ends a transacti
12ff0 6f 6e 20 74 6f 20 74 68 65 20 77 61 6c 20 66 69  on to the wal fi
13000 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  le in the middle
13010 20 6f 66 0a 2a 2a 20 61 6e 20 69 6e 63 72 65 6d   of.** an increm
13020 65 6e 74 61 6c 20 63 68 65 63 6b 70 6f 69 6e 74  ental checkpoint
13030 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
13040 20 72 62 75 53 65 74 75 70 43 68 65 63 6b 70 6f   rbuSetupCheckpo
13050 69 6e 74 28 73 71 6c 69 74 65 33 72 62 75 20 2a  int(sqlite3rbu *
13060 70 2c 20 52 62 75 53 74 61 74 65 20 2a 70 53 74  p, RbuState *pSt
13070 61 74 65 29 7b 0a 0a 20 20 2f 2a 20 49 66 20 70  ate){..  /* If p
13080 53 74 61 74 65 20 69 73 20 4e 55 4c 4c 2c 20 74  State is NULL, t
13090 68 65 6e 20 74 68 65 20 77 61 6c 20 66 69 6c 65  hen the wal file
130a0 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65   may not have be
130b0 65 6e 20 6f 70 65 6e 65 64 20 61 6e 64 0a 20 20  en opened and.  
130c0 2a 2a 20 72 65 63 6f 76 65 72 65 64 2e 20 52 75  ** recovered. Ru
130d0 6e 6e 69 6e 67 20 61 20 72 65 61 64 2d 73 74 61  nning a read-sta
130e0 74 65 6d 65 6e 74 20 68 65 72 65 20 74 6f 20 65  tement here to e
130f0 6e 73 75 72 65 20 74 68 61 74 20 64 6f 69 6e 67  nsure that doing
13100 20 73 6f 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f   so.  ** does no
13110 74 20 69 6e 74 65 72 66 65 72 65 20 77 69 74 68  t interfere with
13120 20 74 68 65 20 22 63 61 70 74 75 72 65 22 20 70   the "capture" p
13130 72 6f 63 65 73 73 20 62 65 6c 6f 77 2e 20 20 2a  rocess below.  *
13140 2f 0a 20 20 69 66 28 20 70 53 74 61 74 65 3d 3d  /.  if( pState==
13150 30 20 29 7b 0a 20 20 20 20 70 2d 3e 65 53 74 61  0 ){.    p->eSta
13160 67 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ge = 0;.    if( 
13170 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
13180 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
13190 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  = sqlite3_exec(p
131a0 2d 3e 64 62 4d 61 69 6e 2c 20 22 53 45 4c 45 43  ->dbMain, "SELEC
131b0 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  T * FROM sqlite_
131c0 6d 61 73 74 65 72 22 2c 20 30 2c 20 30 2c 20 30  master", 0, 0, 0
131d0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
131e0 2f 2a 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20 65  /* Assuming no e
131f0 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
13200 64 2c 20 72 75 6e 20 61 20 22 72 65 73 74 61 72  d, run a "restar
13210 74 22 20 63 68 65 63 6b 70 6f 69 6e 74 20 77 69  t" checkpoint wi
13220 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69  th the.  ** sqli
13230 74 65 33 72 62 75 2e 65 53 74 61 67 65 20 76 61  te3rbu.eStage va
13240 72 69 61 62 6c 65 20 73 65 74 20 74 6f 20 43 41  riable set to CA
13250 50 54 55 52 45 2e 20 54 68 69 73 20 74 75 72 6e  PTURE. This turn
13260 73 20 6f 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s on the followi
13270 6e 67 0a 20 20 2a 2a 20 73 70 65 63 69 61 6c 20  ng.  ** special 
13280 62 65 68 61 76 69 6f 75 72 20 69 6e 20 74 68 65  behaviour in the
13290 20 72 62 75 20 56 46 53 3a 0a 20 20 2a 2a 0a 20   rbu VFS:.  **. 
132a0 20 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 65   **   * If the e
132b0 78 63 6c 75 73 69 76 65 20 73 68 6d 20 57 52 49  xclusive shm WRI
132c0 54 45 52 20 6f 72 20 52 45 41 44 30 20 6c 6f 63  TER or READ0 loc
132d0 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61  k cannot be obta
132e0 69 6e 65 64 2c 0a 20 20 2a 2a 20 20 20 20 20 74  ined,.  **     t
132f0 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 66 61  he checkpoint fa
13300 69 6c 73 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ils with SQLITE_
13310 42 55 53 59 20 28 6e 6f 72 6d 61 6c 6c 79 20 53  BUSY (normally S
13320 51 4c 69 74 65 20 77 6f 75 6c 64 0a 20 20 2a 2a  QLite would.  **
13330 20 20 20 20 20 70 72 6f 63 65 65 64 20 77 69 74       proceed wit
13340 68 20 72 75 6e 6e 69 6e 67 20 61 20 70 61 73 73  h running a pass
13350 69 76 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69  ive checkpoint i
13360 6e 73 74 65 61 64 20 6f 66 20 66 61 69 6c 69 6e  nstead of failin
13370 67 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  g)..  **.  **   
13380 2a 20 41 74 74 65 6d 70 74 73 20 74 6f 20 72 65  * Attempts to re
13390 61 64 20 66 72 6f 6d 20 74 68 65 20 2a 2d 77 61  ad from the *-wa
133a0 6c 20 66 69 6c 65 20 6f 72 20 77 72 69 74 65 20  l file or write 
133b0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
133c0 66 69 6c 65 0a 20 20 2a 2a 20 20 20 20 20 64 6f  file.  **     do
133d0 20 6e 6f 74 20 70 65 72 66 6f 72 6d 20 61 6e 79   not perform any
133e0 20 49 4f 2e 20 49 6e 73 74 65 61 64 2c 20 74 68   IO. Instead, th
133f0 65 20 66 72 61 6d 65 2f 70 61 67 65 20 63 6f 6d  e frame/page com
13400 62 69 6e 61 74 69 6f 6e 73 20 74 68 61 74 0a 20  binations that. 
13410 20 2a 2a 20 20 20 20 20 77 6f 75 6c 64 20 62 65   **     would be
13420 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 61 72   read/written ar
13430 65 20 72 65 63 6f 72 64 65 64 20 69 6e 20 74 68  e recorded in th
13440 65 20 73 71 6c 69 74 65 33 72 62 75 2e 61 46 72  e sqlite3rbu.aFr
13450 61 6d 65 5b 5d 0a 20 20 2a 2a 20 20 20 20 20 61  ame[].  **     a
13460 72 72 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rray..  **.  ** 
13470 20 20 2a 20 43 61 6c 6c 73 20 74 6f 20 78 53 68    * Calls to xSh
13480 6d 4c 6f 63 6b 28 55 4e 4c 4f 43 4b 29 20 74 6f  mLock(UNLOCK) to
13490 20 72 65 6c 65 61 73 65 20 74 68 65 20 65 78 63   release the exc
134a0 6c 75 73 69 76 65 20 73 68 6d 20 57 52 49 54 45  lusive shm WRITE
134b0 52 2c 20 0a 20 20 2a 2a 20 20 20 20 20 52 45 41  R, .  **     REA
134c0 44 30 20 61 6e 64 20 43 48 45 43 4b 50 4f 49 4e  D0 and CHECKPOIN
134d0 54 20 6c 6f 63 6b 73 20 74 61 6b 65 6e 20 61 73  T locks taken as
134e0 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 68 65   part of the che
134f0 63 6b 70 6f 69 6e 74 20 61 72 65 0a 20 20 2a 2a  ckpoint are.  **
13500 20 20 20 20 20 6e 6f 2d 6f 70 73 2e 20 54 68 65       no-ops. The
13510 73 65 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 6e 6f  se locks will no
13520 74 20 62 65 20 72 65 6c 65 61 73 65 64 20 75 6e  t be released un
13530 74 69 6c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  til the connecti
13540 6f 6e 0a 20 20 2a 2a 20 20 20 20 20 69 73 20 63  on.  **     is c
13550 6c 6f 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  losed..  **.  **
13560 20 20 20 2a 20 41 74 74 65 6d 70 74 69 6e 67 20     * Attempting 
13570 74 6f 20 78 53 79 6e 63 28 29 20 74 68 65 20 64  to xSync() the d
13580 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 61 75  atabase file cau
13590 73 65 73 20 61 6e 20 53 51 4c 49 54 45 5f 49 4e  ses an SQLITE_IN
135a0 54 45 52 4e 41 4c 20 0a 20 20 2a 2a 20 20 20 20  TERNAL .  **    
135b0 20 65 72 72 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a   error..  **.  *
135c0 2a 20 41 73 20 61 20 72 65 73 75 6c 74 2c 20 75  * As a result, u
135d0 6e 6c 65 73 73 20 61 6e 20 65 72 72 6f 72 20 28  nless an error (
135e0 69 2e 65 2e 20 4f 4f 4d 20 6f 72 20 53 51 4c 49  i.e. OOM or SQLI
135f0 54 45 5f 42 55 53 59 29 20 6f 63 63 75 72 73 2c  TE_BUSY) occurs,
13600 20 74 68 65 0a 20 20 2a 2a 20 63 68 65 63 6b 70   the.  ** checkp
13610 6f 69 6e 74 20 62 65 6c 6f 77 20 66 61 69 6c 73  oint below fails
13620 20 77 69 74 68 20 53 51 4c 49 54 45 5f 49 4e 54   with SQLITE_INT
13630 45 52 4e 41 4c 2c 20 61 6e 64 20 6c 65 61 76 65  ERNAL, and leave
13640 73 20 74 68 65 20 61 46 72 61 6d 65 5b 5d 0a 20  s the aFrame[]. 
13650 20 2a 2a 20 61 72 72 61 79 20 70 6f 70 75 6c 61   ** array popula
13660 74 65 64 20 77 69 74 68 20 61 20 73 65 74 20 6f  ted with a set o
13670 66 20 28 66 72 61 6d 65 20 2d 3e 20 70 61 67 65  f (frame -> page
13680 29 20 6d 61 70 70 69 6e 67 73 2e 20 42 65 63 61  ) mappings. Beca
13690 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 57 52  use the .  ** WR
136a0 49 54 45 52 2c 20 43 48 45 43 4b 50 4f 49 4e 54  ITER, CHECKPOINT
136b0 20 61 6e 64 20 52 45 41 44 30 20 6c 6f 63 6b 73   and READ0 locks
136c0 20 61 72 65 20 73 74 69 6c 6c 20 68 65 6c 64 2c   are still held,
136d0 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 63   it is safe to c
136e0 6f 70 79 20 0a 20 20 2a 2a 20 64 61 74 61 20 66  opy .  ** data f
136f0 72 6f 6d 20 74 68 65 20 77 61 6c 20 66 69 6c 65  rom the wal file
13700 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
13710 73 65 20 66 69 6c 65 20 61 63 63 6f 72 64 69 6e  se file accordin
13720 67 20 74 6f 20 74 68 65 20 0a 20 20 2a 2a 20 63  g to the .  ** c
13730 6f 6e 74 65 6e 74 73 20 6f 66 20 61 46 72 61 6d  ontents of aFram
13740 65 5b 5d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  e[]..  */.  if( 
13750 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
13760 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b   ){.    int rc2;
13770 0a 20 20 20 20 70 2d 3e 65 53 74 61 67 65 20 3d  .    p->eStage =
13780 20 52 42 55 5f 53 54 41 47 45 5f 43 41 50 54 55   RBU_STAGE_CAPTU
13790 52 45 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71  RE;.    rc2 = sq
137a0 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
137b0 4d 61 69 6e 2c 20 22 50 52 41 47 4d 41 20 6d 61  Main, "PRAGMA ma
137c0 69 6e 2e 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  in.wal_checkpoin
137d0 74 3d 72 65 73 74 61 72 74 22 2c 20 30 2c 20 30  t=restart", 0, 0
137e0 2c 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32  ,0);.    if( rc2
137f0 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41  !=SQLITE_INTERNA
13800 4c 20 29 20 70 2d 3e 72 63 20 3d 20 72 63 32 3b  L ) p->rc = rc2;
13810 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72  .  }..  if( p->r
13820 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
13830 20 20 20 20 70 2d 3e 65 53 74 61 67 65 20 3d 20      p->eStage = 
13840 52 42 55 5f 53 54 41 47 45 5f 43 4b 50 54 3b 0a  RBU_STAGE_CKPT;.
13850 20 20 20 20 70 2d 3e 6e 53 74 65 70 20 3d 20 28      p->nStep = (
13860 70 53 74 61 74 65 20 3f 20 70 53 74 61 74 65 2d  pState ? pState-
13870 3e 6e 52 6f 77 20 3a 20 30 29 3b 0a 20 20 20 20  >nRow : 0);.    
13880 70 2d 3e 61 42 75 66 20 3d 20 72 62 75 4d 61 6c  p->aBuf = rbuMal
13890 6c 6f 63 28 70 2c 20 70 2d 3e 70 67 73 7a 29 3b  loc(p, p->pgsz);
138a0 0a 20 20 20 20 70 2d 3e 69 57 61 6c 43 6b 73 75  .    p->iWalCksu
138b0 6d 20 3d 20 72 62 75 53 68 6d 43 68 65 63 6b 73  m = rbuShmChecks
138c0 75 6d 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  um(p);.  }..  if
138d0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
138e0 4f 4b 20 26 26 20 70 53 74 61 74 65 20 26 26 20  OK && pState && 
138f0 70 53 74 61 74 65 2d 3e 69 57 61 6c 43 6b 73 75  pState->iWalCksu
13900 6d 21 3d 70 2d 3e 69 57 61 6c 43 6b 73 75 6d 20  m!=p->iWalCksum 
13910 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
13920 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
13930 70 2d 3e 65 53 74 61 67 65 20 3d 20 52 42 55 5f  p->eStage = RBU_
13940 53 54 41 47 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a  STAGE_DONE;.  }.
13950 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 65 64 20  }../*.** Called 
13960 77 68 65 6e 20 69 41 6d 74 20 62 79 74 65 73 20  when iAmt bytes 
13970 61 72 65 20 72 65 61 64 20 66 72 6f 6d 20 6f 66  are read from of
13980 66 73 65 74 20 69 4f 66 66 20 6f 66 20 74 68 65  fset iOff of the
13990 20 77 61 6c 20 66 69 6c 65 20 77 68 69 6c 65 0a   wal file while.
139a0 2a 2a 20 74 68 65 20 72 62 75 20 6f 62 6a 65 63  ** the rbu objec
139b0 74 20 69 73 20 69 6e 20 63 61 70 74 75 72 65 20  t is in capture 
139c0 6d 6f 64 65 2e 20 52 65 63 6f 72 64 20 74 68 65  mode. Record the
139d0 20 66 72 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66   frame number of
139e0 20 74 68 65 20 66 72 61 6d 65 0a 2a 2a 20 62 65   the frame.** be
139f0 69 6e 67 20 72 65 61 64 20 69 6e 20 74 68 65 20  ing read in the 
13a00 61 46 72 61 6d 65 5b 5d 20 61 72 72 61 79 2e 0a  aFrame[] array..
13a10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62  */.static int rb
13a20 75 43 61 70 74 75 72 65 57 61 6c 52 65 61 64 28  uCaptureWalRead(
13a30 73 71 6c 69 74 65 33 72 62 75 20 2a 70 52 62 75  sqlite3rbu *pRbu
13a40 2c 20 69 36 34 20 69 4f 66 66 2c 20 69 6e 74 20  , i64 iOff, int 
13a50 69 41 6d 74 29 7b 0a 20 20 63 6f 6e 73 74 20 75  iAmt){.  const u
13a60 33 32 20 6d 52 65 71 20 3d 20 28 31 3c 3c 57 41  32 mReq = (1<<WA
13a70 4c 5f 4c 4f 43 4b 5f 57 52 49 54 45 29 7c 28 31  L_LOCK_WRITE)|(1
13a80 3c 3c 57 41 4c 5f 4c 4f 43 4b 5f 43 4b 50 54 29  <<WAL_LOCK_CKPT)
13a90 7c 28 31 3c 3c 57 41 4c 5f 4c 4f 43 4b 5f 52 45  |(1<<WAL_LOCK_RE
13aa0 41 44 30 29 3b 0a 20 20 75 33 32 20 69 46 72 61  AD0);.  u32 iFra
13ab0 6d 65 3b 0a 0a 20 20 69 66 28 20 70 52 62 75 2d  me;..  if( pRbu-
13ac0 3e 6d 4c 6f 63 6b 21 3d 6d 52 65 71 20 29 7b 0a  >mLock!=mReq ){.
13ad0 20 20 20 20 70 52 62 75 2d 3e 72 63 20 3d 20 53      pRbu->rc = S
13ae0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
13af0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4e  return SQLITE_IN
13b00 54 45 52 4e 41 4c 3b 0a 20 20 7d 0a 0a 20 20 70  TERNAL;.  }..  p
13b10 52 62 75 2d 3e 70 67 73 7a 20 3d 20 69 41 6d 74  Rbu->pgsz = iAmt
13b20 3b 0a 20 20 69 66 28 20 70 52 62 75 2d 3e 6e 46  ;.  if( pRbu->nF
13b30 72 61 6d 65 3d 3d 70 52 62 75 2d 3e 6e 46 72 61  rame==pRbu->nFra
13b40 6d 65 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69  meAlloc ){.    i
13b50 6e 74 20 6e 4e 65 77 20 3d 20 28 70 52 62 75 2d  nt nNew = (pRbu-
13b60 3e 6e 46 72 61 6d 65 41 6c 6c 6f 63 20 3f 20 70  >nFrameAlloc ? p
13b70 52 62 75 2d 3e 6e 46 72 61 6d 65 41 6c 6c 6f 63  Rbu->nFrameAlloc
13b80 20 3a 20 36 34 29 20 2a 20 32 3b 0a 20 20 20 20   : 64) * 2;.    
13b90 52 62 75 46 72 61 6d 65 20 2a 61 4e 65 77 3b 0a  RbuFrame *aNew;.
13ba0 20 20 20 20 61 4e 65 77 20 3d 20 28 52 62 75 46      aNew = (RbuF
13bb0 72 61 6d 65 2a 29 73 71 6c 69 74 65 33 5f 72 65  rame*)sqlite3_re
13bc0 61 6c 6c 6f 63 36 34 28 70 52 62 75 2d 3e 61 46  alloc64(pRbu->aF
13bd0 72 61 6d 65 2c 20 6e 4e 65 77 20 2a 20 73 69 7a  rame, nNew * siz
13be0 65 6f 66 28 52 62 75 46 72 61 6d 65 29 29 3b 0a  eof(RbuFrame));.
13bf0 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20      if( aNew==0 
13c00 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
13c10 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 52 62 75 2d  NOMEM;.    pRbu-
13c20 3e 61 46 72 61 6d 65 20 3d 20 61 4e 65 77 3b 0a  >aFrame = aNew;.
13c30 20 20 20 20 70 52 62 75 2d 3e 6e 46 72 61 6d 65      pRbu->nFrame
13c40 41 6c 6c 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20 20  Alloc = nNew;.  
13c50 7d 0a 0a 20 20 69 46 72 61 6d 65 20 3d 20 28 75  }..  iFrame = (u
13c60 33 32 29 28 28 69 4f 66 66 2d 33 32 29 20 2f 20  32)((iOff-32) / 
13c70 28 69 36 34 29 28 69 41 6d 74 2b 32 34 29 29 20  (i64)(iAmt+24)) 
13c80 2b 20 31 3b 0a 20 20 69 66 28 20 70 52 62 75 2d  + 1;.  if( pRbu-
13c90 3e 69 4d 61 78 46 72 61 6d 65 3c 69 46 72 61 6d  >iMaxFrame<iFram
13ca0 65 20 29 20 70 52 62 75 2d 3e 69 4d 61 78 46 72  e ) pRbu->iMaxFr
13cb0 61 6d 65 20 3d 20 69 46 72 61 6d 65 3b 0a 20 20  ame = iFrame;.  
13cc0 70 52 62 75 2d 3e 61 46 72 61 6d 65 5b 70 52 62  pRbu->aFrame[pRb
13cd0 75 2d 3e 6e 46 72 61 6d 65 5d 2e 69 57 61 6c 46  u->nFrame].iWalF
13ce0 72 61 6d 65 20 3d 20 69 46 72 61 6d 65 3b 0a 20  rame = iFrame;. 
13cf0 20 70 52 62 75 2d 3e 61 46 72 61 6d 65 5b 70 52   pRbu->aFrame[pR
13d00 62 75 2d 3e 6e 46 72 61 6d 65 5d 2e 69 44 62 50  bu->nFrame].iDbP
13d10 61 67 65 20 3d 20 30 3b 0a 20 20 70 52 62 75 2d  age = 0;.  pRbu-
13d20 3e 6e 46 72 61 6d 65 2b 2b 3b 0a 20 20 72 65 74  >nFrame++;.  ret
13d30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
13d40 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 65 64 20 77  ../*.** Called w
13d50 68 65 6e 20 61 20 70 61 67 65 20 6f 66 20 64 61  hen a page of da
13d60 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
13d70 20 6f 66 66 73 65 74 20 69 4f 66 66 20 6f 66 20   offset iOff of 
13d80 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
13d90 66 69 6c 65 20 77 68 69 6c 65 20 74 68 65 20 72  file while the r
13da0 62 75 20 68 61 6e 64 6c 65 20 69 73 20 69 6e 20  bu handle is in 
13db0 63 61 70 74 75 72 65 20 6d 6f 64 65 2e 20 52 65  capture mode. Re
13dc0 63 6f 72 64 20 74 68 65 20 70 61 67 65 20 6e 75  cord the page nu
13dd0 6d 62 65 72 20 0a 2a 2a 20 6f 66 20 74 68 65 20  mber .** of the 
13de0 70 61 67 65 20 62 65 69 6e 67 20 77 72 69 74 74  page being writt
13df0 65 6e 20 69 6e 20 74 68 65 20 61 46 72 61 6d 65  en in the aFrame
13e00 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  [] array..*/.sta
13e10 74 69 63 20 69 6e 74 20 72 62 75 43 61 70 74 75  tic int rbuCaptu
13e20 72 65 44 62 57 72 69 74 65 28 73 71 6c 69 74 65  reDbWrite(sqlite
13e30 33 72 62 75 20 2a 70 52 62 75 2c 20 69 36 34 20  3rbu *pRbu, i64 
13e40 69 4f 66 66 29 7b 0a 20 20 70 52 62 75 2d 3e 61  iOff){.  pRbu->a
13e50 46 72 61 6d 65 5b 70 52 62 75 2d 3e 6e 46 72 61  Frame[pRbu->nFra
13e60 6d 65 2d 31 5d 2e 69 44 62 50 61 67 65 20 3d 20  me-1].iDbPage = 
13e70 28 75 33 32 29 28 69 4f 66 66 20 2f 20 70 52 62  (u32)(iOff / pRb
13e80 75 2d 3e 70 67 73 7a 29 20 2b 20 31 3b 0a 20 20  u->pgsz) + 1;.  
13e90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13ea0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
13eb0 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72  is called as par
13ec0 74 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e  t of an incremen
13ed0 74 61 6c 20 63 68 65 63 6b 70 6f 69 6e 74 20 6f  tal checkpoint o
13ee0 70 65 72 61 74 69 6f 6e 2e 20 43 6f 70 79 0a 2a  peration. Copy.*
13ef0 2a 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65  * a single frame
13f00 20 6f 66 20 64 61 74 61 20 66 72 6f 6d 20 74 68   of data from th
13f10 65 20 77 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20  e wal file into 
13f20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
13f30 65 2c 20 61 73 0a 2a 2a 20 69 6e 64 69 63 61 74  e, as.** indicat
13f40 65 64 20 62 79 20 74 68 65 20 52 62 75 46 72 61  ed by the RbuFra
13f50 6d 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  me object..*/.st
13f60 61 74 69 63 20 76 6f 69 64 20 72 62 75 43 68 65  atic void rbuChe
13f70 63 6b 70 6f 69 6e 74 46 72 61 6d 65 28 73 71 6c  ckpointFrame(sql
13f80 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62 75 46  ite3rbu *p, RbuF
13f90 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a 20  rame *pFrame){. 
13fa0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
13fb0 57 61 6c 20 3d 20 70 2d 3e 70 54 61 72 67 65 74  Wal = p->pTarget
13fc0 46 64 2d 3e 70 57 61 6c 46 64 2d 3e 70 52 65 61  Fd->pWalFd->pRea
13fd0 6c 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  l;.  sqlite3_fil
13fe0 65 20 2a 70 44 62 20 3d 20 70 2d 3e 70 54 61 72  e *pDb = p->pTar
13ff0 67 65 74 46 64 2d 3e 70 52 65 61 6c 3b 0a 20 20  getFd->pReal;.  
14000 69 36 34 20 69 4f 66 66 3b 0a 0a 20 20 61 73 73  i64 iOff;..  ass
14010 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
14020 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 4f 66 66 20  TE_OK );.  iOff 
14030 3d 20 28 69 36 34 29 28 70 46 72 61 6d 65 2d 3e  = (i64)(pFrame->
14040 69 57 61 6c 46 72 61 6d 65 2d 31 29 20 2a 20 28  iWalFrame-1) * (
14050 70 2d 3e 70 67 73 7a 20 2b 20 32 34 29 20 2b 20  p->pgsz + 24) + 
14060 33 32 20 2b 20 32 34 3b 0a 20 20 70 2d 3e 72 63  32 + 24;.  p->rc
14070 20 3d 20 70 57 61 6c 2d 3e 70 4d 65 74 68 6f 64   = pWal->pMethod
14080 73 2d 3e 78 52 65 61 64 28 70 57 61 6c 2c 20 70  s->xRead(pWal, p
14090 2d 3e 61 42 75 66 2c 20 70 2d 3e 70 67 73 7a 2c  ->aBuf, p->pgsz,
140a0 20 69 4f 66 66 29 3b 0a 20 20 69 66 28 20 70 2d   iOff);.  if( p-
140b0 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  >rc ) return;.. 
140c0 20 69 4f 66 66 20 3d 20 28 69 36 34 29 28 70 46   iOff = (i64)(pF
140d0 72 61 6d 65 2d 3e 69 44 62 50 61 67 65 2d 31 29  rame->iDbPage-1)
140e0 20 2a 20 70 2d 3e 70 67 73 7a 3b 0a 20 20 70 2d   * p->pgsz;.  p-
140f0 3e 72 63 20 3d 20 70 44 62 2d 3e 70 4d 65 74 68  >rc = pDb->pMeth
14100 6f 64 73 2d 3e 78 57 72 69 74 65 28 70 44 62 2c  ods->xWrite(pDb,
14110 20 70 2d 3e 61 42 75 66 2c 20 70 2d 3e 70 67 73   p->aBuf, p->pgs
14120 7a 2c 20 69 4f 66 66 29 3b 0a 7d 0a 0a 0a 2f 2a  z, iOff);.}.../*
14130 0a 2a 2a 20 54 61 6b 65 20 61 6e 20 45 58 43 4c  .** Take an EXCL
14140 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
14150 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
14160 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
14170 72 62 75 4c 6f 63 6b 44 61 74 61 62 61 73 65 28  rbuLockDatabase(
14180 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a  sqlite3rbu *p){.
14190 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
141a0 70 52 65 61 6c 20 3d 20 70 2d 3e 70 54 61 72 67  pReal = p->pTarg
141b0 65 74 46 64 2d 3e 70 52 65 61 6c 3b 0a 20 20 61  etFd->pReal;.  a
141c0 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
141d0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 70 2d 3e  LITE_OK );.  p->
141e0 72 63 20 3d 20 70 52 65 61 6c 2d 3e 70 4d 65 74  rc = pReal->pMet
141f0 68 6f 64 73 2d 3e 78 4c 6f 63 6b 28 70 52 65 61  hods->xLock(pRea
14200 6c 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 53  l, SQLITE_LOCK_S
14210 48 41 52 45 44 29 3b 0a 20 20 69 66 28 20 70 2d  HARED);.  if( p-
14220 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
14230 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 52  {.    p->rc = pR
14240 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  eal->pMethods->x
14250 4c 6f 63 6b 28 70 52 65 61 6c 2c 20 53 51 4c 49  Lock(pReal, SQLI
14260 54 45 5f 4c 4f 43 4b 5f 45 58 43 4c 55 53 49 56  TE_LOCK_EXCLUSIV
14270 45 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64  E);.  }.}..#if d
14280 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57 43  efined(_WIN32_WC
14290 45 29 0a 73 74 61 74 69 63 20 4c 50 57 53 54 52  E).static LPWSTR
142a0 20 72 62 75 57 69 6e 55 74 66 38 54 6f 55 6e 69   rbuWinUtf8ToUni
142b0 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20  code(const char 
142c0 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69  *zFilename){.  i
142d0 6e 74 20 6e 43 68 61 72 3b 0a 20 20 4c 50 57 53  nt nChar;.  LPWS
142e0 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  TR zWideFilename
142f0 3b 0a 0a 20 20 6e 43 68 61 72 20 3d 20 4d 75 6c  ;..  nChar = Mul
14300 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72  tiByteToWideChar
14310 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69  (CP_UTF8, 0, zFi
14320 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c  lename, -1, NULL
14330 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 43 68 61  , 0);.  if( nCha
14340 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  r==0 ){.    retu
14350 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 57 69 64  rn 0;.  }.  zWid
14360 65 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69  eFilename = sqli
14370 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e 43  te3_malloc64( nC
14380 68 61 72 2a 73 69 7a 65 6f 66 28 7a 57 69 64 65  har*sizeof(zWide
14390 46 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a  Filename[0]) );.
143a0 20 20 69 66 28 20 7a 57 69 64 65 46 69 6c 65 6e    if( zWideFilen
143b0 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ame==0 ){.    re
143c0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6d 65  turn 0;.  }.  me
143d0 6d 73 65 74 28 7a 57 69 64 65 46 69 6c 65 6e 61  mset(zWideFilena
143e0 6d 65 2c 20 30 2c 20 6e 43 68 61 72 2a 73 69 7a  me, 0, nChar*siz
143f0 65 6f 66 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d  eof(zWideFilenam
14400 65 5b 30 5d 29 29 3b 0a 20 20 6e 43 68 61 72 20  e[0]));.  nChar 
14410 3d 20 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64  = MultiByteToWid
14420 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30  eChar(CP_UTF8, 0
14430 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  , zFilename, -1,
14440 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 0a   zWideFilename,.
14450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14470 6e 43 68 61 72 29 3b 0a 20 20 69 66 28 20 6e 43  nChar);.  if( nC
14480 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  har==0 ){.    sq
14490 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65  lite3_free(zWide
144a0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a  Filename);.    z
144b0 57 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20 30  WideFilename = 0
144c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
144d0 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a  WideFilename;.}.
144e0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
144f0 65 20 52 42 55 20 68 61 6e 64 6c 65 20 69 73 20  e RBU handle is 
14500 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 52 42 55  currently in RBU
14510 5f 53 54 41 47 45 5f 4f 41 4c 20 73 74 61 74 65  _STAGE_OAL state
14520 2c 20 77 69 74 68 20 61 20 53 48 41 52 45 44 20  , with a SHARED 
14530 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 74 68 65 20 64  lock.** on the d
14540 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
14550 69 73 20 70 72 6f 63 20 6d 6f 76 65 73 20 74 68  is proc moves th
14560 65 20 2a 2d 6f 61 6c 20 66 69 6c 65 20 74 6f 20  e *-oal file to 
14570 74 68 65 20 2a 2d 77 61 6c 20 70 61 74 68 2c 0a  the *-wal path,.
14580 2a 2a 20 74 68 65 6e 20 72 65 6f 70 65 6e 73 20  ** then reopens 
14590 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
145a0 65 20 28 74 68 69 73 20 74 69 6d 65 20 69 6e 20  e (this time in 
145b0 76 61 6e 69 6c 6c 61 2c 20 6e 6f 6e 2d 6f 61 6c  vanilla, non-oal
145c0 2c 20 57 41 4c 20 6d 6f 64 65 29 2e 0a 2a 2a 20  , WAL mode)..** 
145d0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
145e0 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  rs, leave an err
145f0 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f  or code and erro
14600 72 20 6d 65 73 73 61 67 65 20 69 6e 20 74 68 65  r message in the
14610 20 72 62 75 20 0a 2a 2a 20 68 61 6e 64 6c 65 2e   rbu .** handle.
14620 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
14630 72 62 75 4d 6f 76 65 4f 61 6c 46 69 6c 65 28 73  rbuMoveOalFile(s
14640 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20  qlite3rbu *p){. 
14650 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 61   const char *zBa
14660 73 65 20 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f  se = sqlite3_db_
14670 66 69 6c 65 6e 61 6d 65 28 70 2d 3e 64 62 4d 61  filename(p->dbMa
14680 69 6e 2c 20 22 6d 61 69 6e 22 29 3b 0a 0a 20 20  in, "main");..  
14690 63 68 61 72 20 2a 7a 57 61 6c 20 3d 20 73 71 6c  char *zWal = sql
146a0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
146b0 2d 77 61 6c 22 2c 20 7a 42 61 73 65 29 3b 0a 20  -wal", zBase);. 
146c0 20 63 68 61 72 20 2a 7a 4f 61 6c 20 3d 20 73 71   char *zOal = sq
146d0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
146e0 73 2d 6f 61 6c 22 2c 20 7a 42 61 73 65 29 3b 0a  s-oal", zBase);.
146f0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 53  .  assert( p->eS
14700 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f  tage==RBU_STAGE_
14710 4d 4f 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74  MOVE );.  assert
14720 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
14730 4f 4b 20 26 26 20 70 2d 3e 7a 45 72 72 6d 73 67  OK && p->zErrmsg
14740 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a 57 61  ==0 );.  if( zWa
14750 6c 3d 3d 30 20 7c 7c 20 7a 4f 61 6c 3d 3d 30 20  l==0 || zOal==0 
14760 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
14770 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
14780 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 6f 76  else{.    /* Mov
14790 65 20 74 68 65 20 2a 2d 6f 61 6c 20 66 69 6c 65  e the *-oal file
147a0 20 74 6f 20 2a 2d 77 61 6c 2e 20 41 74 20 74 68   to *-wal. At th
147b0 69 73 20 70 6f 69 6e 74 20 63 6f 6e 6e 65 63 74  is point connect
147c0 69 6f 6e 20 70 2d 3e 64 62 20 69 73 0a 20 20 20  ion p->db is.   
147d0 20 2a 2a 20 68 6f 6c 64 69 6e 67 20 61 20 53 48   ** holding a SH
147e0 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ARED lock on the
147f0 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65   target database
14800 20 66 69 6c 65 20 28 62 65 63 61 75 73 65 20 69   file (because i
14810 74 20 69 73 0a 20 20 20 20 2a 2a 20 69 6e 20 57  t is.    ** in W
14820 41 4c 20 6d 6f 64 65 29 2e 20 53 6f 20 6e 6f 20  AL mode). So no 
14830 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
14840 20 6d 61 79 20 62 65 20 77 72 69 74 69 6e 67 20   may be writing 
14850 74 68 65 20 64 62 2e 20 0a 20 20 20 20 2a 2a 0a  the db. .    **.
14860 20 20 20 20 2a 2a 20 49 6e 20 6f 72 64 65 72 20      ** In order 
14870 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  to ensure that t
14880 68 65 72 65 20 61 72 65 20 6e 6f 20 64 61 74 61  here are no data
14890 62 61 73 65 20 72 65 61 64 65 72 73 2c 20 61 6e  base readers, an
148a0 20 45 58 43 4c 55 53 49 56 45 0a 20 20 20 20 2a   EXCLUSIVE.    *
148b0 2a 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  * lock is obtain
148c0 65 64 20 68 65 72 65 20 62 65 66 6f 72 65 20 74  ed here before t
148d0 68 65 20 2a 2d 6f 61 6c 20 69 73 20 6d 6f 76 65  he *-oal is move
148e0 64 20 74 6f 20 2a 2d 77 61 6c 2e 0a 20 20 20 20  d to *-wal..    
148f0 2a 2f 0a 20 20 20 20 72 62 75 4c 6f 63 6b 44 61  */.    rbuLockDa
14900 74 61 62 61 73 65 28 70 29 3b 0a 20 20 20 20 69  tabase(p);.    i
14910 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
14920 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 62 75  _OK ){.      rbu
14930 46 69 6c 65 53 75 66 66 69 78 33 28 7a 42 61 73  FileSuffix3(zBas
14940 65 2c 20 7a 57 61 6c 29 3b 0a 20 20 20 20 20 20  e, zWal);.      
14950 72 62 75 46 69 6c 65 53 75 66 66 69 78 33 28 7a  rbuFileSuffix3(z
14960 42 61 73 65 2c 20 7a 4f 61 6c 29 3b 0a 0a 20 20  Base, zOal);..  
14970 20 20 20 20 2f 2a 20 52 65 2d 6f 70 65 6e 20 74      /* Re-open t
14980 68 65 20 64 61 74 61 62 61 73 65 73 2e 20 2a 2f  he databases. */
14990 0a 20 20 20 20 20 20 72 62 75 4f 62 6a 49 74 65  .      rbuObjIte
149a0 72 46 69 6e 61 6c 69 7a 65 28 26 70 2d 3e 6f 62  rFinalize(&p->ob
149b0 6a 69 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71  jiter);.      sq
149c0 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64  lite3_close(p->d
149d0 62 4d 61 69 6e 29 3b 0a 20 20 20 20 20 20 73 71  bMain);.      sq
149e0 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64  lite3_close(p->d
149f0 62 52 62 75 29 3b 0a 20 20 20 20 20 20 70 2d 3e  bRbu);.      p->
14a00 64 62 4d 61 69 6e 20 3d 20 30 3b 0a 20 20 20 20  dbMain = 0;.    
14a10 20 20 70 2d 3e 64 62 52 62 75 20 3d 20 30 3b 0a    p->dbRbu = 0;.
14a20 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49  .#if defined(_WI
14a30 4e 33 32 5f 57 43 45 29 0a 20 20 20 20 20 20 7b  N32_WCE).      {
14a40 0a 20 20 20 20 20 20 20 20 4c 50 57 53 54 52 20  .        LPWSTR 
14a50 7a 57 69 64 65 4f 61 6c 3b 0a 20 20 20 20 20 20  zWideOal;.      
14a60 20 20 4c 50 57 53 54 52 20 7a 57 69 64 65 57 61    LPWSTR zWideWa
14a70 6c 3b 0a 0a 20 20 20 20 20 20 20 20 7a 57 69 64  l;..        zWid
14a80 65 4f 61 6c 20 3d 20 72 62 75 57 69 6e 55 74 66  eOal = rbuWinUtf
14a90 38 54 6f 55 6e 69 63 6f 64 65 28 7a 4f 61 6c 29  8ToUnicode(zOal)
14aa0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 57  ;.        if( zW
14ab0 69 64 65 4f 61 6c 20 29 7b 0a 20 20 20 20 20 20  ideOal ){.      
14ac0 20 20 20 20 7a 57 69 64 65 57 61 6c 20 3d 20 72      zWideWal = r
14ad0 62 75 57 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f  buWinUtf8ToUnico
14ae0 64 65 28 7a 57 61 6c 29 3b 0a 20 20 20 20 20 20  de(zWal);.      
14af0 20 20 20 20 69 66 28 20 7a 57 69 64 65 57 61 6c      if( zWideWal
14b00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
14b10 69 66 28 20 4d 6f 76 65 46 69 6c 65 57 28 7a 57  if( MoveFileW(zW
14b20 69 64 65 4f 61 6c 2c 20 7a 57 69 64 65 57 61 6c  ideOal, zWideWal
14b30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
14b40 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
14b50 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
14b60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14b70 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53         p->rc = S
14b80 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20  QLITE_IOERR;.   
14b90 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
14ba0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
14bb0 72 65 65 28 7a 57 69 64 65 57 61 6c 29 3b 0a 20  ree(zWideWal);. 
14bc0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
14bd0 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72              p->r
14be0 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
14bf0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
14c00 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
14c10 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65  lite3_free(zWide
14c20 4f 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Oal);.        }e
14c30 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
14c40 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f  ->rc = SQLITE_IO
14c50 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ERR_NOMEM;.     
14c60 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6c     }.      }.#el
14c70 73 65 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  se.      p->rc =
14c80 20 72 65 6e 61 6d 65 28 7a 4f 61 6c 2c 20 7a 57   rename(zOal, zW
14c90 61 6c 29 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45  al) ? SQLITE_IOE
14ca0 52 52 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  RR : SQLITE_OK;.
14cb0 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 69 66  #endif..      if
14cc0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
14cd0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 62  OK ){.        rb
14ce0 75 4f 70 65 6e 44 61 74 61 62 61 73 65 28 70 29  uOpenDatabase(p)
14cf0 3b 0a 20 20 20 20 20 20 20 20 72 62 75 53 65 74  ;.        rbuSet
14d00 75 70 43 68 65 63 6b 70 6f 69 6e 74 28 70 2c 20  upCheckpoint(p, 
14d10 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
14d20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  }.  }..  sqlite3
14d30 5f 66 72 65 65 28 7a 57 61 6c 29 3b 0a 20 20 73  _free(zWal);.  s
14d40 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 61 6c  qlite3_free(zOal
14d50 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
14d60 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
14d70 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75   iterating throu
14d80 67 68 20 74 68 65 20 6b 65 79 73 20 66 6f 72 20  gh the keys for 
14d90 74 68 65 20 63 75 72 72 65 6e 74 20 6f 62 6a 65  the current obje
14da0 63 74 0a 2a 2a 20 28 70 2d 3e 6f 62 6a 69 74 65  ct.** (p->objite
14db0 72 2e 70 53 65 6c 65 63 74 29 20 63 75 72 72 65  r.pSelect) curre
14dc0 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 61  ntly points to a
14dd0 20 76 61 6c 69 64 20 72 6f 77 2e 20 54 68 69 73   valid row. This
14de0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 64 65 74   function.** det
14df0 65 72 6d 69 6e 65 73 20 74 68 65 20 74 79 70 65  ermines the type
14e00 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 20 72 65   of operation re
14e10 71 75 65 73 74 65 64 20 62 79 20 74 68 69 73 20  quested by this 
14e20 72 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 73 0a  row and returns.
14e30 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  ** one of the fo
14e40 6c 6c 6f 77 69 6e 67 20 76 61 6c 75 65 73 20 74  llowing values t
14e50 6f 20 69 6e 64 69 63 61 74 65 20 74 68 65 20 72  o indicate the r
14e60 65 73 75 6c 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  esult:.**.**    
14e70 20 2a 20 52 42 55 5f 49 4e 53 45 52 54 0a 2a 2a   * RBU_INSERT.**
14e80 20 20 20 20 20 2a 20 52 42 55 5f 44 45 4c 45 54       * RBU_DELET
14e90 45 0a 2a 2a 20 20 20 20 20 2a 20 52 42 55 5f 49  E.**     * RBU_I
14ea0 44 58 5f 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20  DX_DELETE.**    
14eb0 20 2a 20 52 42 55 5f 55 50 44 41 54 45 0a 2a 2a   * RBU_UPDATE.**
14ec0 0a 2a 2a 20 49 66 20 52 42 55 5f 55 50 44 41 54  .** If RBU_UPDAT
14ed0 45 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74  E is returned, t
14ee0 68 65 6e 20 6f 75 74 70 75 74 20 76 61 72 69 61  hen output varia
14ef0 62 6c 65 20 2a 70 7a 4d 61 73 6b 20 69 73 20 73  ble *pzMask is s
14f00 65 74 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74  et to.** point t
14f10 6f 20 74 68 65 20 74 65 78 74 20 76 61 6c 75 65  o the text value
14f20 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65 20   indicating the 
14f30 63 6f 6c 75 6d 6e 73 20 74 6f 20 75 70 64 61 74  columns to updat
14f40 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
14f50 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 66 69 65 6c  rbu_control fiel
14f60 64 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e  d contains an in
14f70 76 61 6c 69 64 20 76 61 6c 75 65 2c 20 61 6e 20  valid value, an 
14f80 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 0a 2a  error code and.*
14f90 2a 20 6d 65 73 73 61 67 65 20 61 72 65 20 6c 65  * message are le
14fa0 66 74 20 69 6e 20 74 68 65 20 52 42 55 20 68 61  ft in the RBU ha
14fb0 6e 64 6c 65 20 61 6e 64 20 7a 65 72 6f 20 72 65  ndle and zero re
14fc0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
14fd0 63 20 69 6e 74 20 72 62 75 53 74 65 70 54 79 70  c int rbuStepTyp
14fe0 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c  e(sqlite3rbu *p,
14ff0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
15000 4d 61 73 6b 29 7b 0a 20 20 69 6e 74 20 69 43 6f  Mask){.  int iCo
15010 6c 20 3d 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 6e  l = p->objiter.n
15020 43 6f 6c 3b 20 20 20 20 20 2f 2a 20 49 6e 64 65  Col;     /* Inde
15030 78 20 6f 66 20 72 62 75 5f 63 6f 6e 74 72 6f 6c  x of rbu_control
15040 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74   column */.  int
15050 20 72 65 73 20 3d 20 30 3b 20 20 20 20 20 20 20   res = 0;       
15060 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15070 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
15080 0a 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74  .  switch( sqlit
15090 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70  e3_column_type(p
150a0 2d 3e 6f 62 6a 69 74 65 72 2e 70 53 65 6c 65 63  ->objiter.pSelec
150b0 74 2c 20 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20  t, iCol) ){.    
150c0 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45  case SQLITE_INTE
150d0 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  GER: {.      int
150e0 20 69 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f   iVal = sqlite3_
150f0 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 2d 3e 6f 62  column_int(p->ob
15100 6a 69 74 65 72 2e 70 53 65 6c 65 63 74 2c 20 69  jiter.pSelect, i
15110 43 6f 6c 29 3b 0a 20 20 20 20 20 20 73 77 69 74  Col);.      swit
15120 63 68 28 20 69 56 61 6c 20 29 7b 0a 20 20 20 20  ch( iVal ){.    
15130 20 20 20 20 63 61 73 65 20 30 3a 20 72 65 73 20      case 0: res 
15140 3d 20 52 42 55 5f 49 4e 53 45 52 54 3b 20 20 20  = RBU_INSERT;   
15150 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
15160 20 63 61 73 65 20 31 3a 20 72 65 73 20 3d 20 52   case 1: res = R
15170 42 55 5f 44 45 4c 45 54 45 3b 20 20 20 20 20 62  BU_DELETE;     b
15180 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
15190 73 65 20 32 3a 20 72 65 73 20 3d 20 52 42 55 5f  se 2: res = RBU_
151a0 52 45 50 4c 41 43 45 3b 20 20 20 20 62 72 65 61  REPLACE;    brea
151b0 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
151c0 33 3a 20 72 65 73 20 3d 20 52 42 55 5f 49 44 58  3: res = RBU_IDX
151d0 5f 44 45 4c 45 54 45 3b 20 62 72 65 61 6b 3b 0a  _DELETE; break;.
151e0 20 20 20 20 20 20 20 20 63 61 73 65 20 34 3a 20          case 4: 
151f0 72 65 73 20 3d 20 52 42 55 5f 49 44 58 5f 49 4e  res = RBU_IDX_IN
15200 53 45 52 54 3b 20 62 72 65 61 6b 3b 0a 20 20 20  SERT; break;.   
15210 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
15220 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
15230 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b  e SQLITE_TEXT: {
15240 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  .      const uns
15250 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 20 3d 20  igned char *z = 
15260 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
15270 65 78 74 28 70 2d 3e 6f 62 6a 69 74 65 72 2e 70  ext(p->objiter.p
15280 53 65 6c 65 63 74 2c 20 69 43 6f 6c 29 3b 0a 20  Select, iCol);. 
15290 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b       if( z==0 ){
152a0 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
152b0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
152c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
152d0 20 20 20 20 2a 70 7a 4d 61 73 6b 20 3d 20 28 63      *pzMask = (c
152e0 6f 6e 73 74 20 63 68 61 72 2a 29 7a 3b 0a 20 20  onst char*)z;.  
152f0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 73 20      }.      res 
15300 3d 20 52 42 55 5f 55 50 44 41 54 45 3b 0a 0a 20  = RBU_UPDATE;.. 
15310 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15320 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  }..    default:.
15330 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
15340 0a 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29  ..  if( res==0 )
15350 7b 0a 20 20 20 20 72 62 75 42 61 64 43 6f 6e 74  {.    rbuBadCont
15360 72 6f 6c 45 72 72 6f 72 28 70 29 3b 0a 20 20 7d  rolError(p);.  }
15370 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
15380 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
15390 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 41 73 73 65  DEBUG./*.** Asse
153a0 72 74 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69  rt that column i
153b0 43 6f 6c 20 6f 66 20 73 74 61 74 65 6d 65 6e 74  Col of statement
153c0 20 70 53 74 6d 74 20 69 73 20 6e 61 6d 65 64 20   pStmt is named 
153d0 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  zName..*/.static
153e0 20 76 6f 69 64 20 61 73 73 65 72 74 43 6f 6c 75   void assertColu
153f0 6d 6e 4e 61 6d 65 28 73 71 6c 69 74 65 33 5f 73  mnName(sqlite3_s
15400 74 6d 74 20 2a 70 53 74 6d 74 2c 20 69 6e 74 20  tmt *pStmt, int 
15410 69 43 6f 6c 2c 20 63 6f 6e 73 74 20 63 68 61 72  iCol, const char
15420 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 63 6f 6e 73   *zName){.  cons
15430 74 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 73  t char *zCol = s
15440 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61  qlite3_column_na
15450 6d 65 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b  me(pStmt, iCol);
15460 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71  .  assert( 0==sq
15470 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 4e  lite3_stricmp(zN
15480 61 6d 65 2c 20 7a 43 6f 6c 29 20 29 3b 0a 7d 0a  ame, zCol) );.}.
15490 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 61  #else.# define a
154a0 73 73 65 72 74 43 6f 6c 75 6d 6e 4e 61 6d 65 28  ssertColumnName(
154b0 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f  x,y,z).#endif../
154c0 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 65 54  *.** Argument eT
154d0 79 70 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 20  ype must be one 
154e0 6f 66 20 52 42 55 5f 49 4e 53 45 52 54 2c 20 52  of RBU_INSERT, R
154f0 42 55 5f 44 45 4c 45 54 45 2c 20 52 42 55 5f 49  BU_DELETE, RBU_I
15500 44 58 5f 49 4e 53 45 52 54 20 6f 72 0a 2a 2a 20  DX_INSERT or.** 
15510 52 42 55 5f 49 44 58 5f 44 45 4c 45 54 45 2e 20  RBU_IDX_DELETE. 
15520 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 65  This function pe
15530 72 66 6f 72 6d 73 20 74 68 65 20 77 6f 72 6b 20  rforms the work 
15540 6f 66 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 73  of a single.** s
15550 71 6c 69 74 65 33 72 62 75 5f 73 74 65 70 28 29  qlite3rbu_step()
15560 20 63 61 6c 6c 20 66 6f 72 20 74 68 65 20 74 79   call for the ty
15570 70 65 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 20  pe of operation 
15580 73 70 65 63 69 66 69 65 64 20 62 79 20 65 54 79  specified by eTy
15590 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  pe..*/.static vo
155a0 69 64 20 72 62 75 53 74 65 70 4f 6e 65 4f 70 28  id rbuStepOneOp(
155b0 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 69  sqlite3rbu *p, i
155c0 6e 74 20 65 54 79 70 65 29 7b 0a 20 20 52 62 75  nt eType){.  Rbu
155d0 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 20 3d  ObjIter *pIter =
155e0 20 26 70 2d 3e 6f 62 6a 69 74 65 72 3b 0a 20 20   &p->objiter;.  
155f0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
15600 56 61 6c 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  Val;.  sqlite3_s
15610 74 6d 74 20 2a 70 57 72 69 74 65 72 3b 0a 20 20  tmt *pWriter;.  
15620 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74  int i;..  assert
15630 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
15640 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OK );.  assert( 
15650 65 54 79 70 65 21 3d 52 42 55 5f 44 45 4c 45 54  eType!=RBU_DELET
15660 45 20 7c 7c 20 70 49 74 65 72 2d 3e 7a 49 64 78  E || pIter->zIdx
15670 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
15680 20 65 54 79 70 65 3d 3d 52 42 55 5f 44 45 4c 45   eType==RBU_DELE
15690 54 45 20 7c 7c 20 65 54 79 70 65 3d 3d 52 42 55  TE || eType==RBU
156a0 5f 49 44 58 5f 44 45 4c 45 54 45 0a 20 20 20 20  _IDX_DELETE.    
156b0 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 52 42 55     || eType==RBU
156c0 5f 49 4e 53 45 52 54 20 7c 7c 20 65 54 79 70 65  _INSERT || eType
156d0 3d 3d 52 42 55 5f 49 44 58 5f 49 4e 53 45 52 54  ==RBU_IDX_INSERT
156e0 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  .  );..  /* If t
156f0 68 69 73 20 69 73 20 61 20 64 65 6c 65 74 65 2c  his is a delete,
15700 20 64 65 63 72 65 6d 65 6e 74 20 6e 50 68 61 73   decrement nPhas
15710 65 4f 6e 65 53 74 65 70 20 62 79 20 6e 49 6e 64  eOneStep by nInd
15720 65 78 2e 20 49 66 20 74 68 65 20 44 45 4c 45 54  ex. If the DELET
15730 45 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  E.  ** statement
15740 20 62 65 6c 6f 77 20 64 6f 65 73 20 61 63 74 75   below does actu
15750 61 6c 6c 79 20 64 65 6c 65 74 65 20 61 20 72 6f  ally delete a ro
15760 77 2c 20 6e 50 68 61 73 65 4f 6e 65 53 74 65 70  w, nPhaseOneStep
15770 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20 69 6e   will be.  ** in
15780 63 72 65 6d 65 6e 74 65 64 20 62 79 20 74 68 65  cremented by the
15790 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20 77 68 65   same amount whe
157a0 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 72  n SQL function r
157b0 62 75 5f 74 6d 70 5f 69 6e 73 65 72 74 28 29 0a  bu_tmp_insert().
157c0 20 20 2a 2a 20 69 73 20 69 6e 76 6f 6b 65 64 20    ** is invoked 
157d0 62 79 20 74 68 65 20 74 72 69 67 67 65 72 2e 20  by the trigger. 
157e0 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d   */.  if( eType=
157f0 3d 52 42 55 5f 44 45 4c 45 54 45 20 29 7b 0a 20  =RBU_DELETE ){. 
15800 20 20 20 70 2d 3e 6e 50 68 61 73 65 4f 6e 65 53     p->nPhaseOneS
15810 74 65 70 20 2d 3d 20 70 2d 3e 6f 62 6a 69 74 65  tep -= p->objite
15820 72 2e 6e 49 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20  r.nIndex;.  }.. 
15830 20 69 66 28 20 65 54 79 70 65 3d 3d 52 42 55 5f   if( eType==RBU_
15840 49 44 58 5f 44 45 4c 45 54 45 20 7c 7c 20 65 54  IDX_DELETE || eT
15850 79 70 65 3d 3d 52 42 55 5f 44 45 4c 45 54 45 20  ype==RBU_DELETE 
15860 29 7b 0a 20 20 20 20 70 57 72 69 74 65 72 20 3d  ){.    pWriter =
15870 20 70 49 74 65 72 2d 3e 70 44 65 6c 65 74 65 3b   pIter->pDelete;
15880 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 57  .  }else{.    pW
15890 72 69 74 65 72 20 3d 20 70 49 74 65 72 2d 3e 70  riter = pIter->p
158a0 49 6e 73 65 72 74 3b 0a 20 20 7d 0a 0a 20 20 66  Insert;.  }..  f
158b0 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d  or(i=0; i<pIter-
158c0 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
158d0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
158e0 6e 20 49 4e 53 45 52 54 20 69 6e 74 6f 20 61 20  n INSERT into a 
158f0 74 61 62 6c 65 20 62 2d 74 72 65 65 20 61 6e 64  table b-tree and
15900 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61   the table has a
15910 6e 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69  n.    ** explici
15920 74 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  t INTEGER PRIMAR
15930 59 20 4b 45 59 2c 20 63 68 65 63 6b 20 74 68 61  Y KEY, check tha
15940 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 6e  t this is not an
15950 20 61 74 74 65 6d 70 74 0a 20 20 20 20 2a 2a 20   attempt.    ** 
15960 74 6f 20 77 72 69 74 65 20 61 20 4e 55 4c 4c 20  to write a NULL 
15970 69 6e 74 6f 20 74 68 65 20 49 50 4b 20 63 6f 6c  into the IPK col
15980 75 6d 6e 2e 20 54 68 61 74 20 69 73 20 6e 6f 74  umn. That is not
15990 20 70 65 72 6d 69 74 74 65 64 2e 20 20 2a 2f 0a   permitted.  */.
159a0 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 52      if( eType==R
159b0 42 55 5f 49 4e 53 45 52 54 20 0a 20 20 20 20 20  BU_INSERT .     
159c0 26 26 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d  && pIter->zIdx==
159d0 30 20 26 26 20 70 49 74 65 72 2d 3e 65 54 79 70  0 && pIter->eTyp
159e0 65 3d 3d 52 42 55 5f 50 4b 5f 49 50 4b 20 26 26  e==RBU_PK_IPK &&
159f0 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b   pIter->abTblPk[
15a00 69 5d 20 0a 20 20 20 20 20 26 26 20 73 71 6c 69  i] .     && sqli
15a10 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28  te3_column_type(
15a20 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 2c 20  pIter->pSelect, 
15a30 69 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 0a  i)==SQLITE_NULL.
15a40 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e      ){.      p->
15a50 72 63 20 3d 20 53 51 4c 49 54 45 5f 4d 49 53 4d  rc = SQLITE_MISM
15a60 41 54 43 48 3b 0a 20 20 20 20 20 20 70 2d 3e 7a  ATCH;.      p->z
15a70 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33  Errmsg = sqlite3
15a80 5f 6d 70 72 69 6e 74 66 28 22 64 61 74 61 74 79  _mprintf("dataty
15a90 70 65 20 6d 69 73 6d 61 74 63 68 22 29 3b 0a 20  pe mismatch");. 
15aa0 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
15ab0 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70   }..    if( eTyp
15ac0 65 3d 3d 52 42 55 5f 44 45 4c 45 54 45 20 26 26  e==RBU_DELETE &&
15ad0 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b   pIter->abTblPk[
15ae0 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  i]==0 ){.      c
15af0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a  ontinue;.    }..
15b00 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74      pVal = sqlit
15b10 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28  e3_column_value(
15b20 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 2c 20  pIter->pSelect, 
15b30 69 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20  i);.    p->rc = 
15b40 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c  sqlite3_bind_val
15b50 75 65 28 70 57 72 69 74 65 72 2c 20 69 2b 31 2c  ue(pWriter, i+1,
15b60 20 70 56 61 6c 29 3b 0a 20 20 20 20 69 66 28 20   pVal);.    if( 
15b70 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a  p->rc ) return;.
15b80 20 20 7d 0a 20 20 69 66 28 20 70 49 74 65 72 2d    }.  if( pIter-
15b90 3e 7a 49 64 78 3d 3d 30 0a 20 20 20 26 26 20 28  >zIdx==0.   && (
15ba0 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
15bb0 55 5f 50 4b 5f 56 54 41 42 20 7c 7c 20 70 49 74  U_PK_VTAB || pIt
15bc0 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
15bd0 4b 5f 4e 4f 4e 45 29 20 0a 20 20 29 7b 0a 20 20  K_NONE) .  ){.  
15be0 20 20 2f 2a 20 46 6f 72 20 61 20 76 69 72 74 75    /* For a virtu
15bf0 61 6c 20 74 61 62 6c 65 2c 20 6f 72 20 61 20 74  al table, or a t
15c00 61 62 6c 65 20 77 69 74 68 20 6e 6f 20 70 72 69  able with no pri
15c10 6d 61 72 79 20 6b 65 79 2c 20 74 68 65 20 0a 20  mary key, the . 
15c20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61     ** SELECT sta
15c30 74 65 6d 65 6e 74 20 69 73 3a 0a 20 20 20 20 2a  tement is:.    *
15c40 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43  *.    **   SELEC
15c50 54 20 3c 63 6f 6c 73 3e 2c 20 72 62 75 5f 63 6f  T <cols>, rbu_co
15c60 6e 74 72 6f 6c 2c 20 72 62 75 5f 72 6f 77 69 64  ntrol, rbu_rowid
15c70 20 46 52 4f 4d 20 2e 2e 2e 2e 0a 20 20 20 20 2a   FROM .....    *
15c80 2a 0a 20 20 20 20 2a 2a 20 48 65 6e 63 65 20 63  *.    ** Hence c
15c90 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 49 74 65  olumn_value(pIte
15ca0 72 2d 3e 6e 43 6f 6c 2b 31 29 2e 0a 20 20 20 20  r->nCol+1)..    
15cb0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 43 6f 6c  */.    assertCol
15cc0 75 6d 6e 4e 61 6d 65 28 70 49 74 65 72 2d 3e 70  umnName(pIter->p
15cd0 53 65 6c 65 63 74 2c 20 70 49 74 65 72 2d 3e 6e  Select, pIter->n
15ce0 43 6f 6c 2b 31 2c 20 22 72 62 75 5f 72 6f 77 69  Col+1, "rbu_rowi
15cf0 64 22 29 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20  d");.    pVal = 
15d00 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76  sqlite3_column_v
15d10 61 6c 75 65 28 70 49 74 65 72 2d 3e 70 53 65 6c  alue(pIter->pSel
15d20 65 63 74 2c 20 70 49 74 65 72 2d 3e 6e 43 6f 6c  ect, pIter->nCol
15d30 2b 31 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  +1);.    p->rc =
15d40 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61   sqlite3_bind_va
15d50 6c 75 65 28 70 57 72 69 74 65 72 2c 20 70 49 74  lue(pWriter, pIt
15d60 65 72 2d 3e 6e 43 6f 6c 2b 31 2c 20 70 56 61 6c  er->nCol+1, pVal
15d70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
15d80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
15d90 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65  .    sqlite3_ste
15da0 70 28 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20  p(pWriter);.    
15db0 70 2d 3e 72 63 20 3d 20 72 65 73 65 74 41 6e 64  p->rc = resetAnd
15dc0 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 57 72  CollectError(pWr
15dd0 69 74 65 72 2c 20 26 70 2d 3e 7a 45 72 72 6d 73  iter, &p->zErrms
15de0 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  g);.  }.}../*.**
15df0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
15e00 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 66 6f 72  oes the work for
15e10 20 61 6e 20 73 71 6c 69 74 65 33 72 62 75 5f 73   an sqlite3rbu_s
15e20 74 65 70 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a  tep() call..**.*
15e30 2a 20 54 68 65 20 6f 62 6a 65 63 74 2d 69 74 65  * The object-ite
15e40 72 61 74 6f 72 20 28 70 2d 3e 6f 62 6a 69 74 65  rator (p->objite
15e50 72 29 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  r) currently poi
15e60 6e 74 73 20 74 6f 20 61 20 76 61 6c 69 64 20 6f  nts to a valid o
15e70 62 6a 65 63 74 2c 0a 2a 2a 20 61 6e 64 20 74 68  bject,.** and th
15e80 65 20 69 6e 70 75 74 20 63 75 72 73 6f 72 20 28  e input cursor (
15e90 70 2d 3e 6f 62 6a 69 74 65 72 2e 70 53 65 6c 65  p->objiter.pSele
15ea0 63 74 29 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  ct) currently po
15eb0 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 69 64 0a  ints to a valid.
15ec0 2a 2a 20 69 6e 70 75 74 20 72 6f 77 2e 20 50 65  ** input row. Pe
15ed0 72 66 6f 72 6d 20 77 68 61 74 65 76 65 72 20 70  rform whatever p
15ee0 72 6f 63 65 73 73 69 6e 67 20 69 73 20 72 65 71  rocessing is req
15ef0 75 69 72 65 64 20 61 6e 64 20 72 65 74 75 72 6e  uired and return
15f00 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 20 65  ..**.** If no  e
15f10 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c  rror occurs, SQL
15f20 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
15f30 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61  ed. Otherwise, a
15f40 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20  n error code.** 
15f50 61 6e 64 20 6d 65 73 73 61 67 65 20 69 73 20 6c  and message is l
15f60 65 66 74 20 69 6e 20 74 68 65 20 52 42 55 20 68  eft in the RBU h
15f70 61 6e 64 6c 65 20 61 6e 64 20 61 20 63 6f 70 79  andle and a copy
15f80 20 6f 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f   of the error co
15f90 64 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a  de.** returned..
15fa0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62  */.static int rb
15fb0 75 53 74 65 70 28 73 71 6c 69 74 65 33 72 62 75  uStep(sqlite3rbu
15fc0 20 2a 70 29 7b 0a 20 20 52 62 75 4f 62 6a 49 74   *p){.  RbuObjIt
15fd0 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70 2d 3e  er *pIter = &p->
15fe0 6f 62 6a 69 74 65 72 3b 0a 20 20 63 6f 6e 73 74  objiter;.  const
15ff0 20 63 68 61 72 20 2a 7a 4d 61 73 6b 20 3d 20 30   char *zMask = 0
16000 3b 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20  ;.  int eType = 
16010 72 62 75 53 74 65 70 54 79 70 65 28 70 2c 20 26  rbuStepType(p, &
16020 7a 4d 61 73 6b 29 3b 0a 0a 20 20 69 66 28 20 65  zMask);..  if( e
16030 54 79 70 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Type ){.    asse
16040 72 74 28 20 65 54 79 70 65 3d 3d 52 42 55 5f 49  rt( eType==RBU_I
16050 4e 53 45 52 54 20 20 20 20 20 7c 7c 20 65 54 79  NSERT     || eTy
16060 70 65 3d 3d 52 42 55 5f 44 45 4c 45 54 45 0a 20  pe==RBU_DELETE. 
16070 20 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65          || eType
16080 3d 3d 52 42 55 5f 52 45 50 4c 41 43 45 20 20 20  ==RBU_REPLACE   
16090 20 7c 7c 20 65 54 79 70 65 3d 3d 52 42 55 5f 49   || eType==RBU_I
160a0 44 58 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20  DX_DELETE.      
160b0 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 52 42 55     || eType==RBU
160c0 5f 49 44 58 5f 49 4e 53 45 52 54 20 7c 7c 20 65  _IDX_INSERT || e
160d0 54 79 70 65 3d 3d 52 42 55 5f 55 50 44 41 54 45  Type==RBU_UPDATE
160e0 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73 65  .    );.    asse
160f0 72 74 28 20 65 54 79 70 65 21 3d 52 42 55 5f 55  rt( eType!=RBU_U
16100 50 44 41 54 45 20 7c 7c 20 70 49 74 65 72 2d 3e  PDATE || pIter->
16110 7a 49 64 78 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  zIdx==0 );..    
16120 69 66 28 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d  if( pIter->zIdx=
16130 3d 30 20 26 26 20 28 65 54 79 70 65 3d 3d 52 42  =0 && (eType==RB
16140 55 5f 49 44 58 5f 44 45 4c 45 54 45 20 7c 7c 20  U_IDX_DELETE || 
16150 65 54 79 70 65 3d 3d 52 42 55 5f 49 44 58 5f 49  eType==RBU_IDX_I
16160 4e 53 45 52 54 29 20 29 7b 0a 20 20 20 20 20 20  NSERT) ){.      
16170 72 62 75 42 61 64 43 6f 6e 74 72 6f 6c 45 72 72  rbuBadControlErr
16180 6f 72 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  or(p);.    }.   
16190 20 65 6c 73 65 20 69 66 28 20 65 54 79 70 65 3d   else if( eType=
161a0 3d 52 42 55 5f 52 45 50 4c 41 43 45 20 29 7b 0a  =RBU_REPLACE ){.
161b0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
161c0 3e 7a 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20  >zIdx==0 ){.    
161d0 20 20 20 20 70 2d 3e 6e 50 68 61 73 65 4f 6e 65      p->nPhaseOne
161e0 53 74 65 70 20 2b 3d 20 70 2d 3e 6f 62 6a 69 74  Step += p->objit
161f0 65 72 2e 6e 49 6e 64 65 78 3b 0a 20 20 20 20 20  er.nIndex;.     
16200 20 20 20 72 62 75 53 74 65 70 4f 6e 65 4f 70 28     rbuStepOneOp(
16210 70 2c 20 52 42 55 5f 44 45 4c 45 54 45 29 3b 0a  p, RBU_DELETE);.
16220 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
16230 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
16240 4f 4b 20 29 20 72 62 75 53 74 65 70 4f 6e 65 4f  OK ) rbuStepOneO
16250 70 28 70 2c 20 52 42 55 5f 49 4e 53 45 52 54 29  p(p, RBU_INSERT)
16260 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65  ;.    }.    else
16270 20 69 66 28 20 65 54 79 70 65 21 3d 52 42 55 5f   if( eType!=RBU_
16280 55 50 44 41 54 45 20 29 7b 0a 20 20 20 20 20 20  UPDATE ){.      
16290 72 62 75 53 74 65 70 4f 6e 65 4f 70 28 70 2c 20  rbuStepOneOp(p, 
162a0 65 54 79 70 65 29 3b 0a 20 20 20 20 7d 0a 20 20  eType);.    }.  
162b0 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71    else{.      sq
162c0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
162d0 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  l;.      sqlite3
162e0 5f 73 74 6d 74 20 2a 70 55 70 64 61 74 65 20 3d  _stmt *pUpdate =
162f0 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
16300 28 20 65 54 79 70 65 3d 3d 52 42 55 5f 55 50 44  ( eType==RBU_UPD
16310 41 54 45 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ATE );.      p->
16320 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20 2d 3d  nPhaseOneStep -=
16330 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 6e 49 6e 64   p->objiter.nInd
16340 65 78 3b 0a 20 20 20 20 20 20 72 62 75 47 65 74  ex;.      rbuGet
16350 55 70 64 61 74 65 53 74 6d 74 28 70 2c 20 70 49  UpdateStmt(p, pI
16360 74 65 72 2c 20 7a 4d 61 73 6b 2c 20 26 70 55 70  ter, zMask, &pUp
16370 64 61 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28  date);.      if(
16380 20 70 55 70 64 61 74 65 20 29 7b 0a 20 20 20 20   pUpdate ){.    
16390 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
163a0 20 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72     for(i=0; p->r
163b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
163c0 69 3c 70 49 74 65 72 2d 3e 6e 43 6f 6c 3b 20 69  i<pIter->nCol; i
163d0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  ++){.          c
163e0 68 61 72 20 63 20 3d 20 7a 4d 61 73 6b 5b 70 49  har c = zMask[pI
163f0 74 65 72 2d 3e 61 69 53 72 63 4f 72 64 65 72 5b  ter->aiSrcOrder[
16400 69 5d 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 70  i]];.          p
16410 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Val = sqlite3_co
16420 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 49 74 65 72  lumn_value(pIter
16430 2d 3e 70 53 65 6c 65 63 74 2c 20 69 29 3b 0a 20  ->pSelect, i);. 
16440 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74           if( pIt
16450 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 5d 20 7c  er->abTblPk[i] |
16460 7c 20 63 21 3d 27 2e 27 20 29 7b 0a 20 20 20 20  | c!='.' ){.    
16470 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
16480 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c  sqlite3_bind_val
16490 75 65 28 70 55 70 64 61 74 65 2c 20 69 2b 31 2c  ue(pUpdate, i+1,
164a0 20 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20   pVal);.        
164b0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
164c0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
164d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 20  =SQLITE_OK .    
164e0 20 20 20 20 20 26 26 20 28 70 49 74 65 72 2d 3e       && (pIter->
164f0 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 56 54  eType==RBU_PK_VT
16500 41 42 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79  AB || pIter->eTy
16510 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 29  pe==RBU_PK_NONE)
16520 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20   .        ){.   
16530 20 20 20 20 20 20 20 2f 2a 20 42 69 6e 64 20 74         /* Bind t
16540 68 65 20 72 62 75 5f 72 6f 77 69 64 20 76 61 6c  he rbu_rowid val
16550 75 65 20 74 6f 20 63 6f 6c 75 6d 6e 20 5f 72 6f  ue to column _ro
16560 77 69 64 5f 20 2a 2f 0a 20 20 20 20 20 20 20 20  wid_ */.        
16570 20 20 61 73 73 65 72 74 43 6f 6c 75 6d 6e 4e 61    assertColumnNa
16580 6d 65 28 70 49 74 65 72 2d 3e 70 53 65 6c 65 63  me(pIter->pSelec
16590 74 2c 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31  t, pIter->nCol+1
165a0 2c 20 22 72 62 75 5f 72 6f 77 69 64 22 29 3b 0a  , "rbu_rowid");.
165b0 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d            pVal =
165c0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
165d0 76 61 6c 75 65 28 70 49 74 65 72 2d 3e 70 53 65  value(pIter->pSe
165e0 6c 65 63 74 2c 20 70 49 74 65 72 2d 3e 6e 43 6f  lect, pIter->nCo
165f0 6c 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  l+1);.          
16600 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
16610 62 69 6e 64 5f 76 61 6c 75 65 28 70 55 70 64 61  bind_value(pUpda
16620 74 65 2c 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 2b  te, pIter->nCol+
16630 31 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20 20 20  1, pVal);.      
16640 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
16650 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
16660 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
16670 6c 69 74 65 33 5f 73 74 65 70 28 70 55 70 64 61  lite3_step(pUpda
16680 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  te);.          p
16690 2d 3e 72 63 20 3d 20 72 65 73 65 74 41 6e 64 43  ->rc = resetAndC
166a0 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 55 70 64  ollectError(pUpd
166b0 61 74 65 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  ate, &p->zErrmsg
166c0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
166d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
166e0 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d   return p->rc;.}
166f0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e  ../*.** Incremen
16700 74 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  t the schema coo
16710 6b 69 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  kie of the main 
16720 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20  database opened 
16730 62 79 20 70 2d 3e 64 62 4d 61 69 6e 2e 0a 2a 2f  by p->dbMain..*/
16740 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
16750 49 6e 63 72 53 63 68 65 6d 61 43 6f 6f 6b 69 65  IncrSchemaCookie
16760 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b  (sqlite3rbu *p){
16770 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
16780 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
16790 6e 74 20 69 43 6f 6f 6b 69 65 20 3d 20 31 30 30  nt iCookie = 100
167a0 30 30 30 30 3b 0a 20 20 20 20 73 71 6c 69 74 65  0000;.    sqlite
167b0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a  3_stmt *pStmt;..
167c0 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70      p->rc = prep
167d0 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  areAndCollectErr
167e0 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70  or(p->dbMain, &p
167f0 53 74 6d 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73  Stmt, &p->zErrms
16800 67 2c 20 0a 20 20 20 20 20 20 20 20 22 50 52 41  g, .        "PRA
16810 47 4d 41 20 73 63 68 65 6d 61 5f 76 65 72 73 69  GMA schema_versi
16820 6f 6e 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  on".    );.    i
16830 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
16840 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
16850 43 6f 76 65 72 61 67 65 3a 20 69 74 20 6d 61 79  Coverage: it may
16860 20 62 65 20 74 68 61 74 20 74 68 69 73 20 73 71   be that this sq
16870 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63 61 6e  lite3_step() can
16880 6e 6f 74 20 66 61 69 6c 2e 20 54 68 65 72 65 0a  not fail. There.
16890 20 20 20 20 20 20 2a 2a 20 69 73 20 61 6c 72 65        ** is alre
168a0 61 64 79 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ady a transactio
168b0 6e 20 6f 70 65 6e 2c 20 73 6f 20 74 68 65 20 70  n open, so the p
168c0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
168d0 74 20 63 61 6e 6e 6f 74 0a 20 20 20 20 20 20 2a  t cannot.      *
168e0 2a 20 74 68 72 6f 77 20 61 6e 20 53 51 4c 49 54  * throw an SQLIT
168f0 45 5f 53 43 48 45 4d 41 20 65 78 63 65 70 74 69  E_SCHEMA excepti
16900 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 64 61 74  on. The only dat
16910 61 62 61 73 65 20 70 61 67 65 20 74 68 65 0a 20  abase page the. 
16920 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
16930 74 20 72 65 61 64 73 20 69 73 20 70 61 67 65 20  t reads is page 
16940 31 2c 20 77 68 69 63 68 20 69 73 20 67 75 61 72  1, which is guar
16950 61 6e 74 65 65 64 20 74 6f 20 62 65 20 69 6e 20  anteed to be in 
16960 74 68 65 20 63 61 63 68 65 2e 0a 20 20 20 20 20  the cache..     
16970 20 2a 2a 20 41 6e 64 20 6e 6f 20 6d 65 6d 6f 72   ** And no memor
16980 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 72  y allocations ar
16990 65 20 72 65 71 75 69 72 65 64 2e 20 20 2a 2f 0a  e required.  */.
169a0 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
169b0 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
169c0 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20  ep(pStmt) ){.   
169d0 20 20 20 20 20 69 43 6f 6f 6b 69 65 20 3d 20 73       iCookie = s
169e0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
169f0 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  t(pStmt, 0);.   
16a00 20 20 20 7d 0a 20 20 20 20 20 20 72 62 75 46 69     }.      rbuFi
16a10 6e 61 6c 69 7a 65 28 70 2c 20 70 53 74 6d 74 29  nalize(p, pStmt)
16a20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
16a30 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
16a40 20 29 7b 0a 20 20 20 20 20 20 72 62 75 4d 50 72   ){.      rbuMPr
16a50 69 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64  intfExec(p, p->d
16a60 62 4d 61 69 6e 2c 20 22 50 52 41 47 4d 41 20 73  bMain, "PRAGMA s
16a70 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e 20 3d 20  chema_version = 
16a80 25 64 22 2c 20 69 43 6f 6f 6b 69 65 2b 31 29 3b  %d", iCookie+1);
16a90 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
16aa0 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 63  .** Update the c
16ab0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 72  ontents of the r
16ac0 62 75 5f 73 74 61 74 65 20 74 61 62 6c 65 20 77  bu_state table w
16ad0 69 74 68 69 6e 20 74 68 65 20 72 62 75 20 64 61  ithin the rbu da
16ae0 74 61 62 61 73 65 2e 20 54 68 65 0a 2a 2a 20 76  tabase. The.** v
16af0 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 74  alue stored in t
16b00 68 65 20 52 42 55 5f 53 54 41 54 45 5f 53 54 41  he RBU_STATE_STA
16b10 47 45 20 63 6f 6c 75 6d 6e 20 69 73 20 65 53 74  GE column is eSt
16b20 61 67 65 2e 20 41 6c 6c 20 6f 74 68 65 72 20 76  age. All other v
16b30 61 6c 75 65 73 0a 2a 2a 20 61 72 65 20 64 65 74  alues.** are det
16b40 65 72 6d 69 6e 65 64 20 62 79 20 69 6e 73 70 65  ermined by inspe
16b50 63 74 69 6e 67 20 74 68 65 20 72 62 75 20 68 61  cting the rbu ha
16b60 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74  ndle passed as t
16b70 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
16b80 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
16b90 64 20 72 62 75 53 61 76 65 53 74 61 74 65 28 73  d rbuSaveState(s
16ba0 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 69 6e  qlite3rbu *p, in
16bb0 74 20 65 53 74 61 67 65 29 7b 0a 20 20 69 66 28  t eStage){.  if(
16bc0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
16bd0 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  K || p->rc==SQLI
16be0 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 73  TE_DONE ){.    s
16bf0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 6e  qlite3_stmt *pIn
16c00 73 65 72 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  sert = 0;.    in
16c10 74 20 72 63 3b 0a 0a 20 20 20 20 61 73 73 65 72  t rc;..    asser
16c20 74 28 20 70 2d 3e 7a 45 72 72 6d 73 67 3d 3d 30  t( p->zErrmsg==0
16c30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 72 65   );.    rc = pre
16c40 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65  pareFreeAndColle
16c50 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 52 62 75  ctError(p->dbRbu
16c60 2c 20 26 70 49 6e 73 65 72 74 2c 20 26 70 2d 3e  , &pInsert, &p->
16c70 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20 20  zErrmsg, .      
16c80 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
16c90 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 49 4e  f(.          "IN
16ca0 53 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20  SERT OR REPLACE 
16cb0 49 4e 54 4f 20 25 73 2e 72 62 75 5f 73 74 61 74  INTO %s.rbu_stat
16cc0 65 28 6b 2c 20 76 29 20 56 41 4c 55 45 53 20 22  e(k, v) VALUES "
16cd0 0a 20 20 20 20 20 20 20 20 20 20 22 28 25 64 2c  .          "(%d,
16ce0 20 25 64 29 2c 20 22 0a 20 20 20 20 20 20 20 20   %d), ".        
16cf0 20 20 22 28 25 64 2c 20 25 51 29 2c 20 22 0a 20    "(%d, %Q), ". 
16d00 20 20 20 20 20 20 20 20 20 22 28 25 64 2c 20 25           "(%d, %
16d10 51 29 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  Q), ".          
16d20 22 28 25 64 2c 20 25 64 29 2c 20 22 0a 20 20 20  "(%d, %d), ".   
16d30 20 20 20 20 20 20 20 22 28 25 64 2c 20 25 64 29         "(%d, %d)
16d40 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 28  , ".          "(
16d50 25 64 2c 20 25 6c 6c 64 29 2c 20 22 0a 20 20 20  %d, %lld), ".   
16d60 20 20 20 20 20 20 20 22 28 25 64 2c 20 25 6c 6c         "(%d, %ll
16d70 64 29 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  d), ".          
16d80 22 28 25 64 2c 20 25 6c 6c 64 29 2c 20 22 0a 20  "(%d, %lld), ". 
16d90 20 20 20 20 20 20 20 20 20 22 28 25 64 2c 20 25           "(%d, %
16da0 6c 6c 64 29 20 22 2c 0a 20 20 20 20 20 20 20 20  lld) ",.        
16db0 20 20 70 2d 3e 7a 53 74 61 74 65 44 62 2c 0a 20    p->zStateDb,. 
16dc0 20 20 20 20 20 20 20 20 20 52 42 55 5f 53 54 41           RBU_STA
16dd0 54 45 5f 53 54 41 47 45 2c 20 65 53 74 61 67 65  TE_STAGE, eStage
16de0 2c 0a 20 20 20 20 20 20 20 20 20 20 52 42 55 5f  ,.          RBU_
16df0 53 54 41 54 45 5f 54 42 4c 2c 20 70 2d 3e 6f 62  STATE_TBL, p->ob
16e00 6a 69 74 65 72 2e 7a 54 62 6c 2c 20 0a 20 20 20  jiter.zTbl, .   
16e10 20 20 20 20 20 20 20 52 42 55 5f 53 54 41 54 45         RBU_STATE
16e20 5f 49 44 58 2c 20 70 2d 3e 6f 62 6a 69 74 65 72  _IDX, p->objiter
16e30 2e 7a 49 64 78 2c 20 0a 20 20 20 20 20 20 20 20  .zIdx, .        
16e40 20 20 52 42 55 5f 53 54 41 54 45 5f 52 4f 57 2c    RBU_STATE_ROW,
16e50 20 70 2d 3e 6e 53 74 65 70 2c 20 0a 20 20 20 20   p->nStep, .    
16e60 20 20 20 20 20 20 52 42 55 5f 53 54 41 54 45 5f        RBU_STATE_
16e70 50 52 4f 47 52 45 53 53 2c 20 70 2d 3e 6e 50 72  PROGRESS, p->nPr
16e80 6f 67 72 65 73 73 2c 0a 20 20 20 20 20 20 20 20  ogress,.        
16e90 20 20 52 42 55 5f 53 54 41 54 45 5f 43 4b 50 54    RBU_STATE_CKPT
16ea0 2c 20 70 2d 3e 69 57 61 6c 43 6b 73 75 6d 2c 0a  , p->iWalCksum,.
16eb0 20 20 20 20 20 20 20 20 20 20 52 42 55 5f 53 54            RBU_ST
16ec0 41 54 45 5f 43 4f 4f 4b 49 45 2c 20 28 69 36 34  ATE_COOKIE, (i64
16ed0 29 70 2d 3e 70 54 61 72 67 65 74 46 64 2d 3e 69  )p->pTargetFd->i
16ee0 43 6f 6f 6b 69 65 2c 0a 20 20 20 20 20 20 20 20  Cookie,.        
16ef0 20 20 52 42 55 5f 53 54 41 54 45 5f 4f 41 4c 53    RBU_STATE_OALS
16f00 5a 2c 20 70 2d 3e 69 4f 61 6c 53 7a 2c 0a 20 20  Z, p->iOalSz,.  
16f10 20 20 20 20 20 20 20 20 52 42 55 5f 53 54 41 54          RBU_STAT
16f20 45 5f 50 48 41 53 45 4f 4e 45 53 54 45 50 2c 20  E_PHASEONESTEP, 
16f30 70 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70  p->nPhaseOneStep
16f40 0a 20 20 20 20 20 20 29 0a 20 20 20 20 29 3b 0a  .      ).    );.
16f50 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 73      assert( pIns
16f60 65 72 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  ert==0 || rc==SQ
16f70 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20  LITE_OK );..    
16f80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
16f90 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
16fa0 65 33 5f 73 74 65 70 28 70 49 6e 73 65 72 74 29  e3_step(pInsert)
16fb0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
16fc0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 49  ite3_finalize(pI
16fd0 6e 73 65 72 74 29 3b 0a 20 20 20 20 7d 0a 20 20  nsert);.    }.  
16fe0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16ff0 5f 4f 4b 20 29 20 70 2d 3e 72 63 20 3d 20 72 63  _OK ) p->rc = rc
17000 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
17010 53 74 65 70 20 74 68 65 20 52 42 55 20 6f 62 6a  Step the RBU obj
17020 65 63 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ect..*/.int sqli
17030 74 65 33 72 62 75 5f 73 74 65 70 28 73 71 6c 69  te3rbu_step(sqli
17040 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 69 66  te3rbu *p){.  if
17050 28 20 70 20 29 7b 0a 20 20 20 20 73 77 69 74 63  ( p ){.    switc
17060 68 28 20 70 2d 3e 65 53 74 61 67 65 20 29 7b 0a  h( p->eStage ){.
17070 20 20 20 20 20 20 63 61 73 65 20 52 42 55 5f 53        case RBU_S
17080 54 41 47 45 5f 4f 41 4c 3a 20 7b 0a 20 20 20 20  TAGE_OAL: {.    
17090 20 20 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a      RbuObjIter *
170a0 70 49 74 65 72 20 3d 20 26 70 2d 3e 6f 62 6a 69  pIter = &p->obji
170b0 74 65 72 3b 0a 20 20 20 20 20 20 20 20 77 68 69  ter;.        whi
170c0 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
170d0 45 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d 3e 7a  E_OK && pIter->z
170e0 54 62 6c 20 29 7b 0a 0a 20 20 20 20 20 20 20 20  Tbl ){..        
170f0 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62 43 6c    if( pIter->bCl
17100 65 61 6e 75 70 20 29 7b 0a 20 20 20 20 20 20 20  eanup ){.       
17110 20 20 20 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70       /* Clean up
17120 20 74 68 65 20 72 62 75 5f 74 6d 70 5f 78 78 78   the rbu_tmp_xxx
17130 20 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20 70   table for the p
17140 72 65 76 69 6f 75 73 20 74 61 62 6c 65 2e 20 49  revious table. I
17150 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  t .            *
17160 2a 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70  * cannot be drop
17170 70 65 64 20 61 73 20 74 68 65 72 65 20 61 72 65  ped as there are
17180 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
17190 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  e SQL statements
171a0 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  ..            **
171b0 20 42 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74   But the content
171c0 73 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64  s can be deleted
171d0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
171e0 20 20 69 66 28 20 70 49 74 65 72 2d 3e 61 62 49    if( pIter->abI
171f0 6e 64 65 78 65 64 20 29 7b 0a 20 20 20 20 20 20  ndexed ){.      
17200 20 20 20 20 20 20 20 20 72 62 75 4d 50 72 69 6e          rbuMPrin
17210 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64 62 52  tfExec(p, p->dbR
17220 62 75 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  bu, .           
17230 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
17240 52 4f 4d 20 25 73 2e 27 72 62 75 5f 74 6d 70 5f  ROM %s.'rbu_tmp_
17250 25 71 27 22 2c 20 70 2d 3e 7a 53 74 61 74 65 44  %q'", p->zStateD
17260 62 2c 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54  b, pIter->zDataT
17270 62 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  bl.             
17280 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
17290 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
172a0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
172b0 62 75 4f 62 6a 49 74 65 72 50 72 65 70 61 72 65  buObjIterPrepare
172c0 41 6c 6c 28 70 2c 20 70 49 74 65 72 2c 20 30 29  All(p, pIter, 0)
172d0 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;..            /
172e0 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65  * Advance to the
172f0 20 6e 65 78 74 20 72 6f 77 20 74 6f 20 70 72 6f   next row to pro
17300 63 65 73 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  cess. */.       
17310 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
17320 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17330 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72             int r
17340 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
17350 28 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 29  (pIter->pSelect)
17360 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
17370 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52  if( rc==SQLITE_R
17380 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OW ){.          
17390 20 20 20 20 20 20 70 2d 3e 6e 50 72 6f 67 72 65        p->nProgre
173a0 73 73 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ss++;.          
173b0 20 20 20 20 20 20 70 2d 3e 6e 53 74 65 70 2b 2b        p->nStep++
173c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
173d0 20 20 72 65 74 75 72 6e 20 72 62 75 53 74 65 70    return rbuStep
173e0 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (p);.           
173f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
17400 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
17410 65 33 5f 72 65 73 65 74 28 70 49 74 65 72 2d 3e  e3_reset(pIter->
17420 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
17430 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 74 65 70          p->nStep
17440 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
17450 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
17460 0a 20 20 20 20 20 20 20 20 20 20 72 62 75 4f 62  .          rbuOb
17470 6a 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74  jIterNext(p, pIt
17480 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  er);.        }..
17490 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
174a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
174b0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
174c0 28 20 70 49 74 65 72 2d 3e 7a 54 62 6c 3d 3d 30  ( pIter->zTbl==0
174d0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 62   );.          rb
174e0 75 53 61 76 65 53 74 61 74 65 28 70 2c 20 52 42  uSaveState(p, RB
174f0 55 5f 53 54 41 47 45 5f 4d 4f 56 45 29 3b 0a 20  U_STAGE_MOVE);. 
17500 20 20 20 20 20 20 20 20 20 72 62 75 49 6e 63 72           rbuIncr
17510 53 63 68 65 6d 61 43 6f 6f 6b 69 65 28 70 29 3b  SchemaCookie(p);
17520 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
17530 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
17540 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
17550 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65  ->rc = sqlite3_e
17560 78 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22  xec(p->dbMain, "
17570 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 26  COMMIT", 0, 0, &
17580 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20  p->zErrmsg);.   
17590 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
175a0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
175b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
175c0 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73         p->rc = s
175d0 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
175e0 62 52 62 75 2c 20 22 43 4f 4d 4d 49 54 22 2c 20  bRbu, "COMMIT", 
175f0 30 2c 20 30 2c 20 26 70 2d 3e 7a 45 72 72 6d 73  0, 0, &p->zErrms
17600 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  g);.          }.
17610 20 20 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74            p->eSt
17620 61 67 65 20 3d 20 52 42 55 5f 53 54 41 47 45 5f  age = RBU_STAGE_
17630 4d 4f 56 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  MOVE;.        }.
17640 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
17650 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61       }..      ca
17660 73 65 20 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56  se RBU_STAGE_MOV
17670 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28  E: {.        if(
17680 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
17690 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
176a0 62 75 4d 6f 76 65 4f 61 6c 46 69 6c 65 28 70 29  buMoveOalFile(p)
176b0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e  ;.          p->n
176c0 50 72 6f 67 72 65 73 73 2b 2b 3b 0a 20 20 20 20  Progress++;.    
176d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
176e0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
176f0 20 20 20 20 63 61 73 65 20 52 42 55 5f 53 54 41      case RBU_STA
17700 47 45 5f 43 4b 50 54 3a 20 7b 0a 20 20 20 20 20  GE_CKPT: {.     
17710 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
17720 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17730 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 74 65       if( p->nSte
17740 70 3e 3d 70 2d 3e 6e 46 72 61 6d 65 20 29 7b 0a  p>=p->nFrame ){.
17750 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
17760 74 65 33 5f 66 69 6c 65 20 2a 70 44 62 20 3d 20  te3_file *pDb = 
17770 70 2d 3e 70 54 61 72 67 65 74 46 64 2d 3e 70 52  p->pTargetFd->pR
17780 65 61 6c 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  eal;.  .        
17790 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20      /* Sync the 
177a0 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20  db file */.     
177b0 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70         p->rc = p
177c0 44 62 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53  Db->pMethods->xS
177d0 79 6e 63 28 70 44 62 2c 20 53 51 4c 49 54 45 5f  ync(pDb, SQLITE_
177e0 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20  SYNC_NORMAL);.  
177f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
17800 55 70 64 61 74 65 20 6e 42 61 63 6b 66 69 6c 6c  Update nBackfill
17810 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
17820 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
17830 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
17840 20 20 20 20 20 20 76 6f 69 64 20 76 6f 6c 61 74        void volat
17850 69 6c 65 20 2a 70 74 72 3b 0a 20 20 20 20 20 20  ile *ptr;.      
17860 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
17870 70 44 62 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  pDb->pMethods->x
17880 53 68 6d 4d 61 70 28 70 44 62 2c 20 30 2c 20 33  ShmMap(pDb, 0, 3
17890 32 2a 31 30 32 34 2c 20 30 2c 20 26 70 74 72 29  2*1024, 0, &ptr)
178a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
178b0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
178c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
178d0 20 20 20 20 20 20 20 20 28 28 75 33 32 20 76 6f          ((u32 vo
178e0 6c 61 74 69 6c 65 2a 29 70 74 72 29 5b 32 34 5d  latile*)ptr)[24]
178f0 20 3d 20 70 2d 3e 69 4d 61 78 46 72 61 6d 65 3b   = p->iMaxFrame;
17900 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
17910 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
17920 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66   .            if
17930 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
17940 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
17950 20 20 20 20 70 2d 3e 65 53 74 61 67 65 20 3d 20      p->eStage = 
17960 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45 3b 0a  RBU_STAGE_DONE;.
17970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
17980 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e  >rc = SQLITE_DON
17990 45 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  E;.            }
179a0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
179b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 52 62  {.            Rb
179c0 75 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 20 3d  uFrame *pFrame =
179d0 20 26 70 2d 3e 61 46 72 61 6d 65 5b 70 2d 3e 6e   &p->aFrame[p->n
179e0 53 74 65 70 5d 3b 0a 20 20 20 20 20 20 20 20 20  Step];.         
179f0 20 20 20 72 62 75 43 68 65 63 6b 70 6f 69 6e 74     rbuCheckpoint
17a00 46 72 61 6d 65 28 70 2c 20 70 46 72 61 6d 65 29  Frame(p, pFrame)
17a10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  ;.            p-
17a20 3e 6e 53 74 65 70 2b 2b 3b 0a 20 20 20 20 20 20  >nStep++;.      
17a30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
17a40 70 2d 3e 6e 50 72 6f 67 72 65 73 73 2b 2b 3b 0a  p->nProgress++;.
17a50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17a60 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
17a70 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  ..      default:
17a80 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
17a90 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
17aa0 20 70 2d 3e 72 63 3b 0a 20 20 7d 65 6c 73 65 7b   p->rc;.  }else{
17ab0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
17ac0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 7d 0a  TE_NOMEM;.  }.}.
17ad0 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 20 52  ./*.** Free an R
17ae0 62 75 53 74 61 74 65 20 6f 62 6a 65 63 74 20 61  buState object a
17af0 6c 6c 6f 63 61 74 65 64 20 62 79 20 72 62 75 4c  llocated by rbuL
17b00 6f 61 64 53 74 61 74 65 28 29 2e 0a 2a 2f 0a 73  oadState()..*/.s
17b10 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 46 72  tatic void rbuFr
17b20 65 65 53 74 61 74 65 28 52 62 75 53 74 61 74 65  eeState(RbuState
17b30 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b   *p){.  if( p ){
17b40 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
17b50 65 28 70 2d 3e 7a 54 62 6c 29 3b 0a 20 20 20 20  e(p->zTbl);.    
17b60 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
17b70 7a 49 64 78 29 3b 0a 20 20 20 20 73 71 6c 69 74  zIdx);.    sqlit
17b80 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a  e3_free(p);.  }.
17b90 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
17ba0 65 20 61 6e 20 52 62 75 53 74 61 74 65 20 6f 62  e an RbuState ob
17bb0 6a 65 63 74 20 61 6e 64 20 6c 6f 61 64 20 74 68  ject and load th
17bc0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
17bd0 65 20 72 62 75 5f 73 74 61 74 65 20 0a 2a 2a 20  e rbu_state .** 
17be0 74 61 62 6c 65 20 69 6e 74 6f 20 69 74 2e 20 52  table into it. R
17bf0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
17c00 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63  to the new objec
17c10 74 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a  t. It is the .**
17c20 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
17c30 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
17c40 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
17c50 20 74 68 65 20 6f 62 6a 65 63 74 20 75 73 69 6e   the object usin
17c60 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 72 65  g.** sqlite3_fre
17c70 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  e()..**.** If an
17c80 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c   error occurs, l
17c90 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  eave an error co
17ca0 64 65 20 61 6e 64 20 6d 65 73 73 61 67 65 20 69  de and message i
17cb0 6e 20 74 68 65 20 72 62 75 20 68 61 6e 64 6c 65  n the rbu handle
17cc0 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  .** and return N
17cd0 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 52  ULL..*/.static R
17ce0 62 75 53 74 61 74 65 20 2a 72 62 75 4c 6f 61 64  buState *rbuLoad
17cf0 53 74 61 74 65 28 73 71 6c 69 74 65 33 72 62 75  State(sqlite3rbu
17d00 20 2a 70 29 7b 0a 20 20 52 62 75 53 74 61 74 65   *p){.  RbuState
17d10 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 73 71   *pRet = 0;.  sq
17d20 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
17d30 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  t = 0;.  int rc;
17d40 0a 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 70  .  int rc2;..  p
17d50 52 65 74 20 3d 20 28 52 62 75 53 74 61 74 65 2a  Ret = (RbuState*
17d60 29 72 62 75 4d 61 6c 6c 6f 63 28 70 2c 20 73 69  )rbuMalloc(p, si
17d70 7a 65 6f 66 28 52 62 75 53 74 61 74 65 29 29 3b  zeof(RbuState));
17d80 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 29  .  if( pRet==0 )
17d90 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72 63   return 0;..  rc
17da0 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e   = prepareFreeAn
17db0 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d  dCollectError(p-
17dc0 3e 64 62 52 62 75 2c 20 26 70 53 74 6d 74 2c 20  >dbRbu, &pStmt, 
17dd0 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20  &p->zErrmsg, .  
17de0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69      sqlite3_mpri
17df0 6e 74 66 28 22 53 45 4c 45 43 54 20 6b 2c 20 76  ntf("SELECT k, v
17e00 20 46 52 4f 4d 20 25 73 2e 72 62 75 5f 73 74 61   FROM %s.rbu_sta
17e10 74 65 22 2c 20 70 2d 3e 7a 53 74 61 74 65 44 62  te", p->zStateDb
17e20 29 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  ).  );.  while( 
17e30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
17e40 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
17e50 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
17e60 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20   ){.    switch( 
17e70 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
17e80 6e 74 28 70 53 74 6d 74 2c 20 30 29 20 29 7b 0a  nt(pStmt, 0) ){.
17e90 20 20 20 20 20 20 63 61 73 65 20 52 42 55 5f 53        case RBU_S
17ea0 54 41 54 45 5f 53 54 41 47 45 3a 0a 20 20 20 20  TATE_STAGE:.    
17eb0 20 20 20 20 70 52 65 74 2d 3e 65 53 74 61 67 65      pRet->eStage
17ec0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
17ed0 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31 29 3b  n_int(pStmt, 1);
17ee0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 52 65  .        if( pRe
17ef0 74 2d 3e 65 53 74 61 67 65 21 3d 52 42 55 5f 53  t->eStage!=RBU_S
17f00 54 41 47 45 5f 4f 41 4c 0a 20 20 20 20 20 20 20  TAGE_OAL.       
17f10 20 20 26 26 20 70 52 65 74 2d 3e 65 53 74 61 67    && pRet->eStag
17f20 65 21 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56  e!=RBU_STAGE_MOV
17f30 45 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 52  E.         && pR
17f40 65 74 2d 3e 65 53 74 61 67 65 21 3d 52 42 55 5f  et->eStage!=RBU_
17f50 53 54 41 47 45 5f 43 4b 50 54 0a 20 20 20 20 20  STAGE_CKPT.     
17f60 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
17f70 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43  p->rc = SQLITE_C
17f80 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20  ORRUPT;.        
17f90 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
17fa0 0a 0a 20 20 20 20 20 20 63 61 73 65 20 52 42 55  ..      case RBU
17fb0 5f 53 54 41 54 45 5f 54 42 4c 3a 0a 20 20 20 20  _STATE_TBL:.    
17fc0 20 20 20 20 70 52 65 74 2d 3e 7a 54 62 6c 20 3d      pRet->zTbl =
17fd0 20 72 62 75 53 74 72 6e 64 75 70 28 28 63 68 61   rbuStrndup((cha
17fe0 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
17ff0 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29  n_text(pStmt, 1)
18000 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20  , &rc);.        
18010 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61  break;..      ca
18020 73 65 20 52 42 55 5f 53 54 41 54 45 5f 49 44 58  se RBU_STATE_IDX
18030 3a 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  :.        pRet->
18040 7a 49 64 78 20 3d 20 72 62 75 53 74 72 6e 64 75  zIdx = rbuStrndu
18050 70 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  p((char*)sqlite3
18060 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
18070 6d 74 2c 20 31 29 2c 20 26 72 63 29 3b 0a 20 20  mt, 1), &rc);.  
18080 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
18090 20 20 20 20 63 61 73 65 20 52 42 55 5f 53 54 41      case RBU_STA
180a0 54 45 5f 52 4f 57 3a 0a 20 20 20 20 20 20 20 20  TE_ROW:.        
180b0 70 52 65 74 2d 3e 6e 52 6f 77 20 3d 20 73 71 6c  pRet->nRow = sql
180c0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
180d0 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20  pStmt, 1);.     
180e0 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20     break;..     
180f0 20 63 61 73 65 20 52 42 55 5f 53 54 41 54 45 5f   case RBU_STATE_
18100 50 52 4f 47 52 45 53 53 3a 0a 20 20 20 20 20 20  PROGRESS:.      
18110 20 20 70 52 65 74 2d 3e 6e 50 72 6f 67 72 65 73    pRet->nProgres
18120 73 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  s = sqlite3_colu
18130 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  mn_int64(pStmt, 
18140 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  1);.        brea
18150 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 52  k;..      case R
18160 42 55 5f 53 54 41 54 45 5f 43 4b 50 54 3a 0a 20  BU_STATE_CKPT:. 
18170 20 20 20 20 20 20 20 70 52 65 74 2d 3e 69 57 61         pRet->iWa
18180 6c 43 6b 73 75 6d 20 3d 20 73 71 6c 69 74 65 33  lCksum = sqlite3
18190 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53  _column_int64(pS
181a0 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  tmt, 1);.       
181b0 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63   break;..      c
181c0 61 73 65 20 52 42 55 5f 53 54 41 54 45 5f 43 4f  ase RBU_STATE_CO
181d0 4f 4b 49 45 3a 0a 20 20 20 20 20 20 20 20 70 52  OKIE:.        pR
181e0 65 74 2d 3e 69 43 6f 6f 6b 69 65 20 3d 20 28 75  et->iCookie = (u
181f0 33 32 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  32)sqlite3_colum
18200 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31  n_int64(pStmt, 1
18210 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
18220 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 52 42  ;..      case RB
18230 55 5f 53 54 41 54 45 5f 4f 41 4c 53 5a 3a 0a 20  U_STATE_OALSZ:. 
18240 20 20 20 20 20 20 20 70 52 65 74 2d 3e 69 4f 61         pRet->iOa
18250 6c 53 7a 20 3d 20 28 75 33 32 29 73 71 6c 69 74  lSz = (u32)sqlit
18260 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  e3_column_int64(
18270 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20  pStmt, 1);.     
18280 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20     break;..     
18290 20 63 61 73 65 20 52 42 55 5f 53 54 41 54 45 5f   case RBU_STATE_
182a0 50 48 41 53 45 4f 4e 45 53 54 45 50 3a 0a 20 20  PHASEONESTEP:.  
182b0 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 50 68 61        pRet->nPha
182c0 73 65 4f 6e 65 53 74 65 70 20 3d 20 73 71 6c 69  seOneStep = sqli
182d0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
182e0 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20  (pStmt, 1);.    
182f0 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
18300 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
18310 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
18320 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20  ORRUPT;.        
18330 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
18340 0a 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33  .  rc2 = sqlite3
18350 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
18360 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
18370 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32  TE_OK ) rc = rc2
18380 3b 0a 0a 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b  ;..  p->rc = rc;
18390 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
183a0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
183b0 20 73 74 72 69 6e 67 73 20 7a 31 20 61 6e 64 20   strings z1 and 
183c0 7a 32 2c 20 72 65 74 75 72 6e 69 6e 67 20 30 20  z2, returning 0 
183d0 69 66 20 74 68 65 79 20 61 72 65 20 69 64 65 6e  if they are iden
183e0 74 69 63 61 6c 2c 20 6f 72 20 6e 6f 6e 2d 7a 65  tical, or non-ze
183f0 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e  ro.** otherwise.
18400 20 45 69 74 68 65 72 20 6f 72 20 62 6f 74 68 20   Either or both 
18410 61 72 67 75 6d 65 6e 74 20 6d 61 79 20 62 65 20  argument may be 
18420 4e 55 4c 4c 2e 20 54 77 6f 20 4e 55 4c 4c 20 76  NULL. Two NULL v
18430 61 6c 75 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6e  alues are.** con
18440 73 69 64 65 72 65 64 20 65 71 75 61 6c 2c 20 61  sidered equal, a
18450 6e 64 20 4e 55 4c 4c 20 69 73 20 63 6f 6e 73 69  nd NULL is consi
18460 64 65 72 65 64 20 64 69 73 74 69 6e 63 74 20 66  dered distinct f
18470 72 6f 6d 20 61 6c 6c 20 6f 74 68 65 72 20 76 61  rom all other va
18480 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lues..*/.static 
18490 69 6e 74 20 72 62 75 53 74 72 43 6f 6d 70 61 72  int rbuStrCompar
184a0 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31  e(const char *z1
184b0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32  , const char *z2
184c0 29 7b 0a 20 20 69 66 28 20 7a 31 3d 3d 30 20 26  ){.  if( z1==0 &
184d0 26 20 7a 32 3d 3d 30 20 29 20 72 65 74 75 72 6e  & z2==0 ) return
184e0 20 30 3b 0a 20 20 69 66 28 20 7a 31 3d 3d 30 20   0;.  if( z1==0 
184f0 7c 7c 20 7a 32 3d 3d 30 20 29 20 72 65 74 75 72  || z2==0 ) retur
18500 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 28 73  n 1;.  return (s
18510 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
18520 31 2c 20 7a 32 29 21 3d 30 29 3b 0a 7d 0a 0a 2f  1, z2)!=0);.}../
18530 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
18540 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20  on is called as 
18550 70 61 72 74 20 6f 66 20 73 71 6c 69 74 65 33 72  part of sqlite3r
18560 62 75 5f 6f 70 65 6e 28 29 20 77 68 65 6e 20 69  bu_open() when i
18570 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 2a 2a 20 61  nitializing.** a
18580 6e 20 72 62 75 20 68 61 6e 64 6c 65 20 69 6e 20  n rbu handle in 
18590 4f 41 4c 20 73 74 61 67 65 2e 20 49 66 20 74 68  OAL stage. If th
185a0 65 20 72 62 75 20 75 70 64 61 74 65 20 68 61 73  e rbu update has
185b0 20 6e 6f 74 20 73 74 61 72 74 65 64 20 28 69 2e   not started (i.
185c0 65 2e 0a 2a 2a 20 74 68 65 20 72 62 75 5f 73 74  e..** the rbu_st
185d0 61 74 65 20 74 61 62 6c 65 20 77 61 73 20 65 6d  ate table was em
185e0 70 74 79 29 20 69 74 20 69 73 20 61 20 6e 6f 2d  pty) it is a no-
185f0 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  op. Otherwise, i
18600 74 20 61 72 72 61 6e 67 65 73 0a 2a 2a 20 74 68  t arranges.** th
18610 69 6e 67 73 20 73 6f 20 74 68 61 74 20 74 68 65  ings so that the
18620 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 73 71   next call to sq
18630 6c 69 74 65 33 72 62 75 5f 73 74 65 70 28 29 20  lite3rbu_step() 
18640 63 6f 6e 74 69 6e 75 65 73 20 6f 6e 20 66 72 6f  continues on fro
18650 6d 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 70  m.** where the p
18660 72 65 76 69 6f 75 73 20 72 62 75 20 68 61 6e 64  revious rbu hand
18670 6c 65 20 6c 65 66 74 20 6f 66 66 2e 0a 2a 2a 0a  le left off..**.
18680 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
18690 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20  ccurs, an error 
186a0 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d  code and error m
186b0 65 73 73 61 67 65 20 61 72 65 20 6c 65 66 74 20  essage are left 
186c0 69 6e 20 74 68 65 0a 2a 2a 20 72 62 75 20 68 61  in the.** rbu ha
186d0 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74  ndle passed as t
186e0 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
186f0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
18700 64 20 72 62 75 53 65 74 75 70 4f 61 6c 28 73 71  d rbuSetupOal(sq
18710 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62 75  lite3rbu *p, Rbu
18720 53 74 61 74 65 20 2a 70 53 74 61 74 65 29 7b 0a  State *pState){.
18730 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
18740 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
18750 69 66 28 20 70 53 74 61 74 65 2d 3e 7a 54 62 6c  if( pState->zTbl
18760 20 29 7b 0a 20 20 20 20 52 62 75 4f 62 6a 49 74   ){.    RbuObjIt
18770 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70 2d 3e  er *pIter = &p->
18780 6f 62 6a 69 74 65 72 3b 0a 20 20 20 20 69 6e 74  objiter;.    int
18790 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
187a0 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d  ..    while( rc=
187b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49  =SQLITE_OK && pI
187c0 74 65 72 2d 3e 7a 54 62 6c 20 26 26 20 28 70 49  ter->zTbl && (pI
187d0 74 65 72 2d 3e 62 43 6c 65 61 6e 75 70 20 0a 20  ter->bCleanup . 
187e0 20 20 20 20 20 20 7c 7c 20 72 62 75 53 74 72 43        || rbuStrC
187f0 6f 6d 70 61 72 65 28 70 49 74 65 72 2d 3e 7a 49  ompare(pIter->zI
18800 64 78 2c 20 70 53 74 61 74 65 2d 3e 7a 49 64 78  dx, pState->zIdx
18810 29 0a 20 20 20 20 20 20 20 7c 7c 20 72 62 75 53  ).       || rbuS
18820 74 72 43 6f 6d 70 61 72 65 28 70 49 74 65 72 2d  trCompare(pIter-
18830 3e 7a 54 62 6c 2c 20 70 53 74 61 74 65 2d 3e 7a  >zTbl, pState->z
18840 54 62 6c 29 20 0a 20 20 20 20 29 29 7b 0a 20 20  Tbl) .    )){.  
18850 20 20 20 20 72 63 20 3d 20 72 62 75 4f 62 6a 49      rc = rbuObjI
18860 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72  terNext(p, pIter
18870 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
18880 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18890 26 26 20 21 70 49 74 65 72 2d 3e 7a 54 62 6c 20  && !pIter->zTbl 
188a0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
188b0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
188c0 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73    p->zErrmsg = s
188d0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
188e0 72 62 75 5f 73 74 61 74 65 20 6d 69 73 6d 61 74  rbu_state mismat
188f0 63 68 20 65 72 72 6f 72 22 29 3b 0a 20 20 20 20  ch error");.    
18900 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  }..    if( rc==S
18910 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18920 20 20 70 2d 3e 6e 53 74 65 70 20 3d 20 70 53 74    p->nStep = pSt
18930 61 74 65 2d 3e 6e 52 6f 77 3b 0a 20 20 20 20 20  ate->nRow;.     
18940 20 72 63 20 3d 20 72 62 75 4f 62 6a 49 74 65 72   rc = rbuObjIter
18950 50 72 65 70 61 72 65 41 6c 6c 28 70 2c 20 26 70  PrepareAll(p, &p
18960 2d 3e 6f 62 6a 69 74 65 72 2c 20 70 2d 3e 6e 53  ->objiter, p->nS
18970 74 65 70 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  tep);.    }..   
18980 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 7d   p->rc = rc;.  }
18990 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
189a0 72 65 20 69 73 20 61 20 22 2a 2d 6f 61 6c 22 20  re is a "*-oal" 
189b0 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65  file in the file
189c0 2d 73 79 73 74 65 6d 20 63 6f 72 72 65 73 70 6f  -system correspo
189d0 6e 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20  nding to the.** 
189e0 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20  target database 
189f0 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
18a00 65 6d 2c 20 64 65 6c 65 74 65 20 69 74 2e 20 49  em, delete it. I
18a10 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
18a20 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65  s,.** leave an e
18a30 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72  rror code and er
18a40 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 74  ror message in t
18a50 68 65 20 72 62 75 20 68 61 6e 64 6c 65 2e 0a 2a  he rbu handle..*
18a60 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62  /.static void rb
18a70 75 44 65 6c 65 74 65 4f 61 6c 46 69 6c 65 28 73  uDeleteOalFile(s
18a80 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20  qlite3rbu *p){. 
18a90 20 63 68 61 72 20 2a 7a 4f 61 6c 20 3d 20 72 62   char *zOal = rb
18aa0 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 73 2d  uMPrintf(p, "%s-
18ab0 6f 61 6c 22 2c 20 70 2d 3e 7a 54 61 72 67 65 74  oal", p->zTarget
18ac0 29 3b 0a 20 20 69 66 28 20 7a 4f 61 6c 20 29 7b  );.  if( zOal ){
18ad0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
18ae0 20 2a 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33   *pVfs = sqlite3
18af0 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20  _vfs_find(0);.  
18b00 20 20 61 73 73 65 72 74 28 20 70 56 66 73 20 26    assert( pVfs &
18b10 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  & p->rc==SQLITE_
18b20 4f 4b 20 26 26 20 70 2d 3e 7a 45 72 72 6d 73 67  OK && p->zErrmsg
18b30 3d 3d 30 20 29 3b 0a 20 20 20 20 70 56 66 73 2d  ==0 );.    pVfs-
18b40 3e 78 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  >xDelete(pVfs, z
18b50 4f 61 6c 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  Oal, 0);.    sql
18b60 69 74 65 33 5f 66 72 65 65 28 7a 4f 61 6c 29 3b  ite3_free(zOal);
18b70 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
18b80 6c 6f 63 61 74 65 20 61 20 70 72 69 76 61 74 65  locate a private
18b90 20 72 62 75 20 56 46 53 20 66 6f 72 20 74 68 65   rbu VFS for the
18ba0 20 72 62 75 20 68 61 6e 64 6c 65 20 70 61 73 73   rbu handle pass
18bb0 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 0a 2a  ed as the only.*
18bc0 2a 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73  * argument. This
18bd0 20 56 46 53 20 77 69 6c 6c 20 62 65 20 75 73 65   VFS will be use
18be0 64 20 75 6e 6c 65 73 73 20 74 68 65 20 63 61 6c  d unless the cal
18bf0 6c 20 74 6f 20 73 71 6c 69 74 65 33 72 62 75 5f  l to sqlite3rbu_
18c00 6f 70 65 6e 28 29 0a 2a 2a 20 73 70 65 63 69 66  open().** specif
18c10 69 65 64 20 61 20 55 52 49 20 77 69 74 68 20 61  ied a URI with a
18c20 20 76 66 73 3d 3f 20 6f 70 74 69 6f 6e 20 69 6e   vfs=? option in
18c30 20 70 6c 61 63 65 20 6f 66 20 61 20 74 61 72 67   place of a targ
18c40 65 74 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  et database.** f
18c50 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61  ile name..*/.sta
18c60 74 69 63 20 76 6f 69 64 20 72 62 75 43 72 65 61  tic void rbuCrea
18c70 74 65 56 66 73 28 73 71 6c 69 74 65 33 72 62 75  teVfs(sqlite3rbu
18c80 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 6e 64 3b   *p){.  int rnd;
18c90 0a 20 20 63 68 61 72 20 7a 52 6e 64 5b 36 34 5d  .  char zRnd[64]
18ca0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
18cb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
18cc0 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f  .  sqlite3_rando
18cd0 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 69 6e 74  mness(sizeof(int
18ce0 29 2c 20 28 76 6f 69 64 2a 29 26 72 6e 64 29 3b  ), (void*)&rnd);
18cf0 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
18d00 6e 74 66 28 73 69 7a 65 6f 66 28 7a 52 6e 64 29  ntf(sizeof(zRnd)
18d10 2c 20 7a 52 6e 64 2c 20 22 72 62 75 5f 76 66 73  , zRnd, "rbu_vfs
18d20 5f 25 64 22 2c 20 72 6e 64 29 3b 0a 20 20 70 2d  _%d", rnd);.  p-
18d30 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 72 62 75  >rc = sqlite3rbu
18d40 5f 63 72 65 61 74 65 5f 76 66 73 28 7a 52 6e 64  _create_vfs(zRnd
18d50 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72  , 0);.  if( p->r
18d60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
18d70 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
18d80 2a 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f  *pVfs = sqlite3_
18d90 76 66 73 5f 66 69 6e 64 28 7a 52 6e 64 29 3b 0a  vfs_find(zRnd);.
18da0 20 20 20 20 61 73 73 65 72 74 28 20 70 56 66 73      assert( pVfs
18db0 20 29 3b 0a 20 20 20 20 70 2d 3e 7a 56 66 73 4e   );.    p->zVfsN
18dc0 61 6d 65 20 3d 20 70 56 66 73 2d 3e 7a 4e 61 6d  ame = pVfs->zNam
18dd0 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e;.  }.}../*.** 
18de0 44 65 73 74 72 6f 79 20 74 68 65 20 70 72 69 76  Destroy the priv
18df0 61 74 65 20 56 46 53 20 63 72 65 61 74 65 64 20  ate VFS created 
18e00 66 6f 72 20 74 68 65 20 72 62 75 20 68 61 6e 64  for the rbu hand
18e10 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  le passed as the
18e20 20 6f 6e 6c 79 0a 2a 2a 20 61 72 67 75 6d 65 6e   only.** argumen
18e30 74 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  t by an earlier 
18e40 63 61 6c 6c 20 74 6f 20 72 62 75 43 72 65 61 74  call to rbuCreat
18e50 65 56 66 73 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  eVfs()..*/.stati
18e60 63 20 76 6f 69 64 20 72 62 75 44 65 6c 65 74 65  c void rbuDelete
18e70 56 66 73 28 73 71 6c 69 74 65 33 72 62 75 20 2a  Vfs(sqlite3rbu *
18e80 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 7a 56 66  p){.  if( p->zVf
18e90 73 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c  sName ){.    sql
18ea0 69 74 65 33 72 62 75 5f 64 65 73 74 72 6f 79 5f  ite3rbu_destroy_
18eb0 76 66 73 28 70 2d 3e 7a 56 66 73 4e 61 6d 65 29  vfs(p->zVfsName)
18ec0 3b 0a 20 20 20 20 70 2d 3e 7a 56 66 73 4e 61 6d  ;.    p->zVfsNam
18ed0 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  e = 0;.  }.}../*
18ee0 0a 2a 2a 20 54 68 69 73 20 75 73 65 72 2d 64 65  .** This user-de
18ef0 66 69 6e 65 64 20 53 51 4c 20 66 75 6e 63 74 69  fined SQL functi
18f00 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 69  on is invoked wi
18f10 74 68 20 61 20 73 69 6e 67 6c 65 20 61 72 67 75  th a single argu
18f20 6d 65 6e 74 20 2d 20 74 68 65 0a 2a 2a 20 6e 61  ment - the.** na
18f30 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20 65 78  me of a table ex
18f40 70 65 63 74 65 64 20 74 6f 20 61 70 70 65 61 72  pected to appear
18f50 20 69 6e 20 74 68 65 20 74 61 72 67 65 74 20 64   in the target d
18f60 61 74 61 62 61 73 65 2e 20 49 74 20 72 65 74 75  atabase. It retu
18f70 72 6e 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65  rns.** the numbe
18f80 72 20 6f 66 20 61 75 78 69 6c 6c 69 61 72 79 20  r of auxilliary 
18f90 69 6e 64 65 78 65 73 20 6f 6e 20 74 68 65 20 74  indexes on the t
18fa0 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
18fb0 76 6f 69 64 20 72 62 75 49 6e 64 65 78 43 6e 74  void rbuIndexCnt
18fc0 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
18fd0 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
18fe0 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20 73 71    int nVal,.  sq
18ff0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
19000 56 61 6c 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  Val.){.  sqlite3
19010 72 62 75 20 2a 70 20 3d 20 28 73 71 6c 69 74 65  rbu *p = (sqlite
19020 33 72 62 75 2a 29 73 71 6c 69 74 65 33 5f 75 73  3rbu*)sqlite3_us
19030 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20  er_data(pCtx);. 
19040 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
19050 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72  Stmt = 0;.  char
19060 20 2a 7a 45 72 72 6d 73 67 20 3d 20 30 3b 0a 20   *zErrmsg = 0;. 
19070 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
19080 72 74 28 20 6e 56 61 6c 3d 3d 31 20 29 3b 0a 20  rt( nVal==1 );. 
19090 20 0a 20 20 72 63 20 3d 20 70 72 65 70 61 72 65   .  rc = prepare
190a0 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  FreeAndCollectEr
190b0 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26  ror(p->dbMain, &
190c0 70 53 74 6d 74 2c 20 26 7a 45 72 72 6d 73 67 2c  pStmt, &zErrmsg,
190d0 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f   .      sqlite3_
190e0 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20  mprintf("SELECT 
190f0 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 73 71  count(*) FROM sq
19100 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20  lite_master ".  
19110 20 20 20 20 20 20 22 57 48 45 52 45 20 74 79 70        "WHERE typ
19120 65 3d 27 69 6e 64 65 78 27 20 41 4e 44 20 74 62  e='index' AND tb
19130 6c 5f 6e 61 6d 65 20 3d 20 25 51 22 2c 20 73 71  l_name = %Q", sq
19140 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
19150 28 61 70 56 61 6c 5b 30 5d 29 29 0a 20 20 29 3b  (apVal[0])).  );
19160 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
19170 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
19180 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
19190 28 70 43 74 78 2c 20 7a 45 72 72 6d 73 67 2c 20  (pCtx, zErrmsg, 
191a0 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  -1);.  }else{.  
191b0 20 20 69 6e 74 20 6e 49 6e 64 65 78 20 3d 20 30    int nIndex = 0
191c0 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
191d0 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
191e0 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20  ep(pStmt) ){.   
191f0 20 20 20 6e 49 6e 64 65 78 20 3d 20 73 71 6c 69     nIndex = sqli
19200 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
19210 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Stmt, 0);.    }.
19220 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19230 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
19240 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
19250 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19260 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
19270 69 6e 74 28 70 43 74 78 2c 20 6e 49 6e 64 65 78  int(pCtx, nIndex
19280 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
19290 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
192a0 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 73  lt_error(pCtx, s
192b0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
192c0 3e 64 62 4d 61 69 6e 29 2c 20 2d 31 29 3b 0a 20  >dbMain), -1);. 
192d0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69     }.  }..  sqli
192e0 74 65 33 5f 66 72 65 65 28 7a 45 72 72 6d 73 67  te3_free(zErrmsg
192f0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  );.}../*.** If t
19300 68 65 20 52 42 55 20 64 61 74 61 62 61 73 65 20  he RBU database 
19310 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 72 62 75  contains the rbu
19320 5f 63 6f 75 6e 74 20 74 61 62 6c 65 2c 20 75 73  _count table, us
19330 65 20 69 74 20 74 6f 20 69 6e 69 74 69 61 6c 69  e it to initiali
19340 7a 65 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  ze.** the sqlite
19350 33 72 62 75 2e 6e 50 68 61 73 65 4f 6e 65 53 74  3rbu.nPhaseOneSt
19360 65 70 20 76 61 72 69 61 62 6c 65 2e 20 54 68 65  ep variable. The
19370 20 73 63 68 65 6d 61 20 6f 66 20 74 68 65 20 72   schema of the r
19380 62 75 5f 63 6f 75 6e 74 20 74 61 62 6c 65 0a 2a  bu_count table.*
19390 2a 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  * is assumed to 
193a0 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65  contain the same
193b0 20 63 6f 6c 75 6d 6e 73 20 61 73 3a 0a 2a 2a 0a   columns as:.**.
193c0 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
193d0 45 20 72 62 75 5f 63 6f 75 6e 74 28 74 62 6c 20  E rbu_count(tbl 
193e0 54 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59  TEXT PRIMARY KEY
193f0 2c 20 63 6e 74 20 49 4e 54 45 47 45 52 29 20 57  , cnt INTEGER) W
19400 49 54 48 4f 55 54 20 52 4f 57 49 44 3b 0a 2a 2a  ITHOUT ROWID;.**
19410 0a 2a 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64  .** There should
19420 20 62 65 20 6f 6e 65 20 72 6f 77 20 69 6e 20 74   be one row in t
19430 68 65 20 74 61 62 6c 65 20 66 6f 72 20 65 61 63  he table for eac
19440 68 20 64 61 74 61 5f 78 78 78 20 74 61 62 6c 65  h data_xxx table
19450 20 69 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   in the.** datab
19460 61 73 65 2e 20 54 68 65 20 27 74 62 6c 27 20 63  ase. The 'tbl' c
19470 6f 6c 75 6d 6e 20 73 68 6f 75 6c 64 20 63 6f 6e  olumn should con
19480 74 61 69 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  tain the name of
19490 20 61 20 64 61 74 61 5f 78 78 78 20 74 61 62 6c   a data_xxx tabl
194a0 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6e  e,.** and the cn
194b0 74 20 63 6f 6c 75 6d 6e 20 74 68 65 20 6e 75 6d  t column the num
194c0 62 65 72 20 6f 66 20 72 6f 77 73 20 69 74 20 63  ber of rows it c
194d0 6f 6e 74 61 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 73  ontains..**.** s
194e0 71 6c 69 74 65 33 72 62 75 2e 6e 50 68 61 73 65  qlite3rbu.nPhase
194f0 4f 6e 65 53 74 65 70 20 69 73 20 69 6e 69 74 69  OneStep is initi
19500 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20 73 75  alized to the su
19510 6d 20 6f 66 20 28 31 20 2b 20 6e 49 6e 64 65 78  m of (1 + nIndex
19520 29 20 2a 20 63 6e 74 0a 2a 2a 20 66 6f 72 20 61  ) * cnt.** for a
19530 6c 6c 20 72 6f 77 73 20 69 6e 20 74 68 65 20 72  ll rows in the r
19540 62 75 5f 63 6f 75 6e 74 20 74 61 62 6c 65 2c 20  bu_count table, 
19550 77 68 65 72 65 20 6e 49 6e 64 65 78 20 69 73 20  where nIndex is 
19560 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a  the number of .*
19570 2a 20 69 6e 64 65 78 65 73 20 6f 6e 20 74 68 65  * indexes on the
19580 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
19590 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20 74  arget database t
195a0 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
195b0 76 6f 69 64 20 72 62 75 49 6e 69 74 50 68 61 73  void rbuInitPhas
195c0 65 4f 6e 65 53 74 65 70 73 28 73 71 6c 69 74 65  eOneSteps(sqlite
195d0 33 72 62 75 20 2a 70 29 7b 0a 20 20 69 66 28 20  3rbu *p){.  if( 
195e0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
195f0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
19600 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
19610 0a 20 20 20 20 69 6e 74 20 62 45 78 69 73 74 73  .    int bExists
19620 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
19630 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
19640 72 62 75 5f 63 6f 75 6e 74 20 65 78 69 73 74 73  rbu_count exists
19650 20 2a 2f 0a 0a 20 20 20 20 70 2d 3e 6e 50 68 61   */..    p->nPha
19660 73 65 4f 6e 65 53 74 65 70 20 3d 20 2d 31 3b 0a  seOneStep = -1;.
19670 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c  .    p->rc = sql
19680 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
19690 74 69 6f 6e 28 70 2d 3e 64 62 52 62 75 2c 20 0a  tion(p->dbRbu, .
196a0 20 20 20 20 20 20 20 20 22 72 62 75 5f 69 6e 64          "rbu_ind
196b0 65 78 5f 63 6e 74 22 2c 20 31 2c 20 53 51 4c 49  ex_cnt", 1, SQLI
196c0 54 45 5f 55 54 46 38 2c 20 28 76 6f 69 64 2a 29  TE_UTF8, (void*)
196d0 70 2c 20 72 62 75 49 6e 64 65 78 43 6e 74 46 75  p, rbuIndexCntFu
196e0 6e 63 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a  nc, 0, 0.    );.
196f0 20 20 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20    .    /* Check 
19700 66 6f 72 20 74 68 65 20 72 62 75 5f 63 6f 75 6e  for the rbu_coun
19710 74 20 74 61 62 6c 65 2e 20 49 66 20 69 74 20 64  t table. If it d
19720 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 6f  oes not exist, o
19730 72 20 69 66 20 61 6e 20 65 72 72 6f 72 0a 20 20  r if an error.  
19740 20 20 2a 2a 20 6f 63 63 75 72 73 2c 20 6e 50 68    ** occurs, nPh
19750 61 73 65 4f 6e 65 53 74 65 70 20 77 69 6c 6c 20  aseOneStep will 
19760 62 65 20 6c 65 66 74 20 73 65 74 20 74 6f 20 2d  be left set to -
19770 31 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  1. */.    if( p-
19780 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
19790 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
197a0 70 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63  prepareAndCollec
197b0 74 45 72 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c  tError(p->dbRbu,
197c0 20 26 70 53 74 6d 74 2c 20 26 70 2d 3e 7a 45 72   &pStmt, &p->zEr
197d0 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20  rmsg,.          
197e0 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 73  "SELECT 1 FROM s
197f0 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45  qlite_master WHE
19800 52 45 20 74 62 6c 5f 6e 61 6d 65 20 3d 20 27 72  RE tbl_name = 'r
19810 62 75 5f 63 6f 75 6e 74 27 22 0a 20 20 20 20 20  bu_count'".     
19820 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   );.    }.    if
19830 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
19840 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
19850 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
19860 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20  te3_step(pStmt) 
19870 29 7b 0a 20 20 20 20 20 20 20 20 62 45 78 69 73  ){.        bExis
19880 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ts = 1;.      }.
19890 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71        p->rc = sq
198a0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
198b0 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  Stmt);.    }.  .
198c0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
198d0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 45 78 69  QLITE_OK && bExi
198e0 73 74 73 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  sts ){.      p->
198f0 72 63 20 3d 20 70 72 65 70 61 72 65 41 6e 64 43  rc = prepareAndC
19900 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64  ollectError(p->d
19910 62 52 62 75 2c 20 26 70 53 74 6d 74 2c 20 26 70  bRbu, &pStmt, &p
19920 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20 20  ->zErrmsg,.     
19930 20 20 20 20 20 22 53 45 4c 45 43 54 20 73 75 6d       "SELECT sum
19940 28 63 6e 74 20 2a 20 28 31 20 2b 20 72 62 75 5f  (cnt * (1 + rbu_
19950 69 6e 64 65 78 5f 63 6e 74 28 72 62 75 5f 74 61  index_cnt(rbu_ta
19960 72 67 65 74 5f 6e 61 6d 65 28 74 62 6c 29 29 29  rget_name(tbl)))
19970 29 22 0a 20 20 20 20 20 20 20 20 20 20 22 46 52  )".          "FR
19980 4f 4d 20 72 62 75 5f 63 6f 75 6e 74 22 0a 20 20  OM rbu_count".  
19990 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28      );.      if(
199a0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
199b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  K ){.        if(
199c0 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
199d0 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
199e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
199f0 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20 3d  >nPhaseOneStep =
19a00 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
19a10 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 30 29 3b  int64(pStmt, 0);
19a20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
19a30 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
19a40 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
19a50 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
19a60 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  }.  }.}../*.** O
19a70 70 65 6e 20 61 6e 64 20 72 65 74 75 72 6e 20 61  pen and return a
19a80 20 6e 65 77 20 52 42 55 20 68 61 6e 64 6c 65 2e   new RBU handle.
19a90 20 0a 2a 2f 0a 73 71 6c 69 74 65 33 72 62 75 20   .*/.sqlite3rbu 
19aa0 2a 73 71 6c 69 74 65 33 72 62 75 5f 6f 70 65 6e  *sqlite3rbu_open
19ab0 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
19ac0 7a 54 61 72 67 65 74 2c 20 0a 20 20 63 6f 6e 73  zTarget, .  cons
19ad0 74 20 63 68 61 72 20 2a 7a 52 62 75 2c 0a 20 20  t char *zRbu,.  
19ae0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61  const char *zSta
19af0 74 65 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 72  te.){.  sqlite3r
19b00 62 75 20 2a 70 3b 0a 20 20 73 69 7a 65 5f 74 20  bu *p;.  size_t 
19b10 6e 54 61 72 67 65 74 20 3d 20 73 74 72 6c 65 6e  nTarget = strlen
19b20 28 7a 54 61 72 67 65 74 29 3b 0a 20 20 73 69 7a  (zTarget);.  siz
19b30 65 5f 74 20 6e 52 62 75 20 3d 20 73 74 72 6c 65  e_t nRbu = strle
19b40 6e 28 7a 52 62 75 29 3b 0a 20 20 73 69 7a 65 5f  n(zRbu);.  size_
19b50 74 20 6e 53 74 61 74 65 20 3d 20 7a 53 74 61 74  t nState = zStat
19b60 65 20 3f 20 73 74 72 6c 65 6e 28 7a 53 74 61 74  e ? strlen(zStat
19b70 65 29 20 3a 20 30 3b 0a 20 20 73 69 7a 65 5f 74  e) : 0;.  size_t
19b80 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
19b90 73 71 6c 69 74 65 33 72 62 75 29 20 2b 20 6e 54  sqlite3rbu) + nT
19ba0 61 72 67 65 74 2b 31 20 2b 20 6e 52 62 75 2b 31  arget+1 + nRbu+1
19bb0 2b 20 6e 53 74 61 74 65 2b 31 3b 0a 0a 20 20 70  + nState+1;..  p
19bc0 20 3d 20 28 73 71 6c 69 74 65 33 72 62 75 2a 29   = (sqlite3rbu*)
19bd0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
19be0 28 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 70  (nByte);.  if( p
19bf0 20 29 7b 0a 20 20 20 20 52 62 75 53 74 61 74 65   ){.    RbuState
19c00 20 2a 70 53 74 61 74 65 20 3d 20 30 3b 0a 0a 20   *pState = 0;.. 
19c10 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65     /* Create the
19c20 20 63 75 73 74 6f 6d 20 56 46 53 2e 20 2a 2f 0a   custom VFS. */.
19c30 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c      memset(p, 0,
19c40 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 72   sizeof(sqlite3r
19c50 62 75 29 29 3b 0a 20 20 20 20 72 62 75 43 72 65  bu));.    rbuCre
19c60 61 74 65 56 66 73 28 70 29 3b 0a 0a 20 20 20 20  ateVfs(p);..    
19c70 2f 2a 20 4f 70 65 6e 20 74 68 65 20 74 61 72 67  /* Open the targ
19c80 65 74 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  et database */. 
19c90 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
19ca0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19cb0 20 70 2d 3e 7a 54 61 72 67 65 74 20 3d 20 28 63   p->zTarget = (c
19cc0 68 61 72 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20  har*)&p[1];.    
19cd0 20 20 6d 65 6d 63 70 79 28 70 2d 3e 7a 54 61 72    memcpy(p->zTar
19ce0 67 65 74 2c 20 7a 54 61 72 67 65 74 2c 20 6e 54  get, zTarget, nT
19cf0 61 72 67 65 74 2b 31 29 3b 0a 20 20 20 20 20 20  arget+1);.      
19d00 70 2d 3e 7a 52 62 75 20 3d 20 26 70 2d 3e 7a 54  p->zRbu = &p->zT
19d10 61 72 67 65 74 5b 6e 54 61 72 67 65 74 2b 31 5d  arget[nTarget+1]
19d20 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
19d30 2d 3e 7a 52 62 75 2c 20 7a 52 62 75 2c 20 6e 52  ->zRbu, zRbu, nR
19d40 62 75 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28  bu+1);.      if(
19d50 20 7a 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20   zState ){.     
19d60 20 20 20 70 2d 3e 7a 53 74 61 74 65 20 3d 20 26     p->zState = &
19d70 70 2d 3e 7a 52 62 75 5b 6e 52 62 75 2b 31 5d 3b  p->zRbu[nRbu+1];
19d80 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
19d90 70 2d 3e 7a 53 74 61 74 65 2c 20 7a 53 74 61 74  p->zState, zStat
19da0 65 2c 20 6e 53 74 61 74 65 2b 31 29 3b 0a 20 20  e, nState+1);.  
19db0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 62 75 4f      }.      rbuO
19dc0 70 65 6e 44 61 74 61 62 61 73 65 28 70 29 3b 0a  penDatabase(p);.
19dd0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
19de0 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c 72 65   it has not alre
19df0 61 64 79 20 62 65 65 6e 20 63 72 65 61 74 65 64  ady been created
19e00 2c 20 63 72 65 61 74 65 20 74 68 65 20 72 62 75  , create the rbu
19e10 5f 73 74 61 74 65 20 74 61 62 6c 65 20 2a 2f 0a  _state table */.
19e20 20 20 20 20 72 62 75 4d 50 72 69 6e 74 66 45 78      rbuMPrintfEx
19e30 65 63 28 70 2c 20 70 2d 3e 64 62 52 62 75 2c 20  ec(p, p->dbRbu, 
19e40 52 42 55 5f 43 52 45 41 54 45 5f 53 54 41 54 45  RBU_CREATE_STATE
19e50 2c 20 70 2d 3e 7a 53 74 61 74 65 44 62 29 3b 0a  , p->zStateDb);.
19e60 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  .    if( p->rc==
19e70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19e80 20 20 20 70 53 74 61 74 65 20 3d 20 72 62 75 4c     pState = rbuL
19e90 6f 61 64 53 74 61 74 65 28 70 29 3b 0a 20 20 20  oadState(p);.   
19ea0 20 20 20 61 73 73 65 72 74 28 20 70 53 74 61 74     assert( pStat
19eb0 65 20 7c 7c 20 70 2d 3e 72 63 21 3d 53 51 4c 49  e || p->rc!=SQLI
19ec0 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69  TE_OK );.      i
19ed0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
19ee0 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 20 20 20 20  _OK ){..        
19ef0 69 66 28 20 70 53 74 61 74 65 2d 3e 65 53 74 61  if( pState->eSta
19f00 67 65 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20  ge==0 ){ .      
19f10 20 20 20 20 72 62 75 44 65 6c 65 74 65 4f 61 6c      rbuDeleteOal
19f20 46 69 6c 65 28 70 29 3b 0a 20 20 20 20 20 20 20  File(p);.       
19f30 20 20 20 72 62 75 49 6e 69 74 50 68 61 73 65 4f     rbuInitPhaseO
19f40 6e 65 53 74 65 70 73 28 70 29 3b 0a 20 20 20 20  neSteps(p);.    
19f50 20 20 20 20 20 20 70 2d 3e 65 53 74 61 67 65 20        p->eStage 
19f60 3d 20 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 3b  = RBU_STAGE_OAL;
19f70 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
19f80 20 20 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74            p->eSt
19f90 61 67 65 20 3d 20 70 53 74 61 74 65 2d 3e 65 53  age = pState->eS
19fa0 74 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  tage;.          
19fb0 70 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70  p->nPhaseOneStep
19fc0 20 3d 20 70 53 74 61 74 65 2d 3e 6e 50 68 61 73   = pState->nPhas
19fd0 65 4f 6e 65 53 74 65 70 3b 0a 20 20 20 20 20 20  eOneStep;.      
19fe0 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e    }.        p->n
19ff0 50 72 6f 67 72 65 73 73 20 3d 20 70 53 74 61 74  Progress = pStat
1a000 65 2d 3e 6e 50 72 6f 67 72 65 73 73 3b 0a 20 20  e->nProgress;.  
1a010 20 20 20 20 20 20 70 2d 3e 69 4f 61 6c 53 7a 20        p->iOalSz 
1a020 3d 20 70 53 74 61 74 65 2d 3e 69 4f 61 6c 53 7a  = pState->iOalSz
1a030 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1a040 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
1a050 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
1a060 70 2d 3e 65 53 74 61 67 65 21 3d 30 20 29 3b 0a  p->eStage!=0 );.
1a070 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  .    if( p->rc==
1a080 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e  SQLITE_OK && p->
1a090 70 54 61 72 67 65 74 46 64 2d 3e 70 57 61 6c 46  pTargetFd->pWalF
1a0a0 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  d ){.      if( p
1a0b0 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  ->eStage==RBU_ST
1a0c0 41 47 45 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 20  AGE_OAL ){.     
1a0d0 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
1a0e0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
1a0f0 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71   p->zErrmsg = sq
1a100 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 63  lite3_mprintf("c
1a110 61 6e 6e 6f 74 20 75 70 64 61 74 65 20 77 61 6c  annot update wal
1a120 20 6d 6f 64 65 20 64 61 74 61 62 61 73 65 22 29   mode database")
1a130 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1a140 28 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55  ( p->eStage==RBU
1a150 5f 53 54 41 47 45 5f 4d 4f 56 45 20 29 7b 0a 20  _STAGE_MOVE ){. 
1a160 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 67 65         p->eStage
1a170 20 3d 20 52 42 55 5f 53 54 41 47 45 5f 43 4b 50   = RBU_STAGE_CKP
1a180 54 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53  T;.        p->nS
1a190 74 65 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  tep = 0;.      }
1a1a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
1a1b0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1a1c0 0a 20 20 20 20 20 26 26 20 28 70 2d 3e 65 53 74  .     && (p->eSt
1a1d0 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f  age==RBU_STAGE_O
1a1e0 41 4c 20 7c 7c 20 70 2d 3e 65 53 74 61 67 65 3d  AL || p->eStage=
1a1f0 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 29  =RBU_STAGE_MOVE)
1a200 0a 20 20 20 20 20 26 26 20 70 53 74 61 74 65 2d  .     && pState-
1a210 3e 65 53 74 61 67 65 21 3d 30 20 26 26 20 70 2d  >eStage!=0 && p-
1a220 3e 70 54 61 72 67 65 74 46 64 2d 3e 69 43 6f 6f  >pTargetFd->iCoo
1a230 6b 69 65 21 3d 70 53 74 61 74 65 2d 3e 69 43 6f  kie!=pState->iCo
1a240 6f 6b 69 65 0a 20 20 20 20 29 7b 20 20 20 0a 20  okie.    ){   . 
1a250 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20       /* At this 
1a260 70 6f 69 6e 74 20 28 70 54 61 72 67 65 74 46 64  point (pTargetFd
1a270 2d 3e 69 43 6f 6f 6b 69 65 29 20 63 6f 6e 74 61  ->iCookie) conta
1a280 69 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ins the value of
1a290 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 68   the.      ** ch
1a2a0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 63 6f 6f  ange-counter coo
1a2b0 6b 69 65 20 28 74 68 65 20 74 68 69 6e 67 20 74  kie (the thing t
1a2c0 68 61 74 20 67 65 74 73 20 69 6e 63 72 65 6d 65  hat gets increme
1a2d0 6e 74 65 64 20 77 68 65 6e 20 61 20 0a 20 20 20  nted when a .   
1a2e0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
1a2f0 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 69  n is committed i
1a300 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 29  n rollback mode)
1a310 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
1a320 64 20 6f 6e 20 0a 20 20 20 20 20 20 2a 2a 20 70  d on .      ** p
1a330 61 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74  age 1 of the dat
1a340 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  abase file. */. 
1a350 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c       p->rc = SQL
1a360 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
1a370 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c  p->zErrmsg = sql
1a380 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 64 61  ite3_mprintf("da
1a390 74 61 62 61 73 65 20 6d 6f 64 69 66 69 65 64 20  tabase modified 
1a3a0 64 75 72 69 6e 67 20 72 62 75 20 75 70 64 61 74  during rbu updat
1a3b0 65 22 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  e");.    }..    
1a3c0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1a3d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
1a3e0 28 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55  ( p->eStage==RBU
1a3f0 5f 53 54 41 47 45 5f 4f 41 4c 20 29 7b 0a 20 20  _STAGE_OAL ){.  
1a400 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
1a410 62 20 3d 20 70 2d 3e 64 62 4d 61 69 6e 3b 0a 0a  b = p->dbMain;..
1a420 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
1a430 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 62 6f 74  transactions bot
1a440 68 20 64 61 74 61 62 61 73 65 73 2e 20 54 68 65  h databases. The
1a450 20 2a 2d 6f 61 6c 20 66 69 6c 65 20 69 73 20 6f   *-oal file is o
1a460 70 65 6e 65 64 20 6f 72 0a 20 20 20 20 20 20 20  pened or.       
1a470 20 2a 2a 20 63 72 65 61 74 65 64 20 61 74 20 74   ** created at t
1a480 68 69 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20  his point. */.  
1a490 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71        p->rc = sq
1a4a0 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 22  lite3_exec(db, "
1a4b0 42 45 47 49 4e 20 49 4d 4d 45 44 49 41 54 45 22  BEGIN IMMEDIATE"
1a4c0 2c 20 30 2c 20 30 2c 20 26 70 2d 3e 7a 45 72 72  , 0, 0, &p->zErr
1a4d0 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 69 66  msg);.        if
1a4e0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1a4f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1a500 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
1a510 65 78 65 63 28 70 2d 3e 64 62 52 62 75 2c 20 22  exec(p->dbRbu, "
1a520 42 45 47 49 4e 20 49 4d 4d 45 44 49 41 54 45 22  BEGIN IMMEDIATE"
1a530 2c 20 30 2c 20 30 2c 20 26 70 2d 3e 7a 45 72 72  , 0, 0, &p->zErr
1a540 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  msg);.        }.
1a550 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
1a560 6b 20 69 66 20 74 68 65 20 6d 61 69 6e 20 64 61  k if the main da
1a570 74 61 62 61 73 65 20 69 73 20 61 20 7a 69 70 76  tabase is a zipv
1a580 66 73 20 64 62 2e 20 49 66 20 69 74 20 69 73 2c  fs db. If it is,
1a590 20 73 65 74 20 74 68 65 20 75 70 70 65 72 0a 20   set the upper. 
1a5a0 20 20 20 20 20 20 20 2a 2a 20 6c 65 76 65 6c 20         ** level 
1a5b0 70 61 67 65 72 20 74 6f 20 75 73 65 20 22 6a 6f  pager to use "jo
1a5c0 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66 22 2e  urnal_mode=off".
1a5d0 20 54 68 69 73 20 70 72 65 76 65 6e 74 73 20 69   This prevents i
1a5e0 74 20 66 72 6f 6d 20 0a 20 20 20 20 20 20 20 20  t from .        
1a5f0 2a 2a 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20  ** generating a 
1a600 6c 61 72 67 65 20 6a 6f 75 72 6e 61 6c 20 75 73  large journal us
1a610 69 6e 67 20 61 20 74 65 6d 70 20 66 69 6c 65 2e  ing a temp file.
1a620 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
1a630 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1a640 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  K ){.          i
1a650 6e 74 20 66 72 63 20 3d 20 73 71 6c 69 74 65 33  nt frc = sqlite3
1a660 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
1a670 2c 20 22 6d 61 69 6e 22 2c 20 53 51 4c 49 54 45  , "main", SQLITE
1a680 5f 46 43 4e 54 4c 5f 5a 49 50 56 46 53 2c 20 30  _FCNTL_ZIPVFS, 0
1a690 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1a6a0 20 66 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   frc==SQLITE_OK 
1a6b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
1a6c0 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65  ->rc = sqlite3_e
1a6d0 78 65 63 28 64 62 2c 20 22 50 52 41 47 4d 41 20  xec(db, "PRAGMA 
1a6e0 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66  journal_mode=off
1a6f0 22 2c 30 2c 30 2c 26 70 2d 3e 7a 45 72 72 6d 73  ",0,0,&p->zErrms
1a700 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  g);.          }.
1a710 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1a720 20 20 20 2f 2a 20 50 6f 69 6e 74 20 74 68 65 20     /* Point the 
1a730 6f 62 6a 65 63 74 20 69 74 65 72 61 74 6f 72 20  object iterator 
1a740 61 74 20 74 68 65 20 66 69 72 73 74 20 6f 62 6a  at the first obj
1a750 65 63 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ect */.        i
1a760 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1a770 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1a780 20 70 2d 3e 72 63 20 3d 20 72 62 75 4f 62 6a 49   p->rc = rbuObjI
1a790 74 65 72 46 69 72 73 74 28 70 2c 20 26 70 2d 3e  terFirst(p, &p->
1a7a0 6f 62 6a 69 74 65 72 29 3b 0a 20 20 20 20 20 20  objiter);.      
1a7b0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
1a7c0 49 66 20 74 68 65 20 52 42 55 20 64 61 74 61 62  If the RBU datab
1a7d0 61 73 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  ase contains no 
1a7e0 64 61 74 61 5f 78 78 78 20 74 61 62 6c 65 73 2c  data_xxx tables,
1a7f0 20 64 65 63 6c 61 72 65 20 74 68 65 20 52 42 55   declare the RBU
1a800 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 70 64 61  .        ** upda
1a810 74 65 20 66 69 6e 69 73 68 65 64 2e 20 20 2a 2f  te finished.  */
1a820 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
1a830 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1a840 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 7a 54 62 6c   p->objiter.zTbl
1a850 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1a860 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
1a870 44 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  DONE;.        }.
1a880 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
1a890 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1a8a0 0a 20 20 20 20 20 20 20 20 20 20 72 62 75 53 65  .          rbuSe
1a8b0 74 75 70 4f 61 6c 28 70 2c 20 70 53 74 61 74 65  tupOal(p, pState
1a8c0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
1a8d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
1a8e0 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41  >eStage==RBU_STA
1a8f0 47 45 5f 4d 4f 56 45 20 29 7b 0a 20 20 20 20 20  GE_MOVE ){.     
1a900 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20     /* no-op */. 
1a910 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
1a920 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  ->eStage==RBU_ST
1a930 41 47 45 5f 43 4b 50 54 20 29 7b 0a 20 20 20 20  AGE_CKPT ){.    
1a940 20 20 20 20 72 62 75 53 65 74 75 70 43 68 65 63      rbuSetupChec
1a950 6b 70 6f 69 6e 74 28 70 2c 20 70 53 74 61 74 65  kpoint(p, pState
1a960 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
1a970 66 28 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42  f( p->eStage==RB
1a980 55 5f 53 54 41 47 45 5f 44 4f 4e 45 20 29 7b 0a  U_STAGE_DONE ){.
1a990 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
1a9a0 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
1a9b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a9c0 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
1a9d0 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
1a9e0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 62 75  }.    }..    rbu
1a9f0 46 72 65 65 53 74 61 74 65 28 70 53 74 61 74 65  FreeState(pState
1aa00 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
1aa10 20 70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65   p;.}.../*.** Re
1aa20 74 75 72 6e 20 74 68 65 20 64 61 74 61 62 61 73  turn the databas
1aa30 65 20 68 61 6e 64 6c 65 20 75 73 65 64 20 62 79  e handle used by
1aa40 20 70 52 62 75 2e 0a 2a 2f 0a 73 71 6c 69 74 65   pRbu..*/.sqlite
1aa50 33 20 2a 73 71 6c 69 74 65 33 72 62 75 5f 64 62  3 *sqlite3rbu_db
1aa60 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 52 62  (sqlite3rbu *pRb
1aa70 75 2c 20 69 6e 74 20 62 52 62 75 29 7b 0a 20 20  u, int bRbu){.  
1aa80 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 30 3b  sqlite3 *db = 0;
1aa90 0a 20 20 69 66 28 20 70 52 62 75 20 29 7b 0a 20  .  if( pRbu ){. 
1aaa0 20 20 20 64 62 20 3d 20 28 62 52 62 75 20 3f 20     db = (bRbu ? 
1aab0 70 52 62 75 2d 3e 64 62 52 62 75 20 3a 20 70 52  pRbu->dbRbu : pR
1aac0 62 75 2d 3e 64 62 4d 61 69 6e 29 3b 0a 20 20 7d  bu->dbMain);.  }
1aad0 0a 20 20 72 65 74 75 72 6e 20 64 62 3b 0a 7d 0a  .  return db;.}.
1aae0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ../*.** If the e
1aaf0 72 72 6f 72 20 63 6f 64 65 20 63 75 72 72 65 6e  rror code curren
1ab00 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68  tly stored in th
1ab10 65 20 52 42 55 20 68 61 6e 64 6c 65 20 69 73 20  e RBU handle is 
1ab20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
1ab30 54 2c 0a 2a 2a 20 74 68 65 6e 20 65 64 69 74 20  T,.** then edit 
1ab40 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67  any error messag
1ab50 65 20 73 74 72 69 6e 67 20 73 6f 20 61 73 20 74  e string so as t
1ab60 6f 20 72 65 6d 6f 76 65 20 61 6c 6c 20 6f 63 63  o remove all occ
1ab70 75 72 72 65 6e 63 65 73 20 6f 66 0a 2a 2a 20 74  urrences of.** t
1ab80 68 65 20 70 61 74 74 65 72 6e 20 22 72 62 75 5f  he pattern "rbu_
1ab90 69 6d 70 5f 5b 30 2d 39 5d 2a 22 2e 0a 2a 2f 0a  imp_[0-9]*"..*/.
1aba0 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 45  static void rbuE
1abb0 64 69 74 45 72 72 6d 73 67 28 73 71 6c 69 74 65  ditErrmsg(sqlite
1abc0 33 72 62 75 20 2a 70 29 7b 0a 20 20 69 66 28 20  3rbu *p){.  if( 
1abd0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f  p->rc==SQLITE_CO
1abe0 4e 53 54 52 41 49 4e 54 20 26 26 20 70 2d 3e 7a  NSTRAINT && p->z
1abf0 45 72 72 6d 73 67 20 29 7b 0a 20 20 20 20 75 6e  Errmsg ){.    un
1ac00 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20  signed int i;.  
1ac10 20 20 73 69 7a 65 5f 74 20 6e 45 72 72 6d 73 67    size_t nErrmsg
1ac20 20 3d 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 45 72   = strlen(p->zEr
1ac30 72 6d 73 67 29 3b 0a 20 20 20 20 66 6f 72 28 69  rmsg);.    for(i
1ac40 3d 30 3b 20 69 3c 28 6e 45 72 72 6d 73 67 2d 38  =0; i<(nErrmsg-8
1ac50 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
1ac60 66 28 20 6d 65 6d 63 6d 70 28 26 70 2d 3e 7a 45  f( memcmp(&p->zE
1ac70 72 72 6d 73 67 5b 69 5d 2c 20 22 72 62 75 5f 69  rrmsg[i], "rbu_i
1ac80 6d 70 5f 22 2c 20 38 29 3d 3d 30 20 29 7b 0a 20  mp_", 8)==0 ){. 
1ac90 20 20 20 20 20 20 20 69 6e 74 20 6e 44 65 6c 20         int nDel 
1aca0 3d 20 38 3b 0a 20 20 20 20 20 20 20 20 77 68 69  = 8;.        whi
1acb0 6c 65 28 20 70 2d 3e 7a 45 72 72 6d 73 67 5b 69  le( p->zErrmsg[i
1acc0 2b 6e 44 65 6c 5d 3e 3d 27 30 27 20 26 26 20 70  +nDel]>='0' && p
1acd0 2d 3e 7a 45 72 72 6d 73 67 5b 69 2b 6e 44 65 6c  ->zErrmsg[i+nDel
1ace0 5d 3c 3d 27 39 27 20 29 20 6e 44 65 6c 2b 2b 3b  ]<='9' ) nDel++;
1acf0 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65  .        memmove
1ad00 28 26 70 2d 3e 7a 45 72 72 6d 73 67 5b 69 5d 2c  (&p->zErrmsg[i],
1ad10 20 26 70 2d 3e 7a 45 72 72 6d 73 67 5b 69 2b 6e   &p->zErrmsg[i+n
1ad20 44 65 6c 5d 2c 20 6e 45 72 72 6d 73 67 20 2b 20  Del], nErrmsg + 
1ad30 31 20 2d 20 69 20 2d 20 6e 44 65 6c 29 3b 0a 20  1 - i - nDel);. 
1ad40 20 20 20 20 20 20 20 6e 45 72 72 6d 73 67 20 2d         nErrmsg -
1ad50 3d 20 6e 44 65 6c 3b 0a 20 20 20 20 20 20 7d 0a  = nDel;.      }.
1ad60 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
1ad70 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 52 42 55  ** Close the RBU
1ad80 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20   handle..*/.int 
1ad90 73 71 6c 69 74 65 33 72 62 75 5f 63 6c 6f 73 65  sqlite3rbu_close
1ada0 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20  (sqlite3rbu *p, 
1adb0 63 68 61 72 20 2a 2a 70 7a 45 72 72 6d 73 67 29  char **pzErrmsg)
1adc0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  {.  int rc;.  if
1add0 28 20 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 43  ( p ){..    /* C
1ade0 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
1adf0 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 2a 2d 6f  ction to the *-o
1ae00 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
1ae10 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1ae20 45 5f 4f 4b 20 26 26 20 70 2d 3e 65 53 74 61 67  E_OK && p->eStag
1ae30 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c  e==RBU_STAGE_OAL
1ae40 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
1ae50 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  = sqlite3_exec(p
1ae60 2d 3e 64 62 4d 61 69 6e 2c 20 22 43 4f 4d 4d 49  ->dbMain, "COMMI
1ae70 54 22 2c 20 30 2c 20 30 2c 20 26 70 2d 3e 7a 45  T", 0, 0, &p->zE
1ae80 72 72 6d 73 67 29 3b 0a 20 20 20 20 7d 0a 0a 20  rrmsg);.    }.. 
1ae90 20 20 20 72 62 75 53 61 76 65 53 74 61 74 65 28     rbuSaveState(
1aea0 70 2c 20 70 2d 3e 65 53 74 61 67 65 29 3b 0a 0a  p, p->eStage);..
1aeb0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
1aec0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 65  QLITE_OK && p->e
1aed0 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45  Stage==RBU_STAGE
1aee0 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 20 20 70 2d  _OAL ){.      p-
1aef0 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78  >rc = sqlite3_ex
1af00 65 63 28 70 2d 3e 64 62 52 62 75 2c 20 22 43 4f  ec(p->dbRbu, "CO
1af10 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 26 70 2d  MMIT", 0, 0, &p-
1af20 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 7d  >zErrmsg);.    }
1af30 0a 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65 20 61  ..    /* Close a
1af40 6e 79 20 6f 70 65 6e 20 73 74 61 74 65 6d 65 6e  ny open statemen
1af50 74 20 68 61 6e 64 6c 65 73 2e 20 2a 2f 0a 20 20  t handles. */.  
1af60 20 20 72 62 75 4f 62 6a 49 74 65 72 46 69 6e 61    rbuObjIterFina
1af70 6c 69 7a 65 28 26 70 2d 3e 6f 62 6a 69 74 65 72  lize(&p->objiter
1af80 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65  );..    /* Close
1af90 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
1afa0 73 65 20 68 61 6e 64 6c 65 20 61 6e 64 20 56 46  se handle and VF
1afb0 53 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 20  S object. */.   
1afc0 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70   sqlite3_close(p
1afd0 2d 3e 64 62 4d 61 69 6e 29 3b 0a 20 20 20 20 73  ->dbMain);.    s
1afe0 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e  qlite3_close(p->
1aff0 64 62 52 62 75 29 3b 0a 20 20 20 20 72 62 75 44  dbRbu);.    rbuD
1b000 65 6c 65 74 65 56 66 73 28 70 29 3b 0a 20 20 20  eleteVfs(p);.   
1b010 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
1b020 3e 61 42 75 66 29 3b 0a 20 20 20 20 73 71 6c 69  >aBuf);.    sqli
1b030 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 46 72 61  te3_free(p->aFra
1b040 6d 65 29 3b 0a 0a 20 20 20 20 72 62 75 45 64 69  me);..    rbuEdi
1b050 74 45 72 72 6d 73 67 28 70 29 3b 0a 20 20 20 20  tErrmsg(p);.    
1b060 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 20 20  rc = p->rc;.    
1b070 2a 70 7a 45 72 72 6d 73 67 20 3d 20 70 2d 3e 7a  *pzErrmsg = p->z
1b080 45 72 72 6d 73 67 3b 0a 20 20 20 20 73 71 6c 69  Errmsg;.    sqli
1b090 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d  te3_free(p);.  }
1b0a0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
1b0b0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1b0c0 20 2a 70 7a 45 72 72 6d 73 67 20 3d 20 30 3b 0a   *pzErrmsg = 0;.
1b0d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1b0e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1b0f0 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
1b100 72 20 6f 66 20 6b 65 79 2d 76 61 6c 75 65 20 6f  r of key-value o
1b110 70 65 72 61 74 69 6f 6e 73 20 28 69 6e 73 65 72  perations (inser
1b120 74 73 2c 20 64 65 6c 65 74 65 73 20 6f 72 20 0a  ts, deletes or .
1b130 2a 2a 20 75 70 64 61 74 65 73 29 20 74 68 61 74  ** updates) that
1b140 20 68 61 76 65 20 62 65 65 6e 20 70 65 72 66 6f   have been perfo
1b150 72 6d 65 64 20 6f 6e 20 74 68 65 20 74 61 72 67  rmed on the targ
1b160 65 74 20 64 61 74 61 62 61 73 65 20 73 69 6e 63  et database sinc
1b170 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  e the.** current
1b180 20 52 42 55 20 75 70 64 61 74 65 20 77 61 73 20   RBU update was 
1b190 73 74 61 72 74 65 64 2e 0a 2a 2f 0a 73 71 6c 69  started..*/.sqli
1b1a0 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65  te3_int64 sqlite
1b1b0 33 72 62 75 5f 70 72 6f 67 72 65 73 73 28 73 71  3rbu_progress(sq
1b1c0 6c 69 74 65 33 72 62 75 20 2a 70 52 62 75 29 7b  lite3rbu *pRbu){
1b1d0 0a 20 20 72 65 74 75 72 6e 20 70 52 62 75 2d 3e  .  return pRbu->
1b1e0 6e 50 72 6f 67 72 65 73 73 3b 0a 7d 0a 0a 2f 2a  nProgress;.}../*
1b1f0 0a 2a 2a 20 52 65 74 75 72 6e 20 70 65 72 6d 79  .** Return permy
1b200 72 69 61 64 61 67 65 20 70 72 6f 67 72 65 73 73  riadage progress
1b210 20 69 6e 64 69 63 61 74 69 6f 6e 73 20 66 6f 72   indications for
1b220 20 74 68 65 20 74 77 6f 20 6d 61 69 6e 20 73 74   the two main st
1b230 61 67 65 73 20 6f 66 0a 2a 2a 20 61 6e 20 52 42  ages of.** an RB
1b240 55 20 75 70 64 61 74 65 2e 0a 2a 2f 0a 76 6f 69  U update..*/.voi
1b250 64 20 73 71 6c 69 74 65 33 72 62 75 5f 62 70 5f  d sqlite3rbu_bp_
1b260 70 72 6f 67 72 65 73 73 28 73 71 6c 69 74 65 33  progress(sqlite3
1b270 72 62 75 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f  rbu *p, int *pnO
1b280 6e 65 2c 20 69 6e 74 20 2a 70 6e 54 77 6f 29 7b  ne, int *pnTwo){
1b290 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 4d 41 58  .  const int MAX
1b2a0 5f 50 52 4f 47 52 45 53 53 20 3d 20 31 30 30 30  _PROGRESS = 1000
1b2b0 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e  0;.  switch( p->
1b2c0 65 53 74 61 67 65 20 29 7b 0a 20 20 20 20 63 61  eStage ){.    ca
1b2d0 73 65 20 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c  se RBU_STAGE_OAL
1b2e0 3a 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  :.      if( p->n
1b2f0 50 68 61 73 65 4f 6e 65 53 74 65 70 3e 30 20 29  PhaseOneStep>0 )
1b300 7b 0a 20 20 20 20 20 20 20 20 2a 70 6e 4f 6e 65  {.        *pnOne
1b310 20 3d 20 28 69 6e 74 29 28 4d 41 58 5f 50 52 4f   = (int)(MAX_PRO
1b320 47 52 45 53 53 20 2a 20 28 69 36 34 29 70 2d 3e  GRESS * (i64)p->
1b330 6e 50 72 6f 67 72 65 73 73 2f 28 69 36 34 29 70  nProgress/(i64)p
1b340 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 29  ->nPhaseOneStep)
1b350 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1b360 20 20 20 20 20 20 20 2a 70 6e 4f 6e 65 20 3d 20         *pnOne = 
1b370 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
1b380 20 20 2a 70 6e 54 77 6f 20 3d 20 30 3b 0a 20 20    *pnTwo = 0;.  
1b390 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
1b3a0 63 61 73 65 20 52 42 55 5f 53 54 41 47 45 5f 4d  case RBU_STAGE_M
1b3b0 4f 56 45 3a 0a 20 20 20 20 20 20 2a 70 6e 4f 6e  OVE:.      *pnOn
1b3c0 65 20 3d 20 4d 41 58 5f 50 52 4f 47 52 45 53 53  e = MAX_PROGRESS
1b3d0 3b 0a 20 20 20 20 20 20 2a 70 6e 54 77 6f 20 3d  ;.      *pnTwo =
1b3e0 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
1b3f0 0a 0a 20 20 20 20 63 61 73 65 20 52 42 55 5f 53  ..    case RBU_S
1b400 54 41 47 45 5f 43 4b 50 54 3a 0a 20 20 20 20 20  TAGE_CKPT:.     
1b410 20 2a 70 6e 4f 6e 65 20 3d 20 4d 41 58 5f 50 52   *pnOne = MAX_PR
1b420 4f 47 52 45 53 53 3b 0a 20 20 20 20 20 20 2a 70  OGRESS;.      *p
1b430 6e 54 77 6f 20 3d 20 28 69 6e 74 29 28 4d 41 58  nTwo = (int)(MAX
1b440 5f 50 52 4f 47 52 45 53 53 20 2a 20 28 69 36 34  _PROGRESS * (i64
1b450 29 70 2d 3e 6e 53 74 65 70 20 2f 20 28 69 36 34  )p->nStep / (i64
1b460 29 70 2d 3e 6e 46 72 61 6d 65 29 3b 0a 20 20 20  )p->nFrame);.   
1b470 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
1b480 61 73 65 20 52 42 55 5f 53 54 41 47 45 5f 44 4f  ase RBU_STAGE_DO
1b490 4e 45 3a 0a 20 20 20 20 20 20 2a 70 6e 4f 6e 65  NE:.      *pnOne
1b4a0 20 3d 20 4d 41 58 5f 50 52 4f 47 52 45 53 53 3b   = MAX_PROGRESS;
1b4b0 0a 20 20 20 20 20 20 2a 70 6e 54 77 6f 20 3d 20  .      *pnTwo = 
1b4c0 4d 41 58 5f 50 52 4f 47 52 45 53 53 3b 0a 20 20  MAX_PROGRESS;.  
1b4d0 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
1b4e0 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61  default:.      a
1b4f0 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a  ssert( 0 );.  }.
1b500 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 72 62  }..int sqlite3rb
1b510 75 5f 73 61 76 65 73 74 61 74 65 28 73 71 6c 69  u_savestate(sqli
1b520 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 69 6e  te3rbu *p){.  in
1b530 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20  t rc = p->rc;.  
1b540 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1b550 45 5f 44 4f 4e 45 20 29 20 72 65 74 75 72 6e 20  E_DONE ) return 
1b560 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
1b570 73 65 72 74 28 20 70 2d 3e 65 53 74 61 67 65 3e  sert( p->eStage>
1b580 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 26  =RBU_STAGE_OAL &
1b590 26 20 70 2d 3e 65 53 74 61 67 65 3c 3d 52 42 55  & p->eStage<=RBU
1b5a0 5f 53 54 41 47 45 5f 44 4f 4e 45 20 29 3b 0a 20  _STAGE_DONE );. 
1b5b0 20 69 66 28 20 70 2d 3e 65 53 74 61 67 65 3d 3d   if( p->eStage==
1b5c0 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 29 7b  RBU_STAGE_OAL ){
1b5d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
1b5e0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
1b5f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1b600 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 73 71 6c  TE_OK ) rc = sql
1b610 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 4d  ite3_exec(p->dbM
1b620 61 69 6e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30  ain, "COMMIT", 0
1b630 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , 0, 0);.  }..  
1b640 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 72 62  p->rc = rc;.  rb
1b650 75 53 61 76 65 53 74 61 74 65 28 70 2c 20 70 2d  uSaveState(p, p-
1b660 3e 65 53 74 61 67 65 29 3b 0a 20 20 72 63 20 3d  >eStage);.  rc =
1b670 20 70 2d 3e 72 63 3b 0a 0a 20 20 69 66 28 20 70   p->rc;..  if( p
1b680 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  ->eStage==RBU_ST
1b690 41 47 45 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 61  AGE_OAL ){.    a
1b6a0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
1b6b0 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66  E_DONE );.    if
1b6c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b6d0 29 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65  ) rc = sqlite3_e
1b6e0 78 65 63 28 70 2d 3e 64 62 52 62 75 2c 20 22 43  xec(p->dbRbu, "C
1b6f0 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 30 29  OMMIT", 0, 0, 0)
1b700 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1b710 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 73  LITE_OK ) rc = s
1b720 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
1b730 62 52 62 75 2c 20 22 42 45 47 49 4e 20 49 4d 4d  bRbu, "BEGIN IMM
1b740 45 44 49 41 54 45 22 2c 20 30 2c 20 30 2c 20 30  EDIATE", 0, 0, 0
1b750 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1b760 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
1b770 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
1b780 64 62 4d 61 69 6e 2c 20 22 42 45 47 49 4e 20 49  dbMain, "BEGIN I
1b790 4d 4d 45 44 49 41 54 45 22 2c 20 30 2c 20 30 2c  MMEDIATE", 0, 0,
1b7a0 30 29 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 72 63  0);.  }..  p->rc
1b7b0 20 3d 20 72 63 3b 0a 20 20 72 65 74 75 72 6e 20   = rc;.  return 
1b7c0 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  rc;.}../********
1b7d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b7e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b7f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b810 2a 2a 0a 2a 2a 20 42 65 67 69 6e 6e 69 6e 67 20  **.** Beginning 
1b820 6f 66 20 52 42 55 20 56 46 53 20 73 68 69 6d 20  of RBU VFS shim 
1b830 6d 65 74 68 6f 64 73 2e 20 54 68 65 20 56 46 53  methods. The VFS
1b840 20 73 68 69 6d 20 6d 6f 64 69 66 69 65 73 20 74   shim modifies t
1b850 68 65 20 62 65 68 61 76 69 6f 75 72 0a 2a 2a 20  he behaviour.** 
1b860 6f 66 20 61 20 73 74 61 6e 64 61 72 64 20 56 46  of a standard VF
1b870 53 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  S in the followi
1b880 6e 67 20 77 61 79 73 3a 0a 2a 2a 0a 2a 2a 20 31  ng ways:.**.** 1
1b890 2e 20 57 68 65 6e 65 76 65 72 20 74 68 65 20 66  . Whenever the f
1b8a0 69 72 73 74 20 70 61 67 65 20 6f 66 20 61 20 6d  irst page of a m
1b8b0 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
1b8c0 65 20 69 73 20 72 65 61 64 20 6f 72 20 0a 2a 2a  e is read or .**
1b8d0 20 20 20 20 77 72 69 74 74 65 6e 2c 20 74 68 65      written, the
1b8e0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 68   value of the ch
1b8f0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 63 6f 6f  ange-counter coo
1b900 6b 69 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  kie is stored in
1b910 0a 2a 2a 20 20 20 20 72 62 75 5f 66 69 6c 65 2e  .**    rbu_file.
1b920 69 43 6f 6f 6b 69 65 2e 20 53 69 6d 69 6c 61 72  iCookie. Similar
1b930 6c 79 2c 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ly, the value of
1b940 20 74 68 65 20 22 77 72 69 74 65 2d 76 65 72 73   the "write-vers
1b950 69 6f 6e 22 0a 2a 2a 20 20 20 20 64 61 74 61 62  ion".**    datab
1b960 61 73 65 20 68 65 61 64 65 72 20 66 69 65 6c 64  ase header field
1b970 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72 62   is stored in rb
1b980 75 5f 66 69 6c 65 2e 69 57 72 69 74 65 56 65 72  u_file.iWriteVer
1b990 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 0a 2a  . This ensures.*
1b9a0 2a 20 20 20 20 74 68 61 74 20 74 68 65 20 76 61  *    that the va
1b9b0 6c 75 65 73 20 61 72 65 20 61 6c 77 61 79 73 20  lues are always 
1b9c0 74 72 75 73 74 77 6f 72 74 68 79 20 77 69 74 68  trustworthy with
1b9d0 69 6e 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e 73  in an open trans
1b9e0 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 32 2e  action..**.** 2.
1b9f0 20 57 68 65 6e 65 76 65 72 20 61 6e 20 53 51 4c   Whenever an SQL
1ba00 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 66 69 6c  ITE_OPEN_WAL fil
1ba10 65 20 69 73 20 6f 70 65 6e 65 64 2c 20 74 68 65  e is opened, the
1ba20 20 28 72 62 75 5f 66 69 6c 65 2e 70 57 61 6c 46   (rbu_file.pWalF
1ba30 64 29 0a 2a 2a 20 20 20 20 6d 65 6d 62 65 72 20  d).**    member 
1ba40 76 61 72 69 61 62 6c 65 20 6f 66 20 74 68 65 20  variable of the 
1ba50 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62  associated datab
1ba60 61 73 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  ase file descrip
1ba70 74 6f 72 20 69 73 20 73 65 74 0a 2a 2a 20 20 20  tor is set.**   
1ba80 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
1ba90 20 6e 65 77 20 66 69 6c 65 2e 20 41 20 6d 75 74   new file. A mut
1baa0 65 78 20 70 72 6f 74 65 63 74 65 64 20 6c 69 6e  ex protected lin
1bab0 6b 65 64 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  ked list of all 
1bac0 6d 61 69 6e 20 0a 2a 2a 20 20 20 20 64 62 20 66  main .**    db f
1bad0 64 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20  ds opened using 
1bae0 61 20 70 61 72 74 69 63 75 6c 61 72 20 52 42 55  a particular RBU
1baf0 20 56 46 53 20 69 73 20 6d 61 69 6e 74 61 69 6e   VFS is maintain
1bb00 65 64 20 61 74 20 0a 2a 2a 20 20 20 20 72 62 75  ed at .**    rbu
1bb10 5f 76 66 73 2e 70 4d 61 69 6e 20 74 6f 20 66 61  _vfs.pMain to fa
1bb20 63 69 6c 69 74 61 74 65 20 74 68 69 73 2e 0a 2a  cilitate this..*
1bb30 2a 0a 2a 2a 20 33 2e 20 55 73 69 6e 67 20 61 20  *.** 3. Using a 
1bb40 6e 65 77 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c  new file-control
1bb50 20 22 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 52   "SQLITE_FCNTL_R
1bb60 42 55 22 2c 20 61 20 6d 61 69 6e 20 64 62 20 72  BU", a main db r
1bb70 62 75 5f 66 69 6c 65 20 0a 2a 2a 20 20 20 20 6f  bu_file .**    o
1bb80 62 6a 65 63 74 20 63 61 6e 20 62 65 20 6d 61 72  bject can be mar
1bb90 6b 65 64 20 61 73 20 74 68 65 20 74 61 72 67 65  ked as the targe
1bba0 74 20 64 61 74 61 62 61 73 65 20 6f 66 20 61 6e  t database of an
1bbb0 20 52 42 55 20 75 70 64 61 74 65 2e 20 54 68 69   RBU update. Thi
1bbc0 73 0a 2a 2a 20 20 20 20 74 75 72 6e 73 20 6f 6e  s.**    turns on
1bbd0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65   the following e
1bbe0 78 74 72 61 20 73 70 65 63 69 61 6c 20 62 65 68  xtra special beh
1bbf0 61 76 69 6f 75 72 3a 0a 2a 2a 0a 2a 2a 20 33 61  aviour:.**.** 3a
1bc00 2e 20 49 66 20 78 41 63 63 65 73 73 28 29 20 69  . If xAccess() i
1bc10 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 68 65 63  s called to chec
1bc20 6b 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74  k if there exist
1bc30 73 20 61 20 2a 2d 77 61 6c 20 66 69 6c 65 20 0a  s a *-wal file .
1bc40 2a 2a 20 20 20 20 20 61 73 73 6f 63 69 61 74 65  **     associate
1bc50 64 20 77 69 74 68 20 61 6e 20 52 42 55 20 74 61  d with an RBU ta
1bc60 72 67 65 74 20 64 61 74 61 62 61 73 65 20 63 75  rget database cu
1bc70 72 72 65 6e 74 6c 79 20 69 6e 20 52 42 55 5f 53  rrently in RBU_S
1bc80 54 41 47 45 5f 4f 41 4c 0a 2a 2a 20 20 20 20 20  TAGE_OAL.**     
1bc90 73 74 61 67 65 20 28 70 72 65 70 61 72 69 6e 67  stage (preparing
1bca0 20 74 68 65 20 2a 2d 6f 61 6c 20 66 69 6c 65 29   the *-oal file)
1bcb0 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
1bcc0 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67  special handling
1bcd0 0a 2a 2a 20 20 20 20 20 61 70 70 6c 69 65 73 3a  .**     applies:
1bce0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 2a 20 69 66  .**.**      * if
1bcf0 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20   the *-wal file 
1bd00 64 6f 65 73 20 65 78 69 73 74 2c 20 72 65 74 75  does exist, retu
1bd10 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
1bd20 45 4e 2e 20 41 6e 20 52 42 55 0a 2a 2a 20 20 20  EN. An RBU.**   
1bd30 20 20 20 20 20 74 61 72 67 65 74 20 64 61 74 61       target data
1bd40 62 61 73 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  base may not be 
1bd50 69 6e 20 77 61 6c 20 6d 6f 64 65 20 61 6c 72 65  in wal mode alre
1bd60 61 64 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ady..**.**      
1bd70 2a 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66  * if the *-wal f
1bd80 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
1bd90 73 74 2c 20 73 65 74 20 74 68 65 20 6f 75 74 70  st, set the outp
1bda0 75 74 20 70 61 72 61 6d 65 74 65 72 20 74 6f 0a  ut parameter to.
1bdb0 2a 2a 20 20 20 20 20 20 20 20 6e 6f 6e 2d 7a 65  **        non-ze
1bdc0 72 6f 20 28 74 6f 20 74 65 6c 6c 20 53 51 4c 69  ro (to tell SQLi
1bdd0 74 65 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  te that it does 
1bde0 65 78 69 73 74 29 20 61 6e 79 77 61 79 2e 0a 2a  exist) anyway..*
1bdf0 2a 0a 2a 2a 20 20 20 20 20 54 68 65 6e 2c 20 77  *.**     Then, w
1be00 68 65 6e 20 78 4f 70 65 6e 28 29 20 69 73 20 63  hen xOpen() is c
1be10 61 6c 6c 65 64 20 74 6f 20 6f 70 65 6e 20 74 68  alled to open th
1be20 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 61 73 73  e *-wal file ass
1be30 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  ociated with.** 
1be40 20 20 20 20 74 68 65 20 52 42 55 20 74 61 72 67      the RBU targ
1be50 65 74 20 69 6e 20 52 42 55 5f 53 54 41 47 45 5f  et in RBU_STAGE_
1be60 4f 41 4c 20 73 74 61 67 65 2c 20 69 6e 73 74 65  OAL stage, inste
1be70 61 64 20 6f 66 20 6f 70 65 6e 69 6e 67 20 74 68  ad of opening th
1be80 65 20 2a 2d 77 61 6c 0a 2a 2a 20 20 20 20 20 66  e *-wal.**     f
1be90 69 6c 65 2c 20 74 68 65 20 72 62 75 20 76 66 73  ile, the rbu vfs
1bea0 20 6f 70 65 6e 73 20 74 68 65 20 63 6f 72 72 65   opens the corre
1beb0 73 70 6f 6e 64 69 6e 67 20 2a 2d 6f 61 6c 20 66  sponding *-oal f
1bec0 69 6c 65 20 69 6e 73 74 65 61 64 2e 20 0a 2a 2a  ile instead. .**
1bed0 0a 2a 2a 20 33 62 2e 20 54 68 65 20 2a 2d 73 68  .** 3b. The *-sh
1bee0 6d 20 70 61 67 65 73 20 72 65 74 75 72 6e 65 64  m pages returned
1bef0 20 62 79 20 78 53 68 6d 4d 61 70 28 29 20 66 6f   by xShmMap() fo
1bf00 72 20 61 20 74 61 72 67 65 74 20 64 62 20 66 69  r a target db fi
1bf10 6c 65 20 69 6e 0a 2a 2a 20 20 20 20 20 52 42 55  le in.**     RBU
1bf20 5f 53 54 41 47 45 5f 4f 41 4c 20 6d 6f 64 65 20  _STAGE_OAL mode 
1bf30 61 72 65 20 61 63 74 75 61 6c 6c 79 20 73 74 6f  are actually sto
1bf40 72 65 64 20 69 6e 20 68 65 61 70 20 6d 65 6d 6f  red in heap memo
1bf50 72 79 2e 20 54 68 69 73 20 69 73 20 74 6f 0a 2a  ry. This is to.*
1bf60 2a 20 20 20 20 20 61 76 6f 69 64 20 63 72 65 61  *     avoid crea
1bf70 74 69 6e 67 20 61 20 2a 2d 73 68 6d 20 66 69 6c  ting a *-shm fil
1bf80 65 20 6f 6e 20 64 69 73 6b 2e 20 41 64 64 69 74  e on disk. Addit
1bf90 69 6f 6e 61 6c 6c 79 2c 20 78 53 68 6d 4c 6f 63  ionally, xShmLoc
1bfa0 6b 28 29 20 63 61 6c 6c 73 0a 2a 2a 20 20 20 20  k() calls.**    
1bfb0 20 61 72 65 20 6e 6f 2d 6f 70 73 20 6f 6e 20 74   are no-ops on t
1bfc0 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20 66  arget database f
1bfd0 69 6c 65 73 20 69 6e 20 52 42 55 5f 53 54 41 47  iles in RBU_STAG
1bfe0 45 5f 4f 41 4c 20 6d 6f 64 65 2e 20 54 68 69 73  E_OAL mode. This
1bff0 20 69 73 0a 2a 2a 20 20 20 20 20 62 65 63 61 75   is.**     becau
1c000 73 65 20 61 73 73 65 72 74 28 29 20 73 74 61 74  se assert() stat
1c010 65 6d 65 6e 74 73 20 69 6e 20 73 6f 6d 65 20 56  ements in some V
1c020 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  FS implementatio
1c030 6e 73 20 66 61 69 6c 20 69 66 20 0a 2a 2a 20 20  ns fail if .**  
1c040 20 20 20 78 53 68 6d 4c 6f 63 6b 28 29 20 69 73     xShmLock() is
1c050 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 78   called before x
1c060 53 68 6d 4d 61 70 28 29 2e 0a 2a 2a 0a 2a 2a 20  ShmMap()..**.** 
1c070 33 63 2e 20 49 66 20 61 6e 20 45 58 43 4c 55 53  3c. If an EXCLUS
1c080 49 56 45 20 6c 6f 63 6b 20 69 73 20 61 74 74 65  IVE lock is atte
1c090 6d 70 74 65 64 20 6f 6e 20 61 20 74 61 72 67 65  mpted on a targe
1c0a0 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  t database file 
1c0b0 69 6e 20 61 6e 79 0a 2a 2a 20 20 20 20 20 6d 6f  in any.**     mo
1c0c0 64 65 20 65 78 63 65 70 74 20 52 42 55 5f 53 54  de except RBU_ST
1c0d0 41 47 45 5f 44 4f 4e 45 20 28 61 6c 6c 20 77 6f  AGE_DONE (all wo
1c0e0 72 6b 20 63 6f 6d 70 6c 65 74 65 64 20 61 6e 64  rk completed and
1c0f0 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 29 2c 20   checkpointed), 
1c100 69 74 20 0a 2a 2a 20 20 20 20 20 66 61 69 6c 73  it .**     fails
1c110 20 77 69 74 68 20 61 6e 20 53 51 4c 49 54 45 5f   with an SQLITE_
1c120 42 55 53 59 20 65 72 72 6f 72 2e 20 54 68 69 73  BUSY error. This
1c130 20 69 73 20 74 6f 20 73 74 6f 70 20 52 42 55 20   is to stop RBU 
1c140 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 20  connections.**  
1c150 20 20 20 66 72 6f 6d 20 61 75 74 6f 6d 61 74 69     from automati
1c160 63 61 6c 6c 79 20 63 68 65 63 6b 70 6f 69 6e 74  cally checkpoint
1c170 69 6e 67 20 61 20 2a 2d 77 61 6c 20 28 6f 72 20  ing a *-wal (or 
1c180 2a 2d 6f 61 6c 29 20 66 69 6c 65 20 66 72 6f 6d  *-oal) file from
1c190 20 77 69 74 68 69 6e 0a 2a 2a 20 20 20 20 20 73   within.**     s
1c1a0 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 2e 0a  qlite3_close()..
1c1b0 2a 2a 0a 2a 2a 20 33 64 2e 20 49 6e 20 52 42 55  **.** 3d. In RBU
1c1c0 5f 53 54 41 47 45 5f 43 41 50 54 55 52 45 20 6d  _STAGE_CAPTURE m
1c1d0 6f 64 65 2c 20 61 6c 6c 20 78 52 65 61 64 28 29  ode, all xRead()
1c1e0 20 63 61 6c 6c 73 20 6f 6e 20 74 68 65 20 77 61   calls on the wa
1c1f0 6c 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20  l file, and.**  
1c200 20 20 20 61 6c 6c 20 78 57 72 69 74 65 28 29 20     all xWrite() 
1c210 63 61 6c 6c 73 20 6f 6e 20 74 68 65 20 74 61 72  calls on the tar
1c220 67 65 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  get database fil
1c230 65 20 70 65 72 66 6f 72 6d 20 6e 6f 20 49 4f 2e  e perform no IO.
1c240 20 0a 2a 2a 20 20 20 20 20 49 6e 73 74 65 61 64   .**     Instead
1c250 20 74 68 65 20 66 72 61 6d 65 20 61 6e 64 20 70   the frame and p
1c260 61 67 65 20 6e 75 6d 62 65 72 73 20 74 68 61 74  age numbers that
1c270 20 77 6f 75 6c 64 20 62 65 20 72 65 61 64 20 61   would be read a
1c280 6e 64 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20 20  nd written.**   
1c290 20 20 61 72 65 20 72 65 63 6f 72 64 65 64 2e 20    are recorded. 
1c2a0 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 73 75  Additionally, su
1c2b0 63 63 65 73 73 66 75 6c 20 61 74 74 65 6d 70 74  ccessful attempt
1c2c0 73 20 74 6f 20 6f 62 74 61 69 6e 20 65 78 63 6c  s to obtain excl
1c2d0 75 73 69 76 65 0a 2a 2a 20 20 20 20 20 78 53 68  usive.**     xSh
1c2e0 6d 4c 6f 63 6b 28 29 20 57 52 49 54 45 52 2c 20  mLock() WRITER, 
1c2f0 43 48 45 43 4b 50 4f 49 4e 54 45 52 20 61 6e 64  CHECKPOINTER and
1c300 20 52 45 41 44 30 20 6c 6f 63 6b 73 20 6f 6e 20   READ0 locks on 
1c310 74 68 65 20 74 61 72 67 65 74 20 0a 2a 2a 20 20  the target .**  
1c320 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65     database file
1c330 20 61 72 65 20 72 65 63 6f 72 64 65 64 2e 20 78   are recorded. x
1c340 53 68 6d 4c 6f 63 6b 28 29 20 63 61 6c 6c 73 20  ShmLock() calls 
1c350 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 73 61  to unlock the sa
1c360 6d 65 0a 2a 2a 20 20 20 20 20 6c 6f 63 6b 73 20  me.**     locks 
1c370 61 72 65 20 6e 6f 2d 6f 70 73 20 28 73 6f 20 74  are no-ops (so t
1c380 68 61 74 20 6f 6e 63 65 20 6f 62 74 61 69 6e 65  hat once obtaine
1c390 64 2c 20 74 68 65 73 65 20 6c 6f 63 6b 73 20 61  d, these locks a
1c3a0 72 65 20 6e 65 76 65 72 0a 2a 2a 20 20 20 20 20  re never.**     
1c3b0 72 65 6c 69 6e 71 75 69 73 68 65 64 29 2e 20 46  relinquished). F
1c3c0 69 6e 61 6c 6c 79 2c 20 63 61 6c 6c 73 20 74 6f  inally, calls to
1c3d0 20 78 53 79 6e 63 28 29 20 6f 6e 20 74 68 65 20   xSync() on the 
1c3e0 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65 0a  target database.
1c3f0 2a 2a 20 20 20 20 20 66 69 6c 65 20 66 61 69 6c  **     file fail
1c400 20 77 69 74 68 20 53 51 4c 49 54 45 5f 49 4e 54   with SQLITE_INT
1c410 45 52 4e 41 4c 20 65 72 72 6f 72 73 2e 0a 2a 2f  ERNAL errors..*/
1c420 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62  ..static void rb
1c430 75 55 6e 6c 6f 63 6b 53 68 6d 28 72 62 75 5f 66  uUnlockShm(rbu_f
1c440 69 6c 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ile *p){.  if( p
1c450 2d 3e 70 52 62 75 20 29 7b 0a 20 20 20 20 69 6e  ->pRbu ){.    in
1c460 74 20 28 2a 78 53 68 6d 4c 6f 63 6b 29 28 73 71  t (*xShmLock)(sq
1c470 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c  lite3_file*,int,
1c480 69 6e 74 2c 69 6e 74 29 20 3d 20 70 2d 3e 70 52  int,int) = p->pR
1c490 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  eal->pMethods->x
1c4a0 53 68 6d 4c 6f 63 6b 3b 0a 20 20 20 20 69 6e 74  ShmLock;.    int
1c4b0 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
1c4c0 20 69 3c 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c   i<SQLITE_SHM_NL
1c4d0 4f 43 4b 3b 69 2b 2b 29 7b 0a 20 20 20 20 20 20  OCK;i++){.      
1c4e0 69 66 28 20 28 31 3c 3c 69 29 20 26 20 70 2d 3e  if( (1<<i) & p->
1c4f0 70 52 62 75 2d 3e 6d 4c 6f 63 6b 20 29 7b 0a 20  pRbu->mLock ){. 
1c500 20 20 20 20 20 20 20 78 53 68 6d 4c 6f 63 6b 28         xShmLock(
1c510 70 2d 3e 70 52 65 61 6c 2c 20 69 2c 20 31 2c 20  p->pReal, i, 1, 
1c520 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
1c530 4b 7c 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43  K|SQLITE_SHM_EXC
1c540 4c 55 53 49 56 45 29 3b 0a 20 20 20 20 20 20 7d  LUSIVE);.      }
1c550 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 52  .    }.    p->pR
1c560 62 75 2d 3e 6d 4c 6f 63 6b 20 3d 20 30 3b 0a 20  bu->mLock = 0;. 
1c570 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73   }.}../*.** Clos
1c580 65 20 61 6e 20 72 62 75 20 66 69 6c 65 2e 0a 2a  e an rbu file..*
1c590 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75  /.static int rbu
1c5a0 56 66 73 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  VfsClose(sqlite3
1c5b0 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  _file *pFile){. 
1c5c0 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28   rbu_file *p = (
1c5d0 72 62 75 5f 66 69 6c 65 2a 29 70 46 69 6c 65 3b  rbu_file*)pFile;
1c5e0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
1c5f0 20 69 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74   i;..  /* Free t
1c600 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
1c610 68 65 20 61 70 53 68 6d 5b 5d 20 61 72 72 61 79  he apShm[] array
1c620 2e 20 41 6e 64 20 74 68 65 20 61 72 72 61 79 20  . And the array 
1c630 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 66 6f 72  itself. */.  for
1c640 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 68 6d 3b  (i=0; i<p->nShm;
1c650 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
1c660 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 53 68 6d  e3_free(p->apShm
1c670 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  [i]);.  }.  sqli
1c680 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 53 68  te3_free(p->apSh
1c690 6d 29 3b 0a 20 20 70 2d 3e 61 70 53 68 6d 20 3d  m);.  p->apShm =
1c6a0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   0;.  sqlite3_fr
1c6b0 65 65 28 70 2d 3e 7a 44 65 6c 29 3b 0a 0a 20 20  ee(p->zDel);..  
1c6c0 69 66 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73  if( p->openFlags
1c6d0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d   & SQLITE_OPEN_M
1c6e0 41 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20 72 62  AIN_DB ){.    rb
1c6f0 75 5f 66 69 6c 65 20 2a 2a 70 70 3b 0a 20 20 20  u_file **pp;.   
1c700 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1c710 6e 74 65 72 28 70 2d 3e 70 52 62 75 56 66 73 2d  nter(p->pRbuVfs-
1c720 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 66 6f 72  >mutex);.    for
1c730 28 70 70 3d 26 70 2d 3e 70 52 62 75 56 66 73 2d  (pp=&p->pRbuVfs-
1c740 3e 70 4d 61 69 6e 3b 20 2a 70 70 21 3d 70 3b 20  >pMain; *pp!=p; 
1c750 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4d 61 69  pp=&((*pp)->pMai
1c760 6e 4e 65 78 74 29 29 3b 0a 20 20 20 20 2a 70 70  nNext));.    *pp
1c770 20 3d 20 70 2d 3e 70 4d 61 69 6e 4e 65 78 74 3b   = p->pMainNext;
1c780 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
1c790 65 78 5f 6c 65 61 76 65 28 70 2d 3e 70 52 62 75  ex_leave(p->pRbu
1c7a0 56 66 73 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  Vfs->mutex);.   
1c7b0 20 72 62 75 55 6e 6c 6f 63 6b 53 68 6d 28 70 29   rbuUnlockShm(p)
1c7c0 3b 0a 20 20 20 20 70 2d 3e 70 52 65 61 6c 2d 3e  ;.    p->pReal->
1c7d0 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 55 6e  pMethods->xShmUn
1c7e0 6d 61 70 28 70 2d 3e 70 52 65 61 6c 2c 20 30 29  map(p->pReal, 0)
1c7f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 6f 73  ;.  }..  /* Clos
1c800 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
1c810 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a   file handle */.
1c820 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d    rc = p->pReal-
1c830 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 43 6c 6f 73  >pMethods->xClos
1c840 65 28 70 2d 3e 70 52 65 61 6c 29 3b 0a 20 20 72  e(p->pReal);.  r
1c850 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
1c860 0a 2a 2a 20 52 65 61 64 20 61 6e 64 20 72 65 74  .** Read and ret
1c870 75 72 6e 20 61 6e 20 75 6e 73 69 67 6e 65 64 20  urn an unsigned 
1c880 33 32 2d 62 69 74 20 62 69 67 2d 65 6e 64 69 61  32-bit big-endia
1c890 6e 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74  n integer from t
1c8a0 68 65 20 62 75 66 66 65 72 20 0a 2a 2a 20 70 61  he buffer .** pa
1c8b0 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79  ssed as the only
1c8c0 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
1c8d0 61 74 69 63 20 75 33 32 20 72 62 75 47 65 74 55  atic u32 rbuGetU
1c8e0 33 32 28 75 38 20 2a 61 42 75 66 29 7b 0a 20 20  32(u8 *aBuf){.  
1c8f0 72 65 74 75 72 6e 20 28 28 75 33 32 29 61 42 75  return ((u32)aBu
1c900 66 5b 30 5d 20 3c 3c 20 32 34 29 0a 20 20 20 20  f[0] << 24).    
1c910 20 20 20 2b 20 28 28 75 33 32 29 61 42 75 66 5b     + ((u32)aBuf[
1c920 31 5d 20 3c 3c 20 31 36 29 0a 20 20 20 20 20 20  1] << 16).      
1c930 20 2b 20 28 28 75 33 32 29 61 42 75 66 5b 32 5d   + ((u32)aBuf[2]
1c940 20 3c 3c 20 20 38 29 0a 20 20 20 20 20 20 20 2b   <<  8).       +
1c950 20 28 28 75 33 32 29 61 42 75 66 5b 33 5d 29 3b   ((u32)aBuf[3]);
1c960 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64  .}../*.** Read d
1c970 61 74 61 20 66 72 6f 6d 20 61 6e 20 72 62 75 56  ata from an rbuV
1c980 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  fs-file..*/.stat
1c990 69 63 20 69 6e 74 20 72 62 75 56 66 73 52 65 61  ic int rbuVfsRea
1c9a0 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  d(.  sqlite3_fil
1c9b0 65 20 2a 70 46 69 6c 65 2c 20 0a 20 20 76 6f 69  e *pFile, .  voi
1c9c0 64 20 2a 7a 42 75 66 2c 20 0a 20 20 69 6e 74 20  d *zBuf, .  int 
1c9d0 69 41 6d 74 2c 20 0a 20 20 73 71 6c 69 74 65 5f  iAmt, .  sqlite_
1c9e0 69 6e 74 36 34 20 69 4f 66 73 74 0a 29 7b 0a 20  int64 iOfst.){. 
1c9f0 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28   rbu_file *p = (
1ca00 72 62 75 5f 66 69 6c 65 2a 29 70 46 69 6c 65 3b  rbu_file*)pFile;
1ca10 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70  .  sqlite3rbu *p
1ca20 52 62 75 20 3d 20 70 2d 3e 70 52 62 75 3b 0a 20  Rbu = p->pRbu;. 
1ca30 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
1ca40 70 52 62 75 20 26 26 20 70 52 62 75 2d 3e 65 53  pRbu && pRbu->eS
1ca50 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f  tage==RBU_STAGE_
1ca60 43 41 50 54 55 52 45 20 29 7b 0a 20 20 20 20 61  CAPTURE ){.    a
1ca70 73 73 65 72 74 28 20 70 2d 3e 6f 70 65 6e 46 6c  ssert( p->openFl
1ca80 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
1ca90 4e 5f 57 41 4c 20 29 3b 0a 20 20 20 20 72 63 20  N_WAL );.    rc 
1caa0 3d 20 72 62 75 43 61 70 74 75 72 65 57 61 6c 52  = rbuCaptureWalR
1cab0 65 61 64 28 70 2d 3e 70 52 62 75 2c 20 69 4f 66  ead(p->pRbu, iOf
1cac0 73 74 2c 20 69 41 6d 74 29 3b 0a 20 20 7d 65 6c  st, iAmt);.  }el
1cad0 73 65 7b 0a 20 20 20 20 69 66 28 20 70 52 62 75  se{.    if( pRbu
1cae0 20 26 26 20 70 52 62 75 2d 3e 65 53 74 61 67 65   && pRbu->eStage
1caf0 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20  ==RBU_STAGE_OAL 
1cb00 0a 20 20 20 20 20 26 26 20 28 70 2d 3e 6f 70 65  .     && (p->ope
1cb10 6e 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  nFlags & SQLITE_
1cb20 4f 50 45 4e 5f 57 41 4c 29 20 0a 20 20 20 20 20  OPEN_WAL) .     
1cb30 26 26 20 69 4f 66 73 74 3e 3d 70 52 62 75 2d 3e  && iOfst>=pRbu->
1cb40 69 4f 61 6c 53 7a 20 0a 20 20 20 20 29 7b 0a 20  iOalSz .    ){. 
1cb50 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1cb60 5f 4f 4b 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  _OK;.      memse
1cb70 74 28 7a 42 75 66 2c 20 30 2c 20 69 41 6d 74 29  t(zBuf, 0, iAmt)
1cb80 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1cb90 20 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c     rc = p->pReal
1cba0 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 52 65 61  ->pMethods->xRea
1cbb0 64 28 70 2d 3e 70 52 65 61 6c 2c 20 7a 42 75 66  d(p->pReal, zBuf
1cbc0 2c 20 69 41 6d 74 2c 20 69 4f 66 73 74 29 3b 0a  , iAmt, iOfst);.
1cbd0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
1cbe0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
1cbf0 4f 66 73 74 3d 3d 30 20 26 26 20 28 70 2d 3e 6f  Ofst==0 && (p->o
1cc00 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49 54  penFlags & SQLIT
1cc10 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20  E_OPEN_MAIN_DB) 
1cc20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 73  ){.      /* Thes
1cc30 65 20 6c 6f 6f 6b 20 6c 69 6b 65 20 6d 61 67 69  e look like magi
1cc40 63 20 6e 75 6d 62 65 72 73 2e 20 42 75 74 20 74  c numbers. But t
1cc50 68 65 79 20 61 72 65 20 73 74 61 62 6c 65 2c 20  hey are stable, 
1cc60 61 73 20 74 68 65 79 20 61 72 65 20 70 61 72 74  as they are part
1cc70 0a 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  .       ** of th
1cc80 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20  e definition of 
1cc90 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c 65 20  the SQLite file 
1cca0 66 6f 72 6d 61 74 2c 20 77 68 69 63 68 20 6d 61  format, which ma
1ccb0 79 20 6e 6f 74 20 63 68 61 6e 67 65 2e 20 2a 2f  y not change. */
1ccc0 0a 20 20 20 20 20 20 75 38 20 2a 70 42 75 66 20  .      u8 *pBuf 
1ccd0 3d 20 28 75 38 2a 29 7a 42 75 66 3b 0a 20 20 20  = (u8*)zBuf;.   
1cce0 20 20 20 70 2d 3e 69 43 6f 6f 6b 69 65 20 3d 20     p->iCookie = 
1ccf0 72 62 75 47 65 74 55 33 32 28 26 70 42 75 66 5b  rbuGetU32(&pBuf[
1cd00 32 34 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69  24]);.      p->i
1cd10 57 72 69 74 65 56 65 72 20 3d 20 70 42 75 66 5b  WriteVer = pBuf[
1cd20 31 39 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  19];.    }.  }. 
1cd30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1cd40 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20  *.** Write data 
1cd50 74 6f 20 61 6e 20 72 62 75 56 66 73 2d 66 69 6c  to an rbuVfs-fil
1cd60 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1cd70 20 72 62 75 56 66 73 57 72 69 74 65 28 0a 20 20   rbuVfsWrite(.  
1cd80 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
1cd90 69 6c 65 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f  ile, .  const vo
1cda0 69 64 20 2a 7a 42 75 66 2c 20 0a 20 20 69 6e 74  id *zBuf, .  int
1cdb0 20 69 41 6d 74 2c 20 0a 20 20 73 71 6c 69 74 65   iAmt, .  sqlite
1cdc0 5f 69 6e 74 36 34 20 69 4f 66 73 74 0a 29 7b 0a  _int64 iOfst.){.
1cdd0 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20    rbu_file *p = 
1cde0 28 72 62 75 5f 66 69 6c 65 2a 29 70 46 69 6c 65  (rbu_file*)pFile
1cdf0 3b 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a  ;.  sqlite3rbu *
1ce00 70 52 62 75 20 3d 20 70 2d 3e 70 52 62 75 3b 0a  pRbu = p->pRbu;.
1ce10 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
1ce20 20 70 52 62 75 20 26 26 20 70 52 62 75 2d 3e 65   pRbu && pRbu->e
1ce30 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45  Stage==RBU_STAGE
1ce40 5f 43 41 50 54 55 52 45 20 29 7b 0a 20 20 20 20  _CAPTURE ){.    
1ce50 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 65 6e 46  assert( p->openF
1ce60 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
1ce70 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20  EN_MAIN_DB );.  
1ce80 20 20 72 63 20 3d 20 72 62 75 43 61 70 74 75 72    rc = rbuCaptur
1ce90 65 44 62 57 72 69 74 65 28 70 2d 3e 70 52 62 75  eDbWrite(p->pRbu
1cea0 2c 20 69 4f 66 73 74 29 3b 0a 20 20 7d 65 6c 73  , iOfst);.  }els
1ceb0 65 7b 0a 20 20 20 20 69 66 28 20 70 52 62 75 20  e{.    if( pRbu 
1cec0 26 26 20 70 52 62 75 2d 3e 65 53 74 61 67 65 3d  && pRbu->eStage=
1ced0 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 0a  =RBU_STAGE_OAL .
1cee0 20 20 20 20 20 26 26 20 28 70 2d 3e 6f 70 65 6e       && (p->open
1cef0 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
1cf00 50 45 4e 5f 57 41 4c 29 20 0a 20 20 20 20 20 26  PEN_WAL) .     &
1cf10 26 20 69 4f 66 73 74 3e 3d 70 52 62 75 2d 3e 69  & iOfst>=pRbu->i
1cf20 4f 61 6c 53 7a 0a 20 20 20 20 29 7b 0a 20 20 20  OalSz.    ){.   
1cf30 20 20 20 70 52 62 75 2d 3e 69 4f 61 6c 53 7a 20     pRbu->iOalSz 
1cf40 3d 20 69 41 6d 74 20 2b 20 69 4f 66 73 74 3b 0a  = iAmt + iOfst;.
1cf50 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 70      }.    rc = p
1cf60 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
1cf70 73 2d 3e 78 57 72 69 74 65 28 70 2d 3e 70 52 65  s->xWrite(p->pRe
1cf80 61 6c 2c 20 7a 42 75 66 2c 20 69 41 6d 74 2c 20  al, zBuf, iAmt, 
1cf90 69 4f 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20  iOfst);.    if( 
1cfa0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1cfb0 20 69 4f 66 73 74 3d 3d 30 20 26 26 20 28 70 2d   iOfst==0 && (p-
1cfc0 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c  >openFlags & SQL
1cfd0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
1cfe0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ) ){.      /* Th
1cff0 65 73 65 20 6c 6f 6f 6b 20 6c 69 6b 65 20 6d 61  ese look like ma
1d000 67 69 63 20 6e 75 6d 62 65 72 73 2e 20 42 75 74  gic numbers. But
1d010 20 74 68 65 79 20 61 72 65 20 73 74 61 62 6c 65   they are stable
1d020 2c 20 61 73 20 74 68 65 79 20 61 72 65 20 70 61  , as they are pa
1d030 72 74 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  rt.      ** of t
1d040 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66  he definition of
1d050 20 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c 65   the SQLite file
1d060 20 66 6f 72 6d 61 74 2c 20 77 68 69 63 68 20 6d   format, which m
1d070 61 79 20 6e 6f 74 20 63 68 61 6e 67 65 2e 20 2a  ay not change. *
1d080 2f 0a 20 20 20 20 20 20 75 38 20 2a 70 42 75 66  /.      u8 *pBuf
1d090 20 3d 20 28 75 38 2a 29 7a 42 75 66 3b 0a 20 20   = (u8*)zBuf;.  
1d0a0 20 20 20 20 70 2d 3e 69 43 6f 6f 6b 69 65 20 3d      p->iCookie =
1d0b0 20 72 62 75 47 65 74 55 33 32 28 26 70 42 75 66   rbuGetU32(&pBuf
1d0c0 5b 32 34 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e  [24]);.      p->
1d0d0 69 57 72 69 74 65 56 65 72 20 3d 20 70 42 75 66  iWriteVer = pBuf
1d0e0 5b 31 39 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  [19];.    }.  }.
1d0f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1d100 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61  /*.** Truncate a
1d110 6e 20 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a  n rbuVfs-file..*
1d120 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75  /.static int rbu
1d130 56 66 73 54 72 75 6e 63 61 74 65 28 73 71 6c 69  VfsTruncate(sqli
1d140 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
1d150 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 73 69   sqlite_int64 si
1d160 7a 65 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20  ze){.  rbu_file 
1d170 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 2a 29  *p = (rbu_file*)
1d180 70 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20  pFile;.  return 
1d190 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f  p->pReal->pMetho
1d1a0 64 73 2d 3e 78 54 72 75 6e 63 61 74 65 28 70 2d  ds->xTruncate(p-
1d1b0 3e 70 52 65 61 6c 2c 20 73 69 7a 65 29 3b 0a 7d  >pReal, size);.}
1d1c0 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 61 6e 20  ../*.** Sync an 
1d1d0 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a  rbuVfs-file..*/.
1d1e0 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66  static int rbuVf
1d1f0 73 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69  sSync(sqlite3_fi
1d200 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 66  le *pFile, int f
1d210 6c 61 67 73 29 7b 0a 20 20 72 62 75 5f 66 69 6c  lags){.  rbu_fil
1d220 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65  e *p = (rbu_file
1d230 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 66 28 20   *)pFile;.  if( 
1d240 70 2d 3e 70 52 62 75 20 26 26 20 70 2d 3e 70 52  p->pRbu && p->pR
1d250 62 75 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f  bu->eStage==RBU_
1d260 53 54 41 47 45 5f 43 41 50 54 55 52 45 20 29 7b  STAGE_CAPTURE ){
1d270 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e  .    if( p->open
1d280 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
1d290 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20  PEN_MAIN_DB ){. 
1d2a0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1d2b0 54 45 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20 20  TE_INTERNAL;.   
1d2c0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51   }.    return SQ
1d2d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
1d2e0 65 74 75 72 6e 20 70 2d 3e 70 52 65 61 6c 2d 3e  eturn p->pReal->
1d2f0 70 4d 65 74 68 6f 64 73 2d 3e 78 53 79 6e 63 28  pMethods->xSync(
1d300 70 2d 3e 70 52 65 61 6c 2c 20 66 6c 61 67 73 29  p->pReal, flags)
1d310 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1d320 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 69  n the current fi
1d330 6c 65 2d 73 69 7a 65 20 6f 66 20 61 6e 20 72 62  le-size of an rb
1d340 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74  uVfs-file..*/.st
1d350 61 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 46  atic int rbuVfsF
1d360 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  ileSize(sqlite3_
1d370 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c  file *pFile, sql
1d380 69 74 65 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65  ite_int64 *pSize
1d390 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70  ){.  rbu_file *p
1d3a0 20 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a 29 70   = (rbu_file *)p
1d3b0 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 70  File;.  return p
1d3c0 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
1d3d0 73 2d 3e 78 46 69 6c 65 53 69 7a 65 28 70 2d 3e  s->xFileSize(p->
1d3e0 70 52 65 61 6c 2c 20 70 53 69 7a 65 29 3b 0a 7d  pReal, pSize);.}
1d3f0 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 61 6e 20  ../*.** Lock an 
1d400 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a  rbuVfs-file..*/.
1d410 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66  static int rbuVf
1d420 73 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  sLock(sqlite3_fi
1d430 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 65  le *pFile, int e
1d440 4c 6f 63 6b 29 7b 0a 20 20 72 62 75 5f 66 69 6c  Lock){.  rbu_fil
1d450 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65  e *p = (rbu_file
1d460 2a 29 70 46 69 6c 65 3b 0a 20 20 73 71 6c 69 74  *)pFile;.  sqlit
1d470 65 33 72 62 75 20 2a 70 52 62 75 20 3d 20 70 2d  e3rbu *pRbu = p-
1d480 3e 70 52 62 75 3b 0a 20 20 69 6e 74 20 72 63 20  >pRbu;.  int rc 
1d490 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
1d4a0 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 65 6e 46  assert( p->openF
1d4b0 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f  lags & (SQLITE_O
1d4c0 50 45 4e 5f 4d 41 49 4e 5f 44 42 7c 53 51 4c 49  PEN_MAIN_DB|SQLI
1d4d0 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 29  TE_OPEN_TEMP_DB)
1d4e0 20 29 3b 0a 20 20 69 66 28 20 70 52 62 75 20 26   );.  if( pRbu &
1d4f0 26 20 65 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45 5f  & eLock==SQLITE_
1d500 4c 4f 43 4b 5f 45 58 43 4c 55 53 49 56 45 20 26  LOCK_EXCLUSIVE &
1d510 26 20 70 52 62 75 2d 3e 65 53 74 61 67 65 21 3d  & pRbu->eStage!=
1d520 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45 20 29  RBU_STAGE_DONE )
1d530 7b 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  {.    /* Do not 
1d540 61 6c 6c 6f 77 20 45 58 43 4c 55 53 49 56 45 20  allow EXCLUSIVE 
1d550 6c 6f 63 6b 73 2e 20 50 72 65 76 65 6e 74 69 6e  locks. Preventin
1d560 67 20 53 51 4c 69 74 65 20 66 72 6f 6d 20 74 61  g SQLite from ta
1d570 6b 69 6e 67 20 74 68 69 73 20 0a 20 20 20 20 2a  king this .    *
1d580 2a 20 70 72 65 76 65 6e 74 73 20 69 74 20 66 72  * prevents it fr
1d590 6f 6d 20 63 68 65 63 6b 70 6f 69 6e 74 69 6e 67  om checkpointing
1d5a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 72   the database fr
1d5b0 6f 6d 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  om sqlite3_close
1d5c0 28 29 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  (). */.    rc = 
1d5d0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
1d5e0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70  else{.    rc = p
1d5f0 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
1d600 73 2d 3e 78 4c 6f 63 6b 28 70 2d 3e 70 52 65 61  s->xLock(p->pRea
1d610 6c 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 0a  l, eLock);.  }..
1d620 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1d630 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6e 20  /*.** Unlock an 
1d640 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a  rbuVfs-file..*/.
1d650 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66  static int rbuVf
1d660 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  sUnlock(sqlite3_
1d670 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74  file *pFile, int
1d680 20 65 4c 6f 63 6b 29 7b 0a 20 20 72 62 75 5f 66   eLock){.  rbu_f
1d690 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69  ile *p = (rbu_fi
1d6a0 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 72 65  le *)pFile;.  re
1d6b0 74 75 72 6e 20 70 2d 3e 70 52 65 61 6c 2d 3e 70  turn p->pReal->p
1d6c0 4d 65 74 68 6f 64 73 2d 3e 78 55 6e 6c 6f 63 6b  Methods->xUnlock
1d6d0 28 70 2d 3e 70 52 65 61 6c 2c 20 65 4c 6f 63 6b  (p->pReal, eLock
1d6e0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  );.}../*.** Chec
1d6f0 6b 20 69 66 20 61 6e 6f 74 68 65 72 20 66 69 6c  k if another fil
1d700 65 2d 68 61 6e 64 6c 65 20 68 6f 6c 64 73 20 61  e-handle holds a
1d710 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
1d720 6e 20 61 6e 20 72 62 75 56 66 73 2d 66 69 6c 65  n an rbuVfs-file
1d730 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d740 72 62 75 56 66 73 43 68 65 63 6b 52 65 73 65 72  rbuVfsCheckReser
1d750 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
1d760 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74  file *pFile, int
1d770 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 72 62   *pResOut){.  rb
1d780 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75  u_file *p = (rbu
1d790 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20  _file *)pFile;. 
1d7a0 20 72 65 74 75 72 6e 20 70 2d 3e 70 52 65 61 6c   return p->pReal
1d7b0 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 43 68 65  ->pMethods->xChe
1d7c0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70  ckReservedLock(p
1d7d0 2d 3e 70 52 65 61 6c 2c 20 70 52 65 73 4f 75 74  ->pReal, pResOut
1d7e0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 65  );.}../*.** File
1d7f0 20 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 2e   control method.
1d800 20 46 6f 72 20 63 75 73 74 6f 6d 20 6f 70 65 72   For custom oper
1d810 61 74 69 6f 6e 73 20 6f 6e 20 61 6e 20 72 62 75  ations on an rbu
1d820 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  Vfs-file..*/.sta
1d830 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 46 69  tic int rbuVfsFi
1d840 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65  leControl(sqlite
1d850 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69  3_file *pFile, i
1d860 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72  nt op, void *pAr
1d870 67 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a  g){.  rbu_file *
1d880 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a 29  p = (rbu_file *)
1d890 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 28 2a 78  pFile;.  int (*x
1d8a0 43 6f 6e 74 72 6f 6c 29 28 73 71 6c 69 74 65 33  Control)(sqlite3
1d8b0 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a  _file*,int,void*
1d8c0 29 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d  ) = p->pReal->pM
1d8d0 65 74 68 6f 64 73 2d 3e 78 46 69 6c 65 43 6f 6e  ethods->xFileCon
1d8e0 74 72 6f 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  trol;.  int rc;.
1d8f0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70  .  assert( p->op
1d900 65 6e 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54  enFlags & (SQLIT
1d910 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 7c 53  E_OPEN_MAIN_DB|S
1d920 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
1d930 44 42 29 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  DB).       || p-
1d940 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 28 53 51  >openFlags & (SQ
1d950 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49  LITE_OPEN_TRANSI
1d960 45 4e 54 5f 44 42 7c 53 51 4c 49 54 45 5f 4f 50  ENT_DB|SQLITE_OP
1d970 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29  EN_TEMP_JOURNAL)
1d980 0a 20 20 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  .  );.  if( op==
1d990 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 42 55  SQLITE_FCNTL_RBU
1d9a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 72   ){.    sqlite3r
1d9b0 62 75 20 2a 70 52 62 75 20 3d 20 28 73 71 6c 69  bu *pRbu = (sqli
1d9c0 74 65 33 72 62 75 2a 29 70 41 72 67 3b 0a 0a 20  te3rbu*)pArg;.. 
1d9d0 20 20 20 2f 2a 20 46 69 72 73 74 20 74 72 79 20     /* First try 
1d9e0 74 6f 20 66 69 6e 64 20 61 6e 6f 74 68 65 72 20  to find another 
1d9f0 52 42 55 20 76 66 73 20 6c 6f 77 65 72 20 64 6f  RBU vfs lower do
1da00 77 6e 20 69 6e 20 74 68 65 20 76 66 73 20 73 74  wn in the vfs st
1da10 61 63 6b 2e 20 49 66 0a 20 20 20 20 2a 2a 20 6f  ack. If.    ** o
1da20 6e 65 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 69  ne is found, thi
1da30 73 20 76 66 73 20 77 69 6c 6c 20 6f 70 65 72 61  s vfs will opera
1da40 74 65 20 69 6e 20 70 61 73 73 2d 74 68 72 6f 75  te in pass-throu
1da50 67 68 20 6d 6f 64 65 2e 20 54 68 65 20 6c 6f 77  gh mode. The low
1da60 65 72 0a 20 20 20 20 2a 2a 20 6c 65 76 65 6c 20  er.    ** level 
1da70 76 66 73 20 77 69 6c 6c 20 64 6f 20 74 68 65 20  vfs will do the 
1da80 73 70 65 63 69 61 6c 20 52 42 55 20 68 61 6e 64  special RBU hand
1da90 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20 20 20 72 63  ling.  */.    rc
1daa0 20 3d 20 78 43 6f 6e 74 72 6f 6c 28 70 2d 3e 70   = xControl(p->p
1dab0 52 65 61 6c 2c 20 6f 70 2c 20 70 41 72 67 29 3b  Real, op, pArg);
1dac0 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
1dad0 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b  LITE_NOTFOUND ){
1dae0 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 77 20 73 65  .      /* Now se
1daf0 61 72 63 68 20 66 6f 72 20 61 20 7a 69 70 76 66  arch for a zipvf
1db00 73 20 69 6e 73 74 61 6e 63 65 20 6c 6f 77 65 72  s instance lower
1db10 20 64 6f 77 6e 20 69 6e 20 74 68 65 20 56 46 53   down in the VFS
1db20 20 73 74 61 63 6b 2e 20 49 66 0a 20 20 20 20 20   stack. If.     
1db30 20 2a 2a 20 6f 6e 65 20 69 73 20 66 6f 75 6e 64   ** one is found
1db40 2c 20 74 68 69 73 20 69 73 20 61 6e 20 65 72 72  , this is an err
1db50 6f 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20 76 6f  or.  */.      vo
1db60 69 64 20 2a 64 75 6d 6d 79 20 3d 20 30 3b 0a 20  id *dummy = 0;. 
1db70 20 20 20 20 20 72 63 20 3d 20 78 43 6f 6e 74 72       rc = xContr
1db80 6f 6c 28 70 2d 3e 70 52 65 61 6c 2c 20 53 51 4c  ol(p->pReal, SQL
1db90 49 54 45 5f 46 43 4e 54 4c 5f 5a 49 50 56 46 53  ITE_FCNTL_ZIPVFS
1dba0 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20  , &dummy);.     
1dbb0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1dbc0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
1dbd0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
1dbe0 0a 20 20 20 20 20 20 20 20 70 52 62 75 2d 3e 7a  .        pRbu->z
1dbf0 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33  Errmsg = sqlite3
1dc00 5f 6d 70 72 69 6e 74 66 28 22 72 62 75 2f 7a 69  _mprintf("rbu/zi
1dc10 70 76 66 73 20 73 65 74 75 70 20 65 72 72 6f 72  pvfs setup error
1dc20 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ");.      }else 
1dc30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
1dc40 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20  OTFOUND ){.     
1dc50 20 20 20 70 52 62 75 2d 3e 70 54 61 72 67 65 74     pRbu->pTarget
1dc60 46 64 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  Fd = p;.        
1dc70 70 2d 3e 70 52 62 75 20 3d 20 70 52 62 75 3b 0a  p->pRbu = pRbu;.
1dc80 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
1dc90 57 61 6c 46 64 20 29 20 70 2d 3e 70 57 61 6c 46  WalFd ) p->pWalF
1dca0 64 2d 3e 70 52 62 75 20 3d 20 70 52 62 75 3b 0a  d->pRbu = pRbu;.
1dcb0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1dcc0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
1dcd0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
1dce0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d   rc;.  }..  rc =
1dcf0 20 78 43 6f 6e 74 72 6f 6c 28 70 2d 3e 70 52 65   xControl(p->pRe
1dd00 61 6c 2c 20 6f 70 2c 20 70 41 72 67 29 3b 0a 20  al, op, pArg);. 
1dd10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1dd20 4f 4b 20 26 26 20 6f 70 3d 3d 53 51 4c 49 54 45  OK && op==SQLITE
1dd30 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 20 29  _FCNTL_VFSNAME )
1dd40 7b 0a 20 20 20 20 72 62 75 5f 76 66 73 20 2a 70  {.    rbu_vfs *p
1dd50 52 62 75 56 66 73 20 3d 20 70 2d 3e 70 52 62 75  RbuVfs = p->pRbu
1dd60 56 66 73 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  Vfs;.    char *z
1dd70 49 6e 20 3d 20 2a 28 63 68 61 72 2a 2a 29 70 41  In = *(char**)pA
1dd80 72 67 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f  rg;.    char *zO
1dd90 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ut = sqlite3_mpr
1dda0 69 6e 74 66 28 22 72 62 75 28 25 73 29 2f 25 7a  intf("rbu(%s)/%z
1ddb0 22 2c 20 70 52 62 75 56 66 73 2d 3e 62 61 73 65  ", pRbuVfs->base
1ddc0 2e 7a 4e 61 6d 65 2c 20 7a 49 6e 29 3b 0a 20 20  .zName, zIn);.  
1ddd0 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20    *(char**)pArg 
1dde0 3d 20 7a 4f 75 74 3b 0a 20 20 20 20 69 66 28 20  = zOut;.    if( 
1ddf0 7a 4f 75 74 3d 3d 30 20 29 20 72 63 20 3d 20 53  zOut==0 ) rc = S
1de00 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
1de10 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1de20 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1de30 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69  he sector-size i
1de40 6e 20 62 79 74 65 73 20 66 6f 72 20 61 6e 20 72  n bytes for an r
1de50 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73  buVfs-file..*/.s
1de60 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66 73  tatic int rbuVfs
1de70 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74  SectorSize(sqlit
1de80 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b  e3_file *pFile){
1de90 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d  .  rbu_file *p =
1dea0 20 28 72 62 75 5f 66 69 6c 65 20 2a 29 70 46 69   (rbu_file *)pFi
1deb0 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  le;.  return p->
1dec0 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d  pReal->pMethods-
1ded0 3e 78 53 65 63 74 6f 72 53 69 7a 65 28 70 2d 3e  >xSectorSize(p->
1dee0 70 52 65 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pReal);.}../*.**
1def0 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 76 69   Return the devi
1df00 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ce characteristi
1df10 63 20 66 6c 61 67 73 20 73 75 70 70 6f 72 74 65  c flags supporte
1df20 64 20 62 79 20 61 6e 20 72 62 75 56 66 73 2d 66  d by an rbuVfs-f
1df30 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
1df40 6e 74 20 72 62 75 56 66 73 44 65 76 69 63 65 43  nt rbuVfsDeviceC
1df50 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73  haracteristics(s
1df60 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
1df70 6c 65 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20  le){.  rbu_file 
1df80 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a  *p = (rbu_file *
1df90 29 70 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e  )pFile;.  return
1dfa0 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68   p->pReal->pMeth
1dfb0 6f 64 73 2d 3e 78 44 65 76 69 63 65 43 68 61 72  ods->xDeviceChar
1dfc0 61 63 74 65 72 69 73 74 69 63 73 28 70 2d 3e 70  acteristics(p->p
1dfd0 52 65 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Real);.}../*.** 
1dfe0 54 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20  Take or release 
1dff0 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  a shared-memory 
1e000 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lock..*/.static 
1e010 69 6e 74 20 72 62 75 56 66 73 53 68 6d 4c 6f 63  int rbuVfsShmLoc
1e020 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
1e030 70 46 69 6c 65 2c 20 69 6e 74 20 6f 66 73 74 2c  pFile, int ofst,
1e040 20 69 6e 74 20 6e 2c 20 69 6e 74 20 66 6c 61 67   int n, int flag
1e050 73 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a  s){.  rbu_file *
1e060 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 2a 29 70  p = (rbu_file*)p
1e070 46 69 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33 72  File;.  sqlite3r
1e080 62 75 20 2a 70 52 62 75 20 3d 20 70 2d 3e 70 52  bu *pRbu = p->pR
1e090 62 75 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  bu;.  int rc = S
1e0a0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 64 65  QLITE_OK;..#ifde
1e0b0 66 20 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41 4d  f SQLITE_AMALGAM
1e0c0 41 54 49 4f 4e 0a 20 20 20 20 61 73 73 65 72 74  ATION.    assert
1e0d0 28 20 57 41 4c 5f 43 4b 50 54 5f 4c 4f 43 4b 3d  ( WAL_CKPT_LOCK=
1e0e0 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  =1 );.#endif..  
1e0f0 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 65 6e 46  assert( p->openF
1e100 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f  lags & (SQLITE_O
1e110 50 45 4e 5f 4d 41 49 4e 5f 44 42 7c 53 51 4c 49  PEN_MAIN_DB|SQLI
1e120 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 29  TE_OPEN_TEMP_DB)
1e130 20 29 3b 0a 20 20 69 66 28 20 70 52 62 75 20 26   );.  if( pRbu &
1e140 26 20 28 70 52 62 75 2d 3e 65 53 74 61 67 65 3d  & (pRbu->eStage=
1e150 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 7c  =RBU_STAGE_OAL |
1e160 7c 20 70 52 62 75 2d 3e 65 53 74 61 67 65 3d 3d  | pRbu->eStage==
1e170 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 29 20  RBU_STAGE_MOVE) 
1e180 29 7b 0a 20 20 20 20 2f 2a 20 4d 61 67 69 63 20  ){.    /* Magic 
1e190 6e 75 6d 62 65 72 20 31 20 69 73 20 74 68 65 20  number 1 is the 
1e1a0 57 41 4c 5f 43 4b 50 54 5f 4c 4f 43 4b 20 6c 6f  WAL_CKPT_LOCK lo
1e1b0 63 6b 2e 20 50 72 65 76 65 6e 74 69 6e 67 20 53  ck. Preventing S
1e1c0 51 4c 69 74 65 20 66 72 6f 6d 0a 20 20 20 20 2a  QLite from.    *
1e1d0 2a 20 74 61 6b 69 6e 67 20 74 68 69 73 20 6c 6f  * taking this lo
1e1e0 63 6b 20 61 6c 73 6f 20 70 72 65 76 65 6e 74 73  ck also prevents
1e1f0 20 61 6e 79 20 63 68 65 63 6b 70 6f 69 6e 74 73   any checkpoints
1e200 20 66 72 6f 6d 20 6f 63 63 75 72 72 69 6e 67 2e   from occurring.
1e210 20 0a 20 20 20 20 2a 2a 20 74 6f 64 6f 3a 20 72   .    ** todo: r
1e220 65 61 6c 6c 79 2c 20 69 74 27 73 20 6e 6f 74 20  eally, it's not 
1e230 63 6c 65 61 72 20 77 68 79 20 74 68 69 73 20 6d  clear why this m
1e240 69 67 68 74 20 6f 63 63 75 72 2c 20 61 73 20 0a  ight occur, as .
1e250 20 20 20 20 2a 2a 20 77 61 6c 5f 61 75 74 6f 63      ** wal_autoc
1e260 68 65 63 6b 70 6f 69 6e 74 20 6f 75 67 68 74 20  heckpoint ought 
1e270 74 6f 20 62 65 20 74 75 72 6e 65 64 20 6f 66 66  to be turned off
1e280 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 66  .  */.    if( of
1e290 73 74 3d 3d 57 41 4c 5f 4c 4f 43 4b 5f 43 4b 50  st==WAL_LOCK_CKP
1e2a0 54 20 26 26 20 6e 3d 3d 31 20 29 20 72 63 20 3d  T && n==1 ) rc =
1e2b0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
1e2c0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 62  }else{.    int b
1e2d0 43 61 70 74 75 72 65 20 3d 20 30 3b 0a 20 20 20  Capture = 0;.   
1e2e0 20 69 66 28 20 6e 3d 3d 31 20 26 26 20 28 66 6c   if( n==1 && (fl
1e2f0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d  ags & SQLITE_SHM
1e300 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20 20  _EXCLUSIVE).    
1e310 20 26 26 20 70 52 62 75 20 26 26 20 70 52 62 75   && pRbu && pRbu
1e320 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  ->eStage==RBU_ST
1e330 41 47 45 5f 43 41 50 54 55 52 45 0a 20 20 20 20  AGE_CAPTURE.    
1e340 20 26 26 20 28 6f 66 73 74 3d 3d 57 41 4c 5f 4c   && (ofst==WAL_L
1e350 4f 43 4b 5f 57 52 49 54 45 20 7c 7c 20 6f 66 73  OCK_WRITE || ofs
1e360 74 3d 3d 57 41 4c 5f 4c 4f 43 4b 5f 43 4b 50 54  t==WAL_LOCK_CKPT
1e370 20 7c 7c 20 6f 66 73 74 3d 3d 57 41 4c 5f 4c 4f   || ofst==WAL_LO
1e380 43 4b 5f 52 45 41 44 30 29 0a 20 20 20 20 29 7b  CK_READ0).    ){
1e390 0a 20 20 20 20 20 20 62 43 61 70 74 75 72 65 20  .      bCapture 
1e3a0 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
1e3b0 69 66 28 20 62 43 61 70 74 75 72 65 3d 3d 30 20  if( bCapture==0 
1e3c0 7c 7c 20 30 3d 3d 28 66 6c 61 67 73 20 26 20 53  || 0==(flags & S
1e3d0 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
1e3e0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
1e3f0 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f  p->pReal->pMetho
1e400 64 73 2d 3e 78 53 68 6d 4c 6f 63 6b 28 70 2d 3e  ds->xShmLock(p->
1e410 70 52 65 61 6c 2c 20 6f 66 73 74 2c 20 6e 2c 20  pReal, ofst, n, 
1e420 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66  flags);.      if
1e430 28 20 62 43 61 70 74 75 72 65 20 26 26 20 72 63  ( bCapture && rc
1e440 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1e450 20 20 20 20 20 20 20 70 52 62 75 2d 3e 6d 4c 6f         pRbu->mLo
1e460 63 6b 20 7c 3d 20 28 31 20 3c 3c 20 6f 66 73 74  ck |= (1 << ofst
1e470 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1e480 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
1e490 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61  c;.}../*.** Obta
1e4a0 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  in a pointer to 
1e4b0 61 20 6d 61 70 70 69 6e 67 20 6f 66 20 61 20 73  a mapping of a s
1e4c0 69 6e 67 6c 65 20 33 32 4b 69 42 20 70 61 67 65  ingle 32KiB page
1e4d0 20 6f 66 20 74 68 65 20 2a 2d 73 68 6d 20 66 69   of the *-shm fi
1e4e0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1e4f0 74 20 72 62 75 56 66 73 53 68 6d 4d 61 70 28 0a  t rbuVfsShmMap(.
1e500 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1e510 70 46 69 6c 65 2c 20 0a 20 20 69 6e 74 20 69 52  pFile, .  int iR
1e520 65 67 69 6f 6e 2c 20 0a 20 20 69 6e 74 20 73 7a  egion, .  int sz
1e530 52 65 67 69 6f 6e 2c 20 0a 20 20 69 6e 74 20 69  Region, .  int i
1e540 73 57 72 69 74 65 2c 20 0a 20 20 76 6f 69 64 20  sWrite, .  void 
1e550 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 0a 29 7b  volatile **pp.){
1e560 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d  .  rbu_file *p =
1e570 20 28 72 62 75 5f 66 69 6c 65 2a 29 70 46 69 6c   (rbu_file*)pFil
1e580 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  e;.  int rc = SQ
1e590 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 65  LITE_OK;.  int e
1e5a0 53 74 61 67 65 20 3d 20 28 70 2d 3e 70 52 62 75  Stage = (p->pRbu
1e5b0 20 3f 20 70 2d 3e 70 52 62 75 2d 3e 65 53 74 61   ? p->pRbu->eSta
1e5c0 67 65 20 3a 20 30 29 3b 0a 0a 20 20 2f 2a 20 49  ge : 0);..  /* I
1e5d0 66 20 6e 6f 74 20 69 6e 20 52 42 55 5f 53 54 41  f not in RBU_STA
1e5e0 47 45 5f 4f 41 4c 2c 20 61 6c 6c 6f 77 20 74 68  GE_OAL, allow th
1e5f0 69 73 20 63 61 6c 6c 20 74 6f 20 70 61 73 73 20  is call to pass 
1e600 74 68 72 6f 75 67 68 2e 20 4f 72 2c 20 69 66 20  through. Or, if 
1e610 74 68 69 73 0a 20 20 2a 2a 20 72 62 75 20 69 73  this.  ** rbu is
1e620 20 69 6e 20 74 68 65 20 52 42 55 5f 53 54 41 47   in the RBU_STAG
1e630 45 5f 4f 41 4c 20 73 74 61 74 65 2c 20 75 73 65  E_OAL state, use
1e640 20 68 65 61 70 20 6d 65 6d 6f 72 79 20 66 6f 72   heap memory for
1e650 20 2a 2d 73 68 6d 20 73 70 61 63 65 20 0a 20 20   *-shm space .  
1e660 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20  ** instead of a 
1e670 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 20 2a  file on disk.  *
1e680 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f  /.  assert( p->o
1e690 70 65 6e 46 6c 61 67 73 20 26 20 28 53 51 4c 49  penFlags & (SQLI
1e6a0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 7c  TE_OPEN_MAIN_DB|
1e6b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
1e6c0 5f 44 42 29 20 29 3b 0a 20 20 69 66 28 20 65 53  _DB) );.  if( eS
1e6d0 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f  tage==RBU_STAGE_
1e6e0 4f 41 4c 20 7c 7c 20 65 53 74 61 67 65 3d 3d 52  OAL || eStage==R
1e6f0 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 20 29 7b  BU_STAGE_MOVE ){
1e700 0a 20 20 20 20 69 66 28 20 69 52 65 67 69 6f 6e  .    if( iRegion
1e710 3c 3d 70 2d 3e 6e 53 68 6d 20 29 7b 0a 20 20 20  <=p->nShm ){.   
1e720 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28     int nByte = (
1e730 69 52 65 67 69 6f 6e 2b 31 29 20 2a 20 73 69 7a  iRegion+1) * siz
1e740 65 6f 66 28 63 68 61 72 2a 29 3b 0a 20 20 20 20  eof(char*);.    
1e750 20 20 63 68 61 72 20 2a 2a 61 70 4e 65 77 20 3d    char **apNew =
1e760 20 28 63 68 61 72 2a 2a 29 73 71 6c 69 74 65 33   (char**)sqlite3
1e770 5f 72 65 61 6c 6c 6f 63 36 34 28 70 2d 3e 61 70  _realloc64(p->ap
1e780 53 68 6d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  Shm, nByte);.   
1e790 20 20 20 69 66 28 20 61 70 4e 65 77 3d 3d 30 20     if( apNew==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 26 61 70 4e 65 77     memset(&apNew
1e7e0 5b 70 2d 3e 6e 53 68 6d 5d 2c 20 30 2c 20 73 69  [p->nShm], 0, si
1e7f0 7a 65 6f 66 28 63 68 61 72 2a 29 20 2a 20 28 31  zeof(char*) * (1
1e800 20 2b 20 69 52 65 67 69 6f 6e 20 2d 20 70 2d 3e   + iRegion - p->
1e810 6e 53 68 6d 29 29 3b 0a 20 20 20 20 20 20 20 20  nShm));.        
1e820 70 2d 3e 61 70 53 68 6d 20 3d 20 61 70 4e 65 77  p->apShm = apNew
1e830 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 68  ;.        p->nSh
1e840 6d 20 3d 20 69 52 65 67 69 6f 6e 2b 31 3b 0a 20  m = iRegion+1;. 
1e850 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1e860 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1e870 5f 4f 4b 20 26 26 20 70 2d 3e 61 70 53 68 6d 5b  _OK && p->apShm[
1e880 69 52 65 67 69 6f 6e 5d 3d 3d 30 20 29 7b 0a 20  iRegion]==0 ){. 
1e890 20 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20       char *pNew 
1e8a0 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  = (char*)sqlite3
1e8b0 5f 6d 61 6c 6c 6f 63 36 34 28 73 7a 52 65 67 69  _malloc64(szRegi
1e8c0 6f 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  on);.      if( p
1e8d0 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
1e8e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
1e8f0 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  MEM;.      }else
1e900 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  {.        memset
1e910 28 70 4e 65 77 2c 20 30 2c 20 73 7a 52 65 67 69  (pNew, 0, szRegi
1e920 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  on);.        p->
1e930 61 70 53 68 6d 5b 69 52 65 67 69 6f 6e 5d 20 3d  apShm[iRegion] =
1e940 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20   pNew;.      }. 
1e950 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
1e960 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1e970 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 61 70       *pp = p->ap
1e980 53 68 6d 5b 69 52 65 67 69 6f 6e 5d 3b 0a 20 20  Shm[iRegion];.  
1e990 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
1e9a0 70 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  pp = 0;.    }.  
1e9b0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
1e9c0 74 28 20 70 2d 3e 61 70 53 68 6d 3d 3d 30 20 29  t( p->apShm==0 )
1e9d0 3b 0a 20 20 20 20 72 63 20 3d 20 70 2d 3e 70 52  ;.    rc = p->pR
1e9e0 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  eal->pMethods->x
1e9f0 53 68 6d 4d 61 70 28 70 2d 3e 70 52 65 61 6c 2c  ShmMap(p->pReal,
1ea00 20 69 52 65 67 69 6f 6e 2c 20 73 7a 52 65 67 69   iRegion, szRegi
1ea10 6f 6e 2c 20 69 73 57 72 69 74 65 2c 20 70 70 29  on, isWrite, pp)
1ea20 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1ea30 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d  rc;.}../*.** Mem
1ea40 6f 72 79 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a  ory barrier..*/.
1ea50 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 56  static void rbuV
1ea60 66 73 53 68 6d 42 61 72 72 69 65 72 28 73 71 6c  fsShmBarrier(sql
1ea70 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
1ea80 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70  ){.  rbu_file *p
1ea90 20 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a 29 70   = (rbu_file *)p
1eaa0 46 69 6c 65 3b 0a 20 20 70 2d 3e 70 52 65 61 6c  File;.  p->pReal
1eab0 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d  ->pMethods->xShm
1eac0 42 61 72 72 69 65 72 28 70 2d 3e 70 52 65 61 6c  Barrier(p->pReal
1ead0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
1eae0 78 53 68 6d 55 6e 6d 61 70 20 6d 65 74 68 6f 64  xShmUnmap method
1eaf0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1eb00 72 62 75 56 66 73 53 68 6d 55 6e 6d 61 70 28 73  rbuVfsShmUnmap(s
1eb10 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
1eb20 6c 65 2c 20 69 6e 74 20 64 65 6c 46 6c 61 67 29  le, int delFlag)
1eb30 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20  {.  rbu_file *p 
1eb40 3d 20 28 72 62 75 5f 66 69 6c 65 2a 29 70 46 69  = (rbu_file*)pFi
1eb50 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  le;.  int rc = S
1eb60 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
1eb70 65 53 74 61 67 65 20 3d 20 28 70 2d 3e 70 52 62  eStage = (p->pRb
1eb80 75 20 3f 20 70 2d 3e 70 52 62 75 2d 3e 65 53 74  u ? p->pRbu->eSt
1eb90 61 67 65 20 3a 20 30 29 3b 0a 0a 20 20 61 73 73  age : 0);..  ass
1eba0 65 72 74 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67  ert( p->openFlag
1ebb0 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s & (SQLITE_OPEN
1ebc0 5f 4d 41 49 4e 5f 44 42 7c 53 51 4c 49 54 45 5f  _MAIN_DB|SQLITE_
1ebd0 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 29 20 29 3b  OPEN_TEMP_DB) );
1ebe0 0a 20 20 69 66 28 20 65 53 74 61 67 65 3d 3d 52  .  if( eStage==R
1ebf0 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 7c 7c 20  BU_STAGE_OAL || 
1ec00 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47  eStage==RBU_STAG
1ec10 45 5f 4d 4f 56 45 20 29 7b 0a 20 20 20 20 2f 2a  E_MOVE ){.    /*
1ec20 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 7d 65 6c 73   no-op */.  }els
1ec30 65 7b 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73  e{.    /* Releas
1ec40 65 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  e the checkpoint
1ec50 65 72 20 61 6e 64 20 77 72 69 74 65 72 20 6c 6f  er and writer lo
1ec60 63 6b 73 20 2a 2f 0a 20 20 20 20 72 62 75 55 6e  cks */.    rbuUn
1ec70 6c 6f 63 6b 53 68 6d 28 70 29 3b 0a 20 20 20 20  lockShm(p);.    
1ec80 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70  rc = p->pReal->p
1ec90 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 55 6e 6d  Methods->xShmUnm
1eca0 61 70 28 70 2d 3e 70 52 65 61 6c 2c 20 64 65 6c  ap(p->pReal, del
1ecb0 46 6c 61 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Flag);.  }.  ret
1ecc0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1ecd0 20 47 69 76 65 6e 20 74 68 61 74 20 7a 57 61 6c   Given that zWal
1ece0 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66   points to a buf
1ecf0 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  fer containing a
1ed00 20 77 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 70   wal file name p
1ed10 61 73 73 65 64 20 74 6f 20 0a 2a 2a 20 65 69 74  assed to .** eit
1ed20 68 65 72 20 74 68 65 20 78 4f 70 65 6e 28 29 20  her the xOpen() 
1ed30 6f 72 20 78 41 63 63 65 73 73 28 29 20 56 46 53  or xAccess() VFS
1ed40 20 6d 65 74 68 6f 64 2c 20 72 65 74 75 72 6e 20   method, return 
1ed50 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1ed60 0a 2a 2a 20 66 69 6c 65 2d 68 61 6e 64 6c 65 20  .** file-handle 
1ed70 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 73 61  opened by the sa
1ed80 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  me database conn
1ed90 65 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f  ection on the co
1eda0 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 64  rresponding.** d
1edb0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
1edc0 0a 73 74 61 74 69 63 20 72 62 75 5f 66 69 6c 65  .static rbu_file
1edd0 20 2a 72 62 75 46 69 6e 64 4d 61 69 6e 64 62 28   *rbuFindMaindb(
1ede0 72 62 75 5f 76 66 73 20 2a 70 52 62 75 56 66 73  rbu_vfs *pRbuVfs
1edf0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57  , const char *zW
1ee00 61 6c 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20  al){.  rbu_file 
1ee10 2a 70 44 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f  *pDb;.  sqlite3_
1ee20 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 52 62 75  mutex_enter(pRbu
1ee30 56 66 73 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66  Vfs->mutex);.  f
1ee40 6f 72 28 70 44 62 3d 70 52 62 75 56 66 73 2d 3e  or(pDb=pRbuVfs->
1ee50 70 4d 61 69 6e 3b 20 70 44 62 20 26 26 20 70 44  pMain; pDb && pD
1ee60 62 2d 3e 7a 57 61 6c 21 3d 7a 57 61 6c 3b 20 70  b->zWal!=zWal; p
1ee70 44 62 3d 70 44 62 2d 3e 70 4d 61 69 6e 4e 65 78  Db=pDb->pMainNex
1ee80 74 29 7b 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  t){}.  sqlite3_m
1ee90 75 74 65 78 5f 6c 65 61 76 65 28 70 52 62 75 56  utex_leave(pRbuV
1eea0 66 73 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  fs->mutex);.  re
1eeb0 74 75 72 6e 20 70 44 62 3b 0a 7d 0a 0a 2f 2a 0a  turn pDb;.}../*.
1eec0 2a 2a 20 4f 70 65 6e 20 61 6e 20 72 62 75 20 66  ** Open an rbu f
1eed0 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  ile handle..*/.s
1eee0 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66 73  tatic int rbuVfs
1eef0 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
1ef00 76 66 73 20 2a 70 56 66 73 2c 0a 20 20 63 6f 6e  vfs *pVfs,.  con
1ef10 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a  st char *zName,.
1ef20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1ef30 70 46 69 6c 65 2c 0a 20 20 69 6e 74 20 66 6c 61  pFile,.  int fla
1ef40 67 73 2c 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46  gs,.  int *pOutF
1ef50 6c 61 67 73 0a 29 7b 0a 20 20 73 74 61 74 69 63  lags.){.  static
1ef60 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
1ef70 6f 64 73 20 72 62 75 76 66 73 5f 69 6f 5f 6d 65  ods rbuvfs_io_me
1ef80 74 68 6f 64 73 20 3d 20 7b 0a 20 20 20 20 32 2c  thods = {.    2,
1ef90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
1efb0 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 72  Version */.    r
1efc0 62 75 56 66 73 43 6c 6f 73 65 2c 20 20 20 20 20  buVfsClose,     
1efd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1efe0 78 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 72 62  xClose */.    rb
1eff0 75 56 66 73 52 65 61 64 2c 20 20 20 20 20 20 20  uVfsRead,       
1f000 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1f010 52 65 61 64 20 2a 2f 0a 20 20 20 20 72 62 75 56  Read */.    rbuV
1f020 66 73 57 72 69 74 65 2c 20 20 20 20 20 20 20 20  fsWrite,        
1f030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72            /* xWr
1f040 69 74 65 20 2a 2f 0a 20 20 20 20 72 62 75 56 66  ite */.    rbuVf
1f050 73 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20  sTruncate,      
1f060 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75           /* xTru
1f070 6e 63 61 74 65 20 2a 2f 0a 20 20 20 20 72 62 75  ncate */.    rbu
1f080 56 66 73 53 79 6e 63 2c 20 20 20 20 20 20 20 20  VfsSync,        
1f090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
1f0a0 79 6e 63 20 2a 2f 0a 20 20 20 20 72 62 75 56 66  ync */.    rbuVf
1f0b0 73 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20  sFileSize,      
1f0c0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
1f0d0 65 53 69 7a 65 20 2a 2f 0a 20 20 20 20 72 62 75  eSize */.    rbu
1f0e0 56 66 73 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  VfsLock,        
1f0f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
1f100 6f 63 6b 20 2a 2f 0a 20 20 20 20 72 62 75 56 66  ock */.    rbuVf
1f110 73 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  sUnlock,        
1f120 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
1f130 6f 63 6b 20 2a 2f 0a 20 20 20 20 72 62 75 56 66  ock */.    rbuVf
1f140 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  sCheckReservedLo
1f150 63 6b 2c 20 20 20 20 20 20 2f 2a 20 78 43 68 65  ck,      /* xChe
1f160 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a  ckReservedLock *
1f170 2f 0a 20 20 20 20 72 62 75 56 66 73 46 69 6c 65  /.    rbuVfsFile
1f180 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20  Control,        
1f190 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74      /* xFileCont
1f1a0 72 6f 6c 20 2a 2f 0a 20 20 20 20 72 62 75 56 66  rol */.    rbuVf
1f1b0 73 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20  sSectorSize,    
1f1c0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63           /* xSec
1f1d0 74 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 20 20 72  torSize */.    r
1f1e0 62 75 56 66 73 44 65 76 69 63 65 43 68 61 72 61  buVfsDeviceChara
1f1f0 63 74 65 72 69 73 74 69 63 73 2c 20 20 2f 2a 20  cteristics,  /* 
1f200 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  xDeviceCharacter
1f210 69 73 74 69 63 73 20 2a 2f 0a 20 20 20 20 72 62  istics */.    rb
1f220 75 56 66 73 53 68 6d 4d 61 70 2c 20 20 20 20 20  uVfsShmMap,     
1f230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1f240 53 68 6d 4d 61 70 20 2a 2f 0a 20 20 20 20 72 62  ShmMap */.    rb
1f250 75 56 66 73 53 68 6d 4c 6f 63 6b 2c 20 20 20 20  uVfsShmLock,    
1f260 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1f270 53 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 20 20 72  ShmLock */.    r
1f280 62 75 56 66 73 53 68 6d 42 61 72 72 69 65 72 2c  buVfsShmBarrier,
1f290 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f2a0 78 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a 20  xShmBarrier */. 
1f2b0 20 20 20 72 62 75 56 66 73 53 68 6d 55 6e 6d 61     rbuVfsShmUnma
1f2c0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
1f2d0 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f   /* xShmUnmap */
1f2e0 0a 20 20 20 20 30 2c 20 30 20 20 20 20 20 20 20  .    0, 0       
1f2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f300 20 20 20 2f 2a 20 78 46 65 74 63 68 2c 20 78 55     /* xFetch, xU
1f310 6e 66 65 74 63 68 20 2a 2f 0a 20 20 7d 3b 0a 20  nfetch */.  };. 
1f320 20 72 62 75 5f 76 66 73 20 2a 70 52 62 75 56 66   rbu_vfs *pRbuVf
1f330 73 20 3d 20 28 72 62 75 5f 76 66 73 2a 29 70 56  s = (rbu_vfs*)pV
1f340 66 73 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  fs;.  sqlite3_vf
1f350 73 20 2a 70 52 65 61 6c 56 66 73 20 3d 20 70 52  s *pRealVfs = pR
1f360 62 75 56 66 73 2d 3e 70 52 65 61 6c 56 66 73 3b  buVfs->pRealVfs;
1f370 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 46 64  .  rbu_file *pFd
1f380 20 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a 29 70   = (rbu_file *)p
1f390 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d  File;.  int rc =
1f3a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 6f   SQLITE_OK;.  co
1f3b0 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 65 6e 20  nst char *zOpen 
1f3c0 3d 20 7a 4e 61 6d 65 3b 0a 0a 20 20 6d 65 6d 73  = zName;..  mems
1f3d0 65 74 28 70 46 64 2c 20 30 2c 20 73 69 7a 65 6f  et(pFd, 0, sizeo
1f3e0 66 28 72 62 75 5f 66 69 6c 65 29 29 3b 0a 20 20  f(rbu_file));.  
1f3f0 70 46 64 2d 3e 70 52 65 61 6c 20 3d 20 28 73 71  pFd->pReal = (sq
1f400 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 46 64  lite3_file*)&pFd
1f410 5b 31 5d 3b 0a 20 20 70 46 64 2d 3e 70 52 62 75  [1];.  pFd->pRbu
1f420 56 66 73 20 3d 20 70 52 62 75 56 66 73 3b 0a 20  Vfs = pRbuVfs;. 
1f430 20 70 46 64 2d 3e 6f 70 65 6e 46 6c 61 67 73 20   pFd->openFlags 
1f440 3d 20 66 6c 61 67 73 3b 0a 20 20 69 66 28 20 7a  = flags;.  if( z
1f450 4e 61 6d 65 20 29 7b 0a 20 20 20 20 69 66 28 20  Name ){.    if( 
1f460 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
1f470 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20  PEN_MAIN_DB ){. 
1f480 20 20 20 20 20 2f 2a 20 41 20 6d 61 69 6e 20 64       /* A main d
1f490 61 74 61 62 61 73 65 20 68 61 73 20 6a 75 73 74  atabase has just
1f4a0 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 20 54 68   been opened. Th
1f4b0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63  e following bloc
1f4c0 6b 20 73 65 74 73 0a 20 20 20 20 20 20 2a 2a 20  k sets.      ** 
1f4d0 28 70 46 64 2d 3e 7a 57 61 6c 29 20 74 6f 20 70  (pFd->zWal) to p
1f4e0 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
1f4f0 20 6f 77 6e 65 64 20 62 79 20 53 51 4c 69 74 65   owned by SQLite
1f500 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 20   that contains. 
1f510 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65       ** the name
1f520 20 6f 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69   of the *-wal fi
1f530 6c 65 20 74 68 69 73 20 64 62 20 63 6f 6e 6e 65  le this db conne
1f540 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65 2e 20  ction will use. 
1f550 53 51 4c 69 74 65 0a 20 20 20 20 20 20 2a 2a 20  SQLite.      ** 
1f560 68 61 70 70 65 6e 73 20 74 6f 20 70 61 73 73 20  happens to pass 
1f570 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69  a pointer to thi
1f580 73 20 62 75 66 66 65 72 20 77 68 65 6e 20 75 73  s buffer when us
1f590 69 6e 67 20 78 41 63 63 65 73 73 28 29 0a 20 20  ing xAccess().  
1f5a0 20 20 20 20 2a 2a 20 6f 72 20 78 4f 70 65 6e 28      ** or xOpen(
1f5b0 29 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20  ) to operate on 
1f5c0 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 2e 20  the *-wal file. 
1f5d0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 20   */.      int n 
1f5e0 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4e  = (int)strlen(zN
1f5f0 61 6d 65 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73  ame);.      cons
1f600 74 20 63 68 61 72 20 2a 7a 20 3d 20 26 7a 4e 61  t char *z = &zNa
1f610 6d 65 5b 6e 5d 3b 0a 20 20 20 20 20 20 69 66 28  me[n];.      if(
1f620 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
1f630 4f 50 45 4e 5f 55 52 49 20 29 7b 0a 20 20 20 20  OPEN_URI ){.    
1f640 20 20 20 20 69 6e 74 20 6f 64 64 20 3d 20 30 3b      int odd = 0;
1f650 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
1f660 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  1 ){.          i
1f670 66 28 20 7a 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20  f( z[0]==0 ){.  
1f680 20 20 20 20 20 20 20 20 20 20 6f 64 64 20 3d 20            odd = 
1f690 31 20 2d 20 6f 64 64 3b 0a 20 20 20 20 20 20 20  1 - odd;.       
1f6a0 20 20 20 20 20 69 66 28 20 6f 64 64 20 26 26 20       if( odd && 
1f6b0 7a 5b 31 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b  z[1]==0 ) break;
1f6c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1f6d0 20 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20         z++;.    
1f6e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 20      }.        z 
1f6f0 2b 3d 20 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73  += 2;.      }els
1f700 65 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  e{.        while
1f710 28 20 2a 7a 3d 3d 30 20 29 20 7a 2b 2b 3b 0a 20  ( *z==0 ) z++;. 
1f720 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 20 2b       }.      z +
1f730 3d 20 28 6e 20 2b 20 38 20 2b 20 31 29 3b 0a 20  = (n + 8 + 1);. 
1f740 20 20 20 20 20 70 46 64 2d 3e 7a 57 61 6c 20 3d       pFd->zWal =
1f750 20 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c   z;.    }.    el
1f760 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  se if( flags & S
1f770 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29  QLITE_OPEN_WAL )
1f780 7b 0a 20 20 20 20 20 20 72 62 75 5f 66 69 6c 65  {.      rbu_file
1f790 20 2a 70 44 62 20 3d 20 72 62 75 46 69 6e 64 4d   *pDb = rbuFindM
1f7a0 61 69 6e 64 62 28 70 52 62 75 56 66 73 2c 20 7a  aindb(pRbuVfs, z
1f7b0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Name);.      if(
1f7c0 20 70 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20   pDb ){.        
1f7d0 69 66 28 20 70 44 62 2d 3e 70 52 62 75 20 26 26  if( pDb->pRbu &&
1f7e0 20 70 44 62 2d 3e 70 52 62 75 2d 3e 65 53 74 61   pDb->pRbu->eSta
1f7f0 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41  ge==RBU_STAGE_OA
1f800 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  L ){.          /
1f810 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 74  * This call is t
1f820 6f 20 6f 70 65 6e 20 61 20 2a 2d 77 61 6c 20 66  o open a *-wal f
1f830 69 6c 65 2e 20 49 6e 74 65 61 64 2c 20 6f 70 65  ile. Intead, ope
1f840 6e 20 74 68 65 20 2a 2d 6f 61 6c 2e 20 54 68 69  n the *-oal. Thi
1f850 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  s.          ** c
1f860 6f 64 65 20 65 6e 73 75 72 65 73 20 74 68 61 74  ode ensures that
1f870 20 74 68 65 20 73 74 72 69 6e 67 20 70 61 73 73   the string pass
1f880 65 64 20 74 6f 20 78 4f 70 65 6e 28 29 20 69 73  ed to xOpen() is
1f890 20 74 65 72 6d 69 6e 61 74 65 64 20 62 79 20 61   terminated by a
1f8a0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61  .          ** pa
1f8b0 69 72 20 6f 66 20 27 5c 30 27 20 62 79 74 65 73  ir of '\0' bytes
1f8c0 20 69 6e 20 63 61 73 65 20 74 68 65 20 56 46 53   in case the VFS
1f8d0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 65 78 74   attempts to ext
1f8e0 72 61 63 74 20 61 20 55 52 49 20 0a 20 20 20 20  ract a URI .    
1f8f0 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74        ** paramet
1f900 65 72 20 66 72 6f 6d 20 69 74 2e 20 20 2a 2f 0a  er from it.  */.
1f910 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 5f 74            size_t
1f920 20 6e 43 6f 70 79 20 3d 20 73 74 72 6c 65 6e 28   nCopy = strlen(
1f930 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
1f940 20 20 63 68 61 72 20 2a 7a 43 6f 70 79 20 3d 20    char *zCopy = 
1f950 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
1f960 28 6e 43 6f 70 79 2b 32 29 3b 0a 20 20 20 20 20  (nCopy+2);.     
1f970 20 20 20 20 20 69 66 28 20 7a 43 6f 70 79 20 29       if( zCopy )
1f980 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
1f990 6d 63 70 79 28 7a 43 6f 70 79 2c 20 7a 4e 61 6d  mcpy(zCopy, zNam
1f9a0 65 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20  e, nCopy);.     
1f9b0 20 20 20 20 20 20 20 7a 43 6f 70 79 5b 6e 43 6f         zCopy[nCo
1f9c0 70 79 2d 33 5d 20 3d 20 27 6f 27 3b 0a 20 20 20  py-3] = 'o';.   
1f9d0 20 20 20 20 20 20 20 20 20 7a 43 6f 70 79 5b 6e           zCopy[n
1f9e0 43 6f 70 79 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  Copy] = '\0';.  
1f9f0 20 20 20 20 20 20 20 20 20 20 7a 43 6f 70 79 5b            zCopy[
1fa00 6e 43 6f 70 79 2b 31 5d 20 3d 20 27 5c 30 27 3b  nCopy+1] = '\0';
1fa10 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 4f 70  .            zOp
1fa20 65 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  en = (const char
1fa30 2a 29 28 70 46 64 2d 3e 7a 44 65 6c 20 3d 20 7a  *)(pFd->zDel = z
1fa40 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 20 20 20  Copy);.         
1fa50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1fa60 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1fa70 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
1fa80 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 46 64   }.          pFd
1fa90 2d 3e 70 52 62 75 20 3d 20 70 44 62 2d 3e 70 52  ->pRbu = pDb->pR
1faa0 62 75 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  bu;.        }.  
1fab0 20 20 20 20 20 20 70 44 62 2d 3e 70 57 61 6c 46        pDb->pWalF
1fac0 64 20 3d 20 70 46 64 3b 0a 20 20 20 20 20 20 7d  d = pFd;.      }
1fad0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
1fae0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1faf0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 52 65 61  ){.    rc = pRea
1fb00 6c 56 66 73 2d 3e 78 4f 70 65 6e 28 70 52 65 61  lVfs->xOpen(pRea
1fb10 6c 56 66 73 2c 20 7a 4f 70 65 6e 2c 20 70 46 64  lVfs, zOpen, pFd
1fb20 2d 3e 70 52 65 61 6c 2c 20 66 6c 61 67 73 2c 20  ->pReal, flags, 
1fb30 70 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20 7d 0a  pOutFlags);.  }.
1fb40 20 20 69 66 28 20 70 46 64 2d 3e 70 52 65 61 6c    if( pFd->pReal
1fb50 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
1fb60 20 20 2f 2a 20 54 68 65 20 78 4f 70 65 6e 28 29    /* The xOpen()
1fb70 20 6f 70 65 72 61 74 69 6f 6e 20 68 61 73 20 73   operation has s
1fb80 75 63 63 65 65 64 65 64 2e 20 53 65 74 20 74 68  ucceeded. Set th
1fb90 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2e 70  e sqlite3_file.p
1fba0 4d 65 74 68 6f 64 73 0a 20 20 20 20 2a 2a 20 70  Methods.    ** p
1fbb0 6f 69 6e 74 65 72 20 61 6e 64 2c 20 69 66 20 74  ointer and, if t
1fbc0 68 65 20 66 69 6c 65 20 69 73 20 61 20 6d 61 69  he file is a mai
1fbd0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  n database file,
1fbe0 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74 68   link it into th
1fbf0 65 0a 20 20 20 20 2a 2a 20 6d 75 74 65 78 20 70  e.    ** mutex p
1fc00 72 6f 74 65 63 74 65 64 20 6c 69 6e 6b 65 64 20  rotected linked 
1fc10 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 75 63 68  list of all such
1fc20 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 20 20   files.  */.    
1fc30 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20  pFile->pMethods 
1fc40 3d 20 26 72 62 75 76 66 73 5f 69 6f 5f 6d 65 74  = &rbuvfs_io_met
1fc50 68 6f 64 73 3b 0a 20 20 20 20 69 66 28 20 66 6c  hods;.    if( fl
1fc60 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
1fc70 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20 20  N_MAIN_DB ){.   
1fc80 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
1fc90 5f 65 6e 74 65 72 28 70 52 62 75 56 66 73 2d 3e  _enter(pRbuVfs->
1fca0 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 70 46  mutex);.      pF
1fcb0 64 2d 3e 70 4d 61 69 6e 4e 65 78 74 20 3d 20 70  d->pMainNext = p
1fcc0 52 62 75 56 66 73 2d 3e 70 4d 61 69 6e 3b 0a 20  RbuVfs->pMain;. 
1fcd0 20 20 20 20 20 70 52 62 75 56 66 73 2d 3e 70 4d       pRbuVfs->pM
1fce0 61 69 6e 20 3d 20 70 46 64 3b 0a 20 20 20 20 20  ain = pFd;.     
1fcf0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1fd00 65 61 76 65 28 70 52 62 75 56 66 73 2d 3e 6d 75  eave(pRbuVfs->mu
1fd10 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  tex);.    }.  }e
1fd20 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
1fd30 5f 66 72 65 65 28 70 46 64 2d 3e 7a 44 65 6c 29  _free(pFd->zDel)
1fd40 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1fd50 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  rc;.}../*.** Del
1fd60 65 74 65 20 74 68 65 20 66 69 6c 65 20 6c 6f 63  ete the file loc
1fd70 61 74 65 64 20 61 74 20 7a 50 61 74 68 2e 0a 2a  ated at zPath..*
1fd80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75  /.static int rbu
1fd90 56 66 73 44 65 6c 65 74 65 28 73 71 6c 69 74 65  VfsDelete(sqlite
1fda0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e  3_vfs *pVfs, con
1fdb0 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
1fdc0 69 6e 74 20 64 69 72 53 79 6e 63 29 7b 0a 20 20  int dirSync){.  
1fdd0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65  sqlite3_vfs *pRe
1fde0 61 6c 56 66 73 20 3d 20 28 28 72 62 75 5f 76 66  alVfs = ((rbu_vf
1fdf0 73 2a 29 70 56 66 73 29 2d 3e 70 52 65 61 6c 56  s*)pVfs)->pRealV
1fe00 66 73 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65  fs;.  return pRe
1fe10 61 6c 56 66 73 2d 3e 78 44 65 6c 65 74 65 28 70  alVfs->xDelete(p
1fe20 52 65 61 6c 56 66 73 2c 20 7a 50 61 74 68 2c 20  RealVfs, zPath, 
1fe30 64 69 72 53 79 6e 63 29 3b 0a 7d 0a 0a 2f 2a 0a  dirSync);.}../*.
1fe40 2a 2a 20 54 65 73 74 20 66 6f 72 20 61 63 63 65  ** Test for acce
1fe50 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 20  ss permissions. 
1fe60 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
1fe70 68 65 20 72 65 71 75 65 73 74 65 64 20 70 65 72  he requested per
1fe80 6d 69 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61 76  mission.** is av
1fe90 61 69 6c 61 62 6c 65 2c 20 6f 72 20 66 61 6c 73  ailable, or fals
1fea0 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
1feb0 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66  static int rbuVf
1fec0 73 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74  sAccess(.  sqlit
1fed0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 0a 20  e3_vfs *pVfs, . 
1fee0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1fef0 74 68 2c 20 0a 20 20 69 6e 74 20 66 6c 61 67 73  th, .  int flags
1ff00 2c 20 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75  , .  int *pResOu
1ff10 74 0a 29 7b 0a 20 20 72 62 75 5f 76 66 73 20 2a  t.){.  rbu_vfs *
1ff20 70 52 62 75 56 66 73 20 3d 20 28 72 62 75 5f 76  pRbuVfs = (rbu_v
1ff30 66 73 2a 29 70 56 66 73 3b 0a 20 20 73 71 6c 69  fs*)pVfs;.  sqli
1ff40 74 65 33 5f 76 66 73 20 2a 70 52 65 61 6c 56 66  te3_vfs *pRealVf
1ff50 73 20 3d 20 70 52 62 75 56 66 73 2d 3e 70 52 65  s = pRbuVfs->pRe
1ff60 61 6c 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b  alVfs;.  int rc;
1ff70 0a 0a 20 20 72 63 20 3d 20 70 52 65 61 6c 56 66  ..  rc = pRealVf
1ff80 73 2d 3e 78 41 63 63 65 73 73 28 70 52 65 61 6c  s->xAccess(pReal
1ff90 56 66 73 2c 20 7a 50 61 74 68 2c 20 66 6c 61 67  Vfs, zPath, flag
1ffa0 73 2c 20 70 52 65 73 4f 75 74 29 3b 0a 0a 20 20  s, pResOut);..  
1ffb0 2f 2a 20 49 66 20 74 68 69 73 20 63 61 6c 6c 20  /* If this call 
1ffc0 69 73 20 74 6f 20 63 68 65 63 6b 20 69 66 20 61  is to check if a
1ffd0 20 2a 2d 77 61 6c 20 66 69 6c 65 20 61 73 73 6f   *-wal file asso
1ffe0 63 69 61 74 65 64 20 77 69 74 68 20 61 6e 20 52  ciated with an R
1fff0 42 55 20 74 61 72 67 65 74 0a 20 20 2a 2a 20 64  BU target.  ** d
20000 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
20010 6f 6e 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74  on exists, and t
20020 68 65 20 52 42 55 20 75 70 64 61 74 65 20 69 73  he RBU update is
20030 20 69 6e 20 52 42 55 5f 53 54 41 47 45 5f 4f 41   in RBU_STAGE_OA
20040 4c 2c 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c  L,.  ** the foll
20050 6f 77 69 6e 67 20 73 70 65 63 69 61 6c 20 68 61  owing special ha
20060 6e 64 6c 69 6e 67 20 69 73 20 61 63 74 69 76 61  ndling is activa
20070 74 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ted:.  **.  **  
20080 20 61 29 20 69 66 20 74 68 65 20 2a 2d 77 61 6c   a) if the *-wal
20090 20 66 69 6c 65 20 64 6f 65 73 20 65 78 69 73 74   file does exist
200a0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
200b0 43 41 4e 54 4f 50 45 4e 2e 20 54 68 69 73 0a 20  CANTOPEN. This. 
200c0 20 2a 2a 20 20 20 20 20 20 65 6e 73 75 72 65 73   **      ensures
200d0 20 74 68 61 74 20 74 68 65 20 52 42 55 20 65 78   that the RBU ex
200e0 74 65 6e 73 69 6f 6e 20 6e 65 76 65 72 20 74 72  tension never tr
200f0 69 65 73 20 74 6f 20 75 70 64 61 74 65 20 61 20  ies to update a 
20100 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 20 20  database.  **   
20110 20 20 20 69 6e 20 77 61 6c 20 6d 6f 64 65 2c 20     in wal mode, 
20120 65 76 65 6e 20 69 66 20 74 68 65 20 66 69 72 73  even if the firs
20130 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
20140 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 0a  tabase file has.
20150 20 20 2a 2a 20 20 20 20 20 20 62 65 65 6e 20 64    **      been d
20160 61 6d 61 67 65 64 2e 20 0a 20 20 2a 2a 0a 20 20  amaged. .  **.  
20170 2a 2a 20 20 20 62 29 20 69 66 20 74 68 65 20 2a  **   b) if the *
20180 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e  -wal file does n
20190 6f 74 20 65 78 69 73 74 2c 20 63 6c 61 69 6d 20  ot exist, claim 
201a0 74 68 61 74 20 69 74 20 64 6f 65 73 20 61 6e 79  that it does any
201b0 77 61 79 2c 0a 20 20 2a 2a 20 20 20 20 20 20 63  way,.  **      c
201c0 61 75 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f  ausing SQLite to
201d0 20 63 61 6c 6c 20 78 4f 70 65 6e 28 29 20 74 6f   call xOpen() to
201e0 20 6f 70 65 6e 20 69 74 2e 20 54 68 69 73 20 63   open it. This c
201f0 61 6c 6c 20 77 69 6c 6c 20 61 6c 73 6f 0a 20 20  all will also.  
20200 2a 2a 20 20 20 20 20 20 62 65 20 69 6e 74 65 72  **      be inter
20210 63 65 70 74 65 64 20 28 73 65 65 20 74 68 65 20  cepted (see the 
20220 72 62 75 56 66 73 4f 70 65 6e 28 29 20 66 75 6e  rbuVfsOpen() fun
20230 63 74 69 6f 6e 29 20 61 6e 64 20 74 68 65 20 2a  ction) and the *
20240 2d 6f 61 6c 0a 20 20 2a 2a 20 20 20 20 20 20 66  -oal.  **      f
20250 69 6c 65 20 6f 70 65 6e 65 64 20 69 6e 73 74 65  ile opened inste
20260 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  ad..  */.  if( r
20270 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
20280 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43  flags==SQLITE_AC
20290 43 45 53 53 5f 45 58 49 53 54 53 20 29 7b 0a 20  CESS_EXISTS ){. 
202a0 20 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 44 62     rbu_file *pDb
202b0 20 3d 20 72 62 75 46 69 6e 64 4d 61 69 6e 64 62   = rbuFindMaindb
202c0 28 70 52 62 75 56 66 73 2c 20 7a 50 61 74 68 29  (pRbuVfs, zPath)
202d0 3b 0a 20 20 20 20 69 66 28 20 70 44 62 20 26 26  ;.    if( pDb &&
202e0 20 70 44 62 2d 3e 70 52 62 75 20 26 26 20 70 44   pDb->pRbu && pD
202f0 62 2d 3e 70 52 62 75 2d 3e 65 53 74 61 67 65 3d  b->pRbu->eStage=
20300 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 29  =RBU_STAGE_OAL )
20310 7b 0a 20 20 20 20 20 20 69 66 28 20 2a 70 52 65  {.      if( *pRe
20320 73 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20  sOut ){.        
20330 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
20340 4f 50 45 4e 3b 0a 20 20 20 20 20 20 7d 65 6c 73  OPEN;.      }els
20350 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  e{.        *pRes
20360 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Out = 1;.      }
20370 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
20380 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
20390 2a 20 50 6f 70 75 6c 61 74 65 20 62 75 66 66 65  * Populate buffe
203a0 72 20 7a 4f 75 74 20 77 69 74 68 20 74 68 65 20  r zOut with the 
203b0 66 75 6c 6c 20 63 61 6e 6f 6e 69 63 61 6c 20 70  full canonical p
203c0 61 74 68 6e 61 6d 65 20 63 6f 72 72 65 73 70 6f  athname correspo
203d0 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 20  nding.** to the 
203e0 70 61 74 68 6e 61 6d 65 20 69 6e 20 7a 50 61 74  pathname in zPat
203f0 68 2e 20 7a 4f 75 74 20 69 73 20 67 75 61 72 61  h. zOut is guara
20400 6e 74 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74  nteed to point t
20410 6f 20 61 20 62 75 66 66 65 72 0a 2a 2a 20 6f 66  o a buffer.** of
20420 20 61 74 20 6c 65 61 73 74 20 28 44 45 56 53 59   at least (DEVSY
20430 4d 5f 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31  M_MAX_PATHNAME+1
20440 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74  ) bytes..*/.stat
20450 69 63 20 69 6e 74 20 72 62 75 56 66 73 46 75 6c  ic int rbuVfsFul
20460 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c  lPathname(.  sql
20470 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
20480 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
20490 50 61 74 68 2c 20 0a 20 20 69 6e 74 20 6e 4f 75  Path, .  int nOu
204a0 74 2c 20 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74  t, .  char *zOut
204b0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  .){.  sqlite3_vf
204c0 73 20 2a 70 52 65 61 6c 56 66 73 20 3d 20 28 28  s *pRealVfs = ((
204d0 72 62 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e  rbu_vfs*)pVfs)->
204e0 70 52 65 61 6c 56 66 73 3b 0a 20 20 72 65 74 75  pRealVfs;.  retu
204f0 72 6e 20 70 52 65 61 6c 56 66 73 2d 3e 78 46 75  rn pRealVfs->xFu
20500 6c 6c 50 61 74 68 6e 61 6d 65 28 70 52 65 61 6c  llPathname(pReal
20510 56 66 73 2c 20 7a 50 61 74 68 2c 20 6e 4f 75 74  Vfs, zPath, nOut
20520 2c 20 7a 4f 75 74 29 3b 0a 7d 0a 0a 23 69 66 6e  , zOut);.}..#ifn
20530 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
20540 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f  LOAD_EXTENSION./
20550 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 64 79  *.** Open the dy
20560 6e 61 6d 69 63 20 6c 69 62 72 61 72 79 20 6c 6f  namic library lo
20570 63 61 74 65 64 20 61 74 20 7a 50 61 74 68 20 61  cated at zPath a
20580 6e 64 20 72 65 74 75 72 6e 20 61 20 68 61 6e 64  nd return a hand
20590 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
205a0 69 64 20 2a 72 62 75 56 66 73 44 6c 4f 70 65 6e  id *rbuVfsDlOpen
205b0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
205c0 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  fs, const char *
205d0 7a 50 61 74 68 29 7b 0a 20 20 73 71 6c 69 74 65  zPath){.  sqlite
205e0 33 5f 76 66 73 20 2a 70 52 65 61 6c 56 66 73 20  3_vfs *pRealVfs 
205f0 3d 20 28 28 72 62 75 5f 76 66 73 2a 29 70 56 66  = ((rbu_vfs*)pVf
20600 73 29 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20  s)->pRealVfs;.  
20610 72 65 74 75 72 6e 20 70 52 65 61 6c 56 66 73 2d  return pRealVfs-
20620 3e 78 44 6c 4f 70 65 6e 28 70 52 65 61 6c 56 66  >xDlOpen(pRealVf
20630 73 2c 20 7a 50 61 74 68 29 3b 0a 7d 0a 0a 2f 2a  s, zPath);.}../*
20640 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65  .** Populate the
20650 20 62 75 66 66 65 72 20 7a 45 72 72 4d 73 67 20   buffer zErrMsg 
20660 28 73 69 7a 65 20 6e 42 79 74 65 20 62 79 74 65  (size nByte byte
20670 73 29 20 77 69 74 68 20 61 20 68 75 6d 61 6e 20  s) with a human 
20680 72 65 61 64 61 62 6c 65 0a 2a 2a 20 75 74 66 2d  readable.** utf-
20690 38 20 73 74 72 69 6e 67 20 64 65 73 63 72 69 62  8 string describ
206a0 69 6e 67 20 74 68 65 20 6d 6f 73 74 20 72 65 63  ing the most rec
206b0 65 6e 74 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e  ent error encoun
206c0 74 65 72 65 64 20 61 73 73 6f 63 69 61 74 65 64  tered associated
206d0 20 0a 2a 2a 20 77 69 74 68 20 64 79 6e 61 6d 69   .** with dynami
206e0 63 20 6c 69 62 72 61 72 69 65 73 2e 0a 2a 2f 0a  c libraries..*/.
206f0 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 56  static void rbuV
20700 66 73 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65  fsDlError(sqlite
20710 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
20720 20 6e 42 79 74 65 2c 20 63 68 61 72 20 2a 7a 45   nByte, char *zE
20730 72 72 4d 73 67 29 7b 0a 20 20 73 71 6c 69 74 65  rrMsg){.  sqlite
20740 33 5f 76 66 73 20 2a 70 52 65 61 6c 56 66 73 20  3_vfs *pRealVfs 
20750 3d 20 28 28 72 62 75 5f 76 66 73 2a 29 70 56 66  = ((rbu_vfs*)pVf
20760 73 29 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20  s)->pRealVfs;.  
20770 70 52 65 61 6c 56 66 73 2d 3e 78 44 6c 45 72 72  pRealVfs->xDlErr
20780 6f 72 28 70 52 65 61 6c 56 66 73 2c 20 6e 42 79  or(pRealVfs, nBy
20790 74 65 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 7d 0a  te, zErrMsg);.}.
207a0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
207b0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  pointer to the s
207c0 79 6d 62 6f 6c 20 7a 53 79 6d 62 6f 6c 20 69 6e  ymbol zSymbol in
207d0 20 74 68 65 20 64 79 6e 61 6d 69 63 20 6c 69 62   the dynamic lib
207e0 72 61 72 79 20 70 48 61 6e 64 6c 65 2e 0a 2a 2f  rary pHandle..*/
207f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a 72  .static void (*r
20800 62 75 56 66 73 44 6c 53 79 6d 28 0a 20 20 73 71  buVfsDlSym(.  sq
20810 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
20820 20 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 2c 20   .  void *pArg, 
20830 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
20840 53 79 6d 0a 29 29 28 76 6f 69 64 29 7b 0a 20 20  Sym.))(void){.  
20850 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65  sqlite3_vfs *pRe
20860 61 6c 56 66 73 20 3d 20 28 28 72 62 75 5f 76 66  alVfs = ((rbu_vf
20870 73 2a 29 70 56 66 73 29 2d 3e 70 52 65 61 6c 56  s*)pVfs)->pRealV
20880 66 73 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65  fs;.  return pRe
20890 61 6c 56 66 73 2d 3e 78 44 6c 53 79 6d 28 70 52  alVfs->xDlSym(pR
208a0 65 61 6c 56 66 73 2c 20 70 41 72 67 2c 20 7a 53  ealVfs, pArg, zS
208b0 79 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  ym);.}../*.** Cl
208c0 6f 73 65 20 74 68 65 20 64 79 6e 61 6d 69 63 20  ose the dynamic 
208d0 6c 69 62 72 61 72 79 20 68 61 6e 64 6c 65 20 70  library handle p
208e0 48 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  Handle..*/.stati
208f0 63 20 76 6f 69 64 20 72 62 75 56 66 73 44 6c 43  c void rbuVfsDlC
20900 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73  lose(sqlite3_vfs
20910 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48   *pVfs, void *pH
20920 61 6e 64 6c 65 29 7b 0a 20 20 73 71 6c 69 74 65  andle){.  sqlite
20930 33 5f 76 66 73 20 2a 70 52 65 61 6c 56 66 73 20  3_vfs *pRealVfs 
20940 3d 20 28 28 72 62 75 5f 76 66 73 2a 29 70 56 66  = ((rbu_vfs*)pVf
20950 73 29 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20  s)->pRealVfs;.  
20960 70 52 65 61 6c 56 66 73 2d 3e 78 44 6c 43 6c 6f  pRealVfs->xDlClo
20970 73 65 28 70 52 65 61 6c 56 66 73 2c 20 70 48 61  se(pRealVfs, pHa
20980 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  ndle);.}.#endif 
20990 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  /* SQLITE_OMIT_L
209a0 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 2a 2f  OAD_EXTENSION */
209b0 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65  ../*.** Populate
209c0 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
209d0 74 65 64 20 74 6f 20 62 79 20 7a 42 75 66 4f 75  ted to by zBufOu
209e0 74 20 77 69 74 68 20 6e 42 79 74 65 20 62 79 74  t with nByte byt
209f0 65 73 20 6f 66 20 0a 2a 2a 20 72 61 6e 64 6f 6d  es of .** random
20a00 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63   data..*/.static
20a10 20 69 6e 74 20 72 62 75 56 66 73 52 61 6e 64 6f   int rbuVfsRando
20a20 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66  mness(sqlite3_vf
20a30 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 79  s *pVfs, int nBy
20a40 74 65 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75  te, char *zBufOu
20a50 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  t){.  sqlite3_vf
20a60 73 20 2a 70 52 65 61 6c 56 66 73 20 3d 20 28 28  s *pRealVfs = ((
20a70 72 62 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e  rbu_vfs*)pVfs)->
20a80 70 52 65 61 6c 56 66 73 3b 0a 20 20 72 65 74 75  pRealVfs;.  retu
20a90 72 6e 20 70 52 65 61 6c 56 66 73 2d 3e 78 52 61  rn pRealVfs->xRa
20aa0 6e 64 6f 6d 6e 65 73 73 28 70 52 65 61 6c 56 66  ndomness(pRealVf
20ab0 73 2c 20 6e 42 79 74 65 2c 20 7a 42 75 66 4f 75  s, nByte, zBufOu
20ac0 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65  t);.}../*.** Sle
20ad0 65 70 20 66 6f 72 20 6e 4d 69 63 72 6f 20 6d 69  ep for nMicro mi
20ae0 63 72 6f 73 65 63 6f 6e 64 73 2e 20 52 65 74 75  croseconds. Retu
20af0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
20b00 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 0a 2a   microseconds .*
20b10 2a 20 61 63 74 75 61 6c 6c 79 20 73 6c 65 70 74  * actually slept
20b20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
20b30 72 62 75 56 66 73 53 6c 65 65 70 28 73 71 6c 69  rbuVfsSleep(sqli
20b40 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
20b50 6e 74 20 6e 4d 69 63 72 6f 29 7b 0a 20 20 73 71  nt nMicro){.  sq
20b60 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65 61 6c  lite3_vfs *pReal
20b70 56 66 73 20 3d 20 28 28 72 62 75 5f 76 66 73 2a  Vfs = ((rbu_vfs*
20b80 29 70 56 66 73 29 2d 3e 70 52 65 61 6c 56 66 73  )pVfs)->pRealVfs
20b90 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 61 6c  ;.  return pReal
20ba0 56 66 73 2d 3e 78 53 6c 65 65 70 28 70 52 65 61  Vfs->xSleep(pRea
20bb0 6c 56 66 73 2c 20 6e 4d 69 63 72 6f 29 3b 0a 7d  lVfs, nMicro);.}
20bc0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
20bd0 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
20be0 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20  as a Julian Day 
20bf0 6e 75 6d 62 65 72 20 69 6e 20 2a 70 54 69 6d 65  number in *pTime
20c00 4f 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Out..*/.static i
20c10 6e 74 20 72 62 75 56 66 73 43 75 72 72 65 6e 74  nt rbuVfsCurrent
20c20 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73  Time(sqlite3_vfs
20c30 20 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65 20 2a   *pVfs, double *
20c40 70 54 69 6d 65 4f 75 74 29 7b 0a 20 20 73 71 6c  pTimeOut){.  sql
20c50 69 74 65 33 5f 76 66 73 20 2a 70 52 65 61 6c 56  ite3_vfs *pRealV
20c60 66 73 20 3d 20 28 28 72 62 75 5f 76 66 73 2a 29  fs = ((rbu_vfs*)
20c70 70 56 66 73 29 2d 3e 70 52 65 61 6c 56 66 73 3b  pVfs)->pRealVfs;
20c80 0a 20 20 72 65 74 75 72 6e 20 70 52 65 61 6c 56  .  return pRealV
20c90 66 73 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d 65  fs->xCurrentTime
20ca0 28 70 52 65 61 6c 56 66 73 2c 20 70 54 69 6d 65  (pRealVfs, pTime
20cb0 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e  Out);.}../*.** N
20cc0 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
20cd0 69 6e 74 20 72 62 75 56 66 73 47 65 74 4c 61 73  int rbuVfsGetLas
20ce0 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  tError(sqlite3_v
20cf0 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 61 2c  fs *pVfs, int a,
20d00 20 63 68 61 72 20 2a 62 29 7b 0a 20 20 72 65 74   char *b){.  ret
20d10 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
20d20 44 65 72 65 67 69 73 74 65 72 20 61 6e 64 20 64  Deregister and d
20d30 65 73 74 72 6f 79 20 61 6e 20 52 42 55 20 76 66  estroy an RBU vf
20d40 73 20 63 72 65 61 74 65 64 20 62 79 20 61 6e 20  s created by an 
20d50 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 0a  earlier call to.
20d60 2a 2a 20 73 71 6c 69 74 65 33 72 62 75 5f 63 72  ** sqlite3rbu_cr
20d70 65 61 74 65 5f 76 66 73 28 29 2e 0a 2a 2f 0a 76  eate_vfs()..*/.v
20d80 6f 69 64 20 73 71 6c 69 74 65 33 72 62 75 5f 64  oid sqlite3rbu_d
20d90 65 73 74 72 6f 79 5f 76 66 73 28 63 6f 6e 73 74  estroy_vfs(const
20da0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
20db0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
20dc0 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73  fs = sqlite3_vfs
20dd0 5f 66 69 6e 64 28 7a 4e 61 6d 65 29 3b 0a 20 20  _find(zName);.  
20de0 69 66 28 20 70 56 66 73 20 26 26 20 70 56 66 73  if( pVfs && pVfs
20df0 2d 3e 78 4f 70 65 6e 3d 3d 72 62 75 56 66 73 4f  ->xOpen==rbuVfsO
20e00 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pen ){.    sqlit
20e10 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 28 28  e3_mutex_free(((
20e20 72 62 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e  rbu_vfs*)pVfs)->
20e30 6d 75 74 65 78 29 3b 0a 20 20 20 20 73 71 6c 69  mutex);.    sqli
20e40 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74  te3_vfs_unregist
20e50 65 72 28 70 56 66 73 29 3b 0a 20 20 20 20 73 71  er(pVfs);.    sq
20e60 6c 69 74 65 33 5f 66 72 65 65 28 70 56 66 73 29  lite3_free(pVfs)
20e70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
20e80 72 65 61 74 65 20 61 6e 20 52 42 55 20 56 46 53  reate an RBU VFS
20e90 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 20 74 68 61   named zName tha
20ea0 74 20 61 63 63 65 73 73 65 73 20 74 68 65 20 75  t accesses the u
20eb0 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65 2d 73  nderlying file-s
20ec0 79 73 74 65 6d 0a 2a 2a 20 76 69 61 20 65 78 69  ystem.** via exi
20ed0 73 74 69 6e 67 20 56 46 53 20 7a 50 61 72 65 6e  sting VFS zParen
20ee0 74 2e 20 54 68 65 20 6e 65 77 20 6f 62 6a 65 63  t. The new objec
20ef0 74 20 69 73 20 72 65 67 69 73 74 65 72 65 64 20  t is registered 
20f00 61 73 20 61 20 6e 6f 6e 2d 64 65 66 61 75 6c 74  as a non-default
20f10 0a 2a 2a 20 56 46 53 20 77 69 74 68 20 53 51 4c  .** VFS with SQL
20f20 69 74 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ite before retur
20f30 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ning..*/.int sql
20f40 69 74 65 33 72 62 75 5f 63 72 65 61 74 65 5f 76  ite3rbu_create_v
20f50 66 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  fs(const char *z
20f60 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Name, const char
20f70 20 2a 7a 50 61 72 65 6e 74 29 7b 0a 0a 20 20 2f   *zParent){..  /
20f80 2a 20 54 65 6d 70 6c 61 74 65 20 66 6f 72 20 56  * Template for V
20f90 46 53 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 73  FS */.  static s
20fa0 71 6c 69 74 65 33 5f 76 66 73 20 76 66 73 5f 74  qlite3_vfs vfs_t
20fb0 65 6d 70 6c 61 74 65 20 3d 20 7b 0a 20 20 20 20  emplate = {.    
20fc0 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
20fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20fe0 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20   iVersion */.   
20ff0 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
21000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21010 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20  * szOsFile */.  
21020 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
21030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21040 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f  /* mxPathname */
21050 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
21060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21070 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20     /* pNext */. 
21080 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
21090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210a0 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20   /* zName */.   
210b0 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
210c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
210d0 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20  * pAppData */.  
210e0 20 20 72 62 75 56 66 73 4f 70 65 6e 2c 20 20 20    rbuVfsOpen,   
210f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21100 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20  /* xOpen */.    
21110 72 62 75 56 66 73 44 65 6c 65 74 65 2c 20 20 20  rbuVfsDelete,   
21120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21130 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20   xDelete */.    
21140 72 62 75 56 66 73 41 63 63 65 73 73 2c 20 20 20  rbuVfsAccess,   
21150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21160 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20   xAccess */.    
21170 72 62 75 56 66 73 46 75 6c 6c 50 61 74 68 6e 61  rbuVfsFullPathna
21180 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me,           /*
21190 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a   xFullPathname *
211a0 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
211b0 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
211c0 4e 53 49 4f 4e 0a 20 20 20 20 72 62 75 56 66 73  NSION.    rbuVfs
211d0 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  DlOpen,         
211e0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70          /* xDlOp
211f0 65 6e 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73  en */.    rbuVfs
21200 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20  DlError,        
21210 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72          /* xDlEr
21220 72 6f 72 20 2a 2f 0a 20 20 20 20 72 62 75 56 66  ror */.    rbuVf
21230 73 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20  sDlSym,         
21240 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53           /* xDlS
21250 79 6d 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73  ym */.    rbuVfs
21260 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  DlClose,        
21270 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c          /* xDlCl
21280 6f 73 65 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 20  ose */.#else.   
21290 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 23 65 6e   0, 0, 0, 0,.#en
212a0 64 69 66 0a 0a 20 20 20 20 72 62 75 56 66 73 52  dif..    rbuVfsR
212b0 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20  andomness,      
212c0 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f         /* xRando
212d0 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20 72 62 75  mness */.    rbu
212e0 56 66 73 53 6c 65 65 70 2c 20 20 20 20 20 20 20  VfsSleep,       
212f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
21300 6c 65 65 70 20 2a 2f 0a 20 20 20 20 72 62 75 56  leep */.    rbuV
21310 66 73 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20  fsCurrentTime,  
21320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 75            /* xCu
21330 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20  rrentTime */.   
21340 20 72 62 75 56 66 73 47 65 74 4c 61 73 74 45 72   rbuVfsGetLastEr
21350 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ror,           /
21360 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20  * xGetLastError 
21370 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20  */.    0,       
21380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21390 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74       /* xCurrent
213a0 54 69 6d 65 49 6e 74 36 34 20 28 76 65 72 73 69  TimeInt64 (versi
213b0 6f 6e 20 32 29 20 2a 2f 0a 20 20 20 20 30 2c 20  on 2) */.    0, 
213c0 30 2c 20 30 20 20 20 20 20 20 20 20 20 20 20 20  0, 0            
213d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
213e0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 76 65 72 73  implemented vers
213f0 69 6f 6e 20 33 20 6d 65 74 68 6f 64 73 20 2a 2f  ion 3 methods */
21400 0a 20 20 7d 3b 0a 0a 20 20 72 62 75 5f 76 66 73  .  };..  rbu_vfs
21410 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20 20 20 20   *pNew = 0;     
21420 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c           /* Newl
21430 79 20 61 6c 6c 6f 63 61 74 65 64 20 56 46 53 20  y allocated VFS 
21440 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
21450 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 69 7a 65 5f  LITE_OK;.  size_
21460 74 20 6e 4e 61 6d 65 3b 0a 20 20 73 69 7a 65 5f  t nName;.  size_
21470 74 20 6e 42 79 74 65 3b 0a 0a 20 20 6e 4e 61 6d  t nByte;..  nNam
21480 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  e = strlen(zName
21490 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a  );.  nByte = siz
214a0 65 6f 66 28 72 62 75 5f 76 66 73 29 20 2b 20 6e  eof(rbu_vfs) + n
214b0 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 70 4e 65 77  Name + 1;.  pNew
214c0 20 3d 20 28 72 62 75 5f 76 66 73 2a 29 73 71 6c   = (rbu_vfs*)sql
214d0 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42  ite3_malloc64(nB
214e0 79 74 65 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  yte);.  if( pNew
214f0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
21500 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
21510 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
21520 65 33 5f 76 66 73 20 2a 70 50 61 72 65 6e 74 3b  e3_vfs *pParent;
21530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
21540 72 65 6e 74 20 56 46 53 20 2a 2f 0a 20 20 20 20  rent VFS */.    
21550 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20  memset(pNew, 0, 
21560 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 50 61 72  nByte);.    pPar
21570 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 66  ent = sqlite3_vf
21580 73 5f 66 69 6e 64 28 7a 50 61 72 65 6e 74 29 3b  s_find(zParent);
21590 0a 20 20 20 20 69 66 28 20 70 50 61 72 65 6e 74  .    if( pParent
215a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
215b0 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  = SQLITE_NOTFOUN
215c0 44 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  D;.    }else{.  
215d0 20 20 20 20 63 68 61 72 20 2a 7a 53 70 61 63 65      char *zSpace
215e0 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
215f0 70 4e 65 77 2d 3e 62 61 73 65 2c 20 26 76 66 73  pNew->base, &vfs
21600 5f 74 65 6d 70 6c 61 74 65 2c 20 73 69 7a 65 6f  _template, sizeo
21610 66 28 73 71 6c 69 74 65 33 5f 76 66 73 29 29 3b  f(sqlite3_vfs));
21620 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 62 61 73  .      pNew->bas
21630 65 2e 6d 78 50 61 74 68 6e 61 6d 65 20 3d 20 70  e.mxPathname = p
21640 50 61 72 65 6e 74 2d 3e 6d 78 50 61 74 68 6e 61  Parent->mxPathna
21650 6d 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  me;.      pNew->
21660 62 61 73 65 2e 73 7a 4f 73 46 69 6c 65 20 3d 20  base.szOsFile = 
21670 73 69 7a 65 6f 66 28 72 62 75 5f 66 69 6c 65 29  sizeof(rbu_file)
21680 20 2b 20 70 50 61 72 65 6e 74 2d 3e 73 7a 4f 73   + pParent->szOs
21690 46 69 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77  File;.      pNew
216a0 2d 3e 70 52 65 61 6c 56 66 73 20 3d 20 70 50 61  ->pRealVfs = pPa
216b0 72 65 6e 74 3b 0a 20 20 20 20 20 20 70 4e 65 77  rent;.      pNew
216c0 2d 3e 62 61 73 65 2e 7a 4e 61 6d 65 20 3d 20 28  ->base.zName = (
216d0 63 6f 6e 73 74 20 63 68 61 72 2a 29 28 7a 53 70  const char*)(zSp
216e0 61 63 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e  ace = (char*)&pN
216f0 65 77 5b 31 5d 29 3b 0a 20 20 20 20 20 20 6d 65  ew[1]);.      me
21700 6d 63 70 79 28 7a 53 70 61 63 65 2c 20 7a 4e 61  mcpy(zSpace, zNa
21710 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 0a 20 20 20  me, nName);..   
21720 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74     /* Allocate t
21730 68 65 20 6d 75 74 65 78 20 61 6e 64 20 72 65 67  he mutex and reg
21740 69 73 74 65 72 20 74 68 65 20 6e 65 77 20 56 46  ister the new VF
21750 53 20 28 6e 6f 74 20 61 73 20 74 68 65 20 64 65  S (not as the de
21760 66 61 75 6c 74 29 20 2a 2f 0a 20 20 20 20 20 20  fault) */.      
21770 70 4e 65 77 2d 3e 6d 75 74 65 78 20 3d 20 73 71  pNew->mutex = sq
21780 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
21790 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52  c(SQLITE_MUTEX_R
217a0 45 43 55 52 53 49 56 45 29 3b 0a 20 20 20 20 20  ECURSIVE);.     
217b0 20 69 66 28 20 70 4e 65 77 2d 3e 6d 75 74 65 78   if( pNew->mutex
217c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
217d0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
217e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
217f0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
21800 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
21810 28 26 70 4e 65 77 2d 3e 62 61 73 65 2c 20 30 29  (&pNew->base, 0)
21820 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
21830 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
21840 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21850 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
21860 65 65 28 70 4e 65 77 2d 3e 6d 75 74 65 78 29 3b  ee(pNew->mutex);
21870 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
21880 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 7d  ree(pNew);.    }
21890 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
218a0 63 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  c;.}.../********
218b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
218c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
218d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
218e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
218f0 2a 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 21  **/..#endif /* !
21900 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43  defined(SQLITE_C
21910 4f 52 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  ORE) || defined(
21920 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 52 42  SQLITE_ENABLE_RB
21930 55 29 20 2a 2f 0a                                U) */.