/ Hex Artifact Content
Login

Artifact f222350c33f063cbc754001cd4e9683164c6cb06be76ae43f15b396ec6fc1993:


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 20 44 65 6c 74 61 20  ZE 16../* Delta 
1070: 63 68 65 63 6b 73 75 6d 73 20 64 69 73 61 62 6c  checksums disabl
1080: 65 64 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20  ed by default.  
1090: 43 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d 44 52  Compile with -DR
10a0: 42 55 5f 45 4e 41 42 4c 45 5f 44 45 4c 54 41 5f  BU_ENABLE_DELTA_
10b0: 43 4b 53 55 4d 0a 2a 2a 20 74 6f 20 65 6e 61 62  CKSUM.** to enab
10c0: 6c 65 20 63 68 65 63 6b 73 75 6d 20 76 65 72 69  le checksum veri
10d0: 66 69 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66  fication..*/.#if
10e0: 6e 64 65 66 20 52 42 55 5f 45 4e 41 42 4c 45 5f  ndef RBU_ENABLE_
10f0: 44 45 4c 54 41 5f 43 4b 53 55 4d 0a 23 20 64 65  DELTA_CKSUM.# de
1100: 66 69 6e 65 20 52 42 55 5f 45 4e 41 42 4c 45 5f  fine RBU_ENABLE_
1110: 44 45 4c 54 41 5f 43 4b 53 55 4d 20 30 0a 23 65  DELTA_CKSUM 0.#e
1120: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70  ndif../*.** Swap
1130: 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66 20   two objects of 
1140: 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f 0a 23 69  type TYPE..*/.#i
1150: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
1160: 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 29 0a  E_AMALGAMATION).
1170: 23 20 64 65 66 69 6e 65 20 53 57 41 50 28 54 59  # define SWAP(TY
1180: 50 45 2c 41 2c 42 29 20 7b 54 59 50 45 20 74 3d  PE,A,B) {TYPE t=
1190: 41 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 23 65  A; A=B; B=t;}.#e
11a0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
11b0: 72 62 75 5f 73 74 61 74 65 20 74 61 62 6c 65 20  rbu_state table 
11c0: 69 73 20 75 73 65 64 20 74 6f 20 73 61 76 65 20  is used to save 
11d0: 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 20 70  the state of a p
11e0: 61 72 74 69 61 6c 6c 79 20 61 70 70 6c 69 65 64  artially applied
11f0: 0a 2a 2a 20 75 70 64 61 74 65 20 73 6f 20 74 68  .** update so th
1200: 61 74 20 69 74 20 63 61 6e 20 62 65 20 72 65 73  at it can be res
1210: 75 6d 65 64 20 6c 61 74 65 72 2e 20 54 68 65 20  umed later. The 
1220: 74 61 62 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f  table consists o
1230: 66 20 69 6e 74 65 67 65 72 0a 2a 2a 20 6b 65 79  f integer.** key
1240: 73 20 6d 61 70 70 65 64 20 74 6f 20 76 61 6c 75  s mapped to valu
1250: 65 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  es as follows:.*
1260: 2a 0a 2a 2a 20 52 42 55 5f 53 54 41 54 45 5f 53  *.** RBU_STATE_S
1270: 54 41 47 45 3a 0a 2a 2a 20 20 20 4d 61 79 20 62  TAGE:.**   May b
1280: 65 20 73 65 74 20 74 6f 20 69 6e 74 65 67 65 72  e set to integer
1290: 20 76 61 6c 75 65 73 20 31 2c 20 32 2c 20 34 20   values 1, 2, 4 
12a0: 6f 72 20 35 2e 20 41 73 20 66 6f 6c 6c 6f 77 73  or 5. As follows
12b0: 3a 0a 2a 2a 20 20 20 20 20 20 20 31 3a 20 74 68  :.**       1: th
12c0: 65 20 2a 2d 72 62 75 20 66 69 6c 65 20 69 73 20  e *-rbu file is 
12d0: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
12e0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a  construction..**
12f0: 20 20 20 20 20 20 20 32 3a 20 74 68 65 20 2a 2d         2: the *-
1300: 72 62 75 20 66 69 6c 65 20 68 61 73 20 62 65 65  rbu file has bee
1310: 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 2c 20 62  n constructed, b
1320: 75 74 20 6e 6f 74 20 79 65 74 20 6d 6f 76 65 64  ut not yet moved
1330: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f   .**          to
1340: 20 74 68 65 20 2a 2d 77 61 6c 20 70 61 74 68 2e   the *-wal path.
1350: 0a 2a 2a 20 20 20 20 20 20 20 34 3a 20 74 68 65  .**       4: the
1360: 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 75   checkpoint is u
1370: 6e 64 65 72 77 61 79 2e 0a 2a 2a 20 20 20 20 20  nderway..**     
1380: 20 20 35 3a 20 74 68 65 20 72 62 75 20 75 70 64    5: the rbu upd
1390: 61 74 65 20 68 61 73 20 62 65 65 6e 20 63 68 65  ate has been che
13a0: 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a  ckpointed..**.**
13b0: 20 52 42 55 5f 53 54 41 54 45 5f 54 42 4c 3a 0a   RBU_STATE_TBL:.
13c0: 2a 2a 20 20 20 4f 6e 6c 79 20 76 61 6c 69 64 20  **   Only valid 
13d0: 69 66 20 53 54 41 47 45 3d 3d 31 2e 20 54 68 65  if STAGE==1. The
13e0: 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65   target database
13f0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
1400: 6c 65 20 0a 2a 2a 20 20 20 63 75 72 72 65 6e 74  le .**   current
1410: 6c 79 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  ly being written
1420: 2e 0a 2a 2a 0a 2a 2a 20 52 42 55 5f 53 54 41 54  ..**.** RBU_STAT
1430: 45 5f 49 44 58 3a 0a 2a 2a 20 20 20 4f 6e 6c 79  E_IDX:.**   Only
1440: 20 76 61 6c 69 64 20 69 66 20 53 54 41 47 45 3d   valid if STAGE=
1450: 3d 31 2e 20 54 68 65 20 74 61 72 67 65 74 20 64  =1. The target d
1460: 61 74 61 62 61 73 65 20 6e 61 6d 65 20 6f 66 20  atabase name of 
1470: 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 20 20  the index .**   
1480: 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
1490: 77 72 69 74 74 65 6e 2c 20 6f 72 20 4e 55 4c 4c  written, or NULL
14a0: 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 61 62   if the main tab
14b0: 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  le is currently 
14c0: 62 65 69 6e 67 0a 2a 2a 20 20 20 75 70 64 61 74  being.**   updat
14d0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 42 55 5f 53 54  ed..**.** RBU_ST
14e0: 41 54 45 5f 52 4f 57 3a 0a 2a 2a 20 20 20 4f 6e  ATE_ROW:.**   On
14f0: 6c 79 20 76 61 6c 69 64 20 69 66 20 53 54 41 47  ly valid if STAG
1500: 45 3d 3d 31 2e 20 4e 75 6d 62 65 72 20 6f 66 20  E==1. Number of 
1510: 72 6f 77 73 20 61 6c 72 65 61 64 79 20 70 72 6f  rows already pro
1520: 63 65 73 73 65 64 20 66 6f 72 20 74 68 65 20 63  cessed for the c
1530: 75 72 72 65 6e 74 0a 2a 2a 20 20 20 74 61 62 6c  urrent.**   tabl
1540: 65 2f 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 52  e/index..**.** R
1550: 42 55 5f 53 54 41 54 45 5f 50 52 4f 47 52 45 53  BU_STATE_PROGRES
1560: 53 3a 0a 2a 2a 20 20 20 54 72 62 75 6c 20 6e 75  S:.**   Trbul nu
1570: 6d 62 65 72 20 6f 66 20 73 71 6c 69 74 65 33 72  mber of sqlite3r
1580: 62 75 5f 73 74 65 70 28 29 20 63 61 6c 6c 73 20  bu_step() calls 
1590: 6d 61 64 65 20 73 6f 20 66 61 72 20 61 73 20 70  made so far as p
15a0: 61 72 74 20 6f 66 20 74 68 69 73 0a 2a 2a 20 20  art of this.**  
15b0: 20 72 62 75 20 75 70 64 61 74 65 2e 0a 2a 2a 0a   rbu update..**.
15c0: 2a 2a 20 52 42 55 5f 53 54 41 54 45 5f 43 4b 50  ** RBU_STATE_CKP
15d0: 54 3a 0a 2a 2a 20 20 20 56 61 6c 69 64 20 69 66  T:.**   Valid if
15e0: 20 53 54 41 47 45 3d 3d 34 2e 20 54 68 65 20 36   STAGE==4. The 6
15f0: 34 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 61  4-bit checksum a
1600: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
1610: 68 65 20 77 61 6c 2d 69 6e 64 65 78 0a 2a 2a 20  he wal-index.** 
1620: 20 20 68 65 61 64 65 72 20 63 72 65 61 74 65 64    header created
1630: 20 62 79 20 72 65 63 6f 76 65 72 69 6e 67 20 74   by recovering t
1640: 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 2e 20 54  he *-wal file. T
1650: 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 64  his is used to d
1660: 65 74 65 63 74 0a 2a 2a 20 20 20 63 61 73 65 73  etect.**   cases
1670: 20 77 68 65 6e 20 61 6e 6f 74 68 65 72 20 63 6c   when another cl
1680: 69 65 6e 74 20 61 70 70 65 6e 64 73 20 66 72 61  ient appends fra
1690: 6d 65 73 20 74 6f 20 74 68 65 20 2a 2d 77 61 6c  mes to the *-wal
16a0: 20 66 69 6c 65 20 69 6e 20 74 68 65 0a 2a 2a 20   file in the.** 
16b0: 20 20 6d 69 64 64 6c 65 20 6f 66 20 61 6e 20 69    middle of an i
16c0: 6e 63 72 65 6d 65 6e 74 61 6c 20 63 68 65 63 6b  ncremental check
16d0: 70 6f 69 6e 74 20 28 61 6e 20 69 6e 63 72 65 6d  point (an increm
16e0: 65 6e 74 61 6c 20 63 68 65 63 6b 70 6f 69 6e 74  ental checkpoint
16f0: 20 63 61 6e 6e 6f 74 0a 2a 2a 20 20 20 62 65 20   cannot.**   be 
1700: 63 6f 6e 74 69 6e 75 65 64 20 69 66 20 74 68 69  continued if thi
1710: 73 20 68 61 70 70 65 6e 73 29 2e 0a 2a 2a 0a 2a  s happens)..**.*
1720: 2a 20 52 42 55 5f 53 54 41 54 45 5f 43 4f 4f 4b  * RBU_STATE_COOK
1730: 49 45 3a 0a 2a 2a 20 20 20 56 61 6c 69 64 20 69  IE:.**   Valid i
1740: 66 20 53 54 41 47 45 3d 3d 31 2e 20 54 68 65 20  f STAGE==1. The 
1750: 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 2d 63  current change-c
1760: 6f 75 6e 74 65 72 20 63 6f 6f 6b 69 65 20 76 61  ounter cookie va
1770: 6c 75 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 20  lue in the .**  
1780: 20 74 61 72 67 65 74 20 64 62 20 66 69 6c 65 2e   target db file.
1790: 0a 2a 2a 0a 2a 2a 20 52 42 55 5f 53 54 41 54 45  .**.** RBU_STATE
17a0: 5f 4f 41 4c 53 5a 3a 0a 2a 2a 20 20 20 56 61 6c  _OALSZ:.**   Val
17b0: 69 64 20 69 66 20 53 54 41 47 45 3d 3d 31 2e 20  id if STAGE==1. 
17c0: 54 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65  The size in byte
17d0: 73 20 6f 66 20 74 68 65 20 2a 2d 6f 61 6c 20 66  s of the *-oal f
17e0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 42 55 5f 53  ile..**.** RBU_S
17f0: 54 41 54 45 5f 44 41 54 41 54 42 4c 3a 0a 2a 2a  TATE_DATATBL:.**
1800: 20 20 20 4f 6e 6c 79 20 76 61 6c 69 64 20 69 66     Only valid if
1810: 20 53 54 41 47 45 3d 3d 31 2e 20 54 68 65 20 52   STAGE==1. The R
1820: 42 55 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  BU database name
1830: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 0a 2a   of the table .*
1840: 2a 20 20 20 63 75 72 72 65 6e 74 6c 79 20 62 65  *   currently be
1850: 69 6e 67 20 72 65 61 64 2e 0a 2a 2f 0a 23 64 65  ing read..*/.#de
1860: 66 69 6e 65 20 52 42 55 5f 53 54 41 54 45 5f 53  fine RBU_STATE_S
1870: 54 41 47 45 20 20 20 20 20 20 20 20 31 0a 23 64  TAGE        1.#d
1880: 65 66 69 6e 65 20 52 42 55 5f 53 54 41 54 45 5f  efine RBU_STATE_
1890: 54 42 4c 20 20 20 20 20 20 20 20 20 20 32 0a 23  TBL          2.#
18a0: 64 65 66 69 6e 65 20 52 42 55 5f 53 54 41 54 45  define RBU_STATE
18b0: 5f 49 44 58 20 20 20 20 20 20 20 20 20 20 33 0a  _IDX          3.
18c0: 23 64 65 66 69 6e 65 20 52 42 55 5f 53 54 41 54  #define RBU_STAT
18d0: 45 5f 52 4f 57 20 20 20 20 20 20 20 20 20 20 34  E_ROW          4
18e0: 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53 54 41  .#define RBU_STA
18f0: 54 45 5f 50 52 4f 47 52 45 53 53 20 20 20 20 20  TE_PROGRESS     
1900: 35 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53 54  5.#define RBU_ST
1910: 41 54 45 5f 43 4b 50 54 20 20 20 20 20 20 20 20  ATE_CKPT        
1920: 20 36 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53   6.#define RBU_S
1930: 54 41 54 45 5f 43 4f 4f 4b 49 45 20 20 20 20 20  TATE_COOKIE     
1940: 20 20 37 0a 23 64 65 66 69 6e 65 20 52 42 55 5f    7.#define RBU_
1950: 53 54 41 54 45 5f 4f 41 4c 53 5a 20 20 20 20 20  STATE_OALSZ     
1960: 20 20 20 38 0a 23 64 65 66 69 6e 65 20 52 42 55     8.#define RBU
1970: 5f 53 54 41 54 45 5f 50 48 41 53 45 4f 4e 45 53  _STATE_PHASEONES
1980: 54 45 50 20 39 0a 23 64 65 66 69 6e 65 20 52 42  TEP 9.#define RB
1990: 55 5f 53 54 41 54 45 5f 44 41 54 41 54 42 4c 20  U_STATE_DATATBL 
19a0: 20 20 20 20 31 30 0a 0a 23 64 65 66 69 6e 65 20      10..#define 
19b0: 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 20 20  RBU_STAGE_OAL   
19c0: 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20        1.#define 
19d0: 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 20 20  RBU_STAGE_MOVE  
19e0: 20 20 20 20 20 20 32 0a 23 64 65 66 69 6e 65 20        2.#define 
19f0: 52 42 55 5f 53 54 41 47 45 5f 43 41 50 54 55 52  RBU_STAGE_CAPTUR
1a00: 45 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20  E     3.#define 
1a10: 52 42 55 5f 53 54 41 47 45 5f 43 4b 50 54 20 20  RBU_STAGE_CKPT  
1a20: 20 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20        4.#define 
1a30: 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45 20 20  RBU_STAGE_DONE  
1a40: 20 20 20 20 20 20 35 0a 0a 0a 23 64 65 66 69 6e        5...#defin
1a50: 65 20 52 42 55 5f 43 52 45 41 54 45 5f 53 54 41  e RBU_CREATE_STA
1a60: 54 45 20 5c 0a 20 20 22 43 52 45 41 54 45 20 54  TE \.  "CREATE T
1a70: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53  ABLE IF NOT EXIS
1a80: 54 53 20 25 73 2e 72 62 75 5f 73 74 61 74 65 28  TS %s.rbu_state(
1a90: 6b 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  k INTEGER PRIMAR
1aa0: 59 20 4b 45 59 2c 20 76 29 22 0a 0a 74 79 70 65  Y KEY, v)"..type
1ab0: 64 65 66 20 73 74 72 75 63 74 20 52 62 75 46 72  def struct RbuFr
1ac0: 61 6d 65 20 52 62 75 46 72 61 6d 65 3b 0a 74 79  ame RbuFrame;.ty
1ad0: 70 65 64 65 66 20 73 74 72 75 63 74 20 52 62 75  pedef struct Rbu
1ae0: 4f 62 6a 49 74 65 72 20 52 62 75 4f 62 6a 49 74  ObjIter RbuObjIt
1af0: 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  er;.typedef stru
1b00: 63 74 20 52 62 75 53 74 61 74 65 20 52 62 75 53  ct RbuState RbuS
1b10: 74 61 74 65 3b 0a 74 79 70 65 64 65 66 20 73 74  tate;.typedef st
1b20: 72 75 63 74 20 72 62 75 5f 76 66 73 20 72 62 75  ruct rbu_vfs rbu
1b30: 5f 76 66 73 3b 0a 74 79 70 65 64 65 66 20 73 74  _vfs;.typedef st
1b40: 72 75 63 74 20 72 62 75 5f 66 69 6c 65 20 72 62  ruct rbu_file rb
1b50: 75 5f 66 69 6c 65 3b 0a 74 79 70 65 64 65 66 20  u_file;.typedef 
1b60: 73 74 72 75 63 74 20 52 62 75 55 70 64 61 74 65  struct RbuUpdate
1b70: 53 74 6d 74 20 52 62 75 55 70 64 61 74 65 53 74  Stmt RbuUpdateSt
1b80: 6d 74 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  mt;..#if !define
1b90: 64 28 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41 4d  d(SQLITE_AMALGAM
1ba0: 41 54 49 4f 4e 29 0a 74 79 70 65 64 65 66 20 75  ATION).typedef u
1bb0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 33 32 3b  nsigned int u32;
1bc0: 0a 74 79 70 65 64 65 66 20 75 6e 73 69 67 6e 65  .typedef unsigne
1bd0: 64 20 73 68 6f 72 74 20 75 31 36 3b 0a 74 79 70  d short u16;.typ
1be0: 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20 63 68  edef unsigned ch
1bf0: 61 72 20 75 38 3b 0a 74 79 70 65 64 65 66 20 73  ar u8;.typedef s
1c00: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 36 34  qlite3_int64 i64
1c10: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
1c20: 54 68 65 73 65 20 76 61 6c 75 65 73 20 6d 75 73  These values mus
1c30: 74 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75  t match the valu
1c40: 65 73 20 64 65 66 69 6e 65 64 20 69 6e 20 77 61  es defined in wa
1c50: 6c 2e 63 20 66 6f 72 20 74 68 65 20 65 71 75 69  l.c for the equi
1c60: 76 61 6c 65 6e 74 0a 2a 2a 20 6c 6f 63 6b 73 2e  valent.** locks.
1c70: 20 54 68 65 73 65 20 61 72 65 20 6e 6f 74 20 6d   These are not m
1c80: 61 67 69 63 20 6e 75 6d 62 65 72 73 20 61 73 20  agic numbers as 
1c90: 74 68 65 79 20 61 72 65 20 70 61 72 74 20 6f 66  they are part of
1ca0: 20 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c 65   the SQLite file
1cb0: 0a 2a 2a 20 66 6f 72 6d 61 74 2e 0a 2a 2f 0a 23  .** format..*/.#
1cc0: 64 65 66 69 6e 65 20 57 41 4c 5f 4c 4f 43 4b 5f  define WAL_LOCK_
1cd0: 57 52 49 54 45 20 20 30 0a 23 64 65 66 69 6e 65  WRITE  0.#define
1ce0: 20 57 41 4c 5f 4c 4f 43 4b 5f 43 4b 50 54 20 20   WAL_LOCK_CKPT  
1cf0: 20 31 0a 23 64 65 66 69 6e 65 20 57 41 4c 5f 4c   1.#define WAL_L
1d00: 4f 43 4b 5f 52 45 41 44 30 20 20 33 0a 0a 23 64  OCK_READ0  3..#d
1d10: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 46 43 4e  efine SQLITE_FCN
1d20: 54 4c 5f 52 42 55 43 4e 54 20 20 20 20 35 31 34  TL_RBUCNT    514
1d30: 39 32 31 36 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74  9216../*.** A st
1d40: 72 75 63 74 75 72 65 20 74 6f 20 73 74 6f 72 65  ructure to store
1d50: 20 76 61 6c 75 65 73 20 72 65 61 64 20 66 72 6f   values read fro
1d60: 6d 20 74 68 65 20 72 62 75 5f 73 74 61 74 65 20  m the rbu_state 
1d70: 74 61 62 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 2e  table in memory.
1d80: 0a 2a 2f 0a 73 74 72 75 63 74 20 52 62 75 53 74  .*/.struct RbuSt
1d90: 61 74 65 20 7b 0a 20 20 69 6e 74 20 65 53 74 61  ate {.  int eSta
1da0: 67 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 62 6c  ge;.  char *zTbl
1db0: 3b 0a 20 20 63 68 61 72 20 2a 7a 44 61 74 61 54  ;.  char *zDataT
1dc0: 62 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 49 64 78  bl;.  char *zIdx
1dd0: 3b 0a 20 20 69 36 34 20 69 57 61 6c 43 6b 73 75  ;.  i64 iWalCksu
1de0: 6d 3b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 0a 20  m;.  int nRow;. 
1df0: 20 69 36 34 20 6e 50 72 6f 67 72 65 73 73 3b 0a   i64 nProgress;.
1e00: 20 20 75 33 32 20 69 43 6f 6f 6b 69 65 3b 0a 20    u32 iCookie;. 
1e10: 20 69 36 34 20 69 4f 61 6c 53 7a 3b 0a 20 20 69   i64 iOalSz;.  i
1e20: 36 34 20 6e 50 68 61 73 65 4f 6e 65 53 74 65 70  64 nPhaseOneStep
1e30: 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 52 62 75  ;.};..struct Rbu
1e40: 55 70 64 61 74 65 53 74 6d 74 20 7b 0a 20 20 63  UpdateStmt {.  c
1e50: 68 61 72 20 2a 7a 4d 61 73 6b 3b 20 20 20 20 20  har *zMask;     
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e70: 2a 20 43 6f 70 79 20 6f 66 20 75 70 64 61 74 65  * Copy of update
1e80: 20 6d 61 73 6b 20 75 73 65 64 20 77 69 74 68 20   mask used with 
1e90: 70 55 70 64 61 74 65 20 2a 2f 0a 20 20 73 71 6c  pUpdate */.  sql
1ea0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 55 70 64 61  ite3_stmt *pUpda
1eb0: 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  te;          /* 
1ec0: 4c 61 73 74 20 75 70 64 61 74 65 20 73 74 61 74  Last update stat
1ed0: 65 6d 65 6e 74 20 28 6f 72 20 4e 55 4c 4c 29 20  ement (or NULL) 
1ee0: 2a 2f 0a 20 20 52 62 75 55 70 64 61 74 65 53 74  */.  RbuUpdateSt
1ef0: 6d 74 20 2a 70 4e 65 78 74 3b 0a 7d 3b 0a 0a 2f  mt *pNext;.};../
1f00: 2a 0a 2a 2a 20 41 6e 20 69 74 65 72 61 74 6f 72  *.** An iterator
1f10: 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 69 73   of this type is
1f20: 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
1f30: 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f 62 6a   through all obj
1f40: 65 63 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20 74  ects in.** the t
1f50: 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20 74  arget database t
1f60: 68 61 74 20 72 65 71 75 69 72 65 20 75 70 64 61  hat require upda
1f70: 74 69 6e 67 2e 20 46 6f 72 20 65 61 63 68 20 73  ting. For each s
1f80: 75 63 68 20 74 61 62 6c 65 2c 20 74 68 65 0a 2a  uch table, the.*
1f90: 2a 20 69 74 65 72 61 74 6f 72 20 76 69 73 69 74  * iterator visit
1fa0: 73 2c 20 69 6e 20 6f 72 64 65 72 3a 0a 2a 2a 0a  s, in order:.**.
1fb0: 2a 2a 20 20 20 20 20 2a 20 74 68 65 20 74 61 62  **     * the tab
1fc0: 6c 65 20 69 74 73 65 6c 66 2c 20 0a 2a 2a 20 20  le itself, .**  
1fd0: 20 20 20 2a 20 65 61 63 68 20 69 6e 64 65 78 20     * each index 
1fe0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 28 7a 65  of the table (ze
1ff0: 72 6f 20 6f 72 20 6d 6f 72 65 20 70 6f 69 6e 74  ro or more point
2000: 73 20 74 6f 20 76 69 73 69 74 29 2c 20 61 6e 64  s to visit), and
2010: 0a 2a 2a 20 20 20 20 20 2a 20 61 20 73 70 65 63  .**     * a spec
2020: 69 61 6c 20 22 63 6c 65 61 6e 75 70 20 74 61 62  ial "cleanup tab
2030: 6c 65 22 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  le" state..**.**
2040: 20 61 62 49 6e 64 65 78 65 64 3a 0a 2a 2a 20 20   abIndexed:.**  
2050: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 68 61   If the table ha
2060: 73 20 6e 6f 20 69 6e 64 65 78 65 73 20 6f 6e 20  s no indexes on 
2070: 69 74 2c 20 61 62 49 6e 64 65 78 65 64 20 69 73  it, abIndexed is
2080: 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 20 4f 74   set to NULL. Ot
2090: 68 65 72 77 69 73 65 2c 0a 2a 2a 20 20 20 69 74  herwise,.**   it
20a0: 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 72   points to an ar
20b0: 72 61 79 20 6f 66 20 66 6c 61 67 73 20 6e 54 62  ray of flags nTb
20c0: 6c 43 6f 6c 20 65 6c 65 6d 65 6e 74 73 20 69 6e  lCol elements in
20d0: 20 73 69 7a 65 2e 20 54 68 65 20 66 6c 61 67 20   size. The flag 
20e0: 69 73 0a 2a 2a 20 20 20 73 65 74 20 66 6f 72 20  is.**   set for 
20f0: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 74 68 61 74  each column that
2100: 20 69 73 20 65 69 74 68 65 72 20 61 20 70 61 72   is either a par
2110: 74 20 6f 66 20 74 68 65 20 50 4b 20 6f 72 20 61  t of the PK or a
2120: 20 70 61 72 74 20 6f 66 20 61 6e 0a 2a 2a 20 20   part of an.**  
2130: 20 69 6e 64 65 78 2e 20 4f 72 20 63 6c 65 61 72   index. Or clear
2140: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a   otherwise..**.*
2150: 2a 20 20 20 49 66 20 74 68 65 72 65 20 61 72 65  *   If there are
2160: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 70 61 72   one or more par
2170: 74 69 61 6c 20 69 6e 64 65 78 65 73 20 6f 6e 20  tial indexes on 
2180: 74 68 65 20 74 61 62 6c 65 2c 20 61 6c 6c 20 66  the table, all f
2190: 69 65 6c 64 73 20 6f 66 0a 2a 2a 20 20 20 74 68  ields of.**   th
21a0: 69 73 20 61 72 72 61 79 20 73 65 74 20 73 65 74  is array set set
21b0: 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73 20 62   to 1. This is b
21c0: 65 63 61 75 73 65 20 69 6e 20 74 68 61 74 20 63  ecause in that c
21d0: 61 73 65 2c 20 74 68 65 20 6d 6f 64 75 6c 65 20  ase, the module 
21e0: 68 61 73 0a 2a 2a 20 20 20 6e 6f 20 77 61 79 20  has.**   no way 
21f0: 74 6f 20 74 65 6c 6c 20 77 68 69 63 68 20 66 69  to tell which fi
2200: 65 6c 64 73 20 77 69 6c 6c 20 62 65 20 72 65 71  elds will be req
2210: 75 69 72 65 64 20 74 6f 20 61 64 64 20 61 6e 64  uired to add and
2220: 20 72 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 0a   remove entries.
2230: 2a 2a 20 20 20 66 72 6f 6d 20 74 68 65 20 70 61  **   from the pa
2240: 72 74 69 61 6c 20 69 6e 64 65 78 65 73 2e 0a 2a  rtial indexes..*
2250: 2a 20 20 20 0a 2a 2f 0a 73 74 72 75 63 74 20 52  *   .*/.struct R
2260: 62 75 4f 62 6a 49 74 65 72 20 7b 0a 20 20 73 71  buObjIter {.  sq
2270: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 54 62 6c  lite3_stmt *pTbl
2280: 49 74 65 72 3b 20 20 20 20 20 20 20 20 20 2f 2a  Iter;         /*
2290: 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   Iterate through
22a0: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 73 71 6c   tables */.  sql
22b0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 64 78 49  ite3_stmt *pIdxI
22c0: 74 65 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ter;         /* 
22d0: 49 6e 64 65 78 20 69 74 65 72 61 74 6f 72 20 2a  Index iterator *
22e0: 2f 0a 20 20 69 6e 74 20 6e 54 62 6c 43 6f 6c 3b  /.  int nTblCol;
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2300: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
2310: 7a 54 62 6c 43 6f 6c 5b 5d 20 61 72 72 61 79 20  zTblCol[] array 
2320: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 54 62  */.  char **azTb
2330: 6c 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  lCol;           
2340: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
2350: 20 75 6e 71 75 6f 74 65 64 20 74 61 72 67 65 74   unquoted target
2360: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
2370: 0a 20 20 63 68 61 72 20 2a 2a 61 7a 54 62 6c 54  .  char **azTblT
2380: 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ype;            
2390: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 74     /* Array of t
23a0: 61 72 67 65 74 20 63 6f 6c 75 6d 6e 20 74 79 70  arget column typ
23b0: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 53  es */.  int *aiS
23c0: 72 63 4f 72 64 65 72 3b 20 20 20 20 20 20 20 20  rcOrder;        
23d0: 20 20 20 20 20 20 20 20 2f 2a 20 73 72 63 20 74          /* src t
23e0: 61 62 6c 65 20 63 6f 6c 20 2d 3e 20 74 61 72 67  able col -> targ
23f0: 65 74 20 74 61 62 6c 65 20 63 6f 6c 20 2a 2f 0a  et table col */.
2400: 20 20 75 38 20 2a 61 62 54 62 6c 50 6b 3b 20 20    u8 *abTblPk;  
2410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2420: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 66 6c    /* Array of fl
2430: 61 67 73 2c 20 73 65 74 20 6f 6e 20 74 61 72 67  ags, set on targ
2440: 65 74 20 50 4b 20 63 6f 6c 75 6d 6e 73 20 2a 2f  et PK columns */
2450: 0a 20 20 75 38 20 2a 61 62 4e 6f 74 4e 75 6c 6c  .  u8 *abNotNull
2460: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2470: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 66     /* Array of f
2480: 6c 61 67 73 2c 20 73 65 74 20 6f 6e 20 4e 4f 54  lags, set on NOT
2490: 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f   NULL columns */
24a0: 0a 20 20 75 38 20 2a 61 62 49 6e 64 65 78 65 64  .  u8 *abIndexed
24b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24c0: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 66     /* Array of f
24d0: 6c 61 67 73 2c 20 73 65 74 20 6f 6e 20 69 6e 64  lags, set on ind
24e0: 65 78 65 64 20 26 20 50 4b 20 63 6f 6c 73 20 2a  exed & PK cols *
24f0: 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 3b 20 20  /.  int eType;  
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2510: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 79 70      /* Table typ
2520: 65 20 2d 20 61 6e 20 52 42 55 5f 50 4b 5f 58 58  e - an RBU_PK_XX
2530: 58 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a  X value */..  /*
2540: 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   Output variable
2550: 73 2e 20 7a 54 62 6c 3d 3d 30 20 69 6d 70 6c 69  s. zTbl==0 impli
2560: 65 73 20 45 4f 46 2e 20 2a 2f 0a 20 20 69 6e 74  es EOF. */.  int
2570: 20 62 43 6c 65 61 6e 75 70 3b 20 20 20 20 20 20   bCleanup;      
2580: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2590: 54 72 75 65 20 69 6e 20 22 63 6c 65 61 6e 75 70  True in "cleanup
25a0: 22 20 73 74 61 74 65 20 2a 2f 0a 20 20 63 6f 6e  " state */.  con
25b0: 73 74 20 63 68 61 72 20 2a 7a 54 62 6c 3b 20 20  st char *zTbl;  
25c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25d0: 4e 61 6d 65 20 6f 66 20 74 61 72 67 65 74 20 64  Name of target d
25e0: 62 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e  b table */.  con
25f0: 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61 54 62  st char *zDataTb
2600: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  l;           /* 
2610: 4e 61 6d 65 20 6f 66 20 72 62 75 20 64 62 20 74  Name of rbu db t
2620: 61 62 6c 65 20 28 6f 72 20 6e 75 6c 6c 29 20 2a  able (or null) *
2630: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2640: 7a 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  zIdx;           
2650: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2660: 61 72 67 65 74 20 64 62 20 69 6e 64 65 78 20 28  arget db index (
2670: 6f 72 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e  or null) */.  in
2680: 74 20 69 54 6e 75 6d 3b 20 20 20 20 20 20 20 20  t iTnum;        
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26a0: 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 63 75   Root page of cu
26b0: 72 72 65 6e 74 20 6f 62 6a 65 63 74 20 2a 2f 0a  rrent object */.
26c0: 20 20 69 6e 74 20 69 50 6b 54 6e 75 6d 3b 20 20    int iPkTnum;  
26d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e0: 20 20 2f 2a 20 49 66 20 65 54 79 70 65 3d 3d 45    /* If eType==E
26f0: 58 54 45 52 4e 41 4c 2c 20 72 6f 6f 74 20 6f 66  XTERNAL, root of
2700: 20 50 4b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69   PK index */.  i
2710: 6e 74 20 62 55 6e 69 71 75 65 3b 20 20 20 20 20  nt bUnique;     
2720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2730: 2a 20 43 75 72 72 65 6e 74 20 69 6e 64 65 78 20  * Current index 
2740: 69 73 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 69  is unique */.  i
2750: 6e 74 20 6e 49 6e 64 65 78 3b 20 20 20 20 20 20  nt nIndex;      
2760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2770: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 75 78 2e  * Number of aux.
2780: 20 69 6e 64 65 78 65 73 20 6f 6e 20 74 61 62 6c   indexes on tabl
2790: 65 20 7a 54 62 6c 20 2a 2f 0a 0a 20 20 2f 2a 20  e zTbl */..  /* 
27a0: 53 74 61 74 65 6d 65 6e 74 73 20 63 72 65 61 74  Statements creat
27b0: 65 64 20 62 79 20 72 62 75 4f 62 6a 49 74 65 72  ed by rbuObjIter
27c0: 50 72 65 70 61 72 65 41 6c 6c 28 29 20 2a 2f 0a  PrepareAll() */.
27d0: 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
27e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
2800: 6f 6c 75 6d 6e 73 20 69 6e 20 63 75 72 72 65 6e  olumns in curren
2810: 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71  t object */.  sq
2820: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 65 6c  lite3_stmt *pSel
2830: 65 63 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ect;          /*
2840: 20 53 6f 75 72 63 65 20 64 61 74 61 20 2a 2f 0a   Source data */.
2850: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
2860: 70 49 6e 73 65 72 74 3b 20 20 20 20 20 20 20 20  pInsert;        
2870: 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 66    /* Statement f
2880: 6f 72 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74  or INSERT operat
2890: 69 6f 6e 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ions */.  sqlite
28a0: 33 5f 73 74 6d 74 20 2a 70 44 65 6c 65 74 65 3b  3_stmt *pDelete;
28b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
28c0: 74 65 6d 65 6e 74 20 66 6f 72 20 44 45 4c 45 54  tement for DELET
28d0: 45 20 6f 70 73 20 2a 2f 0a 20 20 73 71 6c 69 74  E ops */.  sqlit
28e0: 65 33 5f 73 74 6d 74 20 2a 70 54 6d 70 49 6e 73  e3_stmt *pTmpIns
28f0: 65 72 74 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e  ert;       /* In
2900: 73 65 72 74 20 69 6e 74 6f 20 72 62 75 5f 74 6d  sert into rbu_tm
2910: 70 5f 24 7a 44 61 74 61 54 62 6c 20 2a 2f 0a 0a  p_$zDataTbl */..
2920: 20 20 2f 2a 20 4c 61 73 74 20 55 50 44 41 54 45    /* Last UPDATE
2930: 20 75 73 65 64 20 28 66 6f 72 20 50 4b 20 62 2d   used (for PK b-
2940: 74 72 65 65 20 75 70 64 61 74 65 73 20 6f 6e 6c  tree updates onl
2950: 79 29 2c 20 6f 72 20 4e 55 4c 4c 2e 20 2a 2f 0a  y), or NULL. */.
2960: 20 20 52 62 75 55 70 64 61 74 65 53 74 6d 74 20    RbuUpdateStmt 
2970: 2a 70 52 62 75 55 70 64 61 74 65 3b 0a 7d 3b 0a  *pRbuUpdate;.};.
2980: 0a 2f 2a 0a 2a 2a 20 56 61 6c 75 65 73 20 66 6f  ./*.** Values fo
2990: 72 20 52 62 75 4f 62 6a 49 74 65 72 2e 65 54 79  r RbuObjIter.eTy
29a0: 70 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20 30 3a 20  pe.**.**     0: 
29b0: 54 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65  Table does not e
29c0: 78 69 73 74 20 28 65 72 72 6f 72 29 0a 2a 2a 20  xist (error).** 
29d0: 20 20 20 20 31 3a 20 54 61 62 6c 65 20 68 61 73      1: Table has
29e0: 20 61 6e 20 69 6d 70 6c 69 63 69 74 20 72 6f 77   an implicit row
29f0: 69 64 2e 0a 2a 2a 20 20 20 20 20 32 3a 20 54 61  id..**     2: Ta
2a00: 62 6c 65 20 68 61 73 20 61 6e 20 65 78 70 6c 69  ble has an expli
2a10: 63 69 74 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e 0a  cit IPK column..
2a20: 2a 2a 20 20 20 20 20 33 3a 20 54 61 62 6c 65 20  **     3: Table 
2a30: 68 61 73 20 61 6e 20 65 78 74 65 72 6e 61 6c 20  has an external 
2a40: 50 4b 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 20  PK index..**    
2a50: 20 34 3a 20 54 61 62 6c 65 20 69 73 20 57 49 54   4: Table is WIT
2a60: 48 4f 55 54 20 52 4f 57 49 44 2e 0a 2a 2a 20 20  HOUT ROWID..**  
2a70: 20 20 20 35 3a 20 54 61 62 6c 65 20 69 73 20 61     5: Table is a
2a80: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
2a90: 2a 2f 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 50  */.#define RBU_P
2aa0: 4b 5f 4e 4f 54 41 42 4c 45 20 20 20 20 20 20 20  K_NOTABLE       
2ab0: 20 30 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 50   0.#define RBU_P
2ac0: 4b 5f 4e 4f 4e 45 20 20 20 20 20 20 20 20 20 20  K_NONE          
2ad0: 20 31 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 50   1.#define RBU_P
2ae0: 4b 5f 49 50 4b 20 20 20 20 20 20 20 20 20 20 20  K_IPK           
2af0: 20 32 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 50   2.#define RBU_P
2b00: 4b 5f 45 58 54 45 52 4e 41 4c 20 20 20 20 20 20  K_EXTERNAL      
2b10: 20 33 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 50   3.#define RBU_P
2b20: 4b 5f 57 49 54 48 4f 55 54 5f 52 4f 57 49 44 20  K_WITHOUT_ROWID 
2b30: 20 34 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 50   4.#define RBU_P
2b40: 4b 5f 56 54 41 42 20 20 20 20 20 20 20 20 20 20  K_VTAB          
2b50: 20 35 0a 0a 0a 2f 2a 0a 2a 2a 20 57 69 74 68 69   5.../*.** Withi
2b60: 6e 20 74 68 65 20 52 42 55 5f 53 54 41 47 45 5f  n the RBU_STAGE_
2b70: 4f 41 4c 20 73 74 61 67 65 2c 20 65 61 63 68 20  OAL stage, each 
2b80: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 72  call to sqlite3r
2b90: 62 75 5f 73 74 65 70 28 29 20 70 65 72 66 6f 72  bu_step() perfor
2ba0: 6d 73 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65  ms.** one of the
2bb0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61   following opera
2bc0: 74 69 6f 6e 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  tions..*/.#defin
2bd0: 65 20 52 42 55 5f 49 4e 53 45 52 54 20 20 20 20  e RBU_INSERT    
2be0: 20 31 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49   1          /* I
2bf0: 6e 73 65 72 74 20 6f 6e 20 61 20 6d 61 69 6e 20  nsert on a main 
2c00: 74 61 62 6c 65 20 62 2d 74 72 65 65 20 2a 2f 0a  table b-tree */.
2c10: 23 64 65 66 69 6e 65 20 52 42 55 5f 44 45 4c 45  #define RBU_DELE
2c20: 54 45 20 20 20 20 20 32 20 20 20 20 20 20 20 20  TE     2        
2c30: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 20 72 6f    /* Delete a ro
2c40: 77 20 66 72 6f 6d 20 61 20 6d 61 69 6e 20 74 61  w from a main ta
2c50: 62 6c 65 20 62 2d 74 72 65 65 20 2a 2f 0a 23 64  ble b-tree */.#d
2c60: 65 66 69 6e 65 20 52 42 55 5f 52 45 50 4c 41 43  efine RBU_REPLAC
2c70: 45 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20  E    3          
2c80: 2f 2a 20 44 65 6c 65 74 65 20 61 6e 64 20 74 68  /* Delete and th
2c90: 65 6e 20 69 6e 73 65 72 74 20 61 20 72 6f 77 20  en insert a row 
2ca0: 2a 2f 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 49  */.#define RBU_I
2cb0: 44 58 5f 44 45 4c 45 54 45 20 34 20 20 20 20 20  DX_DELETE 4     
2cc0: 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 61       /* Delete a
2cd0: 20 72 6f 77 20 66 72 6f 6d 20 61 6e 20 61 75 78   row from an aux
2ce0: 2e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 2a  . index b-tree *
2cf0: 2f 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 49 44  /.#define RBU_ID
2d00: 58 5f 49 4e 53 45 52 54 20 35 20 20 20 20 20 20  X_INSERT 5      
2d10: 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 6f 6e      /* Insert on
2d20: 20 61 6e 20 61 75 78 2e 20 69 6e 64 65 78 20 62   an aux. index b
2d30: 2d 74 72 65 65 20 2a 2f 0a 0a 23 64 65 66 69 6e  -tree */..#defin
2d40: 65 20 52 42 55 5f 55 50 44 41 54 45 20 20 20 20  e RBU_UPDATE    
2d50: 20 36 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55   6          /* U
2d60: 70 64 61 74 65 20 61 20 72 6f 77 20 69 6e 20 61  pdate a row in a
2d70: 20 6d 61 69 6e 20 74 61 62 6c 65 20 62 2d 74 72   main table b-tr
2d80: 65 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 20 73  ee */../*.** A s
2d90: 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e  ingle step of an
2da0: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 63 68 65   incremental che
2db0: 63 6b 70 6f 69 6e 74 20 2d 20 66 72 61 6d 65 20  ckpoint - frame 
2dc0: 69 57 61 6c 46 72 61 6d 65 20 6f 66 20 74 68 65  iWalFrame of the
2dd0: 20 77 61 6c 0a 2a 2a 20 66 69 6c 65 20 73 68 6f   wal.** file sho
2de0: 75 6c 64 20 62 65 20 63 6f 70 69 65 64 20 74 6f  uld be copied to
2df0: 20 70 61 67 65 20 69 44 62 50 61 67 65 20 6f 66   page iDbPage of
2e00: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2e10: 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 52 62  le..*/.struct Rb
2e20: 75 46 72 61 6d 65 20 7b 0a 20 20 75 33 32 20 69  uFrame {.  u32 i
2e30: 44 62 50 61 67 65 3b 0a 20 20 75 33 32 20 69 57  DbPage;.  u32 iW
2e40: 61 6c 46 72 61 6d 65 3b 0a 7d 3b 0a 0a 2f 2a 0a  alFrame;.};../*.
2e50: 2a 2a 20 52 42 55 20 68 61 6e 64 6c 65 2e 0a 2a  ** RBU handle..*
2e60: 2a 0a 2a 2a 20 6e 50 68 61 73 65 4f 6e 65 53 74  *.** nPhaseOneSt
2e70: 65 70 3a 0a 2a 2a 20 20 20 49 66 20 74 68 65 20  ep:.**   If the 
2e80: 52 42 55 20 64 61 74 61 62 61 73 65 20 63 6f 6e  RBU database con
2e90: 74 61 69 6e 73 20 61 6e 20 72 62 75 5f 63 6f 75  tains an rbu_cou
2ea0: 6e 74 20 74 61 62 6c 65 2c 20 74 68 69 73 20 76  nt table, this v
2eb0: 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f 0a 2a  alue is set to.*
2ec0: 2a 20 20 20 61 20 72 75 6e 6e 69 6e 67 20 65 73  *   a running es
2ed0: 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75  timate of the nu
2ee0: 6d 62 65 72 20 6f 66 20 62 2d 74 72 65 65 20 6f  mber of b-tree o
2ef0: 70 65 72 61 74 69 6f 6e 73 20 72 65 71 75 69 72  perations requir
2f00: 65 64 20 74 6f 20 0a 2a 2a 20 20 20 66 69 6e 69  ed to .**   fini
2f10: 73 68 20 70 6f 70 75 6c 61 74 69 6e 67 20 74 68  sh populating th
2f20: 65 20 2a 2d 6f 61 6c 20 66 69 6c 65 2e 20 54 68  e *-oal file. Th
2f30: 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 73 71  is allows the sq
2f40: 6c 69 74 65 33 5f 62 70 5f 70 72 6f 67 72 65 73  lite3_bp_progres
2f50: 73 28 29 0a 2a 2a 20 20 20 41 50 49 20 74 6f 20  s().**   API to 
2f60: 63 61 6c 63 75 6c 61 74 65 20 74 68 65 20 70 65  calculate the pe
2f70: 72 6d 79 72 69 61 64 61 67 65 20 70 72 6f 67 72  rmyriadage progr
2f80: 65 73 73 20 6f 66 20 70 6f 70 75 6c 61 74 69 6e  ess of populatin
2f90: 67 20 74 68 65 20 2a 2d 6f 61 6c 20 66 69 6c 65  g the *-oal file
2fa0: 0a 2a 2a 20 20 20 75 73 69 6e 67 20 74 68 65 20  .**   using the 
2fb0: 66 6f 72 6d 75 6c 61 3a 0a 2a 2a 0a 2a 2a 20 20  formula:.**.**  
2fc0: 20 20 20 70 65 72 6d 79 72 69 61 64 61 67 65 20     permyriadage 
2fd0: 3d 20 28 31 30 30 30 30 20 2a 20 6e 50 72 6f 67  = (10000 * nProg
2fe0: 72 65 73 73 29 20 2f 20 6e 50 68 61 73 65 4f 6e  ress) / nPhaseOn
2ff0: 65 53 74 65 70 0a 2a 2a 0a 2a 2a 20 20 20 6e 50  eStep.**.**   nP
3000: 68 61 73 65 4f 6e 65 53 74 65 70 20 69 73 20 69  haseOneStep is i
3010: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 74 68  nitialized to th
3020: 65 20 73 75 6d 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20  e sum of:.**.** 
3030: 20 20 20 20 6e 52 6f 77 20 2a 20 28 6e 49 6e 64      nRow * (nInd
3040: 65 78 20 2b 20 31 29 0a 2a 2a 0a 2a 2a 20 20 20  ex + 1).**.**   
3050: 66 6f 72 20 61 6c 6c 20 73 6f 75 72 63 65 20 74  for all source t
3060: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 52 42 55  ables in the RBU
3070: 20 64 61 74 61 62 61 73 65 2c 20 77 68 65 72 65   database, where
3080: 20 6e 52 6f 77 20 69 73 20 74 68 65 20 6e 75 6d   nRow is the num
3090: 62 65 72 0a 2a 2a 20 20 20 6f 66 20 72 6f 77 73  ber.**   of rows
30a0: 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65 20 74   in the source t
30b0: 61 62 6c 65 20 61 6e 64 20 6e 49 6e 64 65 78 20  able and nIndex 
30c0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  the number of in
30d0: 64 65 78 65 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  dexes on the.** 
30e0: 20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20    corresponding 
30f0: 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20  target database 
3100: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 54  table..**.**   T
3110: 68 69 73 20 65 73 74 69 6d 61 74 65 20 69 73 20  his estimate is 
3120: 61 63 63 75 72 61 74 65 20 69 66 20 74 68 65 20  accurate if the 
3130: 52 42 55 20 75 70 64 61 74 65 20 63 6f 6e 73 69  RBU update consi
3140: 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 0a  sts entirely of.
3150: 2a 2a 20 20 20 49 4e 53 45 52 54 20 6f 70 65 72  **   INSERT oper
3160: 61 74 69 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c  ations. However,
3170: 20 69 74 20 69 73 20 69 6e 61 63 63 75 72 61 74   it is inaccurat
3180: 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  e if:.**.**     
3190: 2a 20 74 68 65 20 52 42 55 20 75 70 64 61 74 65  * the RBU update
31a0: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 55 50   contains any UP
31b0: 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e  DATE operations.
31c0: 20 49 66 20 74 68 65 20 50 4b 20 73 70 65 63 69   If the PK speci
31d0: 66 69 65 64 0a 2a 2a 20 20 20 20 20 20 20 66 6f  fied.**       fo
31e0: 72 20 61 6e 20 55 50 44 41 54 45 20 6f 70 65 72  r an UPDATE oper
31f0: 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65  ation does not e
3200: 78 69 73 74 20 69 6e 20 74 68 65 20 74 61 72 67  xist in the targ
3210: 65 74 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a  et table, then.*
3220: 2a 20 20 20 20 20 20 20 6e 6f 20 62 2d 74 72 65  *       no b-tre
3230: 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65  e operations are
3240: 20 72 65 71 75 69 72 65 64 20 6f 6e 20 69 6e 64   required on ind
3250: 65 78 20 62 2d 74 72 65 65 73 2e 20 4f 72 20 69  ex b-trees. Or i
3260: 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20  f the .**       
3270: 73 70 65 63 69 66 69 65 64 20 50 4b 20 64 6f 65  specified PK doe
3280: 73 20 65 78 69 73 74 2c 20 74 68 65 6e 20 28 6e  s exist, then (n
3290: 49 6e 64 65 78 2a 32 29 20 73 75 63 68 20 6f 70  Index*2) such op
32a0: 65 72 61 74 69 6f 6e 73 20 61 72 65 0a 2a 2a 20  erations are.** 
32b0: 20 20 20 20 20 20 72 65 71 75 69 72 65 64 20 28        required (
32c0: 6f 6e 65 20 64 65 6c 65 74 65 20 61 6e 64 20 6f  one delete and o
32d0: 6e 65 20 69 6e 73 65 72 74 20 6f 6e 20 65 61 63  ne insert on eac
32e0: 68 20 69 6e 64 65 78 20 62 2d 74 72 65 65 29 2e  h index b-tree).
32f0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 74 68 65  .**.**     * the
3300: 20 52 42 55 20 75 70 64 61 74 65 20 63 6f 6e 74   RBU update cont
3310: 61 69 6e 73 20 61 6e 79 20 44 45 4c 45 54 45 20  ains any DELETE 
3320: 6f 70 65 72 61 74 69 6f 6e 73 20 66 6f 72 20 77  operations for w
3330: 68 69 63 68 20 74 68 65 20 73 70 65 63 69 66 69  hich the specifi
3340: 65 64 0a 2a 2a 20 20 20 20 20 20 20 50 4b 20 64  ed.**       PK d
3350: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 49  oes not exist. I
3360: 6e 20 74 68 69 73 20 63 61 73 65 20 6e 6f 20 6f  n this case no o
3370: 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20 72 65  perations are re
3380: 71 75 69 72 65 64 20 6f 6e 20 69 6e 64 65 78 0a  quired on index.
3390: 2a 2a 20 20 20 20 20 20 20 62 2d 74 72 65 65 73  **       b-trees
33a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 74 68  ..**.**     * th
33b0: 65 20 52 42 55 20 75 70 64 61 74 65 20 63 6f 6e  e RBU update con
33c0: 74 61 69 6e 73 20 52 45 50 4c 41 43 45 20 6f 70  tains REPLACE op
33d0: 65 72 61 74 69 6f 6e 73 2e 20 54 68 65 73 65 20  erations. These 
33e0: 61 72 65 20 73 69 6d 69 6c 61 72 20 74 6f 0a 2a  are similar to.*
33f0: 2a 20 20 20 20 20 20 20 55 50 44 41 54 45 20 6f  *       UPDATE o
3400: 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  perations..**.**
3410: 20 20 20 6e 50 68 61 73 65 4f 6e 65 53 74 65 70     nPhaseOneStep
3420: 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 61   is updated to a
3430: 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 63  ccount for the c
3440: 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20  onditions above 
3450: 64 75 72 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20  during the.**   
3460: 66 69 72 73 74 20 70 61 73 73 20 6f 66 20 65 61  first pass of ea
3470: 63 68 20 73 6f 75 72 63 65 20 74 61 62 6c 65 2e  ch source table.
3480: 20 54 68 65 20 75 70 64 61 74 65 64 20 6e 50 68   The updated nPh
3490: 61 73 65 4f 6e 65 53 74 65 70 20 76 61 6c 75 65  aseOneStep value
34a0: 20 69 73 0a 2a 2a 20 20 20 73 74 6f 72 65 64 20   is.**   stored 
34b0: 69 6e 20 74 68 65 20 72 62 75 5f 73 74 61 74 65  in the rbu_state
34c0: 20 74 61 62 6c 65 20 69 66 20 74 68 65 20 52 42   table if the RB
34d0: 55 20 75 70 64 61 74 65 20 69 73 20 73 75 73 70  U update is susp
34e0: 65 6e 64 65 64 2e 0a 2a 2f 0a 73 74 72 75 63 74  ended..*/.struct
34f0: 20 73 71 6c 69 74 65 33 72 62 75 20 7b 0a 20 20   sqlite3rbu {.  
3500: 69 6e 74 20 65 53 74 61 67 65 3b 20 20 20 20 20  int eStage;     
3510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3520: 2f 2a 20 56 61 6c 75 65 20 6f 66 20 52 42 55 5f  /* Value of RBU_
3530: 53 54 41 54 45 5f 53 54 41 47 45 20 66 69 65 6c  STATE_STAGE fiel
3540: 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  d */.  sqlite3 *
3550: 64 62 4d 61 69 6e 3b 20 20 20 20 20 20 20 20 20  dbMain;         
3560: 20 20 20 20 20 20 20 2f 2a 20 74 61 72 67 65 74         /* target
3570: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
3580: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
3590: 62 52 62 75 3b 20 20 20 20 20 20 20 20 20 20 20  bRbu;           
35a0: 20 20 20 20 20 20 2f 2a 20 72 62 75 20 64 61 74        /* rbu dat
35b0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
35c0: 20 20 63 68 61 72 20 2a 7a 54 61 72 67 65 74 3b    char *zTarget;
35d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35e0: 20 20 2f 2a 20 50 61 74 68 20 74 6f 20 74 61 72    /* Path to tar
35f0: 67 65 74 20 64 62 20 2a 2f 0a 20 20 63 68 61 72  get db */.  char
3600: 20 2a 7a 52 62 75 3b 20 20 20 20 20 20 20 20 20   *zRbu;         
3610: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
3620: 61 74 68 20 74 6f 20 72 62 75 20 64 62 20 2a 2f  ath to rbu db */
3630: 0a 20 20 63 68 61 72 20 2a 7a 53 74 61 74 65 3b  .  char *zState;
3640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3650: 20 20 20 2f 2a 20 50 61 74 68 20 74 6f 20 73 74     /* Path to st
3660: 61 74 65 20 64 62 20 28 6f 72 20 4e 55 4c 4c 20  ate db (or NULL 
3670: 69 66 20 7a 52 62 75 29 20 2a 2f 0a 20 20 63 68  if zRbu) */.  ch
3680: 61 72 20 7a 53 74 61 74 65 44 62 5b 35 5d 3b 20  ar zStateDb[5]; 
3690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36a0: 20 44 62 20 6e 61 6d 65 20 66 6f 72 20 73 74 61   Db name for sta
36b0: 74 65 20 28 22 73 74 61 74 22 20 6f 72 20 22 6d  te ("stat" or "m
36c0: 61 69 6e 22 29 20 2a 2f 0a 20 20 69 6e 74 20 72  ain") */.  int r
36d0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
36e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
36f0: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
3700: 6c 61 73 74 20 72 62 75 5f 73 74 65 70 28 29 20  last rbu_step() 
3710: 63 61 6c 6c 20 2a 2f 0a 20 20 63 68 61 72 20 2a  call */.  char *
3720: 7a 45 72 72 6d 73 67 3b 20 20 20 20 20 20 20 20  zErrmsg;        
3730: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72            /* Err
3740: 6f 72 20 6d 65 73 73 61 67 65 20 69 66 20 72 63  or message if rc
3750: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 2a 2f 0a 20  !=SQLITE_OK */. 
3760: 20 69 6e 74 20 6e 53 74 65 70 3b 20 20 20 20 20   int nStep;     
3770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3780: 20 2f 2a 20 52 6f 77 73 20 70 72 6f 63 65 73 73   /* Rows process
3790: 65 64 20 66 6f 72 20 63 75 72 72 65 6e 74 20 6f  ed for current o
37a0: 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  bject */.  int n
37b0: 50 72 6f 67 72 65 73 73 3b 20 20 20 20 20 20 20  Progress;       
37c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
37d0: 77 73 20 70 72 6f 63 65 73 73 65 64 20 66 6f 72  ws processed for
37e0: 20 61 6c 6c 20 6f 62 6a 65 63 74 73 20 2a 2f 0a   all objects */.
37f0: 20 20 52 62 75 4f 62 6a 49 74 65 72 20 6f 62 6a    RbuObjIter obj
3800: 69 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  iter;           
3810: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f    /* Iterator fo
3820: 72 20 73 6b 69 70 70 69 6e 67 20 74 68 72 6f 75  r skipping throu
3830: 67 68 20 74 62 6c 2f 69 64 78 20 2a 2f 0a 20 20  gh tbl/idx */.  
3840: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73  const char *zVfs
3850: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
3860: 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 75 74 6f 6d  /* Name of autom
3870: 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64  atically created
3880: 20 72 62 75 20 76 66 73 20 2a 2f 0a 20 20 72 62   rbu vfs */.  rb
3890: 75 5f 66 69 6c 65 20 2a 70 54 61 72 67 65 74 46  u_file *pTargetF
38a0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d;            /*
38b0: 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 6f 70 65   File handle ope
38c0: 6e 20 6f 6e 20 74 61 72 67 65 74 20 64 62 20 2a  n on target db *
38d0: 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 50 65 72  /.  int nPagePer
38e0: 53 65 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20  Sector;         
38f0: 20 20 20 20 2f 2a 20 50 61 67 65 73 20 70 65 72      /* Pages per
3900: 20 73 65 63 74 6f 72 20 66 6f 72 20 70 54 61 72   sector for pTar
3910: 67 65 74 46 64 20 2a 2f 0a 20 20 69 36 34 20 69  getFd */.  i64 i
3920: 4f 61 6c 53 7a 3b 0a 20 20 69 36 34 20 6e 50 68  OalSz;.  i64 nPh
3930: 61 73 65 4f 6e 65 53 74 65 70 3b 0a 0a 20 20 2f  aseOneStep;..  /
3940: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
3950: 73 74 61 74 65 20 76 61 72 69 61 62 6c 65 73 20  state variables 
3960: 61 72 65 20 75 73 65 64 20 61 73 20 70 61 72 74  are used as part
3970: 20 6f 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e   of the incremen
3980: 74 61 6c 0a 20 20 2a 2a 20 63 68 65 63 6b 70 6f  tal.  ** checkpo
3990: 69 6e 74 20 73 74 61 67 65 20 28 65 53 74 61 67  int stage (eStag
39a0: 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 43 4b 50  e==RBU_STAGE_CKP
39b0: 54 29 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  T). See comments
39c0: 20 73 75 72 72 6f 75 6e 64 69 6e 67 0a 20 20 2a   surrounding.  *
39d0: 2a 20 66 75 6e 63 74 69 6f 6e 20 72 62 75 53 65  * function rbuSe
39e0: 74 75 70 43 68 65 63 6b 70 6f 69 6e 74 28 29 20  tupCheckpoint() 
39f0: 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 20 2a 2f  for details.  */
3a00: 0a 20 20 75 33 32 20 69 4d 61 78 46 72 61 6d 65  .  u32 iMaxFrame
3a10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3a20: 20 20 20 2f 2a 20 4c 61 72 67 65 73 74 20 69 57     /* Largest iW
3a30: 61 6c 46 72 61 6d 65 20 76 61 6c 75 65 20 69 6e  alFrame value in
3a40: 20 61 46 72 61 6d 65 5b 5d 20 2a 2f 0a 20 20 75   aFrame[] */.  u
3a50: 33 32 20 6d 4c 6f 63 6b 3b 0a 20 20 69 6e 74 20  32 mLock;.  int 
3a60: 6e 46 72 61 6d 65 3b 20 20 20 20 20 20 20 20 20  nFrame;         
3a70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
3a80: 6e 74 72 69 65 73 20 69 6e 20 61 46 72 61 6d 65  ntries in aFrame
3a90: 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e  [] array */.  in
3aa0: 74 20 6e 46 72 61 6d 65 41 6c 6c 6f 63 3b 20 20  t nFrameAlloc;  
3ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3ac0: 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20   Allocated size 
3ad0: 6f 66 20 61 46 72 61 6d 65 5b 5d 20 61 72 72 61  of aFrame[] arra
3ae0: 79 20 2a 2f 0a 20 20 52 62 75 46 72 61 6d 65 20  y */.  RbuFrame 
3af0: 2a 61 46 72 61 6d 65 3b 0a 20 20 69 6e 74 20 70  *aFrame;.  int p
3b00: 67 73 7a 3b 0a 20 20 75 38 20 2a 61 42 75 66 3b  gsz;.  u8 *aBuf;
3b10: 0a 20 20 69 36 34 20 69 57 61 6c 43 6b 73 75 6d  .  i64 iWalCksum
3b20: 3b 0a 20 20 69 36 34 20 73 7a 54 65 6d 70 3b 20  ;.  i64 szTemp; 
3b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b40: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73      /* Current s
3b50: 69 7a 65 20 6f 66 20 61 6c 6c 20 74 65 6d 70 20  ize of all temp 
3b60: 66 69 6c 65 73 20 69 6e 20 75 73 65 20 2a 2f 0a  files in use */.
3b70: 20 20 69 36 34 20 73 7a 54 65 6d 70 4c 69 6d 69    i64 szTempLimi
3b80: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
3b90: 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
3ba0: 6c 69 6d 69 74 20 66 6f 72 20 74 65 6d 70 20 66  limit for temp f
3bb0: 69 6c 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 55 73  iles */..  /* Us
3bc0: 65 64 20 69 6e 20 52 42 55 20 76 61 63 75 75 6d  ed in RBU vacuum
3bd0: 20 6d 6f 64 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20   mode only */.  
3be0: 69 6e 74 20 6e 52 62 75 3b 20 20 20 20 20 20 20  int nRbu;       
3bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c00: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 42 55  /* Number of RBU
3c10: 20 56 46 53 20 69 6e 20 74 68 65 20 73 74 61 63   VFS in the stac
3c20: 6b 20 2a 2f 0a 20 20 72 62 75 5f 66 69 6c 65 20  k */.  rbu_file 
3c30: 2a 70 52 62 75 46 64 3b 20 20 20 20 20 20 20 20  *pRbuFd;        
3c40: 20 20 20 20 20 20 20 2f 2a 20 46 64 20 66 6f 72         /* Fd for
3c50: 20 6d 61 69 6e 20 64 62 20 6f 66 20 64 62 52 62   main db of dbRb
3c60: 75 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  u */.};../*.** A
3c70: 6e 20 72 62 75 20 56 46 53 20 69 73 20 69 6d 70  n rbu VFS is imp
3c80: 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 61  lemented using a
3c90: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
3ca0: 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  is structure..**
3cb0: 0a 2a 2a 20 56 61 72 69 61 62 6c 65 20 70 52 62  .** Variable pRb
3cc0: 75 20 69 73 20 6f 6e 6c 79 20 6e 6f 6e 2d 4e 55  u is only non-NU
3cd0: 4c 4c 20 66 6f 72 20 61 75 74 6f 6d 61 74 69 63  LL for automatic
3ce0: 61 6c 6c 79 20 63 72 65 61 74 65 64 20 52 42 55  ally created RBU
3cf0: 20 56 46 53 20 6f 62 6a 65 63 74 73 2e 0a 2a 2a   VFS objects..**
3d00: 20 49 74 20 69 73 20 4e 55 4c 4c 20 66 6f 72 20   It is NULL for 
3d10: 52 42 55 20 56 46 53 20 6f 62 6a 65 63 74 73 20  RBU VFS objects 
3d20: 63 72 65 61 74 65 64 20 65 78 70 6c 69 63 69 74  created explicit
3d30: 6c 79 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69  ly using.** sqli
3d40: 74 65 33 72 62 75 5f 63 72 65 61 74 65 5f 76 66  te3rbu_create_vf
3d50: 73 28 29 2e 20 49 74 20 69 73 20 75 73 65 64 20  s(). It is used 
3d60: 74 6f 20 74 72 61 63 6b 20 74 68 65 20 74 6f 74  to track the tot
3d70: 61 6c 20 61 6d 6f 75 6e 74 20 6f 66 20 74 65 6d  al amount of tem
3d80: 70 0a 2a 2a 20 73 70 61 63 65 20 75 73 65 64 20  p.** space used 
3d90: 62 79 20 74 68 65 20 52 42 55 20 68 61 6e 64 6c  by the RBU handl
3da0: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 72 62 75  e..*/.struct rbu
3db0: 5f 76 66 73 20 7b 0a 20 20 73 71 6c 69 74 65 33  _vfs {.  sqlite3
3dc0: 5f 76 66 73 20 62 61 73 65 3b 20 20 20 20 20 20  _vfs base;      
3dd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 72 62 75 20           /* rbu 
3de0: 56 46 53 20 73 68 69 6d 20 6d 65 74 68 6f 64 73  VFS shim methods
3df0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66   */.  sqlite3_vf
3e00: 73 20 2a 70 52 65 61 6c 56 66 73 3b 20 20 20 20  s *pRealVfs;    
3e10: 20 20 20 20 20 20 2f 2a 20 55 6e 64 65 72 6c 79        /* Underly
3e20: 69 6e 67 20 56 46 53 20 2a 2f 0a 20 20 73 71 6c  ing VFS */.  sql
3e30: 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
3e40: 78 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x;           /* 
3e50: 4d 75 74 65 78 20 74 6f 20 70 72 6f 74 65 63 74  Mutex to protect
3e60: 20 70 4d 61 69 6e 20 2a 2f 0a 20 20 73 71 6c 69   pMain */.  sqli
3e70: 74 65 33 72 62 75 20 2a 70 52 62 75 3b 20 20 20  te3rbu *pRbu;   
3e80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
3e90: 77 6e 65 72 20 52 42 55 20 6f 62 6a 65 63 74 20  wner RBU object 
3ea0: 2a 2f 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70  */.  rbu_file *p
3eb0: 4d 61 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20  Main;           
3ec0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
3ed0: 6d 61 69 6e 20 64 62 20 66 69 6c 65 73 20 2a 2f  main db files */
3ee0: 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 4d 61  .  rbu_file *pMa
3ef0: 69 6e 52 62 75 3b 20 20 20 20 20 20 20 20 20 20  inRbu;          
3f00: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6d 61     /* List of ma
3f10: 69 6e 20 64 62 20 66 69 6c 65 73 20 77 69 74 68  in db files with
3f20: 20 70 52 62 75 21 3d 30 20 2a 2f 0a 7d 3b 0a 0a   pRbu!=0 */.};..
3f30: 2f 2a 0a 2a 2a 20 45 61 63 68 20 66 69 6c 65 20  /*.** Each file 
3f40: 6f 70 65 6e 65 64 20 62 79 20 61 6e 20 72 62 75  opened by an rbu
3f50: 20 56 46 53 20 69 73 20 72 65 70 72 65 73 65 6e   VFS is represen
3f60: 74 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61 6e  ted by an instan
3f70: 63 65 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 6c  ce of.** the fol
3f80: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
3f90: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
3fa0: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  is a temporary f
3fb0: 69 6c 65 20 28 70 52 62 75 21 3d 30 20 26 26 20  ile (pRbu!=0 && 
3fc0: 66 6c 61 67 73 26 44 45 4c 45 54 45 5f 4f 4e 5f  flags&DELETE_ON_
3fd0: 43 4c 4f 53 45 29 2c 20 76 61 72 69 61 62 6c 65  CLOSE), variable
3fe0: 0a 2a 2a 20 22 73 7a 22 20 69 73 20 73 65 74 20  .** "sz" is set 
3ff0: 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  to the current s
4000: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
4010: 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 72  ase file..*/.str
4020: 75 63 74 20 72 62 75 5f 66 69 6c 65 20 7b 0a 20  uct rbu_file {. 
4030: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 62 61   sqlite3_file ba
4040: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
4050: 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65   /* sqlite3_file
4060: 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 20 20 73 71   methods */.  sq
4070: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 52 65 61  lite3_file *pRea
4080: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  l;            /*
4090: 20 55 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65   Underlying file
40a0: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 72 62 75   handle */.  rbu
40b0: 5f 76 66 73 20 2a 70 52 62 75 56 66 73 3b 20 20  _vfs *pRbuVfs;  
40c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
40d0: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72  Pointer to the r
40e0: 62 75 5f 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f  bu_vfs object */
40f0: 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70  .  sqlite3rbu *p
4100: 52 62 75 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rbu;            
4110: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
4120: 20 72 62 75 20 6f 62 6a 65 63 74 20 28 72 62 75   rbu object (rbu
4130: 20 74 61 72 67 65 74 20 6f 6e 6c 79 29 20 2a 2f   target only) */
4140: 0a 20 20 69 36 34 20 73 7a 3b 20 20 20 20 20 20  .  i64 sz;      
4150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4160: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 66 69     /* Size of fi
4170: 6c 65 20 69 6e 20 62 79 74 65 73 20 28 74 65 6d  le in bytes (tem
4180: 70 20 6f 6e 6c 79 29 20 2a 2f 0a 0a 20 20 69 6e  p only) */..  in
4190: 74 20 6f 70 65 6e 46 6c 61 67 73 3b 20 20 20 20  t openFlags;    
41a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
41b0: 20 46 6c 61 67 73 20 74 68 69 73 20 66 69 6c 65   Flags this file
41c0: 20 77 61 73 20 6f 70 65 6e 65 64 20 77 69 74 68   was opened with
41d0: 20 2a 2f 0a 20 20 75 33 32 20 69 43 6f 6f 6b 69   */.  u32 iCooki
41e0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
41f0: 20 20 20 20 20 20 2f 2a 20 43 6f 6f 6b 69 65 20        /* Cookie 
4200: 76 61 6c 75 65 20 66 6f 72 20 6d 61 69 6e 20 64  value for main d
4210: 62 20 66 69 6c 65 73 20 2a 2f 0a 20 20 75 38 20  b files */.  u8 
4220: 69 57 72 69 74 65 56 65 72 3b 20 20 20 20 20 20  iWriteVer;      
4230: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4240: 22 77 72 69 74 65 2d 76 65 72 73 69 6f 6e 22 20  "write-version" 
4250: 76 61 6c 75 65 20 66 6f 72 20 6d 61 69 6e 20 64  value for main d
4260: 62 20 66 69 6c 65 73 20 2a 2f 0a 20 20 75 38 20  b files */.  u8 
4270: 62 4e 6f 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20  bNolock;        
4280: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4290: 54 72 75 65 20 74 6f 20 66 61 69 6c 20 45 58 43  True to fail EXC
42a0: 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 2a 2f 0a  LUSIVE locks */.
42b0: 0a 20 20 69 6e 74 20 6e 53 68 6d 3b 20 20 20 20  .  int nShm;    
42c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42d0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
42e0: 65 6e 74 72 69 65 73 20 69 6e 20 61 70 53 68 6d  entries in apShm
42f0: 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 63 68  [] array */.  ch
4300: 61 72 20 2a 2a 61 70 53 68 6d 3b 20 20 20 20 20  ar **apShm;     
4310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4320: 20 41 72 72 61 79 20 6f 66 20 6d 6d 61 70 27 64   Array of mmap'd
4330: 20 2a 2d 73 68 6d 20 72 65 67 69 6f 6e 73 20 2a   *-shm regions *
4340: 2f 0a 20 20 63 68 61 72 20 2a 7a 44 65 6c 3b 20  /.  char *zDel; 
4350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4360: 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68      /* Delete th
4370: 69 73 20 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20  is when closing 
4380: 66 69 6c 65 20 2a 2f 0a 0a 20 20 63 6f 6e 73 74  file */..  const
4390: 20 63 68 61 72 20 2a 7a 57 61 6c 3b 20 20 20 20   char *zWal;    
43a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 61             /* Wa
43b0: 6c 20 66 69 6c 65 6e 61 6d 65 20 66 6f 72 20 74  l filename for t
43c0: 68 69 73 20 6d 61 69 6e 20 64 62 20 66 69 6c 65  his main db file
43d0: 20 2a 2f 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a   */.  rbu_file *
43e0: 70 57 61 6c 46 64 3b 20 20 20 20 20 20 20 20 20  pWalFd;         
43f0: 20 20 20 20 20 20 2f 2a 20 57 61 6c 20 66 69 6c        /* Wal fil
4400: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
4410: 20 74 68 69 73 20 6d 61 69 6e 20 64 62 20 2a 2f   this main db */
4420: 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 4d 61  .  rbu_file *pMa
4430: 69 6e 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20  inNext;         
4440: 20 20 20 2f 2a 20 4e 65 78 74 20 4d 41 49 4e 5f     /* Next MAIN_
4450: 44 42 20 66 69 6c 65 20 2a 2f 0a 20 20 72 62 75  DB file */.  rbu
4460: 5f 66 69 6c 65 20 2a 70 4d 61 69 6e 52 62 75 4e  _file *pMainRbuN
4470: 65 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ext;         /* 
4480: 4e 65 78 74 20 4d 41 49 4e 5f 44 42 20 66 69 6c  Next MAIN_DB fil
4490: 65 20 77 69 74 68 20 70 52 62 75 21 3d 30 20 2a  e with pRbu!=0 *
44a0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 65  /.};../*.** True
44b0: 20 66 6f 72 20 61 6e 20 52 42 55 20 76 61 63 75   for an RBU vacu
44c0: 75 6d 20 68 61 6e 64 6c 65 2c 20 6f 72 20 66 61  um handle, or fa
44d0: 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  lse otherwise..*
44e0: 2f 0a 23 64 65 66 69 6e 65 20 72 62 75 49 73 56  /.#define rbuIsV
44f0: 61 63 75 75 6d 28 70 29 20 28 28 70 29 2d 3e 7a  acuum(p) ((p)->z
4500: 54 61 72 67 65 74 3d 3d 30 29 0a 0a 0a 2f 2a 2a  Target==0).../**
4510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4550: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66  *******.** The f
4560: 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 66  ollowing three f
4570: 75 6e 63 74 69 6f 6e 73 2c 20 66 6f 75 6e 64 20  unctions, found 
4580: 62 65 6c 6f 77 3a 0a 2a 2a 0a 2a 2a 20 20 20 72  below:.**.**   r
4590: 62 75 44 65 6c 74 61 47 65 74 49 6e 74 28 29 0a  buDeltaGetInt().
45a0: 2a 2a 20 20 20 72 62 75 44 65 6c 74 61 43 68 65  **   rbuDeltaChe
45b0: 63 6b 73 75 6d 28 29 0a 2a 2a 20 20 20 72 62 75  cksum().**   rbu
45c0: 44 65 6c 74 61 41 70 70 6c 79 28 29 0a 2a 2a 0a  DeltaApply().**.
45d0: 2a 2a 20 61 72 65 20 6c 69 66 74 65 64 20 66 72  ** are lifted fr
45e0: 6f 6d 20 74 68 65 20 66 6f 73 73 69 6c 20 73 6f  om the fossil so
45f0: 75 72 63 65 20 63 6f 64 65 20 28 68 74 74 70 3a  urce code (http:
4600: 2f 2f 66 6f 73 73 69 6c 2d 73 63 6d 2e 6f 72 67  //fossil-scm.org
4610: 29 2e 20 54 68 65 79 0a 2a 2a 20 61 72 65 20 75  ). They.** are u
4620: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
4630: 20 74 68 65 20 73 63 61 6c 61 72 20 53 51 4c 20   the scalar SQL 
4640: 66 75 6e 63 74 69 6f 6e 20 72 62 75 5f 66 6f 73  function rbu_fos
4650: 73 69 6c 5f 64 65 6c 74 61 28 29 2e 0a 2a 2f 0a  sil_delta()..*/.
4660: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 62 79 74 65  ./*.** Read byte
4670: 73 20 66 72 6f 6d 20 2a 70 7a 20 61 6e 64 20 63  s from *pz and c
4680: 6f 6e 76 65 72 74 20 74 68 65 6d 20 69 6e 74 6f  onvert them into
4690: 20 61 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65   a positive inte
46a0: 67 65 72 2e 20 20 57 68 65 6e 0a 2a 2a 20 66 69  ger.  When.** fi
46b0: 6e 69 73 68 65 64 2c 20 6c 65 61 76 65 20 2a 70  nished, leave *p
46c0: 7a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  z pointing to th
46d0: 65 20 66 69 72 73 74 20 63 68 61 72 61 63 74 65  e first characte
46e0: 72 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  r past the end o
46f0: 66 0a 2a 2a 20 74 68 65 20 69 6e 74 65 67 65 72  f.** the integer
4700: 2e 20 20 54 68 65 20 2a 70 4c 65 6e 20 70 61 72  .  The *pLen par
4710: 61 6d 65 74 65 72 20 68 6f 6c 64 73 20 74 68 65  ameter holds the
4720: 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73   length of the s
4730: 74 72 69 6e 67 0a 2a 2a 20 69 6e 20 2a 70 7a 20  tring.** in *pz 
4740: 61 6e 64 20 69 73 20 64 65 63 72 65 6d 65 6e 74  and is decrement
4750: 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
4760: 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 74 68   character in th
4770: 65 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74  e integer..*/.st
4780: 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e  atic unsigned in
4790: 74 20 72 62 75 44 65 6c 74 61 47 65 74 49 6e 74  t rbuDeltaGetInt
47a0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a  (const char **pz
47b0: 2c 20 69 6e 74 20 2a 70 4c 65 6e 29 7b 0a 20 20  , int *pLen){.  
47c0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 69 67  static const sig
47d0: 6e 65 64 20 63 68 61 72 20 7a 56 61 6c 75 65 5b  ned char zValue[
47e0: 5d 20 3d 20 7b 0a 20 20 20 20 2d 31 2c 20 2d 31  ] = {.    -1, -1
47f0: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  , -1, -1, -1, -1
4800: 2c 20 2d 31 2c 20 2d 31 2c 20 20 20 2d 31 2c 20  , -1, -1,   -1, 
4810: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
4820: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 0a 20 20 20 20  -1, -1, -1,.    
4830: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
4840: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
4850: 20 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31    -1, -1, -1, -1
4860: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  , -1, -1, -1, -1
4870: 2c 0a 20 20 20 20 2d 31 2c 20 2d 31 2c 20 2d 31  ,.    -1, -1, -1
4880: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  , -1, -1, -1, -1
4890: 2c 20 2d 31 2c 20 20 20 2d 31 2c 20 2d 31 2c 20  , -1,   -1, -1, 
48a0: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
48b0: 2d 31 2c 20 2d 31 2c 0a 20 20 20 20 20 30 2c 20  -1, -1,.     0, 
48c0: 20 31 2c 20 20 32 2c 20 20 33 2c 20 20 34 2c 20   1,  2,  3,  4, 
48d0: 20 35 2c 20 20 36 2c 20 20 37 2c 20 20 20 20 38   5,  6,  7,    8
48e0: 2c 20 20 39 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  ,  9, -1, -1, -1
48f0: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 0a 20 20  , -1, -1, -1,.  
4900: 20 20 2d 31 2c 20 31 30 2c 20 31 31 2c 20 31 32    -1, 10, 11, 12
4910: 2c 20 31 33 2c 20 31 34 2c 20 31 35 2c 20 31 36  , 13, 14, 15, 16
4920: 2c 20 20 20 31 37 2c 20 31 38 2c 20 31 39 2c 20  ,   17, 18, 19, 
4930: 32 30 2c 20 32 31 2c 20 32 32 2c 20 32 33 2c 20  20, 21, 22, 23, 
4940: 32 34 2c 0a 20 20 20 20 32 35 2c 20 32 36 2c 20  24,.    25, 26, 
4950: 32 37 2c 20 32 38 2c 20 32 39 2c 20 33 30 2c 20  27, 28, 29, 30, 
4960: 33 31 2c 20 33 32 2c 20 20 20 33 33 2c 20 33 34  31, 32,   33, 34
4970: 2c 20 33 35 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  , 35, -1, -1, -1
4980: 2c 20 2d 31 2c 20 33 36 2c 0a 20 20 20 20 2d 31  , -1, 36,.    -1
4990: 2c 20 33 37 2c 20 33 38 2c 20 33 39 2c 20 34 30  , 37, 38, 39, 40
49a0: 2c 20 34 31 2c 20 34 32 2c 20 34 33 2c 20 20 20  , 41, 42, 43,   
49b0: 34 34 2c 20 34 35 2c 20 34 36 2c 20 34 37 2c 20  44, 45, 46, 47, 
49c0: 34 38 2c 20 34 39 2c 20 35 30 2c 20 35 31 2c 0a  48, 49, 50, 51,.
49d0: 20 20 20 20 35 32 2c 20 35 33 2c 20 35 34 2c 20      52, 53, 54, 
49e0: 35 35 2c 20 35 36 2c 20 35 37 2c 20 35 38 2c 20  55, 56, 57, 58, 
49f0: 35 39 2c 20 20 20 36 30 2c 20 36 31 2c 20 36 32  59,   60, 61, 62
4a00: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 36 33  , -1, -1, -1, 63
4a10: 2c 20 2d 31 2c 0a 20 20 7d 3b 0a 20 20 75 6e 73  , -1,.  };.  uns
4a20: 69 67 6e 65 64 20 69 6e 74 20 76 20 3d 20 30 3b  igned int v = 0;
4a30: 0a 20 20 69 6e 74 20 63 3b 0a 20 20 75 6e 73 69  .  int c;.  unsi
4a40: 67 6e 65 64 20 63 68 61 72 20 2a 7a 20 3d 20 28  gned char *z = (
4a50: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 2a  unsigned char*)*
4a60: 70 7a 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  pz;.  unsigned c
4a70: 68 61 72 20 2a 7a 53 74 61 72 74 20 3d 20 7a 3b  har *zStart = z;
4a80: 0a 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a  .  while( (c = z
4a90: 56 61 6c 75 65 5b 30 78 37 66 26 2a 28 7a 2b 2b  Value[0x7f&*(z++
4aa0: 29 5d 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 76  )])>=0 ){.     v
4ab0: 20 3d 20 28 76 3c 3c 36 29 20 2b 20 63 3b 0a 20   = (v<<6) + c;. 
4ac0: 20 7d 0a 20 20 7a 2d 2d 3b 0a 20 20 2a 70 4c 65   }.  z--;.  *pLe
4ad0: 6e 20 2d 3d 20 7a 20 2d 20 7a 53 74 61 72 74 3b  n -= z - zStart;
4ae0: 0a 20 20 2a 70 7a 20 3d 20 28 63 68 61 72 2a 29  .  *pz = (char*)
4af0: 7a 3b 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d  z;.  return v;.}
4b00: 0a 0a 23 69 66 20 52 42 55 5f 45 4e 41 42 4c 45  ..#if RBU_ENABLE
4b10: 5f 44 45 4c 54 41 5f 43 4b 53 55 4d 0a 2f 2a 0a  _DELTA_CKSUM./*.
4b20: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 33 32 2d  ** Compute a 32-
4b30: 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20  bit checksum on 
4b40: 74 68 65 20 4e 2d 62 79 74 65 20 62 75 66 66 65  the N-byte buffe
4b50: 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72  r.  Return the r
4b60: 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  esult..*/.static
4b70: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 72 62   unsigned int rb
4b80: 75 44 65 6c 74 61 43 68 65 63 6b 73 75 6d 28 63  uDeltaChecksum(c
4b90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 2c 20  onst char *zIn, 
4ba0: 73 69 7a 65 5f 74 20 4e 29 7b 0a 20 20 63 6f 6e  size_t N){.  con
4bb0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
4bc0: 20 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73   *z = (const uns
4bd0: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 7a 49 6e  igned char *)zIn
4be0: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 73 75 6d  ;.  unsigned sum
4bf0: 30 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65  0 = 0;.  unsigne
4c00: 64 20 73 75 6d 31 20 3d 20 30 3b 0a 20 20 75 6e  d sum1 = 0;.  un
4c10: 73 69 67 6e 65 64 20 73 75 6d 32 20 3d 20 30 3b  signed sum2 = 0;
4c20: 0a 20 20 75 6e 73 69 67 6e 65 64 20 73 75 6d 33  .  unsigned sum3
4c30: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 4e 20   = 0;.  while(N 
4c40: 3e 3d 20 31 36 29 7b 0a 20 20 20 20 73 75 6d 30  >= 16){.    sum0
4c50: 20 2b 3d 20 28 28 75 6e 73 69 67 6e 65 64 29 7a   += ((unsigned)z
4c60: 5b 30 5d 20 2b 20 7a 5b 34 5d 20 2b 20 7a 5b 38  [0] + z[4] + z[8
4c70: 5d 20 2b 20 7a 5b 31 32 5d 29 3b 0a 20 20 20 20  ] + z[12]);.    
4c80: 73 75 6d 31 20 2b 3d 20 28 28 75 6e 73 69 67 6e  sum1 += ((unsign
4c90: 65 64 29 7a 5b 31 5d 20 2b 20 7a 5b 35 5d 20 2b  ed)z[1] + z[5] +
4ca0: 20 7a 5b 39 5d 20 2b 20 7a 5b 31 33 5d 29 3b 0a   z[9] + z[13]);.
4cb0: 20 20 20 20 73 75 6d 32 20 2b 3d 20 28 28 75 6e      sum2 += ((un
4cc0: 73 69 67 6e 65 64 29 7a 5b 32 5d 20 2b 20 7a 5b  signed)z[2] + z[
4cd0: 36 5d 20 2b 20 7a 5b 31 30 5d 2b 20 7a 5b 31 34  6] + z[10]+ z[14
4ce0: 5d 29 3b 0a 20 20 20 20 73 75 6d 33 20 2b 3d 20  ]);.    sum3 += 
4cf0: 28 28 75 6e 73 69 67 6e 65 64 29 7a 5b 33 5d 20  ((unsigned)z[3] 
4d00: 2b 20 7a 5b 37 5d 20 2b 20 7a 5b 31 31 5d 2b 20  + z[7] + z[11]+ 
4d10: 7a 5b 31 35 5d 29 3b 0a 20 20 20 20 7a 20 2b 3d  z[15]);.    z +=
4d20: 20 31 36 3b 0a 20 20 20 20 4e 20 2d 3d 20 31 36   16;.    N -= 16
4d30: 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 4e 20  ;.  }.  while(N 
4d40: 3e 3d 20 34 29 7b 0a 20 20 20 20 73 75 6d 30 20  >= 4){.    sum0 
4d50: 2b 3d 20 7a 5b 30 5d 3b 0a 20 20 20 20 73 75 6d  += z[0];.    sum
4d60: 31 20 2b 3d 20 7a 5b 31 5d 3b 0a 20 20 20 20 73  1 += z[1];.    s
4d70: 75 6d 32 20 2b 3d 20 7a 5b 32 5d 3b 0a 20 20 20  um2 += z[2];.   
4d80: 20 73 75 6d 33 20 2b 3d 20 7a 5b 33 5d 3b 0a 20   sum3 += z[3];. 
4d90: 20 20 20 7a 20 2b 3d 20 34 3b 0a 20 20 20 20 4e     z += 4;.    N
4da0: 20 2d 3d 20 34 3b 0a 20 20 7d 0a 20 20 73 75 6d   -= 4;.  }.  sum
4db0: 33 20 2b 3d 20 28 73 75 6d 32 20 3c 3c 20 38 29  3 += (sum2 << 8)
4dc0: 20 2b 20 28 73 75 6d 31 20 3c 3c 20 31 36 29 20   + (sum1 << 16) 
4dd0: 2b 20 28 73 75 6d 30 20 3c 3c 20 32 34 29 3b 0a  + (sum0 << 24);.
4de0: 20 20 73 77 69 74 63 68 28 4e 29 7b 0a 20 20 20    switch(N){.   
4df0: 20 63 61 73 65 20 33 3a 20 20 20 73 75 6d 33 20   case 3:   sum3 
4e00: 2b 3d 20 28 7a 5b 32 5d 20 3c 3c 20 38 29 3b 0a  += (z[2] << 8);.
4e10: 20 20 20 20 63 61 73 65 20 32 3a 20 20 20 73 75      case 2:   su
4e20: 6d 33 20 2b 3d 20 28 7a 5b 31 5d 20 3c 3c 20 31  m3 += (z[1] << 1
4e30: 36 29 3b 0a 20 20 20 20 63 61 73 65 20 31 3a 20  6);.    case 1: 
4e40: 20 20 73 75 6d 33 20 2b 3d 20 28 7a 5b 30 5d 20    sum3 += (z[0] 
4e50: 3c 3c 20 32 34 29 3b 0a 20 20 20 20 64 65 66 61  << 24);.    defa
4e60: 75 6c 74 3a 20 20 3b 0a 20 20 7d 0a 20 20 72 65  ult:  ;.  }.  re
4e70: 74 75 72 6e 20 73 75 6d 33 3b 0a 7d 0a 23 65 6e  turn sum3;.}.#en
4e80: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79  dif../*.** Apply
4e90: 20 61 20 64 65 6c 74 61 2e 0a 2a 2a 0a 2a 2a 20   a delta..**.** 
4ea0: 54 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  The output buffe
4eb0: 72 20 73 68 6f 75 6c 64 20 62 65 20 62 69 67 20  r should be big 
4ec0: 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74  enough to hold t
4ed0: 68 65 20 77 68 6f 6c 65 20 6f 75 74 70 75 74 0a  he whole output.
4ee0: 2a 2a 20 66 69 6c 65 20 61 6e 64 20 61 20 4e 55  ** file and a NU
4ef0: 4c 20 74 65 72 6d 69 6e 61 74 6f 72 20 61 74 20  L terminator at 
4f00: 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20 64 65  the end.  The de
4f10: 6c 74 61 5f 6f 75 74 70 75 74 5f 73 69 7a 65 28  lta_output_size(
4f20: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c  ).** routine wil
4f30: 6c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 69 73  l determine this
4f40: 20 73 69 7a 65 20 66 6f 72 20 79 6f 75 2e 0a 2a   size for you..*
4f50: 2a 0a 2a 2a 20 54 68 65 20 64 65 6c 74 61 20 73  *.** The delta s
4f60: 74 72 69 6e 67 20 73 68 6f 75 6c 64 20 62 65 20  tring should be 
4f70: 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64 2e  null-terminated.
4f80: 20 20 42 75 74 20 74 68 65 20 64 65 6c 74 61 20    But the delta 
4f90: 73 74 72 69 6e 67 0a 2a 2a 20 6d 61 79 20 63 6f  string.** may co
4fa0: 6e 74 61 69 6e 20 65 6d 62 65 64 64 65 64 20 4e  ntain embedded N
4fb0: 55 4c 20 63 68 61 72 61 63 74 65 72 73 20 28 69  UL characters (i
4fc0: 66 20 74 68 65 20 69 6e 70 75 74 20 61 6e 64 20  f the input and 
4fd0: 6f 75 74 70 75 74 20 61 72 65 0a 2a 2a 20 62 69  output are.** bi
4fe0: 6e 61 72 79 20 66 69 6c 65 73 29 20 73 6f 20 77  nary files) so w
4ff0: 65 20 61 6c 73 6f 20 68 61 76 65 20 74 6f 20 70  e also have to p
5000: 61 73 73 20 69 6e 20 74 68 65 20 6c 65 6e 67 74  ass in the lengt
5010: 68 20 6f 66 20 74 68 65 20 64 65 6c 74 61 20 69  h of the delta i
5020: 6e 0a 2a 2a 20 74 68 65 20 6c 65 6e 44 65 6c 74  n.** the lenDelt
5030: 61 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a  a parameter..**.
5040: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
5050: 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 69 7a   returns the siz
5060: 65 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 20  e of the output 
5070: 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 28 65  file in bytes (e
5080: 78 63 6c 75 64 69 6e 67 0a 2a 2a 20 74 68 65 20  xcluding.** the 
5090: 66 69 6e 61 6c 20 4e 55 4c 20 74 65 72 6d 69 6e  final NUL termin
50a0: 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 29 2e  ator character).
50b0: 20 20 45 78 63 65 70 74 2c 20 69 66 20 74 68 65    Except, if the
50c0: 20 64 65 6c 74 61 20 73 74 72 69 6e 67 20 69 73   delta string is
50d0: 0a 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 6f 72  .** malformed or
50e0: 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 75 73   intended for us
50f0: 65 20 77 69 74 68 20 61 20 73 6f 75 72 63 65 20  e with a source 
5100: 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20  file other than 
5110: 7a 53 72 63 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  zSrc,.** then th
5120: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
5130: 6e 73 20 2d 31 2e 0a 2a 2a 0a 2a 2a 20 52 65 66  ns -1..**.** Ref
5140: 65 72 20 74 6f 20 74 68 65 20 64 65 6c 74 61 5f  er to the delta_
5150: 63 72 65 61 74 65 28 29 20 64 6f 63 75 6d 65 6e  create() documen
5160: 74 61 74 69 6f 6e 20 61 62 6f 76 65 20 66 6f 72  tation above for
5170: 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 0a 2a   a description.*
5180: 2a 20 6f 66 20 74 68 65 20 64 65 6c 74 61 20 66  * of the delta f
5190: 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2f 0a 73  ile format..*/.s
51a0: 74 61 74 69 63 20 69 6e 74 20 72 62 75 44 65 6c  tatic int rbuDel
51b0: 74 61 41 70 70 6c 79 28 0a 20 20 63 6f 6e 73 74  taApply(.  const
51c0: 20 63 68 61 72 20 2a 7a 53 72 63 2c 20 20 20 20   char *zSrc,    
51d0: 20 20 2f 2a 20 54 68 65 20 73 6f 75 72 63 65 20    /* The source 
51e0: 6f 72 20 70 61 74 74 65 72 6e 20 66 69 6c 65 20  or pattern file 
51f0: 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 53 72 63 2c  */.  int lenSrc,
5200: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
5210: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73 6f 75  ength of the sou
5220: 72 63 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 6f  rce file */.  co
5230: 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 6c 74 61  nst char *zDelta
5240: 2c 20 20 20 20 2f 2a 20 44 65 6c 74 61 20 74 6f  ,    /* Delta to
5250: 20 61 70 70 6c 79 20 74 6f 20 74 68 65 20 70 61   apply to the pa
5260: 74 74 65 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6c  ttern */.  int l
5270: 65 6e 44 65 6c 74 61 2c 20 20 20 20 20 20 20 20  enDelta,        
5280: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74    /* Length of t
5290: 68 65 20 64 65 6c 74 61 20 2a 2f 0a 20 20 63 68  he delta */.  ch
52a0: 61 72 20 2a 7a 4f 75 74 20 20 20 20 20 20 20 20  ar *zOut        
52b0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
52c0: 65 20 6f 75 74 70 75 74 20 69 6e 74 6f 20 74 68  e output into th
52d0: 69 73 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20  is preallocated 
52e0: 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 75  buffer */.){.  u
52f0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 69 6d 69  nsigned int limi
5300: 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  t;.  unsigned in
5310: 74 20 74 6f 74 61 6c 20 3d 20 30 3b 0a 23 69 66  t total = 0;.#if
5320: 20 52 42 55 5f 45 4e 41 42 4c 45 5f 44 45 4c 54   RBU_ENABLE_DELT
5330: 41 5f 43 4b 53 55 4d 0a 20 20 63 68 61 72 20 2a  A_CKSUM.  char *
5340: 7a 4f 72 69 67 4f 75 74 20 3d 20 7a 4f 75 74 3b  zOrigOut = zOut;
5350: 0a 23 65 6e 64 69 66 0a 0a 20 20 6c 69 6d 69 74  .#endif..  limit
5360: 20 3d 20 72 62 75 44 65 6c 74 61 47 65 74 49 6e   = rbuDeltaGetIn
5370: 74 28 26 7a 44 65 6c 74 61 2c 20 26 6c 65 6e 44  t(&zDelta, &lenD
5380: 65 6c 74 61 29 3b 0a 20 20 69 66 28 20 2a 7a 44  elta);.  if( *zD
5390: 65 6c 74 61 21 3d 27 5c 6e 27 20 29 7b 0a 20 20  elta!='\n' ){.  
53a0: 20 20 2f 2a 20 45 52 52 4f 52 3a 20 73 69 7a 65    /* ERROR: size
53b0: 20 69 6e 74 65 67 65 72 20 6e 6f 74 20 74 65 72   integer not ter
53c0: 6d 69 6e 61 74 65 64 20 62 79 20 22 5c 6e 22 20  minated by "\n" 
53d0: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31  */.    return -1
53e0: 3b 0a 20 20 7d 0a 20 20 7a 44 65 6c 74 61 2b 2b  ;.  }.  zDelta++
53f0: 3b 20 6c 65 6e 44 65 6c 74 61 2d 2d 3b 0a 20 20  ; lenDelta--;.  
5400: 77 68 69 6c 65 28 20 2a 7a 44 65 6c 74 61 20 26  while( *zDelta &
5410: 26 20 6c 65 6e 44 65 6c 74 61 3e 30 20 29 7b 0a  & lenDelta>0 ){.
5420: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
5430: 20 63 6e 74 2c 20 6f 66 73 74 3b 0a 20 20 20 20   cnt, ofst;.    
5440: 63 6e 74 20 3d 20 72 62 75 44 65 6c 74 61 47 65  cnt = rbuDeltaGe
5450: 74 49 6e 74 28 26 7a 44 65 6c 74 61 2c 20 26 6c  tInt(&zDelta, &l
5460: 65 6e 44 65 6c 74 61 29 3b 0a 20 20 20 20 73 77  enDelta);.    sw
5470: 69 74 63 68 28 20 7a 44 65 6c 74 61 5b 30 5d 20  itch( zDelta[0] 
5480: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 27 40  ){.      case '@
5490: 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 7a 44 65  ': {.        zDe
54a0: 6c 74 61 2b 2b 3b 20 6c 65 6e 44 65 6c 74 61 2d  lta++; lenDelta-
54b0: 2d 3b 0a 20 20 20 20 20 20 20 20 6f 66 73 74 20  -;.        ofst 
54c0: 3d 20 72 62 75 44 65 6c 74 61 47 65 74 49 6e 74  = rbuDeltaGetInt
54d0: 28 26 7a 44 65 6c 74 61 2c 20 26 6c 65 6e 44 65  (&zDelta, &lenDe
54e0: 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20 69 66  lta);.        if
54f0: 28 20 6c 65 6e 44 65 6c 74 61 3e 30 20 26 26 20  ( lenDelta>0 && 
5500: 7a 44 65 6c 74 61 5b 30 5d 21 3d 27 2c 27 20 29  zDelta[0]!=',' )
5510: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  {.          /* E
5520: 52 52 4f 52 3a 20 63 6f 70 79 20 63 6f 6d 6d 61  RROR: copy comma
5530: 6e 64 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65  nd not terminate
5540: 64 20 62 79 20 27 2c 27 20 2a 2f 0a 20 20 20 20  d by ',' */.    
5550: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
5560: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5570: 20 20 20 7a 44 65 6c 74 61 2b 2b 3b 20 6c 65 6e     zDelta++; len
5580: 44 65 6c 74 61 2d 2d 3b 0a 20 20 20 20 20 20 20  Delta--;.       
5590: 20 74 6f 74 61 6c 20 2b 3d 20 63 6e 74 3b 0a 20   total += cnt;. 
55a0: 20 20 20 20 20 20 20 69 66 28 20 74 6f 74 61 6c         if( total
55b0: 3e 6c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  >limit ){.      
55c0: 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20 63 6f      /* ERROR: co
55d0: 70 79 20 65 78 63 65 65 64 73 20 6f 75 74 70 75  py exceeds outpu
55e0: 74 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20  t file size */. 
55f0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
5600: 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  -1;.        }.  
5610: 20 20 20 20 20 20 69 66 28 20 28 69 6e 74 29 28        if( (int)(
5620: 6f 66 73 74 2b 63 6e 74 29 20 3e 20 6c 65 6e 53  ofst+cnt) > lenS
5630: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
5640: 2f 2a 20 45 52 52 4f 52 3a 20 63 6f 70 79 20 65  /* ERROR: copy e
5650: 78 74 65 6e 64 73 20 70 61 73 74 20 65 6e 64 20  xtends past end 
5660: 6f 66 20 69 6e 70 75 74 20 2a 2f 0a 20 20 20 20  of input */.    
5670: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
5680: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5690: 20 20 20 6d 65 6d 63 70 79 28 7a 4f 75 74 2c 20     memcpy(zOut, 
56a0: 26 7a 53 72 63 5b 6f 66 73 74 5d 2c 20 63 6e 74  &zSrc[ofst], cnt
56b0: 29 3b 0a 20 20 20 20 20 20 20 20 7a 4f 75 74 20  );.        zOut 
56c0: 2b 3d 20 63 6e 74 3b 0a 20 20 20 20 20 20 20 20  += cnt;.        
56d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
56e0: 20 20 20 20 20 63 61 73 65 20 27 3a 27 3a 20 7b       case ':': {
56f0: 0a 20 20 20 20 20 20 20 20 7a 44 65 6c 74 61 2b  .        zDelta+
5700: 2b 3b 20 6c 65 6e 44 65 6c 74 61 2d 2d 3b 0a 20  +; lenDelta--;. 
5710: 20 20 20 20 20 20 20 74 6f 74 61 6c 20 2b 3d 20         total += 
5720: 63 6e 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  cnt;.        if(
5730: 20 74 6f 74 61 6c 3e 6c 69 6d 69 74 20 29 7b 0a   total>limit ){.
5740: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 52 52            /* ERR
5750: 4f 52 3a 20 20 69 6e 73 65 72 74 20 63 6f 6d 6d  OR:  insert comm
5760: 61 6e 64 20 67 69 76 65 73 20 61 6e 20 6f 75 74  and gives an out
5770: 70 75 74 20 6c 61 72 67 65 72 20 74 68 61 6e 20  put larger than 
5780: 70 72 65 64 69 63 74 65 64 20 2a 2f 0a 20 20 20  predicted */.   
5790: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31         return -1
57a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
57b0: 20 20 20 20 69 66 28 20 28 69 6e 74 29 63 6e 74      if( (int)cnt
57c0: 3e 6c 65 6e 44 65 6c 74 61 20 29 7b 0a 20 20 20  >lenDelta ){.   
57d0: 20 20 20 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a         /* ERROR:
57e0: 20 69 6e 73 65 72 74 20 63 6f 75 6e 74 20 65 78   insert count ex
57f0: 63 65 65 64 73 20 73 69 7a 65 20 6f 66 20 64 65  ceeds size of de
5800: 6c 74 61 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  lta */.         
5810: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
5820: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65      }.        me
5830: 6d 63 70 79 28 7a 4f 75 74 2c 20 7a 44 65 6c 74  mcpy(zOut, zDelt
5840: 61 2c 20 63 6e 74 29 3b 0a 20 20 20 20 20 20 20  a, cnt);.       
5850: 20 7a 4f 75 74 20 2b 3d 20 63 6e 74 3b 0a 20 20   zOut += cnt;.  
5860: 20 20 20 20 20 20 7a 44 65 6c 74 61 20 2b 3d 20        zDelta += 
5870: 63 6e 74 3b 0a 20 20 20 20 20 20 20 20 6c 65 6e  cnt;.        len
5880: 44 65 6c 74 61 20 2d 3d 20 63 6e 74 3b 0a 20 20  Delta -= cnt;.  
5890: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
58a0: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
58b0: 27 3b 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 7a  ';': {.        z
58c0: 44 65 6c 74 61 2b 2b 3b 20 6c 65 6e 44 65 6c 74  Delta++; lenDelt
58d0: 61 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7a 4f 75  a--;.        zOu
58e0: 74 5b 30 5d 20 3d 20 30 3b 0a 23 69 66 20 52 42  t[0] = 0;.#if RB
58f0: 55 5f 45 4e 41 42 4c 45 5f 44 45 4c 54 41 5f 43  U_ENABLE_DELTA_C
5900: 4b 53 55 4d 0a 20 20 20 20 20 20 20 20 69 66 28  KSUM.        if(
5910: 20 63 6e 74 21 3d 72 62 75 44 65 6c 74 61 43 68   cnt!=rbuDeltaCh
5920: 65 63 6b 73 75 6d 28 7a 4f 72 69 67 4f 75 74 2c  ecksum(zOrigOut,
5930: 20 74 6f 74 61 6c 29 20 29 7b 0a 20 20 20 20 20   total) ){.     
5940: 20 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20 20       /* ERROR:  
5950: 62 61 64 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a  bad checksum */.
5960: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
5970: 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23   -1;.        }.#
5980: 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 66  endif.        if
5990: 28 20 74 6f 74 61 6c 21 3d 6c 69 6d 69 74 20 29  ( total!=limit )
59a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  {.          /* E
59b0: 52 52 4f 52 3a 20 67 65 6e 65 72 61 74 65 64 20  RROR: generated 
59c0: 73 69 7a 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  size does not ma
59d0: 74 63 68 20 70 72 65 64 69 63 74 65 64 20 73 69  tch predicted si
59e0: 7a 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ze */.          
59f0: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
5a00: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74     }.        ret
5a10: 75 72 6e 20 74 6f 74 61 6c 3b 0a 20 20 20 20 20  urn total;.     
5a20: 20 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74   }.      default
5a30: 3a 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45  : {.        /* E
5a40: 52 52 4f 52 3a 20 75 6e 6b 6e 6f 77 6e 20 64 65  RROR: unknown de
5a50: 6c 74 61 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  lta operator */.
5a60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d          return -
5a70: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
5a80: 0a 20 20 7d 0a 20 20 2f 2a 20 45 52 52 4f 52 3a  .  }.  /* ERROR:
5a90: 20 75 6e 74 65 72 6d 69 6e 61 74 65 64 20 64 65   unterminated de
5aa0: 6c 74 61 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  lta */.  return 
5ab0: 2d 31 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  -1;.}..static in
5ac0: 74 20 72 62 75 44 65 6c 74 61 4f 75 74 70 75 74  t rbuDeltaOutput
5ad0: 53 69 7a 65 28 63 6f 6e 73 74 20 63 68 61 72 20  Size(const char 
5ae0: 2a 7a 44 65 6c 74 61 2c 20 69 6e 74 20 6c 65 6e  *zDelta, int len
5af0: 44 65 6c 74 61 29 7b 0a 20 20 69 6e 74 20 73 69  Delta){.  int si
5b00: 7a 65 3b 0a 20 20 73 69 7a 65 20 3d 20 72 62 75  ze;.  size = rbu
5b10: 44 65 6c 74 61 47 65 74 49 6e 74 28 26 7a 44 65  DeltaGetInt(&zDe
5b20: 6c 74 61 2c 20 26 6c 65 6e 44 65 6c 74 61 29 3b  lta, &lenDelta);
5b30: 0a 20 20 69 66 28 20 2a 7a 44 65 6c 74 61 21 3d  .  if( *zDelta!=
5b40: 27 5c 6e 27 20 29 7b 0a 20 20 20 20 2f 2a 20 45  '\n' ){.    /* E
5b50: 52 52 4f 52 3a 20 73 69 7a 65 20 69 6e 74 65 67  RROR: size integ
5b60: 65 72 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65  er not terminate
5b70: 64 20 62 79 20 22 5c 6e 22 20 2a 2f 0a 20 20 20  d by "\n" */.   
5b80: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
5b90: 20 20 72 65 74 75 72 6e 20 73 69 7a 65 3b 0a 7d    return size;.}
5ba0: 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 63  ../*.** End of c
5bb0: 6f 64 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 66  ode taken from f
5bc0: 6f 73 73 69 6c 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ossil..*********
5bd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5be0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5bf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5c00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5c10: 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  /../*.** Impleme
5c20: 6e 74 61 74 69 6f 6e 20 6f 66 20 53 51 4c 20 73  ntation of SQL s
5c30: 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 72  calar function r
5c40: 62 75 5f 66 6f 73 73 69 6c 5f 64 65 6c 74 61 28  bu_fossil_delta(
5c50: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  )..**.** This fu
5c60: 6e 63 74 69 6f 6e 20 61 70 70 6c 69 65 73 20 61  nction applies a
5c70: 20 66 6f 73 73 69 6c 20 64 65 6c 74 61 20 70 61   fossil delta pa
5c80: 74 63 68 20 74 6f 20 61 20 62 6c 6f 62 2e 20 45  tch to a blob. E
5c90: 78 61 63 74 6c 79 20 74 77 6f 0a 2a 2a 20 61 72  xactly two.** ar
5ca0: 67 75 6d 65 6e 74 73 20 6d 75 73 74 20 62 65 20  guments must be 
5cb0: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
5cc0: 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 66 69 72  unction. The fir
5cd0: 73 74 20 69 73 20 74 68 65 20 62 6c 6f 62 20 74  st is the blob t
5ce0: 6f 0a 2a 2a 20 70 61 74 63 68 20 61 6e 64 20 74  o.** patch and t
5cf0: 68 65 20 73 65 63 6f 6e 64 20 74 68 65 20 70 61  he second the pa
5d00: 74 63 68 20 74 6f 20 61 70 70 6c 79 2e 20 49 66  tch to apply. If
5d10: 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
5d20: 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
5d30: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 70  on returns the p
5d40: 61 74 63 68 65 64 20 62 6c 6f 62 2e 0a 2a 2f 0a  atched blob..*/.
5d50: 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 46  static void rbuF
5d60: 6f 73 73 69 6c 44 65 6c 74 61 46 75 6e 63 28 0a  ossilDeltaFunc(.
5d70: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
5d80: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
5d90: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
5da0: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
5db0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
5dc0: 61 44 65 6c 74 61 3b 0a 20 20 69 6e 74 20 6e 44  aDelta;.  int nD
5dd0: 65 6c 74 61 3b 0a 20 20 63 6f 6e 73 74 20 63 68  elta;.  const ch
5de0: 61 72 20 2a 61 4f 72 69 67 3b 0a 20 20 69 6e 74  ar *aOrig;.  int
5df0: 20 6e 4f 72 69 67 3b 0a 0a 20 20 69 6e 74 20 6e   nOrig;..  int n
5e00: 4f 75 74 3b 0a 20 20 69 6e 74 20 6e 4f 75 74 32  Out;.  int nOut2
5e10: 3b 0a 20 20 63 68 61 72 20 2a 61 4f 75 74 3b 0a  ;.  char *aOut;.
5e20: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
5e30: 3d 32 20 29 3b 0a 0a 20 20 6e 4f 72 69 67 20 3d  =2 );..  nOrig =
5e40: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
5e50: 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ytes(argv[0]);. 
5e60: 20 61 4f 72 69 67 20 3d 20 28 63 6f 6e 73 74 20   aOrig = (const 
5e70: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
5e80: 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d  lue_blob(argv[0]
5e90: 29 3b 0a 20 20 6e 44 65 6c 74 61 20 3d 20 73 71  );.  nDelta = sq
5ea0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
5eb0: 73 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 61 44  s(argv[1]);.  aD
5ec0: 65 6c 74 61 20 3d 20 28 63 6f 6e 73 74 20 63 68  elta = (const ch
5ed0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
5ee0: 65 5f 62 6c 6f 62 28 61 72 67 76 5b 31 5d 29 3b  e_blob(argv[1]);
5ef0: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
5f00: 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
5f10: 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 6e 4f  e output */.  nO
5f20: 75 74 20 3d 20 72 62 75 44 65 6c 74 61 4f 75 74  ut = rbuDeltaOut
5f30: 70 75 74 53 69 7a 65 28 61 44 65 6c 74 61 2c 20  putSize(aDelta, 
5f40: 6e 44 65 6c 74 61 29 3b 0a 20 20 69 66 28 20 6e  nDelta);.  if( n
5f50: 4f 75 74 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  Out<0 ){.    sql
5f60: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
5f70: 72 28 63 6f 6e 74 65 78 74 2c 20 22 63 6f 72 72  r(context, "corr
5f80: 75 70 74 20 66 6f 73 73 69 6c 20 64 65 6c 74 61  upt fossil delta
5f90: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75  ", -1);.    retu
5fa0: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 61 4f 75 74 20  rn;.  }..  aOut 
5fb0: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
5fc0: 28 6e 4f 75 74 2b 31 29 3b 0a 20 20 69 66 28 20  (nOut+1);.  if( 
5fd0: 61 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73  aOut==0 ){.    s
5fe0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
5ff0: 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78  ror_nomem(contex
6000: 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
6010: 20 6e 4f 75 74 32 20 3d 20 72 62 75 44 65 6c 74   nOut2 = rbuDelt
6020: 61 41 70 70 6c 79 28 61 4f 72 69 67 2c 20 6e 4f  aApply(aOrig, nO
6030: 72 69 67 2c 20 61 44 65 6c 74 61 2c 20 6e 44 65  rig, aDelta, nDe
6040: 6c 74 61 2c 20 61 4f 75 74 29 3b 0a 20 20 20 20  lta, aOut);.    
6050: 69 66 28 20 6e 4f 75 74 32 21 3d 6e 4f 75 74 20  if( nOut2!=nOut 
6060: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
6070: 5f 66 72 65 65 28 61 4f 75 74 29 3b 0a 20 20 20  _free(aOut);.   
6080: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
6090: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
60a0: 20 22 63 6f 72 72 75 70 74 20 66 6f 73 73 69 6c   "corrupt fossil
60b0: 20 64 65 6c 74 61 22 2c 20 2d 31 29 3b 0a 20 20   delta", -1);.  
60c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
60d0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c  qlite3_result_bl
60e0: 6f 62 28 63 6f 6e 74 65 78 74 2c 20 61 4f 75 74  ob(context, aOut
60f0: 2c 20 6e 4f 75 74 2c 20 73 71 6c 69 74 65 33 5f  , nOut, sqlite3_
6100: 66 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  free);.    }.  }
6110: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61  .}.../*.** Prepa
6120: 72 65 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  re the SQL state
6130: 6d 65 6e 74 20 69 6e 20 62 75 66 66 65 72 20 7a  ment in buffer z
6140: 53 71 6c 20 61 67 61 69 6e 73 74 20 64 61 74 61  Sql against data
6150: 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a  base handle db..
6160: 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
6170: 2c 20 73 65 74 20 2a 70 70 53 74 6d 74 20 74 6f  , set *ppStmt to
6180: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65   point to the ne
6190: 77 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20  w statement and 
61a0: 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  return.** SQLITE
61b0: 5f 4f 4b 2e 20 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  _OK. .**.** Othe
61c0: 72 77 69 73 65 2c 20 69 66 20 61 6e 20 65 72 72  rwise, if an err
61d0: 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 73  or does occur, s
61e0: 65 74 20 2a 70 70 53 74 6d 74 20 74 6f 20 4e 55  et *ppStmt to NU
61f0: 4c 4c 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  LL and return.**
6200: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
6210: 20 63 6f 64 65 2e 20 41 64 64 69 74 69 6f 6e 61   code. Additiona
6220: 6c 6c 79 2c 20 73 65 74 20 6f 75 74 70 75 74 20  lly, set output 
6230: 76 61 72 69 61 62 6c 65 20 2a 70 7a 45 72 72 6d  variable *pzErrm
6240: 73 67 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74  sg to.** point t
6250: 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
6260: 69 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 6d  ining an error m
6270: 65 73 73 61 67 65 2e 20 49 74 20 69 73 20 74 68  essage. It is th
6280: 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
6290: 0a 2a 2a 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  .** of the calle
62a0: 72 20 74 6f 20 28 65 76 65 6e 74 75 61 6c 6c 79  r to (eventually
62b0: 29 20 66 72 65 65 20 74 68 69 73 20 62 75 66 66  ) free this buff
62c0: 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  er using sqlite3
62d0: 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  _free()..*/.stat
62e0: 69 63 20 69 6e 74 20 70 72 65 70 61 72 65 41 6e  ic int prepareAn
62f0: 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 0a 20  dCollectError(. 
6300: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
6310: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a   sqlite3_stmt **
6320: 70 70 53 74 6d 74 2c 0a 20 20 63 68 61 72 20 2a  ppStmt,.  char *
6330: 2a 70 7a 45 72 72 6d 73 67 2c 0a 20 20 63 6f 6e  *pzErrmsg,.  con
6340: 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 0a 29 7b  st char *zSql.){
6350: 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
6360: 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
6370: 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 70 53  b, zSql, -1, ppS
6380: 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  tmt, 0);.  if( r
6390: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
63a0: 20 20 20 20 2a 70 7a 45 72 72 6d 73 67 20 3d 20      *pzErrmsg = 
63b0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
63c0: 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  "%s", sqlite3_er
63d0: 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 2a  rmsg(db));.    *
63e0: 70 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a  ppStmt = 0;.  }.
63f0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
6400: 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20  /*.** Reset the 
6410: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 70 61  SQL statement pa
6420: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
6430: 74 20 61 72 67 75 6d 65 6e 74 2e 20 52 65 74 75  t argument. Retu
6440: 72 6e 20 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20  rn a copy.** of 
6450: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
6460: 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 72 65  ed by sqlite3_re
6470: 73 65 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  set()..**.** If 
6480: 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  an error has occ
6490: 75 72 72 65 64 2c 20 74 68 65 6e 20 73 65 74 20  urred, then set 
64a0: 2a 70 7a 45 72 72 6d 73 67 20 74 6f 20 70 6f 69  *pzErrmsg to poi
64b0: 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 0a 2a  nt to a buffer.*
64c0: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20  * containing an 
64d0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 49  error message. I
64e0: 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
64f0: 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
6500: 61 6c 6c 65 72 0a 2a 2a 20 74 6f 20 65 76 65 6e  aller.** to even
6510: 74 75 61 6c 6c 79 20 66 72 65 65 20 74 68 69 73  tually free this
6520: 20 62 75 66 66 65 72 20 75 73 69 6e 67 20 73 71   buffer using sq
6530: 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f  lite3_free()..*/
6540: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 65  .static int rese
6550: 74 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72  tAndCollectError
6560: 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70  (sqlite3_stmt *p
6570: 53 74 6d 74 2c 20 63 68 61 72 20 2a 2a 70 7a 45  Stmt, char **pzE
6580: 72 72 6d 73 67 29 7b 0a 20 20 69 6e 74 20 72 63  rrmsg){.  int rc
6590: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
65a0: 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 72  (pStmt);.  if( r
65b0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
65c0: 20 20 20 20 2a 70 7a 45 72 72 6d 73 67 20 3d 20      *pzErrmsg = 
65d0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
65e0: 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  "%s", sqlite3_er
65f0: 72 6d 73 67 28 73 71 6c 69 74 65 33 5f 64 62 5f  rmsg(sqlite3_db_
6600: 68 61 6e 64 6c 65 28 70 53 74 6d 74 29 29 29 3b  handle(pStmt)));
6610: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
6620: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73  ;.}../*.** Unles
6630: 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20 61 72  s it is NULL, ar
6640: 67 75 6d 65 6e 74 20 7a 53 71 6c 20 70 6f 69 6e  gument zSql poin
6650: 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 61  ts to a buffer a
6660: 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 0a 2a  llocated using.*
6670: 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  * sqlite3_malloc
6680: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 53   containing an S
6690: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  QL statement. Th
66a0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 72 65 70  is function prep
66b0: 61 72 65 73 20 74 68 65 20 53 51 4c 0a 2a 2a 20  ares the SQL.** 
66c0: 73 74 61 74 65 6d 65 6e 74 20 61 67 61 69 6e 73  statement agains
66d0: 74 20 64 61 74 61 62 61 73 65 20 64 62 20 61 6e  t database db an
66e0: 64 20 66 72 65 65 73 20 74 68 65 20 62 75 66 66  d frees the buff
66f0: 65 72 2e 20 49 66 20 73 74 61 74 65 6d 65 6e 74  er. If statement
6700: 20 0a 2a 2a 20 63 6f 6d 70 69 6c 61 74 69 6f 6e   .** compilation
6710: 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
6720: 2a 70 70 53 74 6d 74 20 69 73 20 73 65 74 20 74  *ppStmt is set t
6730: 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  o point to the n
6740: 65 77 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a  ew statement .**
6750: 20 68 61 6e 64 6c 65 20 61 6e 64 20 53 51 4c 49   handle and SQLI
6760: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
6770: 64 2e 20 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  d. .**.** Otherw
6780: 69 73 65 2c 20 69 66 20 61 6e 20 65 72 72 6f 72  ise, if an error
6790: 20 6f 63 63 75 72 73 2c 20 2a 70 70 53 74 6d 74   occurs, *ppStmt
67a0: 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   is set to NULL 
67b0: 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
67c0: 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 49  e.** returned. I
67d0: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 2a 70 7a  n this case, *pz
67e0: 45 72 72 6d 73 67 20 6d 61 79 20 61 6c 73 6f 20  Errmsg may also 
67f0: 62 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  be set to point 
6800: 74 6f 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6d  to an error.** m
6810: 65 73 73 61 67 65 2e 20 49 74 20 69 73 20 74 68  essage. It is th
6820: 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
6830: 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
6840: 6f 20 66 72 65 65 20 74 68 69 73 20 65 72 72 6f  o free this erro
6850: 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 62 75 66  r message.** buf
6860: 66 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65  fer using sqlite
6870: 33 5f 66 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  3_free()..**.** 
6880: 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 53 71 6c  If argument zSql
6890: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20 66   is NULL, this f
68a0: 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20  unction assumes 
68b0: 74 68 61 74 20 61 6e 20 4f 4f 4d 20 68 61 73 20  that an OOM has 
68c0: 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20 49 6e 20  occurred..** In 
68d0: 74 68 69 73 20 63 61 73 65 20 53 51 4c 49 54 45  this case SQLITE
68e0: 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
68f0: 65 64 20 61 6e 64 20 2a 70 70 53 74 6d 74 20 73  ed and *ppStmt s
6900: 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  et to NULL..*/.s
6910: 74 61 74 69 63 20 69 6e 74 20 70 72 65 70 61 72  tatic int prepar
6920: 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45  eFreeAndCollectE
6930: 72 72 6f 72 28 0a 20 20 73 71 6c 69 74 65 33 20  rror(.  sqlite3 
6940: 2a 64 62 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f  *db, .  sqlite3_
6950: 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 0a 20  stmt **ppStmt,. 
6960: 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 6d 73 67   char **pzErrmsg
6970: 2c 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 0a 29  ,.  char *zSql.)
6980: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
6990: 73 65 72 74 28 20 2a 70 7a 45 72 72 6d 73 67 3d  sert( *pzErrmsg=
69a0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c  =0 );.  if( zSql
69b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
69c0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
69d0: 20 20 2a 70 70 53 74 6d 74 20 3d 20 30 3b 0a 20    *ppStmt = 0;. 
69e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
69f0: 20 70 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65   prepareAndColle
6a00: 63 74 45 72 72 6f 72 28 64 62 2c 20 70 70 53 74  ctError(db, ppSt
6a10: 6d 74 2c 20 70 7a 45 72 72 6d 73 67 2c 20 7a 53  mt, pzErrmsg, zS
6a20: 71 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ql);.    sqlite3
6a30: 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d  _free(zSql);.  }
6a40: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
6a50: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
6a60: 52 62 75 4f 62 6a 49 74 65 72 2e 61 7a 54 62 6c  RbuObjIter.azTbl
6a70: 43 6f 6c 5b 5d 20 61 6e 64 20 52 62 75 4f 62 6a  Col[] and RbuObj
6a80: 49 74 65 72 2e 61 62 54 62 6c 50 6b 5b 5d 20 61  Iter.abTblPk[] a
6a90: 72 72 61 79 73 20 61 6c 6c 6f 63 61 74 65 64 0a  rrays allocated.
6aa0: 2a 2a 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ** by an earlier
6ab0: 20 63 61 6c 6c 20 74 6f 20 72 62 75 4f 62 6a 49   call to rbuObjI
6ac0: 74 65 72 43 61 63 68 65 54 61 62 6c 65 49 6e 66  terCacheTableInf
6ad0: 6f 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  o()..*/.static v
6ae0: 6f 69 64 20 72 62 75 4f 62 6a 49 74 65 72 46 72  oid rbuObjIterFr
6af0: 65 65 43 6f 6c 73 28 52 62 75 4f 62 6a 49 74 65  eeCols(RbuObjIte
6b00: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74  r *pIter){.  int
6b10: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
6b20: 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b  <pIter->nTblCol;
6b30: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
6b40: 65 33 5f 66 72 65 65 28 70 49 74 65 72 2d 3e 61  e3_free(pIter->a
6b50: 7a 54 62 6c 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20  zTblCol[i]);.   
6b60: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
6b70: 74 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65 5b 69  ter->azTblType[i
6b80: 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ]);.  }.  sqlite
6b90: 33 5f 66 72 65 65 28 70 49 74 65 72 2d 3e 61 7a  3_free(pIter->az
6ba0: 54 62 6c 43 6f 6c 29 3b 0a 20 20 70 49 74 65 72  TblCol);.  pIter
6bb0: 2d 3e 61 7a 54 62 6c 43 6f 6c 20 3d 20 30 3b 0a  ->azTblCol = 0;.
6bc0: 20 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 54 79    pIter->azTblTy
6bd0: 70 65 20 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d  pe = 0;.  pIter-
6be0: 3e 61 69 53 72 63 4f 72 64 65 72 20 3d 20 30 3b  >aiSrcOrder = 0;
6bf0: 0a 20 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50  .  pIter->abTblP
6c00: 6b 20 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e  k = 0;.  pIter->
6c10: 61 62 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20  abNotNull = 0;. 
6c20: 20 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20   pIter->nTblCol 
6c30: 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e 65 54  = 0;.  pIter->eT
6c40: 79 70 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ype = 0;        
6c50: 20 20 20 20 20 20 20 2f 2a 20 49 6e 76 61 6c 69         /* Invali
6c60: 64 20 76 61 6c 75 65 20 2a 2f 0a 7d 0a 0a 2f 2a  d value */.}../*
6c70: 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65 20 61 6c 6c  .** Finalize all
6c80: 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6e 64 20   statements and 
6c90: 66 72 65 65 20 61 6c 6c 20 61 6c 6c 6f 63 61 74  free all allocat
6ca0: 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 73 70  ions that are sp
6cb0: 65 63 69 66 69 63 20 74 6f 0a 2a 2a 20 74 68 65  ecific to.** the
6cc0: 20 63 75 72 72 65 6e 74 20 6f 62 6a 65 63 74 20   current object 
6cd0: 28 74 61 62 6c 65 2f 69 6e 64 65 78 20 70 61 69  (table/index pai
6ce0: 72 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  r)..*/.static vo
6cf0: 69 64 20 72 62 75 4f 62 6a 49 74 65 72 43 6c 65  id rbuObjIterCle
6d00: 61 72 53 74 61 74 65 6d 65 6e 74 73 28 52 62 75  arStatements(Rbu
6d10: 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 29 7b  ObjIter *pIter){
6d20: 0a 20 20 52 62 75 55 70 64 61 74 65 53 74 6d 74  .  RbuUpdateStmt
6d30: 20 2a 70 55 70 3b 0a 0a 20 20 73 71 6c 69 74 65   *pUp;..  sqlite
6d40: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 49 74 65 72  3_finalize(pIter
6d50: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71  ->pSelect);.  sq
6d60: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
6d70: 49 74 65 72 2d 3e 70 49 6e 73 65 72 74 29 3b 0a  Iter->pInsert);.
6d80: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
6d90: 7a 65 28 70 49 74 65 72 2d 3e 70 44 65 6c 65 74  ze(pIter->pDelet
6da0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  e);.  sqlite3_fi
6db0: 6e 61 6c 69 7a 65 28 70 49 74 65 72 2d 3e 70 54  nalize(pIter->pT
6dc0: 6d 70 49 6e 73 65 72 74 29 3b 0a 20 20 70 55 70  mpInsert);.  pUp
6dd0: 20 3d 20 70 49 74 65 72 2d 3e 70 52 62 75 55 70   = pIter->pRbuUp
6de0: 64 61 74 65 3b 0a 20 20 77 68 69 6c 65 28 20 70  date;.  while( p
6df0: 55 70 20 29 7b 0a 20 20 20 20 52 62 75 55 70 64  Up ){.    RbuUpd
6e00: 61 74 65 53 74 6d 74 20 2a 70 54 6d 70 20 3d 20  ateStmt *pTmp = 
6e10: 70 55 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pUp->pNext;.    
6e20: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
6e30: 28 70 55 70 2d 3e 70 55 70 64 61 74 65 29 3b 0a  (pUp->pUpdate);.
6e40: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
6e50: 28 70 55 70 29 3b 0a 20 20 20 20 70 55 70 20 3d  (pUp);.    pUp =
6e60: 20 70 54 6d 70 3b 0a 20 20 7d 0a 20 20 0a 20 20   pTmp;.  }.  .  
6e70: 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 20 3d  pIter->pSelect =
6e80: 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e 70 49 6e   0;.  pIter->pIn
6e90: 73 65 72 74 20 3d 20 30 3b 0a 20 20 70 49 74 65  sert = 0;.  pIte
6ea0: 72 2d 3e 70 44 65 6c 65 74 65 20 3d 20 30 3b 0a  r->pDelete = 0;.
6eb0: 20 20 70 49 74 65 72 2d 3e 70 52 62 75 55 70 64    pIter->pRbuUpd
6ec0: 61 74 65 20 3d 20 30 3b 0a 20 20 70 49 74 65 72  ate = 0;.  pIter
6ed0: 2d 3e 70 54 6d 70 49 6e 73 65 72 74 20 3d 20 30  ->pTmpInsert = 0
6ee0: 3b 0a 20 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 20  ;.  pIter->nCol 
6ef0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  = 0;.}../*.** Cl
6f00: 65 61 6e 20 75 70 20 61 6e 79 20 72 65 73 6f 75  ean up any resou
6f10: 72 63 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  rces allocated a
6f20: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 74  s part of the it
6f30: 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 61  erator object pa
6f40: 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 6f  ssed.** as the o
6f50: 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  nly argument..*/
6f60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
6f70: 4f 62 6a 49 74 65 72 46 69 6e 61 6c 69 7a 65 28  ObjIterFinalize(
6f80: 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65  RbuObjIter *pIte
6f90: 72 29 7b 0a 20 20 72 62 75 4f 62 6a 49 74 65 72  r){.  rbuObjIter
6fa0: 43 6c 65 61 72 53 74 61 74 65 6d 65 6e 74 73 28  ClearStatements(
6fb0: 70 49 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  pIter);.  sqlite
6fc0: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 49 74 65 72  3_finalize(pIter
6fd0: 2d 3e 70 54 62 6c 49 74 65 72 29 3b 0a 20 20 73  ->pTblIter);.  s
6fe0: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
6ff0: 70 49 74 65 72 2d 3e 70 49 64 78 49 74 65 72 29  pIter->pIdxIter)
7000: 3b 0a 20 20 72 62 75 4f 62 6a 49 74 65 72 46 72  ;.  rbuObjIterFr
7010: 65 65 43 6f 6c 73 28 70 49 74 65 72 29 3b 0a 20  eeCols(pIter);. 
7020: 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30   memset(pIter, 0
7030: 2c 20 73 69 7a 65 6f 66 28 52 62 75 4f 62 6a 49  , sizeof(RbuObjI
7040: 74 65 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ter));.}../*.** 
7050: 41 64 76 61 6e 63 65 20 74 68 65 20 69 74 65 72  Advance the iter
7060: 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  ator to the next
7070: 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   position..**.**
7080: 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
7090: 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  urs, SQLITE_OK i
70a0: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
70b0: 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c  he iterator is l
70c0: 65 66 74 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67  eft .** pointing
70d0: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74   to the next ent
70e0: 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61  ry. Otherwise, a
70f0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  n error code and
7100: 20 6d 65 73 73 61 67 65 20 69 73 20 0a 2a 2a 20   message is .** 
7110: 6c 65 66 74 20 69 6e 20 74 68 65 20 52 42 55 20  left in the RBU 
7120: 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73  handle passed as
7130: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
7140: 65 6e 74 2e 20 41 20 63 6f 70 79 20 6f 66 20 74  ent. A copy of t
7150: 68 65 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64  he .** error cod
7160: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
7170: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75  /.static int rbu
7180: 4f 62 6a 49 74 65 72 4e 65 78 74 28 73 71 6c 69  ObjIterNext(sqli
7190: 74 65 33 72 62 75 20 2a 70 2c 20 52 62 75 4f 62  te3rbu *p, RbuOb
71a0: 6a 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  jIter *pIter){. 
71b0: 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b   int rc = p->rc;
71c0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
71d0: 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  E_OK ){..    /* 
71e0: 46 72 65 65 20 61 6e 79 20 53 51 4c 69 74 65 20  Free any SQLite 
71f0: 73 74 61 74 65 6d 65 6e 74 73 20 75 73 65 64 20  statements used 
7200: 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69 6e 67  while processing
7210: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6f 62   the previous ob
7220: 6a 65 63 74 20 2a 2f 20 0a 20 20 20 20 72 62 75  ject */ .    rbu
7230: 4f 62 6a 49 74 65 72 43 6c 65 61 72 53 74 61 74  ObjIterClearStat
7240: 65 6d 65 6e 74 73 28 70 49 74 65 72 29 3b 0a 20  ements(pIter);. 
7250: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 7a 49     if( pIter->zI
7260: 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  dx==0 ){.      r
7270: 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
7280: 28 70 2d 3e 64 62 4d 61 69 6e 2c 0a 20 20 20 20  (p->dbMain,.    
7290: 20 20 20 20 20 20 22 44 52 4f 50 20 54 52 49 47        "DROP TRIG
72a0: 47 45 52 20 49 46 20 45 58 49 53 54 53 20 74 65  GER IF EXISTS te
72b0: 6d 70 2e 72 62 75 5f 69 6e 73 65 72 74 5f 74 72  mp.rbu_insert_tr
72c0: 3b 22 0a 20 20 20 20 20 20 20 20 20 20 22 44 52  ;".          "DR
72d0: 4f 50 20 54 52 49 47 47 45 52 20 49 46 20 45 58  OP TRIGGER IF EX
72e0: 49 53 54 53 20 74 65 6d 70 2e 72 62 75 5f 75 70  ISTS temp.rbu_up
72f0: 64 61 74 65 31 5f 74 72 3b 22 0a 20 20 20 20 20  date1_tr;".     
7300: 20 20 20 20 20 22 44 52 4f 50 20 54 52 49 47 47       "DROP TRIGG
7310: 45 52 20 49 46 20 45 58 49 53 54 53 20 74 65 6d  ER IF EXISTS tem
7320: 70 2e 72 62 75 5f 75 70 64 61 74 65 32 5f 74 72  p.rbu_update2_tr
7330: 3b 22 0a 20 20 20 20 20 20 20 20 20 20 22 44 52  ;".          "DR
7340: 4f 50 20 54 52 49 47 47 45 52 20 49 46 20 45 58  OP TRIGGER IF EX
7350: 49 53 54 53 20 74 65 6d 70 2e 72 62 75 5f 64 65  ISTS temp.rbu_de
7360: 6c 65 74 65 5f 74 72 3b 22 0a 20 20 20 20 20 20  lete_tr;".      
7370: 20 20 20 20 2c 20 30 2c 20 30 2c 20 26 70 2d 3e      , 0, 0, &p->
7380: 7a 45 72 72 6d 73 67 0a 20 20 20 20 20 20 29 3b  zErrmsg.      );
7390: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
73a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
73b0: 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
73c0: 2d 3e 62 43 6c 65 61 6e 75 70 20 29 7b 0a 20 20  ->bCleanup ){.  
73d0: 20 20 20 20 20 20 72 62 75 4f 62 6a 49 74 65 72        rbuObjIter
73e0: 46 72 65 65 43 6f 6c 73 28 70 49 74 65 72 29 3b  FreeCols(pIter);
73f0: 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
7400: 62 43 6c 65 61 6e 75 70 20 3d 20 30 3b 0a 20 20  bCleanup = 0;.  
7410: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
7420: 65 33 5f 73 74 65 70 28 70 49 74 65 72 2d 3e 70  e3_step(pIter->p
7430: 54 62 6c 49 74 65 72 29 3b 0a 20 20 20 20 20 20  TblIter);.      
7440: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
7450: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20  _ROW ){.        
7460: 20 20 72 63 20 3d 20 72 65 73 65 74 41 6e 64 43    rc = resetAndC
7470: 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 49 74 65  ollectError(pIte
7480: 72 2d 3e 70 54 62 6c 49 74 65 72 2c 20 26 70 2d  r->pTblIter, &p-
7490: 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 20  >zErrmsg);.     
74a0: 20 20 20 20 20 70 49 74 65 72 2d 3e 7a 54 62 6c       pIter->zTbl
74b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
74c0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
74d0: 49 74 65 72 2d 3e 7a 54 62 6c 20 3d 20 28 63 6f  Iter->zTbl = (co
74e0: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
74f0: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 49  3_column_text(pI
7500: 74 65 72 2d 3e 70 54 62 6c 49 74 65 72 2c 20 30  ter->pTblIter, 0
7510: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  );.          pIt
7520: 65 72 2d 3e 7a 44 61 74 61 54 62 6c 20 3d 20 28  er->zDataTbl = (
7530: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
7540: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
7550: 70 49 74 65 72 2d 3e 70 54 62 6c 49 74 65 72 2c  pIter->pTblIter,
7560: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  1);.          rc
7570: 20 3d 20 28 70 49 74 65 72 2d 3e 7a 44 61 74 61   = (pIter->zData
7580: 54 62 6c 20 26 26 20 70 49 74 65 72 2d 3e 7a 54  Tbl && pIter->zT
7590: 62 6c 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  bl) ? SQLITE_OK 
75a0: 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  : SQLITE_NOMEM;.
75b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
75c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
75d0: 66 28 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d  f( pIter->zIdx==
75e0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
75f0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 64  qlite3_stmt *pId
7600: 78 20 3d 20 70 49 74 65 72 2d 3e 70 49 64 78 49  x = pIter->pIdxI
7610: 74 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 72  ter;.          r
7620: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
7630: 5f 74 65 78 74 28 70 49 64 78 2c 20 31 2c 20 70  _text(pIdx, 1, p
7640: 49 74 65 72 2d 3e 7a 54 62 6c 2c 20 2d 31 2c 20  Iter->zTbl, -1, 
7650: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
7660: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7670: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
7680: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
7690: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   rc = sqlite3_st
76a0: 65 70 28 70 49 74 65 72 2d 3e 70 49 64 78 49 74  ep(pIter->pIdxIt
76b0: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  er);.          i
76c0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f  f( rc!=SQLITE_RO
76d0: 57 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  W ){.           
76e0: 20 72 63 20 3d 20 72 65 73 65 74 41 6e 64 43 6f   rc = resetAndCo
76f0: 6c 6c 65 63 74 45 72 72 6f 72 28 70 49 74 65 72  llectError(pIter
7700: 2d 3e 70 49 64 78 49 74 65 72 2c 20 26 70 2d 3e  ->pIdxIter, &p->
7710: 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 20 20  zErrmsg);.      
7720: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62 43 6c        pIter->bCl
7730: 65 61 6e 75 70 20 3d 20 31 3b 0a 20 20 20 20 20  eanup = 1;.     
7740: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 7a 49         pIter->zI
7750: 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  dx = 0;.        
7760: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7770: 20 20 20 20 20 70 49 74 65 72 2d 3e 7a 49 64 78       pIter->zIdx
7780: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
7790: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
77a0: 65 78 74 28 70 49 74 65 72 2d 3e 70 49 64 78 49  ext(pIter->pIdxI
77b0: 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ter, 0);.       
77c0: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 54 6e 75       pIter->iTnu
77d0: 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  m = sqlite3_colu
77e0: 6d 6e 5f 69 6e 74 28 70 49 74 65 72 2d 3e 70 49  mn_int(pIter->pI
77f0: 64 78 49 74 65 72 2c 20 31 29 3b 0a 20 20 20 20  dxIter, 1);.    
7800: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62          pIter->b
7810: 55 6e 69 71 75 65 20 3d 20 73 71 6c 69 74 65 33  Unique = sqlite3
7820: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 49 74 65  _column_int(pIte
7830: 72 2d 3e 70 49 64 78 49 74 65 72 2c 20 32 29 3b  r->pIdxIter, 2);
7840: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
7850: 3d 20 70 49 74 65 72 2d 3e 7a 49 64 78 20 3f 20  = pIter->zIdx ? 
7860: 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49  SQLITE_OK : SQLI
7870: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
7880: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
7890: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
78a0: 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  }..  if( rc!=SQL
78b0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 62  ITE_OK ){.    rb
78c0: 75 4f 62 6a 49 74 65 72 46 69 6e 61 6c 69 7a 65  uObjIterFinalize
78d0: 28 70 49 74 65 72 29 3b 0a 20 20 20 20 70 2d 3e  (pIter);.    p->
78e0: 72 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 20 20 72  rc = rc;.  }.  r
78f0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
7900: 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e  .** The implemen
7910: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 62  tation of the rb
7920: 75 5f 74 61 72 67 65 74 5f 6e 61 6d 65 28 29 20  u_target_name() 
7930: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68  SQL function. Th
7940: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  is function.** a
7950: 63 63 65 70 74 73 20 6f 6e 65 20 6f 72 20 74 77  ccepts one or tw
7960: 6f 20 61 72 67 75 6d 65 6e 74 73 2e 20 54 68 65  o arguments. The
7970: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
7980: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
7990: 20 74 61 62 6c 65 20 2d 0a 2a 2a 20 74 68 65 20   table -.** the 
79a0: 6e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20  name of a table 
79b0: 69 6e 20 74 68 65 20 52 42 55 20 64 61 74 61 62  in the RBU datab
79c0: 61 73 65 2e 20 20 54 68 65 20 73 65 63 6f 6e 64  ase.  The second
79d0: 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65  , if it is prese
79e0: 6e 74 2c 20 69 73 20 31 0a 2a 2a 20 66 6f 72 20  nt, is 1.** for 
79f0: 61 20 76 69 65 77 20 6f 72 20 30 20 66 6f 72 20  a view or 0 for 
7a00: 61 20 74 61 62 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  a table. .**.** 
7a10: 46 6f 72 20 61 20 6e 6f 6e 2d 76 61 63 75 75 6d  For a non-vacuum
7a20: 20 52 42 55 20 68 61 6e 64 6c 65 2c 20 69 66 20   RBU handle, if 
7a30: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d  the table name m
7a40: 61 74 63 68 65 73 20 74 68 65 20 70 61 74 74 65  atches the patte
7a50: 72 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 61  rn:.**.**     da
7a60: 74 61 5b 30 2d 39 5d 5f 3c 6e 61 6d 65 3e 0a 2a  ta[0-9]_<name>.*
7a70: 2a 0a 2a 2a 20 77 68 65 72 65 20 3c 6e 61 6d 65  *.** where <name
7a80: 3e 20 69 73 20 61 6e 79 20 73 65 71 75 65 6e 63  > is any sequenc
7a90: 65 20 6f 66 20 31 20 6f 72 20 6d 6f 72 65 20 63  e of 1 or more c
7aa0: 68 61 72 61 63 74 65 72 73 2c 20 3c 6e 61 6d 65  haracters, <name
7ab0: 3e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  > is returned..*
7ac0: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
7ad0: 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  the only argumen
7ae0: 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  t does not match
7af0: 20 74 68 65 20 61 62 6f 76 65 20 70 61 74 74 65   the above patte
7b00: 72 6e 2c 20 61 6e 20 53 51 4c 0a 2a 2a 20 4e 55  rn, an SQL.** NU
7b10: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  LL is returned..
7b20: 2a 2a 0a 2a 2a 20 20 20 20 20 22 64 61 74 61 5f  **.**     "data_
7b30: 74 31 22 20 20 20 20 20 2d 3e 20 22 74 31 22 0a  t1"     -> "t1".
7b40: 2a 2a 20 20 20 20 20 22 64 61 74 61 30 31 32 33  **     "data0123
7b50: 5f 74 32 22 20 2d 3e 20 22 74 32 22 0a 2a 2a 20  _t2" -> "t2".** 
7b60: 20 20 20 20 22 64 61 74 61 41 42 5f 74 33 22 20      "dataAB_t3" 
7b70: 20 20 2d 3e 20 4e 55 4c 4c 0a 2a 2a 0a 2a 2a 20    -> NULL.**.** 
7b80: 46 6f 72 20 61 6e 20 72 62 75 20 76 61 63 75 75  For an rbu vacuu
7b90: 6d 20 68 61 6e 64 6c 65 2c 20 61 20 63 6f 70 79  m handle, a copy
7ba0: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 61 72   of the first ar
7bb0: 67 75 6d 65 6e 74 20 69 73 20 72 65 74 75 72 6e  gument is return
7bc0: 65 64 20 69 66 0a 2a 2a 20 74 68 65 20 73 65 63  ed if.** the sec
7bd0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
7be0: 65 69 74 68 65 72 20 6d 69 73 73 69 6e 67 20 6f  either missing o
7bf0: 72 20 30 20 28 6e 6f 74 20 61 20 76 69 65 77 29  r 0 (not a view)
7c00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7c10: 20 72 62 75 54 61 72 67 65 74 4e 61 6d 65 46 75   rbuTargetNameFu
7c20: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
7c30: 6e 74 65 78 74 20 2a 70 43 74 78 2c 0a 20 20 69  ntext *pCtx,.  i
7c40: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
7c50: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
7c60: 29 7b 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20  ){.  sqlite3rbu 
7c70: 2a 70 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65  *p = sqlite3_use
7c80: 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20  r_data(pCtx);.  
7c90: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 3b  const char *zIn;
7ca0: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
7cb0: 3d 31 20 7c 7c 20 61 72 67 63 3d 3d 32 20 29 3b  =1 || argc==2 );
7cc0: 0a 0a 20 20 7a 49 6e 20 3d 20 28 63 6f 6e 73 74  ..  zIn = (const
7cd0: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
7ce0: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
7cf0: 5d 29 3b 0a 20 20 69 66 28 20 7a 49 6e 20 29 7b  ]);.  if( zIn ){
7d00: 0a 20 20 20 20 69 66 28 20 72 62 75 49 73 56 61  .    if( rbuIsVa
7d10: 63 75 75 6d 28 70 29 20 29 7b 0a 20 20 20 20 20  cuum(p) ){.     
7d20: 20 69 66 28 20 61 72 67 63 3d 3d 31 20 7c 7c 20   if( argc==1 || 
7d30: 30 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  0==sqlite3_value
7d40: 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 20 29 7b  _int(argv[1]) ){
7d50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7d60: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74  _result_text(pCt
7d70: 78 2c 20 7a 49 6e 2c 20 2d 31 2c 20 53 51 4c 49  x, zIn, -1, SQLI
7d80: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
7d90: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
7da0: 20 20 20 20 20 69 66 28 20 73 74 72 6c 65 6e 28       if( strlen(
7db0: 7a 49 6e 29 3e 34 20 26 26 20 6d 65 6d 63 6d 70  zIn)>4 && memcmp
7dc0: 28 22 64 61 74 61 22 2c 20 7a 49 6e 2c 20 34 29  ("data", zIn, 4)
7dd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
7de0: 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f  nt i;.        fo
7df0: 72 28 69 3d 34 3b 20 7a 49 6e 5b 69 5d 3e 3d 27  r(i=4; zIn[i]>='
7e00: 30 27 20 26 26 20 7a 49 6e 5b 69 5d 3c 3d 27 39  0' && zIn[i]<='9
7e10: 27 3b 20 69 2b 2b 29 3b 0a 20 20 20 20 20 20 20  '; i++);.       
7e20: 20 69 66 28 20 7a 49 6e 5b 69 5d 3d 3d 27 5f 27   if( zIn[i]=='_'
7e30: 20 26 26 20 7a 49 6e 5b 69 2b 31 5d 20 29 7b 0a   && zIn[i+1] ){.
7e40: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
7e50: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43  3_result_text(pC
7e60: 74 78 2c 20 26 7a 49 6e 5b 69 2b 31 5d 2c 20 2d  tx, &zIn[i+1], -
7e70: 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
7e80: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
7e90: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
7ea0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
7eb0: 7a 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ze the iterator 
7ec0: 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
7ed0: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
7ee0: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49  rgument..**.** I
7ef0: 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
7f00: 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  s, SQLITE_OK is 
7f10: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
7f20: 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c 65 66   iterator is lef
7f30: 74 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74  t .** pointing t
7f40: 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
7f50: 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  y. Otherwise, an
7f60: 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20   error code and 
7f70: 6d 65 73 73 61 67 65 20 69 73 20 0a 2a 2a 20 6c  message is .** l
7f80: 65 66 74 20 69 6e 20 74 68 65 20 52 42 55 20 68  eft in the RBU h
7f90: 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20  andle passed as 
7fa0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
7fb0: 6e 74 2e 20 41 20 63 6f 70 79 20 6f 66 20 74 68  nt. A copy of th
7fc0: 65 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  e .** error code
7fd0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
7fe0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 4f  .static int rbuO
7ff0: 62 6a 49 74 65 72 46 69 72 73 74 28 73 71 6c 69  bjIterFirst(sqli
8000: 74 65 33 72 62 75 20 2a 70 2c 20 52 62 75 4f 62  te3rbu *p, RbuOb
8010: 6a 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  jIter *pIter){. 
8020: 20 69 6e 74 20 72 63 3b 0a 20 20 6d 65 6d 73 65   int rc;.  memse
8030: 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65  t(pIter, 0, size
8040: 6f 66 28 52 62 75 4f 62 6a 49 74 65 72 29 29 3b  of(RbuObjIter));
8050: 0a 0a 20 20 72 63 20 3d 20 70 72 65 70 61 72 65  ..  rc = prepare
8060: 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  FreeAndCollectEr
8070: 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20 26 70  ror(p->dbRbu, &p
8080: 49 74 65 72 2d 3e 70 54 62 6c 49 74 65 72 2c 20  Iter->pTblIter, 
8090: 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20  &p->zErrmsg, .  
80a0: 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
80b0: 66 28 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54  f(.      "SELECT
80c0: 20 72 62 75 5f 74 61 72 67 65 74 5f 6e 61 6d 65   rbu_target_name
80d0: 28 6e 61 6d 65 2c 20 74 79 70 65 3d 27 76 69 65  (name, type='vie
80e0: 77 27 29 20 41 53 20 74 61 72 67 65 74 2c 20 6e  w') AS target, n
80f0: 61 6d 65 20 22 0a 20 20 20 20 20 20 22 46 52 4f  ame ".      "FRO
8100: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
8110: 22 0a 20 20 20 20 20 20 22 57 48 45 52 45 20 74  ".      "WHERE t
8120: 79 70 65 20 49 4e 20 28 27 74 61 62 6c 65 27 2c  ype IN ('table',
8130: 20 27 76 69 65 77 27 29 20 41 4e 44 20 74 61 72   'view') AND tar
8140: 67 65 74 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20  get IS NOT NULL 
8150: 22 0a 20 20 20 20 20 20 22 20 25 73 20 22 0a 20  ".      " %s ". 
8160: 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 6e       "ORDER BY n
8170: 61 6d 65 22 0a 20 20 2c 20 72 62 75 49 73 56 61  ame".  , rbuIsVa
8180: 63 75 75 6d 28 70 29 20 3f 20 22 41 4e 44 20 72  cuum(p) ? "AND r
8190: 6f 6f 74 70 61 67 65 21 3d 30 20 41 4e 44 20 72  ootpage!=0 AND r
81a0: 6f 6f 74 70 61 67 65 20 49 53 20 4e 4f 54 20 4e  ootpage IS NOT N
81b0: 55 4c 4c 22 20 3a 20 22 22 29 29 3b 0a 0a 20 20  ULL" : ""));..  
81c0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
81d0: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 72  K ){.    rc = pr
81e0: 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45  epareAndCollectE
81f0: 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  rror(p->dbMain, 
8200: 26 70 49 74 65 72 2d 3e 70 49 64 78 49 74 65 72  &pIter->pIdxIter
8210: 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20  , &p->zErrmsg,. 
8220: 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e         "SELECT n
8230: 61 6d 65 2c 20 72 6f 6f 74 70 61 67 65 2c 20 73  ame, rootpage, s
8240: 71 6c 20 49 53 20 4e 55 4c 4c 20 4f 52 20 73 75  ql IS NULL OR su
8250: 62 73 74 72 28 38 2c 20 36 29 3d 3d 27 55 4e 49  bstr(8, 6)=='UNI
8260: 51 55 45 27 20 22 0a 20 20 20 20 20 20 20 20 22  QUE' ".        "
8270: 20 20 46 52 4f 4d 20 6d 61 69 6e 2e 73 71 6c 69    FROM main.sqli
8280: 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20  te_master ".    
8290: 20 20 20 20 22 20 20 57 48 45 52 45 20 74 79 70      "  WHERE typ
82a0: 65 3d 27 69 6e 64 65 78 27 20 41 4e 44 20 74 62  e='index' AND tb
82b0: 6c 5f 6e 61 6d 65 20 3d 20 3f 22 0a 20 20 20 20  l_name = ?".    
82c0: 29 3b 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d  );.  }..  pIter-
82d0: 3e 62 43 6c 65 61 6e 75 70 20 3d 20 31 3b 0a 20  >bCleanup = 1;. 
82e0: 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 72   p->rc = rc;.  r
82f0: 65 74 75 72 6e 20 72 62 75 4f 62 6a 49 74 65 72  eturn rbuObjIter
8300: 4e 65 78 74 28 70 2c 20 70 49 74 65 72 29 3b 0a  Next(p, pIter);.
8310: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
8320: 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e   a wrapper aroun
8330: 64 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  d "sqlite3_mprin
8340: 74 66 28 7a 46 6d 74 2c 20 2e 2e 2e 29 22 2e 20  tf(zFmt, ...)". 
8350: 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73  If an OOM occurs
8360: 2c 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f  ,.** an error co
8370: 64 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  de is stored in 
8380: 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65 20 70  the RBU handle p
8390: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
83a0: 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  st argument..**.
83b0: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68  ** If an error h
83c0: 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
83d0: 72 65 64 20 28 70 2d 3e 72 63 20 69 73 20 61 6c  red (p->rc is al
83e0: 72 65 61 64 79 20 73 65 74 20 74 6f 20 73 6f 6d  ready set to som
83f0: 65 74 68 69 6e 67 20 6f 74 68 65 72 0a 2a 2a 20  ething other.** 
8400: 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 29 2c  than SQLITE_OK),
8410: 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
8420: 69 6f 6e 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  ion returns NULL
8430: 20 77 69 74 68 6f 75 74 20 6d 6f 64 69 66 79 69   without modifyi
8440: 6e 67 20 74 68 65 0a 2a 2a 20 73 74 6f 72 65 64  ng the.** stored
8450: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 6e 20   error code. In 
8460: 74 68 69 73 20 63 61 73 65 20 69 74 20 73 74 69  this case it sti
8470: 6c 6c 20 63 61 6c 6c 73 20 73 71 6c 69 74 65 33  ll calls sqlite3
8480: 5f 66 72 65 65 28 29 20 6f 6e 20 61 6e 79 20 0a  _free() on any .
8490: 2a 2a 20 70 72 69 6e 74 66 28 29 20 70 61 72 61  ** printf() para
84a0: 6d 65 74 65 72 73 20 61 73 73 6f 63 69 61 74 65  meters associate
84b0: 64 20 77 69 74 68 20 25 7a 20 63 6f 6e 76 65 72  d with %z conver
84c0: 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  sions..*/.static
84d0: 20 63 68 61 72 20 2a 72 62 75 4d 50 72 69 6e 74   char *rbuMPrint
84e0: 66 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c  f(sqlite3rbu *p,
84f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d   const char *zFm
8500: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 63 68 61 72 20  t, ...){.  char 
8510: 2a 7a 53 71 6c 20 3d 20 30 3b 0a 20 20 76 61 5f  *zSql = 0;.  va_
8520: 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74  list ap;.  va_st
8530: 61 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20  art(ap, zFmt);. 
8540: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
8550: 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61  vmprintf(zFmt, a
8560: 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  p);.  if( p->rc=
8570: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8580: 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20    if( zSql==0 ) 
8590: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
85a0: 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OMEM;.  }else{. 
85b0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
85c0: 7a 53 71 6c 29 3b 0a 20 20 20 20 7a 53 71 6c 20  zSql);.    zSql 
85d0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 76 61 5f 65 6e  = 0;.  }.  va_en
85e0: 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  d(ap);.  return 
85f0: 7a 53 71 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  zSql;.}../*.** A
8600: 72 67 75 6d 65 6e 74 20 7a 46 6d 74 20 69 73 20  rgument zFmt is 
8610: 61 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  a sqlite3_mprint
8620: 66 28 29 20 73 74 79 6c 65 20 66 6f 72 6d 61 74  f() style format
8630: 20 73 74 72 69 6e 67 2e 20 54 68 65 20 74 72 61   string. The tra
8640: 69 6c 69 6e 67 0a 2a 2a 20 61 72 67 75 6d 65 6e  iling.** argumen
8650: 74 73 20 61 72 65 20 74 68 65 20 75 73 75 61 6c  ts are the usual
8660: 20 73 75 62 73 69 74 75 74 69 6f 6e 20 76 61 6c   subsitution val
8670: 75 65 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ues. This functi
8680: 6f 6e 20 70 65 72 66 6f 72 6d 73 0a 2a 2a 20 74  on performs.** t
8690: 68 65 20 70 72 69 6e 74 66 28 29 20 73 74 79 6c  he printf() styl
86a0: 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20  e substitutions 
86b0: 61 6e 64 20 65 78 65 63 75 74 65 73 20 74 68 65  and executes the
86c0: 20 72 65 73 75 6c 74 20 61 73 20 61 6e 20 53 51   result as an SQ
86d0: 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6f  L.** statement o
86e0: 6e 20 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65  n the RBU handle
86f0: 73 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  s database..**.*
8700: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
8710: 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63  curs, an error c
8720: 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65  ode and error me
8730: 73 73 61 67 65 20 69 73 20 73 74 6f 72 65 64 20  ssage is stored 
8740: 69 6e 20 74 68 65 0a 2a 2a 20 52 42 55 20 68 61  in the.** RBU ha
8750: 6e 64 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f  ndle. If an erro
8760: 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
8770: 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73  curred when this
8780: 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20   function is.** 
8790: 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
87a0: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
87b0: 20 69 6e 74 20 72 62 75 4d 50 72 69 6e 74 66 45   int rbuMPrintfE
87c0: 78 65 63 28 73 71 6c 69 74 65 33 72 62 75 20 2a  xec(sqlite3rbu *
87d0: 70 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  p, sqlite3 *db, 
87e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74  const char *zFmt
87f0: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
8800: 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53  t ap;.  char *zS
8810: 71 6c 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  ql;.  va_start(a
8820: 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 7a 53 71 6c  p, zFmt);.  zSql
8830: 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69   = sqlite3_vmpri
8840: 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20  ntf(zFmt, ap);. 
8850: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
8860: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
8870: 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zSql==0 ){.    
8880: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
8890: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
88a0: 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  e{.      p->rc =
88b0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62   sqlite3_exec(db
88c0: 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 70  , zSql, 0, 0, &p
88d0: 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20  ->zErrmsg);.    
88e0: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
88f0: 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 76 61  free(zSql);.  va
8900: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75  _end(ap);.  retu
8910: 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a  rn p->rc;.}../*.
8920: 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 61 6c  ** Attempt to al
8930: 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72  locate and retur
8940: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
8950: 20 7a 65 72 6f 65 64 20 62 6c 6f 63 6b 20 6f 66   zeroed block of
8960: 20 6e 42 79 74 65 20 0a 2a 2a 20 62 79 74 65 73   nByte .** bytes
8970: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  . .**.** If an e
8980: 72 72 6f 72 20 28 69 2e 65 2e 20 61 6e 20 4f 4f  rror (i.e. an OO
8990: 4d 20 63 6f 6e 64 69 74 69 6f 6e 29 20 6f 63 63  M condition) occ
89a0: 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  urs, return NULL
89b0: 20 61 6e 64 20 6c 65 61 76 65 20 61 6e 20 0a 2a   and leave an .*
89c0: 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 6e 20  * error code in 
89d0: 74 68 65 20 72 62 75 20 68 61 6e 64 6c 65 20 70  the rbu handle p
89e0: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
89f0: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 4f 72 2c  st argument. Or,
8a00: 20 69 66 20 61 6e 20 0a 2a 2a 20 65 72 72 6f 72   if an .** error
8a10: 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
8a20: 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20  urred when this 
8a30: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
8a40: 65 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20  ed, return NULL 
8a50: 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  .** immediately 
8a60: 77 69 74 68 6f 75 74 20 61 74 74 65 6d 70 74 69  without attempti
8a70: 6e 67 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  ng the allocatio
8a80: 6e 20 6f 72 20 6d 6f 64 69 66 79 69 6e 67 20 74  n or modifying t
8a90: 68 65 20 73 74 6f 72 65 64 0a 2a 2a 20 65 72 72  he stored.** err
8aa0: 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
8ab0: 69 63 20 76 6f 69 64 20 2a 72 62 75 4d 61 6c 6c  ic void *rbuMall
8ac0: 6f 63 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  oc(sqlite3rbu *p
8ad0: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
8ae0: 6e 42 79 74 65 29 7b 0a 20 20 76 6f 69 64 20 2a  nByte){.  void *
8af0: 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  pRet = 0;.  if( 
8b00: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
8b10: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
8b20: 6e 42 79 74 65 3e 30 20 29 3b 0a 20 20 20 20 70  nByte>0 );.    p
8b30: 52 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Ret = sqlite3_ma
8b40: 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29 3b 0a 20  lloc64(nByte);. 
8b50: 20 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 29     if( pRet==0 )
8b60: 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
8b70: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
8b80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d    }else{.      m
8b90: 65 6d 73 65 74 28 70 52 65 74 2c 20 30 2c 20 6e  emset(pRet, 0, n
8ba0: 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Byte);.    }.  }
8bb0: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
8bc0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  }.../*.** Alloca
8bd0: 74 65 20 61 6e 64 20 7a 65 72 6f 20 74 68 65 20  te and zero the 
8be0: 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b  pIter->azTblCol[
8bf0: 5d 20 61 6e 64 20 61 62 54 62 6c 50 6b 5b 5d 20  ] and abTblPk[] 
8c00: 61 72 72 61 79 73 20 73 6f 20 74 68 61 74 0a 2a  arrays so that.*
8c10: 2a 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20  * there is room 
8c20: 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6e 43 6f  for at least nCo
8c30: 6c 20 65 6c 65 6d 65 6e 74 73 2e 20 49 66 20 61  l elements. If a
8c40: 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 73 74  n OOM occurs, st
8c50: 6f 72 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20  ore an.** error 
8c60: 63 6f 64 65 20 69 6e 20 74 68 65 20 52 42 55 20  code in the RBU 
8c70: 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73  handle passed as
8c80: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
8c90: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
8ca0: 6f 69 64 20 72 62 75 41 6c 6c 6f 63 61 74 65 49  oid rbuAllocateI
8cb0: 74 65 72 41 72 72 61 79 73 28 73 71 6c 69 74 65  terArrays(sqlite
8cc0: 33 72 62 75 20 2a 70 2c 20 52 62 75 4f 62 6a 49  3rbu *p, RbuObjI
8cd0: 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20  ter *pIter, int 
8ce0: 6e 43 6f 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33  nCol){.  sqlite3
8cf0: 5f 69 6e 74 36 34 20 6e 42 79 74 65 20 3d 20 28  _int64 nByte = (
8d00: 32 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20  2*sizeof(char*) 
8d10: 2b 20 73 69 7a 65 6f 66 28 69 6e 74 29 20 2b 20  + sizeof(int) + 
8d20: 33 2a 73 69 7a 65 6f 66 28 75 38 29 29 20 2a 20  3*sizeof(u8)) * 
8d30: 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 2a 61  nCol;.  char **a
8d40: 7a 4e 65 77 3b 0a 0a 20 20 61 7a 4e 65 77 20 3d  zNew;..  azNew =
8d50: 20 28 63 68 61 72 2a 2a 29 72 62 75 4d 61 6c 6c   (char**)rbuMall
8d60: 6f 63 28 70 2c 20 6e 42 79 74 65 29 3b 0a 20 20  oc(p, nByte);.  
8d70: 69 66 28 20 61 7a 4e 65 77 20 29 7b 0a 20 20 20  if( azNew ){.   
8d80: 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c   pIter->azTblCol
8d90: 20 3d 20 61 7a 4e 65 77 3b 0a 20 20 20 20 70 49   = azNew;.    pI
8da0: 74 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65 20 3d  ter->azTblType =
8db0: 20 26 61 7a 4e 65 77 5b 6e 43 6f 6c 5d 3b 0a 20   &azNew[nCol];. 
8dc0: 20 20 20 70 49 74 65 72 2d 3e 61 69 53 72 63 4f     pIter->aiSrcO
8dd0: 72 64 65 72 20 3d 20 28 69 6e 74 2a 29 26 70 49  rder = (int*)&pI
8de0: 74 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65 5b 6e  ter->azTblType[n
8df0: 43 6f 6c 5d 3b 0a 20 20 20 20 70 49 74 65 72 2d  Col];.    pIter-
8e00: 3e 61 62 54 62 6c 50 6b 20 3d 20 28 75 38 2a 29  >abTblPk = (u8*)
8e10: 26 70 49 74 65 72 2d 3e 61 69 53 72 63 4f 72 64  &pIter->aiSrcOrd
8e20: 65 72 5b 6e 43 6f 6c 5d 3b 0a 20 20 20 20 70 49  er[nCol];.    pI
8e30: 74 65 72 2d 3e 61 62 4e 6f 74 4e 75 6c 6c 20 3d  ter->abNotNull =
8e40: 20 28 75 38 2a 29 26 70 49 74 65 72 2d 3e 61 62   (u8*)&pIter->ab
8e50: 54 62 6c 50 6b 5b 6e 43 6f 6c 5d 3b 0a 20 20 20  TblPk[nCol];.   
8e60: 20 70 49 74 65 72 2d 3e 61 62 49 6e 64 65 78 65   pIter->abIndexe
8e70: 64 20 3d 20 28 75 38 2a 29 26 70 49 74 65 72 2d  d = (u8*)&pIter-
8e80: 3e 61 62 4e 6f 74 4e 75 6c 6c 5b 6e 43 6f 6c 5d  >abNotNull[nCol]
8e90: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
8ea0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
8eb0: 74 20 6d 75 73 74 20 62 65 20 61 20 6e 75 6c 2d  t must be a nul-
8ec0: 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
8ed0: 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  g. This function
8ee0: 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 63 6f  .** returns a co
8ef0: 70 79 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67  py of the string
8f00: 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
8f10: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
8f20: 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 74  _malloc()..** It
8f30: 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
8f40: 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
8f50: 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
8f60: 6c 79 20 66 72 65 65 20 74 68 69 73 20 6d 65 6d  ly free this mem
8f70: 6f 72 79 0a 2a 2a 20 75 73 69 6e 67 20 73 71 6c  ory.** using sql
8f80: 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2a 0a  ite3_free()..**.
8f90: 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e  ** If an OOM con
8fa0: 64 69 74 69 6f 6e 20 69 73 20 65 6e 63 6f 75 6e  dition is encoun
8fb0: 74 65 72 65 64 20 77 68 65 6e 20 61 74 74 65 6d  tered when attem
8fc0: 70 74 69 6e 67 20 74 6f 20 61 6c 6c 6f 63 61 74  pting to allocat
8fd0: 65 20 6d 65 6d 6f 72 79 2c 0a 2a 2a 20 6f 75 74  e memory,.** out
8fe0: 70 75 74 20 76 61 72 69 61 62 6c 65 20 28 2a 70  put variable (*p
8ff0: 52 63 29 20 69 73 20 73 65 74 20 74 6f 20 53 51  Rc) is set to SQ
9000: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 62 65 66 6f 72  LITE_NOMEM befor
9010: 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 4f 74 68  e returning. Oth
9020: 65 72 77 69 73 65 2c 0a 2a 2a 20 69 66 20 74 68  erwise,.** if th
9030: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 75 63  e allocation suc
9040: 63 65 65 64 73 2c 20 28 2a 70 52 63 29 20 69 73  ceeds, (*pRc) is
9050: 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e   left unchanged.
9060: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
9070: 2a 72 62 75 53 74 72 6e 64 75 70 28 63 6f 6e 73  *rbuStrndup(cons
9080: 74 20 63 68 61 72 20 2a 7a 53 74 72 2c 20 69 6e  t char *zStr, in
9090: 74 20 2a 70 52 63 29 7b 0a 20 20 63 68 61 72 20  t *pRc){.  char 
90a0: 2a 7a 52 65 74 20 3d 20 30 3b 0a 0a 20 20 61 73  *zRet = 0;..  as
90b0: 73 65 72 74 28 20 2a 70 52 63 3d 3d 53 51 4c 49  sert( *pRc==SQLI
90c0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 7a  TE_OK );.  if( z
90d0: 53 74 72 20 29 7b 0a 20 20 20 20 73 69 7a 65 5f  Str ){.    size_
90e0: 74 20 6e 43 6f 70 79 20 3d 20 73 74 72 6c 65 6e  t nCopy = strlen
90f0: 28 7a 53 74 72 29 20 2b 20 31 3b 0a 20 20 20 20  (zStr) + 1;.    
9100: 7a 52 65 74 20 3d 20 28 63 68 61 72 2a 29 73 71  zRet = (char*)sq
9110: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e  lite3_malloc64(n
9120: 43 6f 70 79 29 3b 0a 20 20 20 20 69 66 28 20 7a  Copy);.    if( z
9130: 52 65 74 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  Ret ){.      mem
9140: 63 70 79 28 7a 52 65 74 2c 20 7a 53 74 72 2c 20  cpy(zRet, zStr, 
9150: 6e 43 6f 70 79 29 3b 0a 20 20 20 20 7d 65 6c 73  nCopy);.    }els
9160: 65 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20  e{.      *pRc = 
9170: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
9180: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
9190: 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n zRet;.}../*.**
91a0: 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20 73 74   Finalize the st
91b0: 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61  atement passed a
91c0: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
91d0: 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ument..**.** If 
91e0: 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  the sqlite3_fina
91f0: 6c 69 7a 65 28 29 20 63 61 6c 6c 20 69 6e 64 69  lize() call indi
9200: 63 61 74 65 73 20 74 68 61 74 20 61 6e 20 65 72  cates that an er
9210: 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 64 20  ror occurs, and 
9220: 74 68 65 0a 2a 2a 20 72 62 75 20 68 61 6e 64 6c  the.** rbu handl
9230: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
9240: 6e 6f 74 20 61 6c 72 65 61 64 79 20 73 65 74 2c  not already set,
9250: 20 73 65 74 20 74 68 65 20 65 72 72 6f 72 20 63   set the error c
9260: 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 0a 2a 2a  ode and error.**
9270: 20 6d 65 73 73 61 67 65 20 61 63 63 6f 72 64 69   message accordi
9280: 6e 67 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ngly..*/.static 
9290: 76 6f 69 64 20 72 62 75 46 69 6e 61 6c 69 7a 65  void rbuFinalize
92a0: 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20  (sqlite3rbu *p, 
92b0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
92c0: 74 6d 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  tmt){.  sqlite3 
92d0: 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 64 62  *db = sqlite3_db
92e0: 5f 68 61 6e 64 6c 65 28 70 53 74 6d 74 29 3b 0a  _handle(pStmt);.
92f0: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
9300: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
9310: 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  t);.  if( p->rc=
9320: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
9330: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
9340: 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
9350: 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20     p->zErrmsg = 
9360: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
9370: 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  "%s", sqlite3_er
9380: 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d 0a 7d  rmsg(db));.  }.}
9390: 0a 0a 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74  ../* Determine t
93a0: 68 65 20 74 79 70 65 20 6f 66 20 61 20 74 61 62  he type of a tab
93b0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 70 65 54 79  le..**.**   peTy
93c0: 70 65 20 69 73 20 6f 66 20 74 79 70 65 20 28 69  pe is of type (i
93d0: 6e 74 2a 29 2c 20 61 20 70 6f 69 6e 74 65 72 20  nt*), a pointer 
93e0: 74 6f 20 61 6e 20 6f 75 74 70 75 74 20 70 61 72  to an output par
93f0: 61 6d 65 74 65 72 20 6f 66 20 74 79 70 65 0a 2a  ameter of type.*
9400: 2a 20 20 20 28 69 6e 74 29 2e 20 54 68 69 73 20  *   (int). This 
9410: 63 61 6c 6c 20 73 65 74 73 20 74 68 65 20 6f 75  call sets the ou
9420: 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 20 61  tput parameter a
9430: 73 20 66 6f 6c 6c 6f 77 73 2c 20 64 65 70 65 6e  s follows, depen
9440: 64 69 6e 67 0a 2a 2a 20 20 20 6f 6e 20 74 68 65  ding.**   on the
9450: 20 74 79 70 65 20 6f 66 20 74 68 65 20 74 61 62   type of the tab
9460: 6c 65 20 73 70 65 63 69 66 69 65 64 20 62 79 20  le specified by 
9470: 70 61 72 61 6d 65 74 65 72 73 20 64 62 4e 61 6d  parameters dbNam
9480: 65 20 61 6e 64 20 7a 54 62 6c 2e 0a 2a 2a 0a 2a  e and zTbl..**.*
9490: 2a 20 20 20 20 20 52 42 55 5f 50 4b 5f 4e 4f 54  *     RBU_PK_NOT
94a0: 41 42 4c 45 3a 20 20 20 20 20 20 20 4e 6f 20 73  ABLE:       No s
94b0: 75 63 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20  uch table..**   
94c0: 20 20 52 42 55 5f 50 4b 5f 4e 4f 4e 45 3a 20 20    RBU_PK_NONE:  
94d0: 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 68 61          Table ha
94e0: 73 20 61 6e 20 69 6d 70 6c 69 63 69 74 20 72 6f  s an implicit ro
94f0: 77 69 64 2e 0a 2a 2a 20 20 20 20 20 52 42 55 5f  wid..**     RBU_
9500: 50 4b 5f 49 50 4b 3a 20 20 20 20 20 20 20 20 20  PK_IPK:         
9510: 20 20 54 61 62 6c 65 20 68 61 73 20 61 6e 20 65    Table has an e
9520: 78 70 6c 69 63 69 74 20 49 50 4b 20 63 6f 6c 75  xplicit IPK colu
9530: 6d 6e 2e 0a 2a 2a 20 20 20 20 20 52 42 55 5f 50  mn..**     RBU_P
9540: 4b 5f 45 58 54 45 52 4e 41 4c 3a 20 20 20 20 20  K_EXTERNAL:     
9550: 20 54 61 62 6c 65 20 68 61 73 20 61 6e 20 65 78   Table has an ex
9560: 74 65 72 6e 61 6c 20 50 4b 20 69 6e 64 65 78 2e  ternal PK index.
9570: 0a 2a 2a 20 20 20 20 20 52 42 55 5f 50 4b 5f 57  .**     RBU_PK_W
9580: 49 54 48 4f 55 54 5f 52 4f 57 49 44 3a 20 54 61  ITHOUT_ROWID: Ta
9590: 62 6c 65 20 69 73 20 57 49 54 48 4f 55 54 20 52  ble is WITHOUT R
95a0: 4f 57 49 44 2e 0a 2a 2a 20 20 20 20 20 52 42 55  OWID..**     RBU
95b0: 5f 50 4b 5f 56 54 41 42 3a 20 20 20 20 20 20 20  _PK_VTAB:       
95c0: 20 20 20 54 61 62 6c 65 20 69 73 20 61 20 76 69     Table is a vi
95d0: 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a  rtual table..**.
95e0: 2a 2a 20 20 20 41 72 67 75 6d 65 6e 74 20 2a 70  **   Argument *p
95f0: 69 50 6b 20 69 73 20 61 6c 73 6f 20 6f 66 20 74  iPk is also of t
9600: 79 70 65 20 28 69 6e 74 2a 29 2c 20 61 6e 64 20  ype (int*), and 
9610: 61 6c 73 6f 20 70 6f 69 6e 74 73 20 74 6f 20 61  also points to a
9620: 6e 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 70 61  n output.**   pa
9630: 72 61 6d 65 74 65 72 2e 20 55 6e 6c 65 73 73 20  rameter. Unless 
9640: 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e  the table has an
9650: 20 65 78 74 65 72 6e 61 6c 20 70 72 69 6d 61 72   external primar
9660: 79 20 6b 65 79 20 69 6e 64 65 78 20 0a 2a 2a 20  y key index .** 
9670: 20 20 28 69 2e 65 2e 20 75 6e 6c 65 73 73 20 2a    (i.e. unless *
9680: 70 65 54 79 70 65 20 69 73 20 73 65 74 20 74 6f  peType is set to
9690: 20 33 29 2c 20 74 68 65 6e 20 2a 70 69 50 6b 20   3), then *piPk 
96a0: 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
96b0: 4f 72 2c 0a 2a 2a 20 20 20 69 66 20 74 68 65 20  Or,.**   if the 
96c0: 74 61 62 6c 65 20 64 6f 65 73 20 68 61 76 65 20  table does have 
96d0: 61 6e 20 65 78 74 65 72 6e 61 6c 20 70 72 69 6d  an external prim
96e0: 61 72 79 20 6b 65 79 20 69 6e 64 65 78 2c 20 74  ary key index, t
96f0: 68 65 6e 20 2a 70 69 50 6b 0a 2a 2a 20 20 20 69  hen *piPk.**   i
9700: 73 20 73 65 74 20 74 6f 20 74 68 65 20 72 6f 6f  s set to the roo
9710: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  t page number of
9720: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
9730: 20 69 6e 64 65 78 20 62 65 66 6f 72 65 0a 2a 2a   index before.**
9740: 20 20 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a     returning..**
9750: 0a 2a 2a 20 41 4c 47 4f 52 49 54 48 4d 3a 0a 2a  .** ALGORITHM:.*
9760: 2a 0a 2a 2a 20 20 20 69 66 28 20 6e 6f 20 65 6e  *.**   if( no en
9770: 74 72 79 20 65 78 69 73 74 73 20 69 6e 20 73 71  try exists in sq
9780: 6c 69 74 65 5f 6d 61 73 74 65 72 20 29 7b 0a 2a  lite_master ){.*
9790: 2a 20 20 20 20 20 72 65 74 75 72 6e 20 52 42 55  *     return RBU
97a0: 5f 50 4b 5f 4e 4f 54 41 42 4c 45 0a 2a 2a 20 20  _PK_NOTABLE.**  
97b0: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 20 66   }else if( sql f
97c0: 6f 72 20 74 68 65 20 65 6e 74 72 79 20 73 74 61  or the entry sta
97d0: 72 74 73 20 77 69 74 68 20 22 43 52 45 41 54 45  rts with "CREATE
97e0: 20 56 49 52 54 55 41 4c 22 20 29 7b 0a 2a 2a 20   VIRTUAL" ){.** 
97f0: 20 20 20 20 72 65 74 75 72 6e 20 52 42 55 5f 50      return RBU_P
9800: 4b 5f 56 54 41 42 0a 2a 2a 20 20 20 7d 65 6c 73  K_VTAB.**   }els
9810: 65 20 69 66 28 20 22 50 52 41 47 4d 41 20 69 6e  e if( "PRAGMA in
9820: 64 65 78 5f 6c 69 73 74 28 29 22 20 66 6f 72 20  dex_list()" for 
9830: 74 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  the table contai
9840: 6e 73 20 61 20 22 70 6b 22 20 69 6e 64 65 78 20  ns a "pk" index 
9850: 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20 74 68  ){.**     if( th
9860: 65 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 20  e index that is 
9870: 74 68 65 20 70 6b 20 65 78 69 73 74 73 20 69 6e  the pk exists in
9880: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 29   sqlite_master )
9890: 7b 0a 2a 2a 20 20 20 20 20 20 20 2a 70 69 50 4b  {.**       *piPK
98a0: 20 3d 20 72 6f 6f 74 70 61 67 65 20 6f 66 20 74   = rootpage of t
98b0: 68 61 74 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20  hat index..**   
98c0: 20 20 20 20 72 65 74 75 72 6e 20 52 42 55 5f 50      return RBU_P
98d0: 4b 5f 45 58 54 45 52 4e 41 4c 0a 2a 2a 20 20 20  K_EXTERNAL.**   
98e0: 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20 20 20    }else{.**     
98f0: 20 20 72 65 74 75 72 6e 20 52 42 55 5f 50 4b 5f    return RBU_PK_
9900: 57 49 54 48 4f 55 54 5f 52 4f 57 49 44 0a 2a 2a  WITHOUT_ROWID.**
9910: 20 20 20 20 20 7d 0a 2a 2a 20 20 20 7d 65 6c 73       }.**   }els
9920: 65 20 69 66 28 20 22 50 52 41 47 4d 41 20 74 61  e if( "PRAGMA ta
9930: 62 6c 65 5f 69 6e 66 6f 28 29 22 20 6c 69 73 74  ble_info()" list
9940: 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 70  s one or more "p
9950: 6b 22 20 63 6f 6c 75 6d 6e 73 20 29 7b 0a 2a 2a  k" columns ){.**
9960: 20 20 20 20 20 72 65 74 75 72 6e 20 52 42 55 5f       return RBU_
9970: 50 4b 5f 49 50 4b 0a 2a 2a 20 20 20 7d 65 6c 73  PK_IPK.**   }els
9980: 65 7b 0a 2a 2a 20 20 20 20 20 72 65 74 75 72 6e  e{.**     return
9990: 20 52 42 55 5f 50 4b 5f 4e 4f 4e 45 0a 2a 2a 20   RBU_PK_NONE.** 
99a0: 20 20 7d 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f    }.*/.static vo
99b0: 69 64 20 72 62 75 54 61 62 6c 65 54 79 70 65 28  id rbuTableType(
99c0: 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70  .  sqlite3rbu *p
99d0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
99e0: 7a 54 61 62 2c 0a 20 20 69 6e 74 20 2a 70 65 54  zTab,.  int *peT
99f0: 79 70 65 2c 0a 20 20 69 6e 74 20 2a 70 69 54 6e  ype,.  int *piTn
9a00: 75 6d 2c 0a 20 20 69 6e 74 20 2a 70 69 50 6b 0a  um,.  int *piPk.
9a10: 29 7b 0a 20 20 2f 2a 0a 20 20 2a 2a 20 30 29 20  ){.  /*.  ** 0) 
9a20: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
9a30: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
9a40: 65 72 20 77 68 65 72 65 20 6e 61 6d 65 3d 25 51  er where name=%Q
9a50: 20 41 4e 44 20 49 73 56 69 72 74 75 61 6c 28 25   AND IsVirtual(%
9a60: 51 29 0a 20 20 2a 2a 20 31 29 20 50 52 41 47 4d  Q).  ** 1) PRAGM
9a70: 41 20 69 6e 64 65 78 5f 6c 69 73 74 20 3d 20 3f  A index_list = ?
9a80: 0a 20 20 2a 2a 20 32 29 20 53 45 4c 45 43 54 20  .  ** 2) SELECT 
9a90: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 73 71  count(*) FROM sq
9aa0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 77 68 65 72  lite_master wher
9ab0: 65 20 6e 61 6d 65 3d 25 51 20 0a 20 20 2a 2a 20  e name=%Q .  ** 
9ac0: 33 29 20 50 52 41 47 4d 41 20 74 61 62 6c 65 5f  3) PRAGMA table_
9ad0: 69 6e 66 6f 20 3d 20 3f 0a 20 20 2a 2f 0a 20 20  info = ?.  */.  
9ae0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 61 53  sqlite3_stmt *aS
9af0: 74 6d 74 5b 34 5d 20 3d 20 7b 30 2c 20 30 2c 20  tmt[4] = {0, 0, 
9b00: 30 2c 20 30 7d 3b 0a 0a 20 20 2a 70 65 54 79 70  0, 0};..  *peTyp
9b10: 65 20 3d 20 52 42 55 5f 50 4b 5f 4e 4f 54 41 42  e = RBU_PK_NOTAB
9b20: 4c 45 3b 0a 20 20 2a 70 69 50 6b 20 3d 20 30 3b  LE;.  *piPk = 0;
9b30: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ..  assert( p->r
9b40: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
9b50: 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72    p->rc = prepar
9b60: 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45  eFreeAndCollectE
9b70: 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  rror(p->dbMain, 
9b80: 26 61 53 74 6d 74 5b 30 5d 2c 20 26 70 2d 3e 7a  &aStmt[0], &p->z
9b90: 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 73 71 6c  Errmsg, .    sql
9ba0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
9bb0: 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
9bc0: 28 73 71 6c 20 4c 49 4b 45 20 27 63 72 65 61 74  (sql LIKE 'creat
9bd0: 65 20 76 69 72 74 75 61 6c 25 25 27 29 2c 20 72  e virtual%%'), r
9be0: 6f 6f 74 70 61 67 65 22 0a 20 20 20 20 20 20 20  ootpage".       
9bf0: 20 20 20 22 20 20 46 52 4f 4d 20 73 71 6c 69 74     "  FROM sqlit
9c00: 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20  e_master".      
9c10: 20 20 20 20 22 20 57 48 45 52 45 20 6e 61 6d 65      " WHERE name
9c20: 3d 25 51 22 2c 20 7a 54 61 62 0a 20 20 29 29 3b  =%Q", zTab.  ));
9c30: 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51  .  if( p->rc!=SQ
9c40: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74  LITE_OK || sqlit
9c50: 65 33 5f 73 74 65 70 28 61 53 74 6d 74 5b 30 5d  e3_step(aStmt[0]
9c60: 29 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )!=SQLITE_ROW ){
9c70: 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 61  .    /* Either a
9c80: 6e 20 65 72 72 6f 72 2c 20 6f 72 20 6e 6f 20 73  n error, or no s
9c90: 75 63 68 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20  uch table. */.  
9ca0: 20 20 67 6f 74 6f 20 72 62 75 54 61 62 6c 65 54    goto rbuTableT
9cb0: 79 70 65 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69  ype_end;.  }.  i
9cc0: 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  f( sqlite3_colum
9cd0: 6e 5f 69 6e 74 28 61 53 74 6d 74 5b 30 5d 2c 20  n_int(aStmt[0], 
9ce0: 30 29 20 29 7b 0a 20 20 20 20 2a 70 65 54 79 70  0) ){.    *peTyp
9cf0: 65 20 3d 20 52 42 55 5f 50 4b 5f 56 54 41 42 3b  e = RBU_PK_VTAB;
9d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d10: 20 20 20 20 20 2f 2a 20 76 69 72 74 75 61 6c 20       /* virtual 
9d20: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 67 6f 74  table */.    got
9d30: 6f 20 72 62 75 54 61 62 6c 65 54 79 70 65 5f 65  o rbuTableType_e
9d40: 6e 64 3b 0a 20 20 7d 0a 20 20 2a 70 69 54 6e 75  nd;.  }.  *piTnu
9d50: 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  m = sqlite3_colu
9d60: 6d 6e 5f 69 6e 74 28 61 53 74 6d 74 5b 30 5d 2c  mn_int(aStmt[0],
9d70: 20 31 29 3b 0a 0a 20 20 70 2d 3e 72 63 20 3d 20   1);..  p->rc = 
9d80: 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f  prepareFreeAndCo
9d90: 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62  llectError(p->db
9da0: 4d 61 69 6e 2c 20 26 61 53 74 6d 74 5b 31 5d 2c  Main, &aStmt[1],
9db0: 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20   &p->zErrmsg, . 
9dc0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e     sqlite3_mprin
9dd0: 74 66 28 22 50 52 41 47 4d 41 20 69 6e 64 65 78  tf("PRAGMA index
9de0: 5f 6c 69 73 74 3d 25 51 22 2c 7a 54 61 62 29 0a  _list=%Q",zTab).
9df0: 20 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63    );.  if( p->rc
9e00: 20 29 20 67 6f 74 6f 20 72 62 75 54 61 62 6c 65   ) goto rbuTable
9e10: 54 79 70 65 5f 65 6e 64 3b 0a 20 20 77 68 69 6c  Type_end;.  whil
9e20: 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  e( sqlite3_step(
9e30: 61 53 74 6d 74 5b 31 5d 29 3d 3d 53 51 4c 49 54  aStmt[1])==SQLIT
9e40: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e  E_ROW ){.    con
9e50: 73 74 20 75 38 20 2a 7a 4f 72 69 67 20 3d 20 73  st u8 *zOrig = s
9e60: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
9e70: 78 74 28 61 53 74 6d 74 5b 31 5d 2c 20 33 29 3b  xt(aStmt[1], 3);
9e80: 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a  .    const u8 *z
9e90: 49 64 78 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Idx = sqlite3_co
9ea0: 6c 75 6d 6e 5f 74 65 78 74 28 61 53 74 6d 74 5b  lumn_text(aStmt[
9eb0: 31 5d 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20  1], 1);.    if( 
9ec0: 7a 4f 72 69 67 20 26 26 20 7a 49 64 78 20 26 26  zOrig && zIdx &&
9ed0: 20 7a 4f 72 69 67 5b 30 5d 3d 3d 27 70 27 20 29   zOrig[0]=='p' )
9ee0: 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
9ef0: 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f  prepareFreeAndCo
9f00: 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62  llectError(p->db
9f10: 4d 61 69 6e 2c 20 26 61 53 74 6d 74 5b 32 5d 2c  Main, &aStmt[2],
9f20: 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20   &p->zErrmsg, . 
9f30: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
9f40: 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
9f50: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 72 6f        "SELECT ro
9f60: 6f 74 70 61 67 65 20 46 52 4f 4d 20 73 71 6c 69  otpage FROM sqli
9f70: 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20  te_master WHERE 
9f80: 6e 61 6d 65 20 3d 20 25 51 22 2c 20 7a 49 64 78  name = %Q", zIdx
9f90: 0a 20 20 20 20 20 20 29 29 3b 0a 20 20 20 20 20  .      ));.     
9fa0: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
9fb0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
9fc0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65   if( sqlite3_ste
9fd0: 70 28 61 53 74 6d 74 5b 32 5d 29 3d 3d 53 51 4c  p(aStmt[2])==SQL
9fe0: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
9ff0: 20 20 20 20 20 2a 70 69 50 6b 20 3d 20 73 71 6c       *piPk = sql
a000: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
a010: 61 53 74 6d 74 5b 32 5d 2c 20 30 29 3b 0a 20 20  aStmt[2], 0);.  
a020: 20 20 20 20 20 20 20 20 2a 70 65 54 79 70 65 20          *peType 
a030: 3d 20 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41  = RBU_PK_EXTERNA
a040: 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  L;.        }else
a050: 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 65 54  {.          *peT
a060: 79 70 65 20 3d 20 52 42 55 5f 50 4b 5f 57 49 54  ype = RBU_PK_WIT
a070: 48 4f 55 54 5f 52 4f 57 49 44 3b 0a 20 20 20 20  HOUT_ROWID;.    
a080: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
a090: 20 20 20 20 67 6f 74 6f 20 72 62 75 54 61 62 6c      goto rbuTabl
a0a0: 65 54 79 70 65 5f 65 6e 64 3b 0a 20 20 20 20 7d  eType_end;.    }
a0b0: 0a 20 20 7d 0a 0a 20 20 70 2d 3e 72 63 20 3d 20  .  }..  p->rc = 
a0c0: 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f  prepareFreeAndCo
a0d0: 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62  llectError(p->db
a0e0: 4d 61 69 6e 2c 20 26 61 53 74 6d 74 5b 33 5d 2c  Main, &aStmt[3],
a0f0: 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20   &p->zErrmsg, . 
a100: 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e     sqlite3_mprin
a110: 74 66 28 22 50 52 41 47 4d 41 20 74 61 62 6c 65  tf("PRAGMA table
a120: 5f 69 6e 66 6f 3d 25 51 22 2c 7a 54 61 62 29 0a  _info=%Q",zTab).
a130: 20 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63    );.  if( p->rc
a140: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
a150: 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65     while( sqlite
a160: 33 5f 73 74 65 70 28 61 53 74 6d 74 5b 33 5d 29  3_step(aStmt[3])
a170: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
a180: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
a190: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 61 53 74  3_column_int(aSt
a1a0: 6d 74 5b 33 5d 2c 35 29 3e 30 20 29 7b 0a 20 20  mt[3],5)>0 ){.  
a1b0: 20 20 20 20 20 20 2a 70 65 54 79 70 65 20 3d 20        *peType = 
a1c0: 52 42 55 5f 50 4b 5f 49 50 4b 3b 20 20 20 20 20  RBU_PK_IPK;     
a1d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 65 78             /* ex
a1e0: 70 6c 69 63 69 74 20 49 50 4b 20 63 6f 6c 75 6d  plicit IPK colum
a1f0: 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74  n */.        got
a200: 6f 20 72 62 75 54 61 62 6c 65 54 79 70 65 5f 65  o rbuTableType_e
a210: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
a220: 7d 0a 20 20 20 20 2a 70 65 54 79 70 65 20 3d 20  }.    *peType = 
a230: 52 42 55 5f 50 4b 5f 4e 4f 4e 45 3b 0a 20 20 7d  RBU_PK_NONE;.  }
a240: 0a 0a 72 62 75 54 61 62 6c 65 54 79 70 65 5f 65  ..rbuTableType_e
a250: 6e 64 3a 20 7b 0a 20 20 20 20 75 6e 73 69 67 6e  nd: {.    unsign
a260: 65 64 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f  ed int i;.    fo
a270: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
a280: 61 53 74 6d 74 29 2f 73 69 7a 65 6f 66 28 61 53  aStmt)/sizeof(aS
a290: 74 6d 74 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  tmt[0]); i++){. 
a2a0: 20 20 20 20 20 72 62 75 46 69 6e 61 6c 69 7a 65       rbuFinalize
a2b0: 28 70 2c 20 61 53 74 6d 74 5b 69 5d 29 3b 0a 20  (p, aStmt[i]);. 
a2c0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
a2d0: 2a 20 54 68 69 73 20 69 73 20 61 20 68 65 6c 70  * This is a help
a2e0: 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  er function for 
a2f0: 72 62 75 4f 62 6a 49 74 65 72 43 61 63 68 65 54  rbuObjIterCacheT
a300: 61 62 6c 65 49 6e 66 6f 28 29 2e 20 49 74 20 70  ableInfo(). It p
a310: 6f 70 75 6c 61 74 65 73 0a 2a 2a 20 74 68 65 20  opulates.** the 
a320: 70 49 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64  pIter->abIndexed
a330: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  [] array..*/.sta
a340: 74 69 63 20 76 6f 69 64 20 72 62 75 4f 62 6a 49  tic void rbuObjI
a350: 74 65 72 43 61 63 68 65 49 6e 64 65 78 65 64 43  terCacheIndexedC
a360: 6f 6c 73 28 73 71 6c 69 74 65 33 72 62 75 20 2a  ols(sqlite3rbu *
a370: 70 2c 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70  p, RbuObjIter *p
a380: 49 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  Iter){.  sqlite3
a390: 5f 73 74 6d 74 20 2a 70 4c 69 73 74 20 3d 20 30  _stmt *pList = 0
a3a0: 3b 0a 20 20 69 6e 74 20 62 49 6e 64 65 78 20 3d  ;.  int bIndex =
a3b0: 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63   0;..  if( p->rc
a3c0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
a3d0: 20 20 20 6d 65 6d 63 70 79 28 70 49 74 65 72 2d     memcpy(pIter-
a3e0: 3e 61 62 49 6e 64 65 78 65 64 2c 20 70 49 74 65  >abIndexed, pIte
a3f0: 72 2d 3e 61 62 54 62 6c 50 6b 2c 20 73 69 7a 65  r->abTblPk, size
a400: 6f 66 28 75 38 29 2a 70 49 74 65 72 2d 3e 6e 54  of(u8)*pIter->nT
a410: 62 6c 43 6f 6c 29 3b 0a 20 20 20 20 70 2d 3e 72  blCol);.    p->r
a420: 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41  c = prepareFreeA
a430: 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70  ndCollectError(p
a440: 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 4c 69 73 74  ->dbMain, &pList
a450: 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20  , &p->zErrmsg,. 
a460: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
a470: 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20 6d  printf("PRAGMA m
a480: 61 69 6e 2e 69 6e 64 65 78 5f 6c 69 73 74 20 3d  ain.index_list =
a490: 20 25 51 22 2c 20 70 49 74 65 72 2d 3e 7a 54 62   %Q", pIter->zTb
a4a0: 6c 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20  l).    );.  }.. 
a4b0: 20 70 49 74 65 72 2d 3e 6e 49 6e 64 65 78 20 3d   pIter->nIndex =
a4c0: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e   0;.  while( p->
a4d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
a4e0: 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
a4f0: 69 74 65 33 5f 73 74 65 70 28 70 4c 69 73 74 29  ite3_step(pList)
a500: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
a510: 61 72 20 2a 7a 49 64 78 20 3d 20 28 63 6f 6e 73  ar *zIdx = (cons
a520: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
a530: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 4c 69 73  column_text(pLis
a540: 74 2c 20 31 29 3b 0a 20 20 20 20 69 6e 74 20 62  t, 1);.    int b
a550: 50 61 72 74 69 61 6c 20 3d 20 73 71 6c 69 74 65  Partial = sqlite
a560: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 4c 69  3_column_int(pLi
a570: 73 74 2c 20 34 29 3b 0a 20 20 20 20 73 71 6c 69  st, 4);.    sqli
a580: 74 65 33 5f 73 74 6d 74 20 2a 70 58 49 6e 66 6f  te3_stmt *pXInfo
a590: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 49   = 0;.    if( zI
a5a0: 64 78 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  dx==0 ) break;. 
a5b0: 20 20 20 69 66 28 20 62 50 61 72 74 69 61 6c 20     if( bPartial 
a5c0: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
a5d0: 70 49 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64  pIter->abIndexed
a5e0: 2c 20 30 78 30 31 2c 20 73 69 7a 65 6f 66 28 75  , 0x01, sizeof(u
a5f0: 38 29 2a 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f  8)*pIter->nTblCo
a600: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  l);.    }.    p-
a610: 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65  >rc = prepareFre
a620: 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72  eAndCollectError
a630: 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 58 49  (p->dbMain, &pXI
a640: 6e 66 6f 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  nfo, &p->zErrmsg
a650: 2c 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ,.        sqlite
a660: 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d  3_mprintf("PRAGM
a670: 41 20 6d 61 69 6e 2e 69 6e 64 65 78 5f 78 69 6e  A main.index_xin
a680: 66 6f 20 3d 20 25 51 22 2c 20 7a 49 64 78 29 0a  fo = %Q", zIdx).
a690: 20 20 20 20 29 3b 0a 20 20 20 20 77 68 69 6c 65      );.    while
a6a0: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
a6b0: 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57  OK && SQLITE_ROW
a6c0: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
a6d0: 58 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20  XInfo) ){.      
a6e0: 69 6e 74 20 69 43 69 64 20 3d 20 73 71 6c 69 74  int iCid = sqlit
a6f0: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58  e3_column_int(pX
a700: 49 6e 66 6f 2c 20 31 29 3b 0a 20 20 20 20 20 20  Info, 1);.      
a710: 69 66 28 20 69 43 69 64 3e 3d 30 20 29 20 70 49  if( iCid>=0 ) pI
a720: 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64 5b 69  ter->abIndexed[i
a730: 43 69 64 5d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Cid] = 1;.    }.
a740: 20 20 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28      rbuFinalize(
a750: 70 2c 20 70 58 49 6e 66 6f 29 3b 0a 20 20 20 20  p, pXInfo);.    
a760: 62 49 6e 64 65 78 20 3d 20 31 3b 0a 20 20 20 20  bIndex = 1;.    
a770: 70 49 74 65 72 2d 3e 6e 49 6e 64 65 78 2b 2b 3b  pIter->nIndex++;
a780: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 74 65  .  }..  if( pIte
a790: 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
a7a0: 5f 57 49 54 48 4f 55 54 5f 52 4f 57 49 44 20 29  _WITHOUT_ROWID )
a7b0: 7b 0a 20 20 20 20 2f 2a 20 22 50 52 41 47 4d 41  {.    /* "PRAGMA
a7c0: 20 69 6e 64 65 78 5f 6c 69 73 74 22 20 69 6e 63   index_list" inc
a7d0: 6c 75 64 65 73 20 74 68 65 20 6d 61 69 6e 20 50  ludes the main P
a7e0: 4b 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20  K b-tree */.    
a7f0: 70 49 74 65 72 2d 3e 6e 49 6e 64 65 78 2d 2d 3b  pIter->nIndex--;
a800: 0a 20 20 7d 0a 0a 20 20 72 62 75 46 69 6e 61 6c  .  }..  rbuFinal
a810: 69 7a 65 28 70 2c 20 70 4c 69 73 74 29 3b 0a 20  ize(p, pList);. 
a820: 20 69 66 28 20 62 49 6e 64 65 78 3d 3d 30 20 29   if( bIndex==0 )
a830: 20 70 49 74 65 72 2d 3e 61 62 49 6e 64 65 78 65   pIter->abIndexe
a840: 64 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  d = 0;.}.../*.**
a850: 20 49 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74   If they are not
a860: 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74   already populat
a870: 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65  ed, populate the
a880: 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c   pIter->azTblCol
a890: 5b 5d 2c 0a 2a 2a 20 70 49 74 65 72 2d 3e 61 62  [],.** pIter->ab
a8a0: 54 62 6c 50 6b 5b 5d 2c 20 70 49 74 65 72 2d 3e  TblPk[], pIter->
a8b0: 6e 54 62 6c 43 6f 6c 20 61 6e 64 20 70 49 74 65  nTblCol and pIte
a8c0: 72 2d 3e 62 52 6f 77 69 64 20 76 61 72 69 61 62  r->bRowid variab
a8d0: 6c 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  les according to
a8e0: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 28 6e  .** the table (n
a8f0: 6f 74 20 69 6e 64 65 78 29 20 74 68 61 74 20 74  ot index) that t
a900: 68 65 20 69 74 65 72 61 74 6f 72 20 63 75 72 72  he iterator curr
a910: 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e  ently points to.
a920: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
a930: 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65  LITE_OK if succe
a940: 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c  ssful, or an SQL
a950: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  ite error code o
a960: 74 68 65 72 77 69 73 65 2e 20 49 66 0a 2a 2a 20  therwise. If.** 
a970: 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63  an error does oc
a980: 63 75 72 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  cur, an error co
a990: 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73  de and error mes
a9a0: 73 61 67 65 20 61 72 65 20 61 6c 73 6f 20 6c 65  sage are also le
a9b0: 66 74 20 69 6e 20 0a 2a 2a 20 74 68 65 20 52 42  ft in .** the RB
a9c0: 55 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61  U handle..*/.sta
a9d0: 74 69 63 20 69 6e 74 20 72 62 75 4f 62 6a 49 74  tic int rbuObjIt
a9e0: 65 72 43 61 63 68 65 54 61 62 6c 65 49 6e 66 6f  erCacheTableInfo
a9f0: 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20  (sqlite3rbu *p, 
aa00: 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65  RbuObjIter *pIte
aa10: 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72 2d  r){.  if( pIter-
aa20: 3e 61 7a 54 62 6c 43 6f 6c 3d 3d 30 20 29 7b 0a  >azTblCol==0 ){.
aa30: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
aa40: 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20   *pStmt = 0;.   
aa50: 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20   int nCol = 0;. 
aa60: 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
aa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa80: 20 2f 2a 20 66 6f 72 28 29 20 6c 6f 6f 70 20 69   /* for() loop i
aa90: 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
aaa0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 52 62 75   */.    int bRbu
aab0: 52 6f 77 69 64 20 3d 20 30 3b 20 20 20 20 20 20  Rowid = 0;      
aac0: 20 20 20 20 20 20 2f 2a 20 49 66 20 69 6e 70 75        /* If inpu
aad0: 74 20 74 61 62 6c 65 20 68 61 73 20 63 6f 6c 75  t table has colu
aae0: 6d 6e 20 22 72 62 75 5f 72 6f 77 69 64 22 20 2a  mn "rbu_rowid" *
aaf0: 2f 0a 20 20 20 20 69 6e 74 20 69 4f 72 64 65 72  /.    int iOrder
ab00: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 54   = 0;.    int iT
ab10: 6e 75 6d 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  num = 0;..    /*
ab20: 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
ab30: 74 79 70 65 20 6f 66 20 74 61 62 6c 65 20 74 68  type of table th
ab40: 69 73 20 73 74 65 70 20 77 69 6c 6c 20 64 65 61  is step will dea
ab50: 6c 20 77 69 74 68 2e 20 2a 2f 0a 20 20 20 20 61  l with. */.    a
ab60: 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 65 54  ssert( pIter->eT
ab70: 79 70 65 3d 3d 30 20 29 3b 0a 20 20 20 20 72 62  ype==0 );.    rb
ab80: 75 54 61 62 6c 65 54 79 70 65 28 70 2c 20 70 49  uTableType(p, pI
ab90: 74 65 72 2d 3e 7a 54 62 6c 2c 20 26 70 49 74 65  ter->zTbl, &pIte
aba0: 72 2d 3e 65 54 79 70 65 2c 20 26 69 54 6e 75 6d  r->eType, &iTnum
abb0: 2c 20 26 70 49 74 65 72 2d 3e 69 50 6b 54 6e 75  , &pIter->iPkTnu
abc0: 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72  m);.    if( p->r
abd0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
abe0: 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
abf0: 55 5f 50 4b 5f 4e 4f 54 41 42 4c 45 20 29 7b 0a  U_PK_NOTABLE ){.
ac00: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
ac10: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
ac20: 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73    p->zErrmsg = s
ac30: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
ac40: 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25  no such table: %
ac50: 73 22 2c 20 70 49 74 65 72 2d 3e 7a 54 62 6c 29  s", pIter->zTbl)
ac60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
ac70: 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 20 70  p->rc ) return p
ac80: 2d 3e 72 63 3b 0a 20 20 20 20 69 66 28 20 70 49  ->rc;.    if( pI
ac90: 74 65 72 2d 3e 7a 49 64 78 3d 3d 30 20 29 20 70  ter->zIdx==0 ) p
aca0: 49 74 65 72 2d 3e 69 54 6e 75 6d 20 3d 20 69 54  Iter->iTnum = iT
acb0: 6e 75 6d 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  num;..    assert
acc0: 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  ( pIter->eType==
acd0: 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 7c 7c 20 70  RBU_PK_NONE || p
ace0: 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55  Iter->eType==RBU
acf0: 5f 50 4b 5f 49 50 4b 20 0a 20 20 20 20 20 20 20  _PK_IPK .       
ad00: 20 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70    || pIter->eTyp
ad10: 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e  e==RBU_PK_EXTERN
ad20: 41 4c 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79  AL || pIter->eTy
ad30: 70 65 3d 3d 52 42 55 5f 50 4b 5f 57 49 54 48 4f  pe==RBU_PK_WITHO
ad40: 55 54 5f 52 4f 57 49 44 0a 20 20 20 20 20 20 20  UT_ROWID.       
ad50: 20 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70    || pIter->eTyp
ad60: 65 3d 3d 52 42 55 5f 50 4b 5f 56 54 41 42 0a 20  e==RBU_PK_VTAB. 
ad70: 20 20 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f     );..    /* Po
ad80: 70 75 6c 61 74 65 20 74 68 65 20 61 7a 54 62 6c  pulate the azTbl
ad90: 43 6f 6c 5b 5d 20 61 6e 64 20 6e 54 62 6c 43 6f  Col[] and nTblCo
ada0: 6c 20 76 61 72 69 61 62 6c 65 73 20 62 61 73 65  l variables base
adb0: 64 20 6f 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 73  d on the columns
adc0: 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 69  .    ** of the i
add0: 6e 70 75 74 20 74 61 62 6c 65 2e 20 49 67 6e 6f  nput table. Igno
ade0: 72 65 20 61 6e 79 20 69 6e 70 75 74 20 74 61 62  re any input tab
adf0: 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  le columns that 
ae00: 62 65 67 69 6e 20 77 69 74 68 0a 20 20 20 20 2a  begin with.    *
ae10: 2a 20 22 72 62 75 5f 22 2e 20 20 2a 2f 0a 20 20  * "rbu_".  */.  
ae20: 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72    p->rc = prepar
ae30: 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45  eFreeAndCollectE
ae40: 72 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20 26  rror(p->dbRbu, &
ae50: 70 53 74 6d 74 2c 20 26 70 2d 3e 7a 45 72 72 6d  pStmt, &p->zErrm
ae60: 73 67 2c 20 0a 20 20 20 20 20 20 20 20 73 71 6c  sg, .        sql
ae70: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45  ite3_mprintf("SE
ae80: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 27 25 71 27  LECT * FROM '%q'
ae90: 22 2c 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54  ", pIter->zDataT
aea0: 62 6c 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  bl).    );.    i
aeb0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
aec0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 43 6f  _OK ){.      nCo
aed0: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
aee0: 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b  mn_count(pStmt);
aef0: 0a 20 20 20 20 20 20 72 62 75 41 6c 6c 6f 63 61  .      rbuAlloca
af00: 74 65 49 74 65 72 41 72 72 61 79 73 28 70 2c 20  teIterArrays(p, 
af10: 70 49 74 65 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20  pIter, nCol);.  
af20: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
af30: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
af40: 4b 20 26 26 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  K && i<nCol; i++
af50: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
af60: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f  har *zName = (co
af70: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
af80: 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53  3_column_name(pS
af90: 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  tmt, i);.      i
afa0: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  f( sqlite3_strni
afb0: 63 6d 70 28 22 72 62 75 5f 22 2c 20 7a 4e 61 6d  cmp("rbu_", zNam
afc0: 65 2c 20 34 29 20 29 7b 0a 20 20 20 20 20 20 20  e, 4) ){.       
afd0: 20 63 68 61 72 20 2a 7a 43 6f 70 79 20 3d 20 72   char *zCopy = r
afe0: 62 75 53 74 72 6e 64 75 70 28 7a 4e 61 6d 65 2c  buStrndup(zName,
aff0: 20 26 70 2d 3e 72 63 29 3b 0a 20 20 20 20 20 20   &p->rc);.      
b000: 20 20 70 49 74 65 72 2d 3e 61 69 53 72 63 4f 72    pIter->aiSrcOr
b010: 64 65 72 5b 70 49 74 65 72 2d 3e 6e 54 62 6c 43  der[pIter->nTblC
b020: 6f 6c 5d 20 3d 20 70 49 74 65 72 2d 3e 6e 54 62  ol] = pIter->nTb
b030: 6c 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 49  lCol;.        pI
b040: 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 70 49  ter->azTblCol[pI
b050: 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 2b 2b 5d 20  ter->nTblCol++] 
b060: 3d 20 7a 43 6f 70 79 3b 0a 20 20 20 20 20 20 7d  = zCopy;.      }
b070: 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20  .      else if( 
b080: 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63  0==sqlite3_stric
b090: 6d 70 28 22 72 62 75 5f 72 6f 77 69 64 22 2c 20  mp("rbu_rowid", 
b0a0: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
b0b0: 20 20 62 52 62 75 52 6f 77 69 64 20 3d 20 31 3b    bRbuRowid = 1;
b0c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
b0d0: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
b0e0: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
b0f0: 70 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20  pStmt = 0;..    
b100: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
b110: 45 5f 4f 4b 0a 20 20 20 20 20 26 26 20 72 62 75  E_OK.     && rbu
b120: 49 73 56 61 63 75 75 6d 28 70 29 3d 3d 30 0a 20  IsVacuum(p)==0. 
b130: 20 20 20 20 26 26 20 62 52 62 75 52 6f 77 69 64      && bRbuRowid
b140: 21 3d 28 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  !=(pIter->eType=
b150: 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20 7c 7c 20  =RBU_PK_VTAB || 
b160: 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
b170: 55 5f 50 4b 5f 4e 4f 4e 45 29 0a 20 20 20 20 29  U_PK_NONE).    )
b180: 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
b190: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
b1a0: 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d      p->zErrmsg =
b1b0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
b1c0: 28 0a 20 20 20 20 20 20 20 20 20 20 22 74 61 62  (.          "tab
b1d0: 6c 65 20 25 71 20 25 73 20 72 62 75 5f 72 6f 77  le %q %s rbu_row
b1e0: 69 64 20 63 6f 6c 75 6d 6e 22 2c 20 70 49 74 65  id column", pIte
b1f0: 72 2d 3e 7a 44 61 74 61 54 62 6c 2c 0a 20 20 20  r->zDataTbl,.   
b200: 20 20 20 20 20 20 20 28 62 52 62 75 52 6f 77 69         (bRbuRowi
b210: 64 20 3f 20 22 6d 61 79 20 6e 6f 74 20 68 61 76  d ? "may not hav
b220: 65 22 20 3a 20 22 72 65 71 75 69 72 65 73 22 29  e" : "requires")
b230: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
b240: 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  .    /* Check th
b250: 61 74 20 61 6c 6c 20 6e 6f 6e 2d 48 49 44 44 45  at all non-HIDDE
b260: 4e 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  N columns in the
b270: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 61 62   destination tab
b280: 6c 65 20 61 72 65 20 61 6c 73 6f 0a 20 20 20 20  le are also.    
b290: 2a 2a 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  ** present in th
b2a0: 65 20 69 6e 70 75 74 20 74 61 62 6c 65 2e 20 50  e input table. P
b2b0: 6f 70 75 6c 61 74 65 20 74 68 65 20 61 62 54 62  opulate the abTb
b2c0: 6c 50 6b 5b 5d 2c 20 61 7a 54 62 6c 54 79 70 65  lPk[], azTblType
b2d0: 5b 5d 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 69  [] and.    ** ai
b2e0: 54 62 6c 4f 72 64 65 72 5b 5d 20 61 72 72 61 79  TblOrder[] array
b2f0: 73 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  s at the same ti
b300: 6d 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  me.  */.    if( 
b310: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
b320: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
b330: 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64  = prepareFreeAnd
b340: 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e  CollectError(p->
b350: 64 62 4d 61 69 6e 2c 20 26 70 53 74 6d 74 2c 20  dbMain, &pStmt, 
b360: 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20  &p->zErrmsg, .  
b370: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
b380: 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20  mprintf("PRAGMA 
b390: 74 61 62 6c 65 5f 69 6e 66 6f 28 25 51 29 22 2c  table_info(%Q)",
b3a0: 20 70 49 74 65 72 2d 3e 7a 54 62 6c 29 0a 20 20   pIter->zTbl).  
b3b0: 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20      );.    }.   
b3c0: 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53   while( p->rc==S
b3d0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49  QLITE_OK && SQLI
b3e0: 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
b3f0: 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20  step(pStmt) ){. 
b400: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
b410: 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20  *zName = (const 
b420: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
b430: 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
b440: 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a   1);.      if( z
b450: 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Name==0 ) break;
b460: 20 20 2f 2a 20 41 6e 20 4f 4f 4d 20 2d 20 66 69    /* An OOM - fi
b470: 6e 61 6c 69 7a 65 28 29 20 62 65 6c 6f 77 20 72  nalize() below r
b480: 65 74 75 72 6e 73 20 53 5f 4e 4f 4d 45 4d 20 2a  eturns S_NOMEM *
b490: 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 69 4f  /.      for(i=iO
b4a0: 72 64 65 72 3b 20 69 3c 70 49 74 65 72 2d 3e 6e  rder; i<pIter->n
b4b0: 54 62 6c 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  TblCol; i++){.  
b4c0: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72        if( 0==str
b4d0: 63 6d 70 28 7a 4e 61 6d 65 2c 20 70 49 74 65 72  cmp(zName, pIter
b4e0: 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 29 20 29  ->azTblCol[i]) )
b4f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
b500: 20 20 20 20 20 20 69 66 28 20 69 3d 3d 70 49 74        if( i==pIt
b510: 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20 29 7b 0a 20  er->nTblCol ){. 
b520: 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53         p->rc = S
b530: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
b540: 20 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20       p->zErrmsg 
b550: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
b560: 66 28 22 63 6f 6c 75 6d 6e 20 6d 69 73 73 69 6e  f("column missin
b570: 67 20 66 72 6f 6d 20 25 71 3a 20 25 73 22 2c 0a  g from %q: %s",.
b580: 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
b590: 72 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 7a 4e 61  r->zDataTbl, zNa
b5a0: 6d 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  me.        );.  
b5b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b5c0: 20 20 20 69 6e 74 20 69 50 6b 20 3d 20 73 71 6c     int iPk = sql
b5d0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
b5e0: 70 53 74 6d 74 2c 20 35 29 3b 0a 20 20 20 20 20  pStmt, 5);.     
b5f0: 20 20 20 69 6e 74 20 62 4e 6f 74 4e 75 6c 6c 20     int bNotNull 
b600: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
b610: 5f 69 6e 74 28 70 53 74 6d 74 2c 20 33 29 3b 0a  _int(pStmt, 3);.
b620: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
b630: 61 72 20 2a 7a 54 79 70 65 20 3d 20 28 63 6f 6e  ar *zType = (con
b640: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
b650: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
b660: 6d 74 2c 20 32 29 3b 0a 0a 20 20 20 20 20 20 20  mt, 2);..       
b670: 20 69 66 28 20 69 21 3d 69 4f 72 64 65 72 20 29   if( i!=iOrder )
b680: 7b 0a 20 20 20 20 20 20 20 20 20 20 53 57 41 50  {.          SWAP
b690: 28 69 6e 74 2c 20 70 49 74 65 72 2d 3e 61 69 53  (int, pIter->aiS
b6a0: 72 63 4f 72 64 65 72 5b 69 5d 2c 20 70 49 74 65  rcOrder[i], pIte
b6b0: 72 2d 3e 61 69 53 72 63 4f 72 64 65 72 5b 69 4f  r->aiSrcOrder[iO
b6c0: 72 64 65 72 5d 29 3b 0a 20 20 20 20 20 20 20 20  rder]);.        
b6d0: 20 20 53 57 41 50 28 63 68 61 72 2a 2c 20 70 49    SWAP(char*, pI
b6e0: 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d  ter->azTblCol[i]
b6f0: 2c 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f  , pIter->azTblCo
b700: 6c 5b 69 4f 72 64 65 72 5d 29 3b 0a 20 20 20 20  l[iOrder]);.    
b710: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 70      }..        p
b720: 49 74 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65 5b  Iter->azTblType[
b730: 69 4f 72 64 65 72 5d 20 3d 20 72 62 75 53 74 72  iOrder] = rbuStr
b740: 6e 64 75 70 28 7a 54 79 70 65 2c 20 26 70 2d 3e  ndup(zType, &p->
b750: 72 63 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74  rc);.        pIt
b760: 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 4f 72 64  er->abTblPk[iOrd
b770: 65 72 5d 20 3d 20 28 69 50 6b 21 3d 30 29 3b 0a  er] = (iPk!=0);.
b780: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 61          pIter->a
b790: 62 4e 6f 74 4e 75 6c 6c 5b 69 4f 72 64 65 72 5d  bNotNull[iOrder]
b7a0: 20 3d 20 28 75 38 29 62 4e 6f 74 4e 75 6c 6c 20   = (u8)bNotNull 
b7b0: 7c 7c 20 28 69 50 6b 21 3d 30 29 3b 0a 20 20 20  || (iPk!=0);.   
b7c0: 20 20 20 20 20 69 4f 72 64 65 72 2b 2b 3b 0a 20       iOrder++;. 
b7d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
b7e0: 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c    rbuFinalize(p,
b7f0: 20 70 53 74 6d 74 29 3b 0a 20 20 20 20 72 62 75   pStmt);.    rbu
b800: 4f 62 6a 49 74 65 72 43 61 63 68 65 49 6e 64 65  ObjIterCacheInde
b810: 78 65 64 43 6f 6c 73 28 70 2c 20 70 49 74 65 72  xedCols(p, pIter
b820: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
b830: 49 74 65 72 2d 3e 65 54 79 70 65 21 3d 52 42 55  Iter->eType!=RBU
b840: 5f 50 4b 5f 56 54 41 42 20 7c 7c 20 70 49 74 65  _PK_VTAB || pIte
b850: 72 2d 3e 61 62 49 6e 64 65 78 65 64 3d 3d 30 20  r->abIndexed==0 
b860: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
b870: 49 74 65 72 2d 3e 65 54 79 70 65 21 3d 52 42 55  Iter->eType!=RBU
b880: 5f 50 4b 5f 56 54 41 42 20 7c 7c 20 70 49 74 65  _PK_VTAB || pIte
b890: 72 2d 3e 6e 49 6e 64 65 78 3d 3d 30 20 29 3b 0a  r->nIndex==0 );.
b8a0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 2d    }..  return p-
b8b0: 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  >rc;.}../*.** Th
b8c0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 73  is function cons
b8d0: 74 72 75 63 74 73 20 61 6e 64 20 72 65 74 75 72  tructs and retur
b8e0: 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
b8f0: 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  a nul-terminated
b900: 20 0a 2a 2a 20 73 74 72 69 6e 67 20 63 6f 6e 74   .** string cont
b910: 61 69 6e 69 6e 67 20 73 6f 6d 65 20 53 51 4c 20  aining some SQL 
b920: 63 6c 61 75 73 65 20 6f 72 20 6c 69 73 74 20 62  clause or list b
b930: 61 73 65 64 20 6f 6e 20 6f 6e 65 20 6f 72 20 6d  ased on one or m
b940: 6f 72 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 63  ore of the .** c
b950: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 63 75 72 72  olumn names curr
b960: 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20  ently stored in 
b970: 74 68 65 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c  the pIter->azTbl
b980: 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a  Col[] array..*/.
b990: 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 62 75  static char *rbu
b9a0: 4f 62 6a 49 74 65 72 47 65 74 43 6f 6c 6c 69 73  ObjIterGetCollis
b9b0: 74 28 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20  t(.  sqlite3rbu 
b9c0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
b9d0: 20 20 20 20 20 2f 2a 20 52 42 55 20 6f 62 6a 65       /* RBU obje
b9e0: 63 74 20 2a 2f 0a 20 20 52 62 75 4f 62 6a 49 74  ct */.  RbuObjIt
b9f0: 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20  er *pIter       
ba00: 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63          /* Objec
ba10: 74 20 69 74 65 72 61 74 6f 72 20 66 6f 72 20 63  t iterator for c
ba20: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 29  olumn names */.)
ba30: 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 69 73 74 20  {.  char *zList 
ba40: 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  = 0;.  const cha
ba50: 72 20 2a 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20  r *zSep = "";.  
ba60: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
ba70: 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43  ; i<pIter->nTblC
ba80: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f  ol; i++){.    co
ba90: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 49  nst char *z = pI
baa0: 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d  ter->azTblCol[i]
bab0: 3b 0a 20 20 20 20 7a 4c 69 73 74 20 3d 20 72 62  ;.    zList = rb
bac0: 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 25  uMPrintf(p, "%z%
bad0: 73 5c 22 25 77 5c 22 22 2c 20 7a 4c 69 73 74 2c  s\"%w\"", zList,
bae0: 20 7a 53 65 70 2c 20 7a 29 3b 0a 20 20 20 20 7a   zSep, z);.    z
baf0: 53 65 70 20 3d 20 22 2c 20 22 3b 0a 20 20 7d 0a  Sep = ", ";.  }.
bb00: 20 20 72 65 74 75 72 6e 20 7a 4c 69 73 74 3b 0a    return zList;.
bb10: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
bb20: 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
bb30: 6f 20 63 72 65 61 74 65 20 61 20 53 45 4c 45 43  o create a SELEC
bb40: 54 20 6c 69 73 74 20 28 74 68 65 20 6c 69 73 74  T list (the list
bb50: 20 6f 66 20 53 51 4c 20 0a 2a 2a 20 65 78 70 72   of SQL .** expr
bb60: 65 73 73 69 6f 6e 73 20 74 68 61 74 20 66 6f 6c  essions that fol
bb70: 6c 6f 77 73 20 61 20 53 45 4c 45 43 54 20 6b 65  lows a SELECT ke
bb80: 79 77 6f 72 64 29 20 66 6f 72 20 61 20 53 45 4c  yword) for a SEL
bb90: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a  ECT statement .*
bba0: 2a 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 66  * used to read f
bbb0: 72 6f 6d 20 61 6e 20 64 61 74 61 5f 78 78 78 20  rom an data_xxx 
bbc0: 6f 72 20 72 62 75 5f 74 6d 70 5f 78 78 78 20 74  or rbu_tmp_xxx t
bbd0: 61 62 6c 65 20 77 68 69 6c 65 20 75 70 64 61 74  able while updat
bbe0: 69 6e 67 20 74 68 65 20 0a 2a 2a 20 69 6e 64 65  ing the .** inde
bbf0: 78 20 6f 62 6a 65 63 74 20 63 75 72 72 65 6e 74  x object current
bc00: 6c 79 20 69 6e 64 69 63 61 74 65 64 20 62 79 20  ly indicated by 
bc10: 74 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62 6a  the iterator obj
bc20: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
bc30: 65 20 0a 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67  e .** second arg
bc40: 75 6d 65 6e 74 2e 20 41 20 22 50 52 41 47 4d 41  ument. A "PRAGMA
bc50: 20 69 6e 64 65 78 5f 78 69 6e 66 6f 20 3d 20 3c   index_xinfo = <
bc60: 69 64 78 6e 61 6d 65 3e 22 20 73 74 61 74 65 6d  idxname>" statem
bc70: 65 6e 74 20 69 73 20 75 73 65 64 20 0a 2a 2a 20  ent is used .** 
bc80: 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 72 65  to obtain the re
bc90: 71 75 69 72 65 64 20 69 6e 66 6f 72 6d 61 74 69  quired informati
bca0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  on..**.** If the
bcb0: 20 69 6e 64 65 78 20 69 73 20 6f 66 20 74 68 65   index is of the
bcc0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a   following form:
bcd0: 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20  .**.**   CREATE 
bce0: 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 63  INDEX i1 ON t1(c
bcf0: 2c 20 62 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61  , b COLLATE noca
bd00: 73 65 29 3b 0a 2a 2a 0a 2a 2a 20 61 6e 64 20 22  se);.**.** and "
bd10: 74 31 22 20 69 73 20 61 20 74 61 62 6c 65 20 77  t1" is a table w
bd20: 69 74 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20  ith an explicit 
bd30: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
bd40: 4b 45 59 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 22  KEY column .** "
bd50: 69 70 6b 22 2c 20 74 68 65 20 72 65 74 75 72 6e  ipk", the return
bd60: 65 64 20 73 74 72 69 6e 67 20 69 73 3a 0a 2a 2a  ed string is:.**
bd70: 0a 2a 2a 20 20 20 22 60 63 60 20 43 4f 4c 4c 41  .**   "`c` COLLA
bd80: 54 45 20 27 42 49 4e 41 52 59 27 2c 20 60 62 60  TE 'BINARY', `b`
bd90: 20 43 4f 4c 4c 41 54 45 20 27 4e 4f 43 41 53 45   COLLATE 'NOCASE
bda0: 27 2c 20 60 69 70 6b 60 20 43 4f 4c 4c 41 54 45  ', `ipk` COLLATE
bdb0: 20 27 42 49 4e 41 52 59 27 22 0a 2a 2a 0a 2a 2a   'BINARY'".**.**
bdc0: 20 41 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20   As well as the 
bdd0: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 2c  returned string,
bde0: 20 74 68 72 65 65 20 6f 74 68 65 72 20 6d 61 6c   three other mal
bdf0: 6c 6f 63 27 64 20 73 74 72 69 6e 67 73 20 61 72  loc'd strings ar
be00: 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 76  e .** returned v
be10: 69 61 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65  ia output parame
be20: 74 65 72 73 2e 20 41 73 20 66 6f 6c 6c 6f 77 73  ters. As follows
be30: 3a 0a 2a 2a 0a 2a 2a 20 20 20 70 7a 49 6d 70 6f  :.**.**   pzImpo
be40: 73 74 65 72 43 6f 6c 73 3a 20 2e 2e 2e 0a 2a 2a  sterCols: ....**
be50: 20 20 20 70 7a 49 6d 70 6f 73 74 65 72 50 6b 3a     pzImposterPk:
be60: 20 2e 2e 2e 0a 2a 2a 20 20 20 70 7a 57 68 65 72   ....**   pzWher
be70: 65 3a 20 2e 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63  e: ....*/.static
be80: 20 63 68 61 72 20 2a 72 62 75 4f 62 6a 49 74 65   char *rbuObjIte
be90: 72 47 65 74 49 6e 64 65 78 43 6f 6c 73 28 0a 20  rGetIndexCols(. 
bea0: 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20   sqlite3rbu *p, 
beb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bec0: 20 2f 2a 20 52 42 55 20 6f 62 6a 65 63 74 20 2a   /* RBU object *
bed0: 2f 0a 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a  /.  RbuObjIter *
bee0: 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20  pIter,          
bef0: 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 69 74      /* Object it
bf00: 65 72 61 74 6f 72 20 66 6f 72 20 63 6f 6c 75 6d  erator for colum
bf10: 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 63 68 61  n names */.  cha
bf20: 72 20 2a 2a 70 7a 49 6d 70 6f 73 74 65 72 43 6f  r **pzImposterCo
bf30: 6c 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ls,          /* 
bf40: 4f 55 54 3a 20 43 6f 6c 75 6d 6e 73 20 66 6f 72  OUT: Columns for
bf50: 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20   imposter table 
bf60: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 49 6d  */.  char **pzIm
bf70: 70 6f 73 74 65 72 50 6b 2c 20 20 20 20 20 20 20  posterPk,       
bf80: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 49 6d 70       /* OUT: Imp
bf90: 6f 73 74 65 72 20 50 4b 20 63 6c 61 75 73 65 20  oster PK clause 
bfa0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 57 68  */.  char **pzWh
bfb0: 65 72 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ere,            
bfc0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57 48 45       /* OUT: WHE
bfd0: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  RE clause */.  i
bfe0: 6e 74 20 2a 70 6e 42 69 6e 64 20 20 20 20 20 20  nt *pnBind      
bff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c000: 2a 20 4f 55 54 3a 20 54 72 62 75 6c 20 6e 75 6d  * OUT: Trbul num
c010: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a  ber of columns *
c020: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
c030: 70 2d 3e 72 63 3b 20 20 20 20 20 20 20 20 20 20  p->rc;          
c040: 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
c050: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  code */.  int rc
c060: 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2;              
c070: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
c080: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 29 20  ite3_finalize() 
c090: 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
c0a0: 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20 30 3b   char *zRet = 0;
c0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0c0: 20 2f 2a 20 53 74 72 69 6e 67 20 74 6f 20 72 65   /* String to re
c0d0: 74 75 72 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  turn */.  char *
c0e0: 7a 49 6d 70 43 6f 6c 73 20 3d 20 30 3b 20 20 20  zImpCols = 0;   
c0f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72            /* Str
c100: 69 6e 67 20 74 6f 20 72 65 74 75 72 6e 20 76 69  ing to return vi
c110: 61 20 2a 70 7a 49 6d 70 6f 73 74 65 72 43 6f 6c  a *pzImposterCol
c120: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 49 6d  s */.  char *zIm
c130: 70 50 4b 20 3d 20 30 3b 20 20 20 20 20 20 20 20  pPK = 0;        
c140: 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67         /* String
c150: 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a   to return via *
c160: 70 7a 49 6d 70 6f 73 74 65 72 50 4b 20 2a 2f 0a  pzImposterPK */.
c170: 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d    char *zWhere =
c180: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
c190: 20 20 2f 2a 20 53 74 72 69 6e 67 20 74 6f 20 72    /* String to r
c1a0: 65 74 75 72 6e 20 76 69 61 20 2a 70 7a 57 68 65  eturn via *pzWhe
c1b0: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 69 6e  re */.  int nBin
c1c0: 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
c1d0: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
c1e0: 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a   to return via *
c1f0: 70 6e 42 69 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73  pnBind */.  cons
c200: 74 20 63 68 61 72 20 2a 7a 43 6f 6d 20 3d 20 22  t char *zCom = "
c210: 22 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ";          /* S
c220: 65 74 20 74 6f 20 22 2c 20 22 20 6c 61 74 65 72  et to ", " later
c230: 20 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63   on */.  const c
c240: 68 61 72 20 2a 7a 41 6e 64 20 3d 20 22 22 3b 20  har *zAnd = ""; 
c250: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
c260: 74 6f 20 22 20 41 4e 44 20 22 20 6c 61 74 65 72  to " AND " later
c270: 20 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33   on */.  sqlite3
c280: 5f 73 74 6d 74 20 2a 70 58 49 6e 66 6f 20 3d 20  _stmt *pXInfo = 
c290: 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 52 41 47  0;       /* PRAG
c2a0: 4d 41 20 69 6e 64 65 78 5f 78 69 6e 66 6f 20 3d  MA index_xinfo =
c2b0: 20 3f 20 2a 2f 0a 0a 20 20 69 66 28 20 72 63 3d   ? */..  if( rc=
c2c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
c2d0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a 45 72    assert( p->zEr
c2e0: 72 6d 73 67 3d 3d 30 20 29 3b 0a 20 20 20 20 72  rmsg==0 );.    r
c2f0: 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41  c = prepareFreeA
c300: 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70  ndCollectError(p
c310: 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 58 49 6e 66  ->dbMain, &pXInf
c320: 6f 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a  o, &p->zErrmsg,.
c330: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
c340: 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20  mprintf("PRAGMA 
c350: 6d 61 69 6e 2e 69 6e 64 65 78 5f 78 69 6e 66 6f  main.index_xinfo
c360: 20 3d 20 25 51 22 2c 20 70 49 74 65 72 2d 3e 7a   = %Q", pIter->z
c370: 49 64 78 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  Idx).    );.  }.
c380: 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
c390: 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54  LITE_OK && SQLIT
c3a0: 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
c3b0: 74 65 70 28 70 58 49 6e 66 6f 29 20 29 7b 0a 20  tep(pXInfo) ){. 
c3c0: 20 20 20 69 6e 74 20 69 43 69 64 20 3d 20 73 71     int iCid = sq
c3d0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
c3e0: 28 70 58 49 6e 66 6f 2c 20 31 29 3b 0a 20 20 20  (pXInfo, 1);.   
c3f0: 20 69 6e 74 20 62 44 65 73 63 20 3d 20 73 71 6c   int bDesc = sql
c400: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
c410: 70 58 49 6e 66 6f 2c 20 33 29 3b 0a 20 20 20 20  pXInfo, 3);.    
c420: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
c430: 6c 61 74 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  late = (const ch
c440: 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
c450: 6d 6e 5f 74 65 78 74 28 70 58 49 6e 66 6f 2c 20  mn_text(pXInfo, 
c460: 34 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  4);.    const ch
c470: 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 63 6f  ar *zCol;.    co
c480: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b  nst char *zType;
c490: 0a 0a 20 20 20 20 69 66 28 20 69 43 69 64 3c 30  ..    if( iCid<0
c4a0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20   ){.      /* An 
c4b0: 69 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79 20  integer primary 
c4c0: 6b 65 79 2e 20 49 66 20 74 68 65 20 74 61 62 6c  key. If the tabl
c4d0: 65 20 68 61 73 20 61 6e 20 65 78 70 6c 69 63 69  e has an explici
c4e0: 74 20 49 50 4b 2c 20 75 73 65 0a 20 20 20 20 20  t IPK, use.     
c4f0: 20 2a 2a 20 69 74 73 20 6e 61 6d 65 2e 20 4f 74   ** its name. Ot
c500: 68 65 72 77 69 73 65 2c 20 75 73 65 20 22 72 62  herwise, use "rb
c510: 75 5f 72 6f 77 69 64 22 2e 20 20 2a 2f 0a 20 20  u_rowid".  */.  
c520: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 65      if( pIter->e
c530: 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 49 50 4b  Type==RBU_PK_IPK
c540: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
c550: 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  i;.        for(i
c560: 3d 30 3b 20 70 49 74 65 72 2d 3e 61 62 54 62 6c  =0; pIter->abTbl
c570: 50 6b 5b 69 5d 3d 3d 30 3b 20 69 2b 2b 29 3b 0a  Pk[i]==0; i++);.
c580: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
c590: 69 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c  i<pIter->nTblCol
c5a0: 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c   );.        zCol
c5b0: 20 3d 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43   = pIter->azTblC
c5c0: 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 65 6c  ol[i];.      }el
c5d0: 73 65 20 69 66 28 20 72 62 75 49 73 56 61 63 75  se if( rbuIsVacu
c5e0: 75 6d 28 70 29 20 29 7b 0a 20 20 20 20 20 20 20  um(p) ){.       
c5f0: 20 7a 43 6f 6c 20 3d 20 22 5f 72 6f 77 69 64 5f   zCol = "_rowid_
c600: 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ";.      }else{.
c610: 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22          zCol = "
c620: 72 62 75 5f 72 6f 77 69 64 22 3b 0a 20 20 20 20  rbu_rowid";.    
c630: 20 20 7d 0a 20 20 20 20 20 20 7a 54 79 70 65 20    }.      zType 
c640: 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20  = "INTEGER";.   
c650: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 43   }else{.      zC
c660: 6f 6c 20 3d 20 70 49 74 65 72 2d 3e 61 7a 54 62  ol = pIter->azTb
c670: 6c 43 6f 6c 5b 69 43 69 64 5d 3b 0a 20 20 20 20  lCol[iCid];.    
c680: 20 20 7a 54 79 70 65 20 3d 20 70 49 74 65 72 2d    zType = pIter-
c690: 3e 61 7a 54 62 6c 54 79 70 65 5b 69 43 69 64 5d  >azTblType[iCid]
c6a0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 7a 52 65  ;.    }..    zRe
c6b0: 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  t = sqlite3_mpri
c6c0: 6e 74 66 28 22 25 7a 25 73 5c 22 25 77 5c 22 20  ntf("%z%s\"%w\" 
c6d0: 43 4f 4c 4c 41 54 45 20 25 51 22 2c 20 7a 52 65  COLLATE %Q", zRe
c6e0: 74 2c 20 7a 43 6f 6d 2c 20 7a 43 6f 6c 2c 20 7a  t, zCom, zCol, z
c6f0: 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 20 20 69 66  Collate);.    if
c700: 28 20 70 49 74 65 72 2d 3e 62 55 6e 69 71 75 65  ( pIter->bUnique
c710: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 63  ==0 || sqlite3_c
c720: 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f  olumn_int(pXInfo
c730: 2c 20 35 29 20 29 7b 0a 20 20 20 20 20 20 63 6f  , 5) ){.      co
c740: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 64 65 72  nst char *zOrder
c750: 20 3d 20 28 62 44 65 73 63 20 3f 20 22 20 44 45   = (bDesc ? " DE
c760: 53 43 22 20 3a 20 22 22 29 3b 0a 20 20 20 20 20  SC" : "");.     
c770: 20 7a 49 6d 70 50 4b 20 3d 20 73 71 6c 69 74 65   zImpPK = sqlite
c780: 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 25 73 5c  3_mprintf("%z%s\
c790: 22 72 62 75 5f 69 6d 70 5f 25 64 25 77 5c 22 25  "rbu_imp_%d%w\"%
c7a0: 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 7a  s", .          z
c7b0: 49 6d 70 50 4b 2c 20 7a 43 6f 6d 2c 20 6e 42 69  ImpPK, zCom, nBi
c7c0: 6e 64 2c 20 7a 43 6f 6c 2c 20 7a 4f 72 64 65 72  nd, zCol, zOrder
c7d0: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
c7e0: 20 20 20 20 7a 49 6d 70 43 6f 6c 73 20 3d 20 73      zImpCols = s
c7f0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
c800: 25 7a 25 73 5c 22 72 62 75 5f 69 6d 70 5f 25 64  %z%s\"rbu_imp_%d
c810: 25 77 5c 22 20 25 73 20 43 4f 4c 4c 41 54 45 20  %w\" %s COLLATE 
c820: 25 51 22 2c 20 0a 20 20 20 20 20 20 20 20 7a 49  %Q", .        zI
c830: 6d 70 43 6f 6c 73 2c 20 7a 43 6f 6d 2c 20 6e 42  mpCols, zCom, nB
c840: 69 6e 64 2c 20 7a 43 6f 6c 2c 20 7a 54 79 70 65  ind, zCol, zType
c850: 2c 20 7a 43 6f 6c 6c 61 74 65 0a 20 20 20 20 29  , zCollate.    )
c860: 3b 0a 20 20 20 20 7a 57 68 65 72 65 20 3d 20 73  ;.    zWhere = s
c870: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
c880: 20 20 20 20 20 20 20 20 22 25 7a 25 73 5c 22 72          "%z%s\"r
c890: 62 75 5f 69 6d 70 5f 25 64 25 77 5c 22 20 49 53  bu_imp_%d%w\" IS
c8a0: 20 3f 22 2c 20 7a 57 68 65 72 65 2c 20 7a 41 6e   ?", zWhere, zAn
c8b0: 64 2c 20 6e 42 69 6e 64 2c 20 7a 43 6f 6c 0a 20  d, nBind, zCol. 
c8c0: 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 52     );.    if( zR
c8d0: 65 74 3d 3d 30 20 7c 7c 20 7a 49 6d 70 50 4b 3d  et==0 || zImpPK=
c8e0: 3d 30 20 7c 7c 20 7a 49 6d 70 43 6f 6c 73 3d 3d  =0 || zImpCols==
c8f0: 30 20 7c 7c 20 7a 57 68 65 72 65 3d 3d 30 20 29  0 || zWhere==0 )
c900: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
c910: 45 4d 3b 0a 20 20 20 20 7a 43 6f 6d 20 3d 20 22  EM;.    zCom = "
c920: 2c 20 22 3b 0a 20 20 20 20 7a 41 6e 64 20 3d 20  , ";.    zAnd = 
c930: 22 20 41 4e 44 20 22 3b 0a 20 20 20 20 6e 42 69  " AND ";.    nBi
c940: 6e 64 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72 63 32  nd++;.  }..  rc2
c950: 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   = sqlite3_final
c960: 69 7a 65 28 70 58 49 6e 66 6f 29 3b 0a 20 20 69  ize(pXInfo);.  i
c970: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
c980: 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 0a 20 20   ) rc = rc2;..  
c990: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
c9a0: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
c9b0: 5f 66 72 65 65 28 7a 52 65 74 29 3b 0a 20 20 20  _free(zRet);.   
c9c0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 49   sqlite3_free(zI
c9d0: 6d 70 43 6f 6c 73 29 3b 0a 20 20 20 20 73 71 6c  mpCols);.    sql
c9e0: 69 74 65 33 5f 66 72 65 65 28 7a 49 6d 70 50 4b  ite3_free(zImpPK
c9f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
ca00: 72 65 65 28 7a 57 68 65 72 65 29 3b 0a 20 20 20  ree(zWhere);.   
ca10: 20 7a 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 7a   zRet = 0;.    z
ca20: 49 6d 70 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 20  ImpCols = 0;.   
ca30: 20 7a 49 6d 70 50 4b 20 3d 20 30 3b 0a 20 20 20   zImpPK = 0;.   
ca40: 20 7a 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 20   zWhere = 0;.   
ca50: 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 7d   p->rc = rc;.  }
ca60: 0a 0a 20 20 2a 70 7a 49 6d 70 6f 73 74 65 72 43  ..  *pzImposterC
ca70: 6f 6c 73 20 3d 20 7a 49 6d 70 43 6f 6c 73 3b 0a  ols = zImpCols;.
ca80: 20 20 2a 70 7a 49 6d 70 6f 73 74 65 72 50 6b 20    *pzImposterPk 
ca90: 3d 20 7a 49 6d 70 50 4b 3b 0a 20 20 2a 70 7a 57  = zImpPK;.  *pzW
caa0: 68 65 72 65 20 3d 20 7a 57 68 65 72 65 3b 0a 20  here = zWhere;. 
cab0: 20 2a 70 6e 42 69 6e 64 20 3d 20 6e 42 69 6e 64   *pnBind = nBind
cac0: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b  ;.  return zRet;
cad0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 75 6d 69  .}../*.** Assumi
cae0: 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ng the current t
caf0: 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 61 72 65  able columns are
cb00: 20 22 61 22 2c 20 22 62 22 20 61 6e 64 20 22 63   "a", "b" and "c
cb10: 22 2c 20 61 6e 64 20 74 68 65 20 7a 4f 62 6a 0a  ", and the zObj.
cb20: 2a 2a 20 70 61 72 61 6d 74 65 72 20 69 73 20 70  ** paramter is p
cb30: 61 73 73 65 64 20 22 6f 6c 64 22 2c 20 72 65 74  assed "old", ret
cb40: 75 72 6e 20 61 20 73 74 72 69 6e 67 20 6f 66 20  urn a string of 
cb50: 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
cb60: 20 20 20 20 22 6f 6c 64 2e 61 2c 20 6f 6c 64 2e      "old.a, old.
cb70: 62 2c 20 6f 6c 64 2e 62 22 0a 2a 2a 0a 2a 2a 20  b, old.b".**.** 
cb80: 57 69 74 68 20 74 68 65 20 63 6f 6c 75 6d 6e 20  With the column 
cb90: 6e 61 6d 65 73 20 65 73 63 61 70 65 64 2e 0a 2a  names escaped..*
cba0: 2a 0a 2a 2a 20 46 6f 72 20 74 61 62 6c 65 73 20  *.** For tables 
cbb0: 77 69 74 68 20 69 6d 70 6c 69 63 69 74 20 72 6f  with implicit ro
cbc0: 77 69 64 73 20 2d 20 52 42 55 5f 50 4b 5f 45 58  wids - RBU_PK_EX
cbd0: 54 45 52 4e 41 4c 20 61 6e 64 20 52 42 55 5f 50  TERNAL and RBU_P
cbe0: 4b 5f 4e 4f 4e 45 2c 20 61 70 70 65 6e 64 0a 2a  K_NONE, append.*
cbf0: 2a 20 74 68 65 20 74 65 78 74 20 22 2c 20 6f 6c  * the text ", ol
cc00: 64 2e 5f 72 6f 77 69 64 5f 22 20 74 6f 20 74 68  d._rowid_" to th
cc10: 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
cc20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
cc30: 20 2a 72 62 75 4f 62 6a 49 74 65 72 47 65 74 4f   *rbuObjIterGetO
cc40: 6c 64 6c 69 73 74 28 0a 20 20 73 71 6c 69 74 65  ldlist(.  sqlite
cc50: 33 72 62 75 20 2a 70 2c 20 0a 20 20 52 62 75 4f  3rbu *p, .  RbuO
cc60: 62 6a 49 74 65 72 20 2a 70 49 74 65 72 2c 0a 20  bjIter *pIter,. 
cc70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 62   const char *zOb
cc80: 6a 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 69  j.){.  char *zLi
cc90: 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d  st = 0;.  if( p-
cca0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
ccb0: 26 20 70 49 74 65 72 2d 3e 61 62 49 6e 64 65 78  & pIter->abIndex
ccc0: 65 64 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  ed ){.    const 
ccd0: 63 68 61 72 20 2a 7a 53 20 3d 20 22 22 3b 0a 20  char *zS = "";. 
cce0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
ccf0: 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e  r(i=0; i<pIter->
cd00: 6e 54 62 6c 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nTblCol; i++){. 
cd10: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
cd20: 61 62 49 6e 64 65 78 65 64 5b 69 5d 20 29 7b 0a  abIndexed[i] ){.
cd30: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
cd40: 61 72 20 2a 7a 43 6f 6c 20 3d 20 70 49 74 65 72  ar *zCol = pIter
cd50: 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 3b 0a 20  ->azTblCol[i];. 
cd60: 20 20 20 20 20 20 20 7a 4c 69 73 74 20 3d 20 73         zList = s
cd70: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
cd80: 25 7a 25 73 25 73 2e 5c 22 25 77 5c 22 22 2c 20  %z%s%s.\"%w\"", 
cd90: 7a 4c 69 73 74 2c 20 7a 53 2c 20 7a 4f 62 6a 2c  zList, zS, zObj,
cda0: 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 65   zCol);.      }e
cdb0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69  lse{.        zLi
cdc0: 73 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  st = sqlite3_mpr
cdd0: 69 6e 74 66 28 22 25 7a 25 73 4e 55 4c 4c 22 2c  intf("%z%sNULL",
cde0: 20 7a 4c 69 73 74 2c 20 7a 53 29 3b 0a 20 20 20   zList, zS);.   
cdf0: 20 20 20 7d 0a 20 20 20 20 20 20 7a 53 20 3d 20     }.      zS = 
ce00: 22 2c 20 22 3b 0a 20 20 20 20 20 20 69 66 28 20  ", ";.      if( 
ce10: 7a 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  zList==0 ){.    
ce20: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
ce30: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
ce40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
ce50: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46  .    }..    /* F
ce60: 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  or a table with 
ce70: 69 6d 70 6c 69 63 69 74 20 72 6f 77 69 64 73 2c  implicit rowids,
ce80: 20 61 70 70 65 6e 64 20 22 6f 6c 64 2e 5f 72 6f   append "old._ro
ce90: 77 69 64 5f 22 20 74 6f 20 74 68 65 20 6c 69 73  wid_" to the lis
cea0: 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49  t. */.    if( pI
ceb0: 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f  ter->eType==RBU_
cec0: 50 4b 5f 45 58 54 45 52 4e 41 4c 20 7c 7c 20 70  PK_EXTERNAL || p
ced0: 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55  Iter->eType==RBU
cee0: 5f 50 4b 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  _PK_NONE ){.    
cef0: 20 20 7a 4c 69 73 74 20 3d 20 72 62 75 4d 50 72    zList = rbuMPr
cf00: 69 6e 74 66 28 70 2c 20 22 25 7a 2c 20 25 73 2e  intf(p, "%z, %s.
cf10: 5f 72 6f 77 69 64 5f 22 2c 20 7a 4c 69 73 74 2c  _rowid_", zList,
cf20: 20 7a 4f 62 6a 29 3b 0a 20 20 20 20 7d 0a 20 20   zObj);.    }.  
cf30: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4c 69 73 74  }.  return zList
cf40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
cf50: 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  n an expression 
cf60: 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
cf70: 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c 61 75   in a WHERE clau
cf80: 73 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 0a  se to match the.
cf90: 2a 2a 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f  ** primary key o
cfa0: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61  f the current ta
cfb0: 62 6c 65 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ble. For example
cfc0: 2c 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  , if the table i
cfd0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54  s:.**.**   CREAT
cfe0: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c  E TABLE t1(a, b,
cff0: 20 63 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28   c, PRIMARY KEY(
d000: 62 2c 20 63 29 29 3b 0a 2a 2a 0a 2a 2a 20 52 65  b, c));.**.** Re
d010: 74 75 72 6e 20 74 68 65 20 73 74 72 69 6e 67 3a  turn the string:
d020: 0a 2a 2a 0a 2a 2a 20 20 20 22 62 20 3d 20 3f 31  .**.**   "b = ?1
d030: 20 41 4e 44 20 63 20 3d 20 3f 32 22 0a 2a 2f 0a   AND c = ?2".*/.
d040: 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 62 75  static char *rbu
d050: 4f 62 6a 49 74 65 72 47 65 74 57 68 65 72 65 28  ObjIterGetWhere(
d060: 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70  .  sqlite3rbu *p
d070: 2c 20 0a 20 20 52 62 75 4f 62 6a 49 74 65 72 20  , .  RbuObjIter 
d080: 2a 70 49 74 65 72 0a 29 7b 0a 20 20 63 68 61 72  *pIter.){.  char
d090: 20 2a 7a 4c 69 73 74 20 3d 20 30 3b 0a 20 20 69   *zList = 0;.  i
d0a0: 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  f( pIter->eType=
d0b0: 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20 7c 7c 20  =RBU_PK_VTAB || 
d0c0: 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
d0d0: 55 5f 50 4b 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  U_PK_NONE ){.   
d0e0: 20 7a 4c 69 73 74 20 3d 20 72 62 75 4d 50 72 69   zList = rbuMPri
d0f0: 6e 74 66 28 70 2c 20 22 5f 72 6f 77 69 64 5f 20  ntf(p, "_rowid_ 
d100: 3d 20 3f 25 64 22 2c 20 70 49 74 65 72 2d 3e 6e  = ?%d", pIter->n
d110: 54 62 6c 43 6f 6c 2b 31 29 3b 0a 20 20 7d 65 6c  TblCol+1);.  }el
d120: 73 65 20 69 66 28 20 70 49 74 65 72 2d 3e 65 54  se if( pIter->eT
d130: 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45  ype==RBU_PK_EXTE
d140: 52 4e 41 4c 20 29 7b 0a 20 20 20 20 63 6f 6e 73  RNAL ){.    cons
d150: 74 20 63 68 61 72 20 2a 7a 53 65 70 20 3d 20 22  t char *zSep = "
d160: 22 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ";.    int i;.  
d170: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74    for(i=0; i<pIt
d180: 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69 2b 2b  er->nTblCol; i++
d190: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ){.      if( pIt
d1a0: 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 5d 20 29  er->abTblPk[i] )
d1b0: 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 73 74 20  {.        zList 
d1c0: 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20  = rbuMPrintf(p, 
d1d0: 22 25 7a 25 73 63 25 64 3d 3f 25 64 22 2c 20 7a  "%z%sc%d=?%d", z
d1e0: 4c 69 73 74 2c 20 7a 53 65 70 2c 20 69 2c 20 69  List, zSep, i, i
d1f0: 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7a 53 65  +1);.        zSe
d200: 70 20 3d 20 22 20 41 4e 44 20 22 3b 0a 20 20 20  p = " AND ";.   
d210: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a     }.    }.    z
d220: 4c 69 73 74 20 3d 20 72 62 75 4d 50 72 69 6e 74  List = rbuMPrint
d230: 66 28 70 2c 20 0a 20 20 20 20 20 20 20 20 22 5f  f(p, .        "_
d240: 72 6f 77 69 64 5f 20 3d 20 28 53 45 4c 45 43 54  rowid_ = (SELECT
d250: 20 69 64 20 46 52 4f 4d 20 72 62 75 5f 69 6d 70   id FROM rbu_imp
d260: 6f 73 74 65 72 32 20 57 48 45 52 45 20 25 7a 29  oster2 WHERE %z)
d270: 22 2c 20 7a 4c 69 73 74 0a 20 20 20 20 29 3b 0a  ", zList.    );.
d280: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f  .  }else{.    co
d290: 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70 20 3d  nst char *zSep =
d2a0: 20 22 22 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a   "";.    int i;.
d2b0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
d2c0: 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69  Iter->nTblCol; i
d2d0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
d2e0: 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 5d  Iter->abTblPk[i]
d2f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
d300: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 70  t char *zCol = p
d310: 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69  Iter->azTblCol[i
d320: 5d 3b 0a 20 20 20 20 20 20 20 20 7a 4c 69 73 74  ];.        zList
d330: 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c   = rbuMPrintf(p,
d340: 20 22 25 7a 25 73 5c 22 25 77 5c 22 3d 3f 25 64   "%z%s\"%w\"=?%d
d350: 22 2c 20 7a 4c 69 73 74 2c 20 7a 53 65 70 2c 20  ", zList, zSep, 
d360: 7a 43 6f 6c 2c 20 69 2b 31 29 3b 0a 20 20 20 20  zCol, i+1);.    
d370: 20 20 20 20 7a 53 65 70 20 3d 20 22 20 41 4e 44      zSep = " AND
d380: 20 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   ";.      }.    
d390: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  }.  }.  return z
d3a0: 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  List;.}../*.** T
d3b0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
d3c0: 65 6e 74 20 69 74 65 72 61 74 69 6e 67 20 74 68  ent iterating th
d3d0: 72 6f 75 67 68 20 74 68 65 20 6b 65 79 73 20 66  rough the keys f
d3e0: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f  or the current o
d3f0: 62 6a 65 63 74 0a 2a 2a 20 28 70 2d 3e 6f 62 6a  bject.** (p->obj
d400: 69 74 65 72 2e 70 53 65 6c 65 63 74 29 20 63 75  iter.pSelect) cu
d410: 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
d420: 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 2e 20 48  o a valid row. H
d430: 6f 77 65 76 65 72 2c 20 74 68 65 72 65 0a 2a 2a  owever, there.**
d440: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 77 72   is something wr
d450: 6f 6e 67 20 77 69 74 68 20 74 68 65 20 72 62 75  ong with the rbu
d460: 5f 63 6f 6e 74 72 6f 6c 20 76 61 6c 75 65 20 69  _control value i
d470: 6e 20 74 68 65 20 72 62 75 5f 63 6f 6e 74 72 6f  n the rbu_contro
d480: 6c 20 76 61 6c 75 65 0a 2a 2a 20 73 74 6f 72 65  l value.** store
d490: 64 20 69 6e 20 74 68 65 20 28 70 2d 3e 6e 43 6f  d in the (p->nCo
d4a0: 6c 2b 31 29 27 74 68 20 63 6f 6c 75 6d 6e 2e 20  l+1)'th column. 
d4b0: 53 65 74 20 74 68 65 20 65 72 72 6f 72 20 63 6f  Set the error co
d4c0: 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73  de and error mes
d4d0: 73 61 67 65 0a 2a 2a 20 6f 66 20 74 68 65 20 52  sage.** of the R
d4e0: 42 55 20 68 61 6e 64 6c 65 20 74 6f 20 73 6f 6d  BU handle to som
d4f0: 65 74 68 69 6e 67 20 72 65 66 6c 65 63 74 69 6e  ething reflectin
d500: 67 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69  g this..*/.stati
d510: 63 20 76 6f 69 64 20 72 62 75 42 61 64 43 6f 6e  c void rbuBadCon
d520: 74 72 6f 6c 45 72 72 6f 72 28 73 71 6c 69 74 65  trolError(sqlite
d530: 33 72 62 75 20 2a 70 29 7b 0a 20 20 70 2d 3e 72  3rbu *p){.  p->r
d540: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
d550: 3b 0a 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d  ;.  p->zErrmsg =
d560: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
d570: 28 22 69 6e 76 61 6c 69 64 20 72 62 75 5f 63 6f  ("invalid rbu_co
d580: 6e 74 72 6f 6c 20 76 61 6c 75 65 22 29 3b 0a 7d  ntrol value");.}
d590: 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .../*.** Return 
d5a0: 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  a nul-terminated
d5b0: 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
d5c0: 6e 67 20 74 68 65 20 63 6f 6d 6d 61 20 73 65 70  ng the comma sep
d5d0: 61 72 61 74 65 64 20 6c 69 73 74 20 6f 66 0a 2a  arated list of.*
d5e0: 2a 20 61 73 73 69 67 6e 6d 65 6e 74 73 20 74 68  * assignments th
d5f0: 61 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 63  at should be inc
d600: 6c 75 64 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20  luded following 
d610: 74 68 65 20 22 53 45 54 22 20 6b 65 79 77 6f 72  the "SET" keywor
d620: 64 20 6f 66 0a 2a 2a 20 61 6e 20 55 50 44 41 54  d of.** an UPDAT
d630: 45 20 73 74 61 74 65 6d 65 6e 74 20 75 73 65 64  E statement used
d640: 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 74   to update the t
d650: 61 62 6c 65 20 6f 62 6a 65 63 74 20 74 68 61 74  able object that
d660: 20 74 68 65 20 69 74 65 72 61 74 6f 72 0a 2a 2a   the iterator.**
d670: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
d680: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63  econd argument c
d690: 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
d6a0: 74 6f 20 69 66 20 74 68 65 20 72 62 75 5f 63 6f  to if the rbu_co
d6b0: 6e 74 72 6f 6c 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  ntrol.** column 
d6c0: 6f 66 20 74 68 65 20 64 61 74 61 5f 78 78 78 20  of the data_xxx 
d6d0: 74 61 62 6c 65 20 65 6e 74 72 79 20 69 73 20 73  table entry is s
d6e0: 65 74 20 74 6f 20 7a 4d 61 73 6b 2e 0a 2a 2a 0a  et to zMask..**.
d6f0: 2a 2a 20 54 68 65 20 6d 65 6d 6f 72 79 20 66 6f  ** The memory fo
d700: 72 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  r the returned s
d710: 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65  tring is obtaine
d720: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
d730: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 74 20 69  alloc()..** It i
d740: 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
d750: 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
d760: 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
d770: 20 66 72 65 65 20 69 74 20 75 73 69 6e 67 0a 2a   free it using.*
d780: 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  * sqlite3_free()
d790: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f  . .**.** If an O
d7a0: 4f 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  OM error is enco
d7b0: 75 6e 74 65 72 65 64 20 77 68 65 6e 20 61 6c 6c  untered when all
d7c0: 6f 63 61 74 69 6e 67 20 73 70 61 63 65 20 66 6f  ocating space fo
d7d0: 72 20 74 68 65 20 6e 65 77 0a 2a 2a 20 73 74 72  r the new.** str
d7e0: 69 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  ing, an error co
d7f0: 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20 74 68  de is left in th
d800: 65 20 72 62 75 20 68 61 6e 64 6c 65 20 70 61 73  e rbu handle pas
d810: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
d820: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 61 6e 64  .** argument and
d830: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
d840: 64 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72  d. Or, if an err
d850: 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  or has already o
d860: 63 63 75 72 72 65 64 0a 2a 2a 20 77 68 65 6e 20  ccurred.** when 
d870: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
d880: 20 63 61 6c 6c 65 64 2c 20 4e 55 4c 4c 20 69 73   called, NULL is
d890: 20 72 65 74 75 72 6e 65 64 20 69 6d 6d 65 64 69   returned immedi
d8a0: 61 74 65 6c 79 2c 20 77 69 74 68 6f 75 74 0a 2a  ately, without.*
d8b0: 2a 20 61 74 74 65 6d 70 74 69 6e 67 20 74 68 65  * attempting the
d8c0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 72 20 6d   allocation or m
d8d0: 6f 64 69 66 79 69 6e 67 20 74 68 65 20 73 74 6f  odifying the sto
d8e0: 72 65 64 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  red error code..
d8f0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
d900: 72 62 75 4f 62 6a 49 74 65 72 47 65 74 53 65 74  rbuObjIterGetSet
d910: 6c 69 73 74 28 0a 20 20 73 71 6c 69 74 65 33 72  list(.  sqlite3r
d920: 62 75 20 2a 70 2c 0a 20 20 52 62 75 4f 62 6a 49  bu *p,.  RbuObjI
d930: 74 65 72 20 2a 70 49 74 65 72 2c 0a 20 20 63 6f  ter *pIter,.  co
d940: 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 6b 0a  nst char *zMask.
d950: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 69 73 74  ){.  char *zList
d960: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72   = 0;.  if( p->r
d970: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
d980: 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20      int i;..    
d990: 69 66 28 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  if( (int)strlen(
d9a0: 7a 4d 61 73 6b 29 21 3d 70 49 74 65 72 2d 3e 6e  zMask)!=pIter->n
d9b0: 54 62 6c 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  TblCol ){.      
d9c0: 72 62 75 42 61 64 43 6f 6e 74 72 6f 6c 45 72 72  rbuBadControlErr
d9d0: 6f 72 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65  or(p);.    }else
d9e0: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
d9f0: 61 72 20 2a 7a 53 65 70 20 3d 20 22 22 3b 0a 20  ar *zSep = "";. 
da00: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
da10: 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20  pIter->nTblCol; 
da20: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  i++){.        ch
da30: 61 72 20 63 20 3d 20 7a 4d 61 73 6b 5b 70 49 74  ar c = zMask[pIt
da40: 65 72 2d 3e 61 69 53 72 63 4f 72 64 65 72 5b 69  er->aiSrcOrder[i
da50: 5d 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ]];.        if( 
da60: 63 3d 3d 27 78 27 20 29 7b 0a 20 20 20 20 20 20  c=='x' ){.      
da70: 20 20 20 20 7a 4c 69 73 74 20 3d 20 72 62 75 4d      zList = rbuM
da80: 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 25 73 5c  Printf(p, "%z%s\
da90: 22 25 77 5c 22 3d 3f 25 64 22 2c 20 0a 20 20 20  "%w\"=?%d", .   
daa0: 20 20 20 20 20 20 20 20 20 20 20 7a 4c 69 73 74             zList
dab0: 2c 20 7a 53 65 70 2c 20 70 49 74 65 72 2d 3e 61  , zSep, pIter->a
dac0: 7a 54 62 6c 43 6f 6c 5b 69 5d 2c 20 69 2b 31 0a  zTblCol[i], i+1.
dad0: 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
dae0: 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 2c         zSep = ",
daf0: 20 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   ";.        }.  
db00: 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 63        else if( c
db10: 3d 3d 27 64 27 20 29 7b 0a 20 20 20 20 20 20 20  =='d' ){.       
db20: 20 20 20 7a 4c 69 73 74 20 3d 20 72 62 75 4d 50     zList = rbuMP
db30: 72 69 6e 74 66 28 70 2c 20 22 25 7a 25 73 5c 22  rintf(p, "%z%s\"
db40: 25 77 5c 22 3d 72 62 75 5f 64 65 6c 74 61 28 5c  %w\"=rbu_delta(\
db50: 22 25 77 5c 22 2c 20 3f 25 64 29 22 2c 20 0a 20  "%w\", ?%d)", . 
db60: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4c 69               zLi
db70: 73 74 2c 20 7a 53 65 70 2c 20 70 49 74 65 72 2d  st, zSep, pIter-
db80: 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 2c 20 70 49  >azTblCol[i], pI
db90: 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d  ter->azTblCol[i]
dba0: 2c 20 69 2b 31 0a 20 20 20 20 20 20 20 20 20 20  , i+1.          
dbb0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 53 65  );.          zSe
dbc0: 70 20 3d 20 22 2c 20 22 3b 0a 20 20 20 20 20 20  p = ", ";.      
dbd0: 20 20 7d 0a 20 20 20 20 20 20 20 20 65 6c 73 65    }.        else
dbe0: 20 69 66 28 20 63 3d 3d 27 66 27 20 29 7b 0a 20   if( c=='f' ){. 
dbf0: 20 20 20 20 20 20 20 20 20 7a 4c 69 73 74 20 3d           zList =
dc00: 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22   rbuMPrintf(p, "
dc10: 25 7a 25 73 5c 22 25 77 5c 22 3d 72 62 75 5f 66  %z%s\"%w\"=rbu_f
dc20: 6f 73 73 69 6c 5f 64 65 6c 74 61 28 5c 22 25 77  ossil_delta(\"%w
dc30: 5c 22 2c 20 3f 25 64 29 22 2c 20 0a 20 20 20 20  \", ?%d)", .    
dc40: 20 20 20 20 20 20 20 20 20 20 7a 4c 69 73 74 2c            zList,
dc50: 20 7a 53 65 70 2c 20 70 49 74 65 72 2d 3e 61 7a   zSep, pIter->az
dc60: 54 62 6c 43 6f 6c 5b 69 5d 2c 20 70 49 74 65 72  TblCol[i], pIter
dc70: 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 2c 20 69  ->azTblCol[i], i
dc80: 2b 31 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  +1.          );.
dc90: 20 20 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d            zSep =
dca0: 20 22 2c 20 22 3b 0a 20 20 20 20 20 20 20 20 7d   ", ";.        }
dcb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
dcc0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4c 69 73   }.  return zLis
dcd0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t;.}../*.** Retu
dce0: 72 6e 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  rn a nul-termina
dcf0: 74 65 64 20 73 74 72 69 6e 67 20 63 6f 6e 73 69  ted string consi
dd00: 73 74 69 6e 67 20 6f 66 20 6e 42 79 74 65 20 63  sting of nByte c
dd10: 6f 6d 6d 61 20 73 65 70 61 72 61 74 65 64 0a 2a  omma separated.*
dd20: 2a 20 22 3f 22 20 65 78 70 72 65 73 73 69 6f 6e  * "?" expression
dd30: 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  s. For example, 
dd40: 69 66 20 6e 42 79 74 65 20 69 73 20 33 2c 20 72  if nByte is 3, r
dd50: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
dd60: 74 6f 0a 2a 2a 20 61 20 62 75 66 66 65 72 20 63  to.** a buffer c
dd70: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 74  ontaining the st
dd80: 72 69 6e 67 20 22 3f 2c 3f 2c 3f 22 2e 0a 2a 2a  ring "?,?,?"..**
dd90: 0a 2a 2a 20 54 68 65 20 6d 65 6d 6f 72 79 20 66  .** The memory f
dda0: 6f 72 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  or the returned 
ddb0: 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e  string is obtain
ddc0: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
ddd0: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 74 20  malloc()..** It 
dde0: 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
ddf0: 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
de00: 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
de10: 79 20 66 72 65 65 20 69 74 20 75 73 69 6e 67 0a  y free it using.
de20: 2a 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  ** sqlite3_free(
de30: 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ). .**.** If an 
de40: 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63  OOM error is enc
de50: 6f 75 6e 74 65 72 65 64 20 77 68 65 6e 20 61 6c  ountered when al
de60: 6c 6f 63 61 74 69 6e 67 20 73 70 61 63 65 20 66  locating space f
de70: 6f 72 20 74 68 65 20 6e 65 77 0a 2a 2a 20 73 74  or the new.** st
de80: 72 69 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20 63  ring, an error c
de90: 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20 74  ode is left in t
dea0: 68 65 20 72 62 75 20 68 61 6e 64 6c 65 20 70 61  he rbu handle pa
deb0: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
dec0: 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 61 6e  t.** argument an
ded0: 64 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  d NULL is return
dee0: 65 64 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72  ed. Or, if an er
def0: 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ror has already 
df00: 6f 63 63 75 72 72 65 64 0a 2a 2a 20 77 68 65 6e  occurred.** when
df10: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
df20: 73 20 63 61 6c 6c 65 64 2c 20 4e 55 4c 4c 20 69  s called, NULL i
df30: 73 20 72 65 74 75 72 6e 65 64 20 69 6d 6d 65 64  s returned immed
df40: 69 61 74 65 6c 79 2c 20 77 69 74 68 6f 75 74 0a  iately, without.
df50: 2a 2a 20 61 74 74 65 6d 70 74 69 6e 67 20 74 68  ** attempting th
df60: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 72 20  e allocation or 
df70: 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 73 74  modifying the st
df80: 6f 72 65 64 20 65 72 72 6f 72 20 63 6f 64 65 2e  ored error code.
df90: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
dfa0: 2a 72 62 75 4f 62 6a 49 74 65 72 47 65 74 42 69  *rbuObjIterGetBi
dfb0: 6e 64 6c 69 73 74 28 73 71 6c 69 74 65 33 72 62  ndlist(sqlite3rb
dfc0: 75 20 2a 70 2c 20 69 6e 74 20 6e 42 69 6e 64 29  u *p, int nBind)
dfd0: 7b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 20 3d  {.  char *zRet =
dfe0: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   0;.  sqlite3_in
dff0: 74 36 34 20 6e 42 79 74 65 20 3d 20 32 2a 28 73  t64 nByte = 2*(s
e000: 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 6e 42 69  qlite3_int64)nBi
e010: 6e 64 20 2b 20 31 3b 0a 0a 20 20 7a 52 65 74 20  nd + 1;..  zRet 
e020: 3d 20 28 63 68 61 72 2a 29 72 62 75 4d 61 6c 6c  = (char*)rbuMall
e030: 6f 63 28 70 2c 20 6e 42 79 74 65 29 3b 0a 20 20  oc(p, nByte);.  
e040: 69 66 28 20 7a 52 65 74 20 29 7b 0a 20 20 20 20  if( zRet ){.    
e050: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
e060: 3d 30 3b 20 69 3c 6e 42 69 6e 64 3b 20 69 2b 2b  =0; i<nBind; i++
e070: 29 7b 0a 20 20 20 20 20 20 7a 52 65 74 5b 69 2a  ){.      zRet[i*
e080: 32 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20 20 20  2] = '?';.      
e090: 7a 52 65 74 5b 69 2a 32 2b 31 5d 20 3d 20 28 69  zRet[i*2+1] = (i
e0a0: 2b 31 3d 3d 6e 42 69 6e 64 29 20 3f 20 27 5c 30  +1==nBind) ? '\0
e0b0: 27 20 3a 20 27 2c 27 3b 0a 20 20 20 20 7d 0a 20  ' : ',';.    }. 
e0c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74   }.  return zRet
e0d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69  ;.}../*.** The i
e0e0: 74 65 72 61 74 6f 72 20 63 75 72 72 65 6e 74 6c  terator currentl
e0f0: 79 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 74 61  y points to a ta
e100: 62 6c 65 20 28 6e 6f 74 20 69 6e 64 65 78 29 20  ble (not index) 
e110: 6f 66 20 74 79 70 65 20 0a 2a 2a 20 52 42 55 5f  of type .** RBU_
e120: 50 4b 5f 57 49 54 48 4f 55 54 5f 52 4f 57 49 44  PK_WITHOUT_ROWID
e130: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
e140: 63 72 65 61 74 65 73 20 74 68 65 20 50 52 49 4d  creates the PRIM
e150: 41 52 59 20 4b 45 59 20 0a 2a 2a 20 64 65 63 6c  ARY KEY .** decl
e160: 61 72 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  aration for the 
e170: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69 6d  corresponding im
e180: 70 6f 73 74 65 72 20 74 61 62 6c 65 2e 20 46 6f  poster table. Fo
e190: 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 69 66  r example,.** if
e1a0: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f   the iterator po
e1b0: 69 6e 74 73 20 74 6f 20 61 20 74 61 62 6c 65 20  ints to a table 
e1c0: 63 72 65 61 74 65 64 20 61 73 3a 0a 2a 2a 0a 2a  created as:.**.*
e1d0: 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
e1e0: 20 74 31 28 61 2c 20 62 2c 20 63 2c 20 50 52 49   t1(a, b, c, PRI
e1f0: 4d 41 52 59 20 4b 45 59 28 62 2c 20 61 20 44 45  MARY KEY(b, a DE
e200: 53 43 29 29 20 57 49 54 48 4f 55 54 20 52 4f 57  SC)) WITHOUT ROW
e210: 49 44 0a 2a 2a 0a 2a 2a 20 74 68 69 73 20 66 75  ID.**.** this fu
e220: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 3a 0a  nction returns:.
e230: 2a 2a 0a 2a 2a 20 20 20 50 52 49 4d 41 52 59 20  **.**   PRIMARY 
e240: 4b 45 59 28 22 62 22 2c 20 22 61 22 20 44 45 53  KEY("b", "a" DES
e250: 43 29 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  C).*/.static cha
e260: 72 20 2a 72 62 75 57 69 74 68 6f 75 74 52 6f 77  r *rbuWithoutRow
e270: 69 64 50 4b 28 73 71 6c 69 74 65 33 72 62 75 20  idPK(sqlite3rbu 
e280: 2a 70 2c 20 52 62 75 4f 62 6a 49 74 65 72 20 2a  *p, RbuObjIter *
e290: 70 49 74 65 72 29 7b 0a 20 20 63 68 61 72 20 2a  pIter){.  char *
e2a0: 7a 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  z = 0;.  assert(
e2b0: 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d 30 20   pIter->zIdx==0 
e2c0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  );.  if( p->rc==
e2d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
e2e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65   const char *zSe
e2f0: 70 20 3d 20 22 50 52 49 4d 41 52 59 20 4b 45 59  p = "PRIMARY KEY
e300: 28 22 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  (";.    sqlite3_
e310: 73 74 6d 74 20 2a 70 58 4c 69 73 74 20 3d 20 30  stmt *pXList = 0
e320: 3b 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20  ;     /* PRAGMA 
e330: 69 6e 64 65 78 5f 6c 69 73 74 20 3d 20 28 70 49  index_list = (pI
e340: 74 65 72 2d 3e 7a 54 62 6c 29 20 2a 2f 0a 20 20  ter->zTbl) */.  
e350: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
e360: 70 58 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20  pXInfo = 0;     
e370: 2f 2a 20 50 52 41 47 4d 41 20 69 6e 64 65 78 5f  /* PRAGMA index_
e380: 78 69 6e 66 6f 20 3d 20 3c 70 6b 2d 69 6e 64 65  xinfo = <pk-inde
e390: 78 3e 20 2a 2f 0a 20 20 20 0a 20 20 20 20 70 2d  x> */.   .    p-
e3a0: 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65  >rc = prepareFre
e3b0: 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72  eAndCollectError
e3c0: 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 58 4c  (p->dbMain, &pXL
e3d0: 69 73 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  ist, &p->zErrmsg
e3e0: 2c 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ,.        sqlite
e3f0: 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d  3_mprintf("PRAGM
e400: 41 20 6d 61 69 6e 2e 69 6e 64 65 78 5f 6c 69 73  A main.index_lis
e410: 74 20 3d 20 25 51 22 2c 20 70 49 74 65 72 2d 3e  t = %Q", pIter->
e420: 7a 54 62 6c 29 0a 20 20 20 20 29 3b 0a 20 20 20  zTbl).    );.   
e430: 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53   while( p->rc==S
e440: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49  QLITE_OK && SQLI
e450: 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
e460: 73 74 65 70 28 70 58 4c 69 73 74 29 20 29 7b 0a  step(pXList) ){.
e470: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
e480: 20 2a 7a 4f 72 69 67 20 3d 20 28 63 6f 6e 73 74   *zOrig = (const
e490: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
e4a0: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 58 4c 69 73  olumn_text(pXLis
e4b0: 74 2c 33 29 3b 0a 20 20 20 20 20 20 69 66 28 20  t,3);.      if( 
e4c0: 7a 4f 72 69 67 20 26 26 20 73 74 72 63 6d 70 28  zOrig && strcmp(
e4d0: 7a 4f 72 69 67 2c 20 22 70 6b 22 29 3d 3d 30 20  zOrig, "pk")==0 
e4e0: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
e4f0: 20 63 68 61 72 20 2a 7a 49 64 78 20 3d 20 28 63   char *zIdx = (c
e500: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
e510: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
e520: 58 4c 69 73 74 2c 31 29 3b 0a 20 20 20 20 20 20  XList,1);.      
e530: 20 20 69 66 28 20 7a 49 64 78 20 29 7b 0a 20 20    if( zIdx ){.  
e540: 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
e550: 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f  prepareFreeAndCo
e560: 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62  llectError(p->db
e570: 4d 61 69 6e 2c 20 26 70 58 49 6e 66 6f 2c 20 26  Main, &pXInfo, &
e580: 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20  p->zErrmsg,.    
e590: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
e5a0: 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d  3_mprintf("PRAGM
e5b0: 41 20 6d 61 69 6e 2e 69 6e 64 65 78 5f 78 69 6e  A main.index_xin
e5c0: 66 6f 20 3d 20 25 51 22 2c 20 7a 49 64 78 29 0a  fo = %Q", zIdx).
e5d0: 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
e5e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
e5f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
e600: 20 20 7d 0a 20 20 20 20 72 62 75 46 69 6e 61 6c    }.    rbuFinal
e610: 69 7a 65 28 70 2c 20 70 58 4c 69 73 74 29 3b 0a  ize(p, pXList);.
e620: 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72  .    while( p->r
e630: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
e640: 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
e650: 74 65 33 5f 73 74 65 70 28 70 58 49 6e 66 6f 29  te3_step(pXInfo)
e660: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
e670: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
e680: 28 70 58 49 6e 66 6f 2c 20 35 29 20 29 7b 0a 20  (pXInfo, 5) ){. 
e690: 20 20 20 20 20 20 20 2f 2a 20 69 6e 74 20 69 43         /* int iC
e6a0: 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  id = sqlite3_col
e6b0: 75 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20  umn_int(pXInfo, 
e6c0: 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  0); */.        c
e6d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 20  onst char *zCol 
e6e0: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
e6f0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
e700: 78 74 28 70 58 49 6e 66 6f 2c 20 32 29 3b 0a 20  xt(pXInfo, 2);. 
e710: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
e720: 72 20 2a 7a 44 65 73 63 20 3d 20 73 71 6c 69 74  r *zDesc = sqlit
e730: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58  e3_column_int(pX
e740: 49 6e 66 6f 2c 20 33 29 20 3f 20 22 20 44 45 53  Info, 3) ? " DES
e750: 43 22 20 3a 20 22 22 3b 0a 20 20 20 20 20 20 20  C" : "";.       
e760: 20 7a 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28   z = rbuMPrintf(
e770: 70 2c 20 22 25 7a 25 73 5c 22 25 77 5c 22 25 73  p, "%z%s\"%w\"%s
e780: 22 2c 20 7a 2c 20 7a 53 65 70 2c 20 7a 43 6f 6c  ", z, zSep, zCol
e790: 2c 20 7a 44 65 73 63 29 3b 0a 20 20 20 20 20 20  , zDesc);.      
e7a0: 20 20 7a 53 65 70 20 3d 20 22 2c 20 22 3b 0a 20    zSep = ", ";. 
e7b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
e7c0: 20 7a 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28   z = rbuMPrintf(
e7d0: 70 2c 20 22 25 7a 29 22 2c 20 7a 29 3b 0a 20 20  p, "%z)", z);.  
e7e0: 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c    rbuFinalize(p,
e7f0: 20 70 58 49 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20   pXInfo);.  }.  
e800: 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a  return z;.}../*.
e810: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
e820: 20 63 72 65 61 74 65 73 20 74 68 65 20 73 65 63   creates the sec
e830: 6f 6e 64 20 69 6d 70 6f 73 74 65 72 20 74 61 62  ond imposter tab
e840: 6c 65 20 75 73 65 64 20 77 68 65 6e 20 77 72 69  le used when wri
e850: 74 69 6e 67 20 74 6f 0a 2a 2a 20 61 20 74 61 62  ting to.** a tab
e860: 6c 65 20 62 2d 74 72 65 65 20 77 68 65 72 65 20  le b-tree where 
e870: 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e  the table has an
e880: 20 65 78 74 65 72 6e 61 6c 20 70 72 69 6d 61 72   external primar
e890: 79 20 6b 65 79 2e 20 49 66 20 74 68 65 0a 2a 2a  y key. If the.**
e8a0: 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
e8b0: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
e8c0: 72 67 75 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74  rgument does not
e8d0: 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
e8e0: 20 74 6f 0a 2a 2a 20 61 20 74 61 62 6c 65 20 28   to.** a table (
e8f0: 6e 6f 74 20 69 6e 64 65 78 29 20 77 69 74 68 20  not index) with 
e900: 61 6e 20 65 78 74 65 72 6e 61 6c 20 70 72 69 6d  an external prim
e910: 61 72 79 20 6b 65 79 2c 20 74 68 69 73 20 66 75  ary key, this fu
e920: 6e 63 74 69 6f 6e 20 69 73 20 61 0a 2a 2a 20 6e  nction is a.** n
e930: 6f 2d 6f 70 2e 20 0a 2a 2a 0a 2a 2a 20 41 73 73  o-op. .**.** Ass
e940: 75 6d 69 6e 67 20 74 68 65 20 69 74 65 72 61 74  uming the iterat
e950: 6f 72 20 64 6f 65 73 20 70 6f 69 6e 74 20 74 6f  or does point to
e960: 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 61 6e   a table with an
e970: 20 65 78 74 65 72 6e 61 6c 20 50 4b 2c 20 74 68   external PK, th
e980: 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 63  is.** function c
e990: 72 65 61 74 65 73 20 61 20 57 49 54 48 4f 55 54  reates a WITHOUT
e9a0: 20 52 4f 57 49 44 20 69 6d 70 6f 73 74 65 72 20   ROWID imposter 
e9b0: 74 61 62 6c 65 20 6e 61 6d 65 64 20 22 72 62 75  table named "rbu
e9c0: 5f 69 6d 70 6f 73 74 65 72 32 22 0a 2a 2a 20 75  _imposter2".** u
e9d0: 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68  sed to access th
e9e0: 61 74 20 50 4b 20 69 6e 64 65 78 2e 20 46 6f 72  at PK index. For
e9f0: 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
ea00: 20 74 61 72 67 65 74 20 74 61 62 6c 65 20 69 73   target table is
ea10: 0a 2a 2a 20 64 65 63 6c 61 72 65 64 20 61 73 20  .** declared as 
ea20: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
ea30: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
ea40: 28 61 2c 20 62 20 54 45 58 54 2c 20 63 20 52 45  (a, b TEXT, c RE
ea50: 41 4c 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28  AL, PRIMARY KEY(
ea60: 62 2c 20 63 29 29 3b 0a 2a 2a 0a 2a 2a 20 74 68  b, c));.**.** th
ea70: 65 6e 20 74 68 65 20 69 6d 70 6f 73 74 65 72 20  en the imposter 
ea80: 74 61 62 6c 65 20 73 63 68 65 6d 61 20 69 73 3a  table schema is:
ea90: 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20  .**.**   CREATE 
eaa0: 54 41 42 4c 45 20 72 62 75 5f 69 6d 70 6f 73 74  TABLE rbu_impost
eab0: 65 72 32 28 63 31 20 54 45 58 54 2c 20 63 32 20  er2(c1 TEXT, c2 
eac0: 52 45 41 4c 2c 20 69 64 20 49 4e 54 45 47 45 52  REAL, id INTEGER
ead0: 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 3b  ) WITHOUT ROWID;
eae0: 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  .**.*/.static vo
eaf0: 69 64 20 72 62 75 43 72 65 61 74 65 49 6d 70 6f  id rbuCreateImpo
eb00: 73 74 65 72 54 61 62 6c 65 32 28 73 71 6c 69 74  sterTable2(sqlit
eb10: 65 33 72 62 75 20 2a 70 2c 20 52 62 75 4f 62 6a  e3rbu *p, RbuObj
eb20: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
eb30: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
eb40: 45 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d 3e 65  E_OK && pIter->e
eb50: 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54  Type==RBU_PK_EXT
eb60: 45 52 4e 41 4c 20 29 7b 0a 20 20 20 20 69 6e 74  ERNAL ){.    int
eb70: 20 74 6e 75 6d 20 3d 20 70 49 74 65 72 2d 3e 69   tnum = pIter->i
eb80: 50 6b 54 6e 75 6d 3b 20 20 20 20 2f 2a 20 52 6f  PkTnum;    /* Ro
eb90: 6f 74 20 70 61 67 65 20 6f 66 20 50 4b 20 69 6e  ot page of PK in
eba0: 64 65 78 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  dex */.    sqlit
ebb0: 65 33 5f 73 74 6d 74 20 2a 70 51 75 65 72 79 20  e3_stmt *pQuery 
ebc0: 3d 20 30 3b 20 20 20 20 20 2f 2a 20 53 45 4c 45  = 0;     /* SELE
ebd0: 43 54 20 6e 61 6d 65 20 2e 2e 2e 20 57 48 45 52  CT name ... WHER
ebe0: 45 20 72 6f 6f 74 70 61 67 65 20 3d 20 24 74 6e  E rootpage = $tn
ebf0: 75 6d 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  um */.    const 
ec00: 63 68 61 72 20 2a 7a 49 64 78 20 3d 20 30 3b 20  char *zIdx = 0; 
ec10: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
ec20: 6f 66 20 50 4b 20 69 6e 64 65 78 20 2a 2f 0a 20  of PK index */. 
ec30: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
ec40: 2a 70 58 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20  *pXInfo = 0;    
ec50: 20 2f 2a 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e   /* PRAGMA main.
ec60: 69 6e 64 65 78 5f 78 69 6e 66 6f 20 3d 20 24 7a  index_xinfo = $z
ec70: 49 64 78 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  Idx */.    const
ec80: 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 61 20 3d 20   char *zComma = 
ec90: 22 22 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43  "";.    char *zC
eca0: 6f 6c 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ols = 0;        
ecb0: 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
ecc0: 20 62 75 69 6c 64 20 75 70 20 6c 69 73 74 20 6f   build up list o
ecd0: 66 20 74 61 62 6c 65 20 63 6f 6c 73 20 2a 2f 0a  f table cols */.
ece0: 20 20 20 20 63 68 61 72 20 2a 7a 50 6b 20 3d 20      char *zPk = 
ecf0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
ed00: 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 62 75 69    /* Used to bui
ed10: 6c 64 20 75 70 20 74 61 62 6c 65 20 50 4b 20 64  ld up table PK d
ed20: 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20  eclaration */.. 
ed30: 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
ed40: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
ed50: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64   primary key ind
ed60: 65 78 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ex for the curre
ed70: 6e 74 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a  nt table..    **
ed80: 20 54 68 69 73 20 69 73 20 6e 65 65 64 65 64 20   This is needed 
ed90: 66 6f 72 20 74 68 65 20 61 72 67 75 6d 65 6e 74  for the argument
eda0: 20 74 6f 20 22 50 52 41 47 4d 41 20 69 6e 64 65   to "PRAGMA inde
edb0: 78 5f 78 69 6e 66 6f 22 2e 20 53 65 74 0a 20 20  x_xinfo". Set.  
edc0: 20 20 2a 2a 20 7a 49 64 78 20 74 6f 20 70 6f 69    ** zIdx to poi
edd0: 6e 74 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d  nt to a nul-term
ede0: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 63 6f  inated string co
edf0: 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 6e 61  ntaining this na
ee00: 6d 65 2e 20 2a 2f 0a 20 20 20 20 70 2d 3e 72 63  me. */.    p->rc
ee10: 20 3d 20 70 72 65 70 61 72 65 41 6e 64 43 6f 6c   = prepareAndCol
ee20: 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d  lectError(p->dbM
ee30: 61 69 6e 2c 20 26 70 51 75 65 72 79 2c 20 26 70  ain, &pQuery, &p
ee40: 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20  ->zErrmsg, .    
ee50: 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65      "SELECT name
ee60: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
ee70: 74 65 72 20 57 48 45 52 45 20 72 6f 6f 74 70 61  ter WHERE rootpa
ee80: 67 65 20 3d 20 3f 22 0a 20 20 20 20 29 3b 0a 20  ge = ?".    );. 
ee90: 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
eea0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
eeb0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
eec0: 74 28 70 51 75 65 72 79 2c 20 31 2c 20 74 6e 75  t(pQuery, 1, tnu
eed0: 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51  m);.      if( SQ
eee0: 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
eef0: 33 5f 73 74 65 70 28 70 51 75 65 72 79 29 20 29  3_step(pQuery) )
ef00: 7b 0a 20 20 20 20 20 20 20 20 7a 49 64 78 20 3d  {.        zIdx =
ef10: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
ef20: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
ef30: 74 28 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20  t(pQuery, 0);.  
ef40: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
ef50: 69 66 28 20 7a 49 64 78 20 29 7b 0a 20 20 20 20  if( zIdx ){.    
ef60: 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72    p->rc = prepar
ef70: 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45  eFreeAndCollectE
ef80: 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  rror(p->dbMain, 
ef90: 26 70 58 49 6e 66 6f 2c 20 26 70 2d 3e 7a 45 72  &pXInfo, &p->zEr
efa0: 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20  rmsg,.          
efb0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
efc0: 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 69 6e 64  "PRAGMA main.ind
efd0: 65 78 5f 78 69 6e 66 6f 20 3d 20 25 51 22 2c 20  ex_xinfo = %Q", 
efe0: 7a 49 64 78 29 0a 20 20 20 20 20 20 29 3b 0a 20  zIdx).      );. 
eff0: 20 20 20 7d 0a 20 20 20 20 72 62 75 46 69 6e 61     }.    rbuFina
f000: 6c 69 7a 65 28 70 2c 20 70 51 75 65 72 79 29 3b  lize(p, pQuery);
f010: 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e  ..    while( p->
f020: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
f030: 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
f040: 69 74 65 33 5f 73 74 65 70 28 70 58 49 6e 66 6f  ite3_step(pXInfo
f050: 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62  ) ){.      int b
f060: 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Key = sqlite3_co
f070: 6c 75 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f 2c  lumn_int(pXInfo,
f080: 20 35 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62   5);.      if( b
f090: 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Key ){.        i
f0a0: 6e 74 20 69 43 69 64 20 3d 20 73 71 6c 69 74 65  nt iCid = sqlite
f0b0: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49  3_column_int(pXI
f0c0: 6e 66 6f 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  nfo, 1);.       
f0d0: 20 69 6e 74 20 62 44 65 73 63 20 3d 20 73 71 6c   int bDesc = sql
f0e0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
f0f0: 70 58 49 6e 66 6f 2c 20 33 29 3b 0a 20 20 20 20  pXInfo, 3);.    
f100: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
f110: 7a 43 6f 6c 6c 61 74 65 20 3d 20 28 63 6f 6e 73  zCollate = (cons
f120: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
f130: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 58 49 6e  column_text(pXIn
f140: 66 6f 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  fo, 4);.        
f150: 7a 43 6f 6c 73 20 3d 20 72 62 75 4d 50 72 69 6e  zCols = rbuMPrin
f160: 74 66 28 70 2c 20 22 25 7a 25 73 63 25 64 20 25  tf(p, "%z%sc%d %
f170: 73 20 43 4f 4c 4c 41 54 45 20 25 51 22 2c 20 7a  s COLLATE %Q", z
f180: 43 6f 6c 73 2c 20 7a 43 6f 6d 6d 61 2c 20 0a 20  Cols, zComma, . 
f190: 20 20 20 20 20 20 20 20 20 20 20 69 43 69 64 2c             iCid,
f1a0: 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 54 79 70   pIter->azTblTyp
f1b0: 65 5b 69 43 69 64 5d 2c 20 7a 43 6f 6c 6c 61 74  e[iCid], zCollat
f1c0: 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  e.        );.   
f1d0: 20 20 20 20 20 7a 50 6b 20 3d 20 72 62 75 4d 50       zPk = rbuMP
f1e0: 72 69 6e 74 66 28 70 2c 20 22 25 7a 25 73 63 25  rintf(p, "%z%sc%
f1f0: 64 25 73 22 2c 20 7a 50 6b 2c 20 7a 43 6f 6d 6d  d%s", zPk, zComm
f200: 61 2c 20 69 43 69 64 2c 20 62 44 65 73 63 3f 22  a, iCid, bDesc?"
f210: 20 44 45 53 43 22 3a 22 22 29 3b 0a 20 20 20 20   DESC":"");.    
f220: 20 20 20 20 7a 43 6f 6d 6d 61 20 3d 20 22 2c 20      zComma = ", 
f230: 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ";.      }.    }
f240: 0a 20 20 20 20 7a 43 6f 6c 73 20 3d 20 72 62 75  .    zCols = rbu
f250: 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 2c 20  MPrintf(p, "%z, 
f260: 69 64 20 49 4e 54 45 47 45 52 22 2c 20 7a 43 6f  id INTEGER", zCo
f270: 6c 73 29 3b 0a 20 20 20 20 72 62 75 46 69 6e 61  ls);.    rbuFina
f280: 6c 69 7a 65 28 70 2c 20 70 58 49 6e 66 6f 29 3b  lize(p, pXInfo);
f290: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65  ..    sqlite3_te
f2a0: 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
f2b0: 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53  E_TESTCTRL_IMPOS
f2c0: 54 45 52 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20  TER, p->dbMain, 
f2d0: 22 6d 61 69 6e 22 2c 20 31 2c 20 74 6e 75 6d 29  "main", 1, tnum)
f2e0: 3b 0a 20 20 20 20 72 62 75 4d 50 72 69 6e 74 66  ;.    rbuMPrintf
f2f0: 45 78 65 63 28 70 2c 20 70 2d 3e 64 62 4d 61 69  Exec(p, p->dbMai
f300: 6e 2c 0a 20 20 20 20 20 20 20 20 22 43 52 45 41  n,.        "CREA
f310: 54 45 20 54 41 42 4c 45 20 72 62 75 5f 69 6d 70  TE TABLE rbu_imp
f320: 6f 73 74 65 72 32 28 25 7a 2c 20 50 52 49 4d 41  oster2(%z, PRIMA
f330: 52 59 20 4b 45 59 28 25 7a 29 29 20 57 49 54 48  RY KEY(%z)) WITH
f340: 4f 55 54 20 52 4f 57 49 44 22 2c 20 0a 20 20 20  OUT ROWID", .   
f350: 20 20 20 20 20 7a 43 6f 6c 73 2c 20 7a 50 6b 0a       zCols, zPk.
f360: 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
f370: 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
f380: 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
f390: 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 4d  IMPOSTER, p->dbM
f3a0: 61 69 6e 2c 20 22 6d 61 69 6e 22 2c 20 30 2c 20  ain, "main", 0, 
f3b0: 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0);.  }.}../*.**
f3c0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
f3d0: 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
f3e0: 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
f3f0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
f400: 69 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  it .** immediate
f410: 6c 79 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 20  ly returns zero 
f420: 28 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61  (without doing a
f430: 6e 79 20 77 6f 72 6b 29 2e 20 4f 72 2c 20 69 66  ny work). Or, if
f440: 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63   an error.** occ
f450: 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 65  urs during the e
f460: 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73  xecution of this
f470: 20 66 75 6e 63 74 69 6f 6e 2c 20 69 74 20 73 65   function, it se
f480: 74 73 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  ts the error cod
f490: 65 0a 2a 2a 20 69 6e 20 74 68 65 20 73 71 6c 69  e.** in the sqli
f4a0: 74 65 33 72 62 75 20 6f 62 6a 65 63 74 20 69 6e  te3rbu object in
f4b0: 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20 66  dicated by the f
f4c0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 61 6e  irst argument an
f4d0: 64 20 72 65 74 75 72 6e 73 0a 2a 2a 20 7a 65 72  d returns.** zer
f4e0: 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 74 65  o..**.** The ite
f4f0: 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20  rator passed as 
f500: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
f510: 65 6e 74 20 69 73 20 67 75 61 72 61 6e 74 65 65  ent is guarantee
f520: 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a  d to point to.**
f530: 20 61 20 74 61 62 6c 65 20 28 6e 6f 74 20 61 6e   a table (not an
f540: 20 69 6e 64 65 78 29 20 77 68 65 6e 20 74 68 69   index) when thi
f550: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
f560: 6c 6c 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74  lled. This funct
f570: 69 6f 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  ion.** attempts 
f580: 74 6f 20 63 72 65 61 74 65 20 61 6e 79 20 69 6d  to create any im
f590: 70 6f 73 74 65 72 20 74 61 62 6c 65 20 72 65 71  poster table req
f5a0: 75 69 72 65 64 20 74 6f 20 77 72 69 74 65 20 74  uired to write t
f5b0: 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 74 61  o the main.** ta
f5c0: 62 6c 65 20 62 2d 74 72 65 65 20 6f 66 20 74 68  ble b-tree of th
f5d0: 65 20 74 61 62 6c 65 20 62 65 66 6f 72 65 20 72  e table before r
f5e0: 65 74 75 72 6e 69 6e 67 2e 20 4e 6f 6e 2d 7a 65  eturning. Non-ze
f5f0: 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  ro is returned i
f600: 66 0a 2a 2a 20 61 6e 20 69 6d 70 6f 73 74 65 72  f.** an imposter
f610: 20 74 61 62 6c 65 20 61 72 65 20 63 72 65 61 74   table are creat
f620: 65 64 2c 20 6f 72 20 7a 65 72 6f 20 6f 74 68 65  ed, or zero othe
f630: 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  rwise..**.** An 
f640: 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20 69  imposter table i
f650: 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 61 6c  s required in al
f660: 6c 20 63 61 73 65 73 20 65 78 63 65 70 74 20 52  l cases except R
f670: 42 55 5f 50 4b 5f 56 54 41 42 2e 20 4f 6e 6c 79  BU_PK_VTAB. Only
f680: 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c  .** virtual tabl
f690: 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 74  es are written t
f6a0: 6f 20 64 69 72 65 63 74 6c 79 2e 20 54 68 65 20  o directly. The 
f6b0: 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20 68  imposter table h
f6c0: 61 73 20 74 68 65 20 0a 2a 2a 20 73 61 6d 65 20  as the .** same 
f6d0: 73 63 68 65 6d 61 20 61 73 20 74 68 65 20 61 63  schema as the ac
f6e0: 74 75 61 6c 20 74 61 72 67 65 74 20 74 61 62 6c  tual target tabl
f6f0: 65 20 28 6c 65 73 73 20 61 6e 79 20 55 4e 49 51  e (less any UNIQ
f700: 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 29 2e  UE constraints).
f710: 20 0a 2a 2a 20 4d 6f 72 65 20 70 72 65 63 69 73   .** More precis
f720: 65 6c 79 2c 20 74 68 65 20 22 73 61 6d 65 20 73  ely, the "same s
f730: 63 68 65 6d 61 22 20 6d 65 61 6e 73 20 74 68 65  chema" means the
f740: 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 73 2c 20 74   same columns, t
f750: 79 70 65 73 2c 20 0a 2a 2a 20 63 6f 6c 6c 61 74  ypes, .** collat
f760: 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 2e 20 46  ion sequences. F
f770: 6f 72 20 74 61 62 6c 65 73 20 74 68 61 74 20 64  or tables that d
f780: 6f 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 65 78  o not have an ex
f790: 74 65 72 6e 61 6c 20 50 52 49 4d 41 52 59 0a 2a  ternal PRIMARY.*
f7a0: 2a 20 4b 45 59 2c 20 69 74 20 61 6c 73 6f 20 6d  * KEY, it also m
f7b0: 65 61 6e 73 20 74 68 65 20 73 61 6d 65 20 50 52  eans the same PR
f7c0: 49 4d 41 52 59 20 4b 45 59 20 64 65 63 6c 61 72  IMARY KEY declar
f7d0: 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
f7e0: 20 76 6f 69 64 20 72 62 75 43 72 65 61 74 65 49   void rbuCreateI
f7f0: 6d 70 6f 73 74 65 72 54 61 62 6c 65 28 73 71 6c  mposterTable(sql
f800: 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62 75 4f  ite3rbu *p, RbuO
f810: 62 6a 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  bjIter *pIter){.
f820: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
f830: 49 54 45 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d  ITE_OK && pIter-
f840: 3e 65 54 79 70 65 21 3d 52 42 55 5f 50 4b 5f 56  >eType!=RBU_PK_V
f850: 54 41 42 20 29 7b 0a 20 20 20 20 69 6e 74 20 74  TAB ){.    int t
f860: 6e 75 6d 20 3d 20 70 49 74 65 72 2d 3e 69 54 6e  num = pIter->iTn
f870: 75 6d 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  um;.    const ch
f880: 61 72 20 2a 7a 43 6f 6d 6d 61 20 3d 20 22 22 3b  ar *zComma = "";
f890: 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20  .    char *zSql 
f8a0: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f  = 0;.    int iCo
f8b0: 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74  l;.    sqlite3_t
f8c0: 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
f8d0: 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f  TE_TESTCTRL_IMPO
f8e0: 53 54 45 52 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c  STER, p->dbMain,
f8f0: 20 22 6d 61 69 6e 22 2c 20 30 2c 20 31 29 3b 0a   "main", 0, 1);.
f900: 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b  .    for(iCol=0;
f910: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
f920: 4b 20 26 26 20 69 43 6f 6c 3c 70 49 74 65 72 2d  K && iCol<pIter-
f930: 3e 6e 54 62 6c 43 6f 6c 3b 20 69 43 6f 6c 2b 2b  >nTblCol; iCol++
f940: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
f950: 68 61 72 20 2a 7a 50 6b 20 3d 20 22 22 3b 0a 20  har *zPk = "";. 
f960: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
f970: 2a 7a 43 6f 6c 20 3d 20 70 49 74 65 72 2d 3e 61  *zCol = pIter->a
f980: 7a 54 62 6c 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20  zTblCol[iCol];. 
f990: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
f9a0: 2a 7a 43 6f 6c 6c 20 3d 20 30 3b 0a 0a 20 20 20  *zColl = 0;..   
f9b0: 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
f9c0: 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f  e3_table_column_
f9d0: 6d 65 74 61 64 61 74 61 28 0a 20 20 20 20 20 20  metadata(.      
f9e0: 20 20 20 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22      p->dbMain, "
f9f0: 6d 61 69 6e 22 2c 20 70 49 74 65 72 2d 3e 7a 54  main", pIter->zT
fa00: 62 6c 2c 20 7a 43 6f 6c 2c 20 30 2c 20 26 7a 43  bl, zCol, 0, &zC
fa10: 6f 6c 6c 2c 20 30 2c 20 30 2c 20 30 0a 20 20 20  oll, 0, 0, 0.   
fa20: 20 20 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28     );..      if(
fa30: 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52   pIter->eType==R
fa40: 42 55 5f 50 4b 5f 49 50 4b 20 26 26 20 70 49 74  BU_PK_IPK && pIt
fa50: 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 43 6f 6c  er->abTblPk[iCol
fa60: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ] ){.        /* 
fa70: 49 66 20 74 68 65 20 74 61 72 67 65 74 20 74 61  If the target ta
fa80: 62 6c 65 20 63 6f 6c 75 6d 6e 20 69 73 20 61 6e  ble column is an
fa90: 20 22 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52   "INTEGER PRIMAR
faa0: 59 20 4b 45 59 22 2c 20 61 64 64 0a 20 20 20 20  Y KEY", add.    
fab0: 20 20 20 20 2a 2a 20 22 50 52 49 4d 41 52 59 20      ** "PRIMARY 
fac0: 4b 45 59 22 20 74 6f 20 74 68 65 20 69 6d 70 6f  KEY" to the impo
fad0: 73 74 65 72 20 74 61 62 6c 65 20 63 6f 6c 75 6d  ster table colum
fae0: 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 2e 20 2a  n declaration. *
faf0: 2f 0a 20 20 20 20 20 20 20 20 7a 50 6b 20 3d 20  /.        zPk = 
fb00: 22 50 52 49 4d 41 52 59 20 4b 45 59 20 22 3b 0a  "PRIMARY KEY ";.
fb10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 53        }.      zS
fb20: 71 6c 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28  ql = rbuMPrintf(
fb30: 70 2c 20 22 25 7a 25 73 5c 22 25 77 5c 22 20 25  p, "%z%s\"%w\" %
fb40: 73 20 25 73 43 4f 4c 4c 41 54 45 20 25 51 25 73  s %sCOLLATE %Q%s
fb50: 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 7a 53  ", .          zS
fb60: 71 6c 2c 20 7a 43 6f 6d 6d 61 2c 20 7a 43 6f 6c  ql, zComma, zCol
fb70: 2c 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 54 79  , pIter->azTblTy
fb80: 70 65 5b 69 43 6f 6c 5d 2c 20 7a 50 6b 2c 20 7a  pe[iCol], zPk, z
fb90: 43 6f 6c 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  Coll,.          
fba0: 28 70 49 74 65 72 2d 3e 61 62 4e 6f 74 4e 75 6c  (pIter->abNotNul
fbb0: 6c 5b 69 43 6f 6c 5d 20 3f 20 22 20 4e 4f 54 20  l[iCol] ? " NOT 
fbc0: 4e 55 4c 4c 22 20 3a 20 22 22 29 0a 20 20 20 20  NULL" : "").    
fbd0: 20 20 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6d 6d    );.      zComm
fbe0: 61 20 3d 20 22 2c 20 22 3b 0a 20 20 20 20 7d 0a  a = ", ";.    }.
fbf0: 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
fc00: 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 57 49  eType==RBU_PK_WI
fc10: 54 48 4f 55 54 5f 52 4f 57 49 44 20 29 7b 0a 20  THOUT_ROWID ){. 
fc20: 20 20 20 20 20 63 68 61 72 20 2a 7a 50 6b 20 3d       char *zPk =
fc30: 20 72 62 75 57 69 74 68 6f 75 74 52 6f 77 69 64   rbuWithoutRowid
fc40: 50 4b 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  PK(p, pIter);.  
fc50: 20 20 20 20 69 66 28 20 7a 50 6b 20 29 7b 0a 20      if( zPk ){. 
fc60: 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 72 62         zSql = rb
fc70: 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 2c  uMPrintf(p, "%z,
fc80: 20 25 7a 22 2c 20 7a 53 71 6c 2c 20 7a 50 6b 29   %z", zSql, zPk)
fc90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
fca0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73  .    sqlite3_tes
fcb0: 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
fcc0: 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54  _TESTCTRL_IMPOST
fcd0: 45 52 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22  ER, p->dbMain, "
fce0: 6d 61 69 6e 22 2c 20 31 2c 20 74 6e 75 6d 29 3b  main", 1, tnum);
fcf0: 0a 20 20 20 20 72 62 75 4d 50 72 69 6e 74 66 45  .    rbuMPrintfE
fd00: 78 65 63 28 70 2c 20 70 2d 3e 64 62 4d 61 69 6e  xec(p, p->dbMain
fd10: 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  , "CREATE TABLE 
fd20: 5c 22 72 62 75 5f 69 6d 70 5f 25 77 5c 22 28 25  \"rbu_imp_%w\"(%
fd30: 7a 29 25 73 22 2c 20 0a 20 20 20 20 20 20 20 20  z)%s", .        
fd40: 70 49 74 65 72 2d 3e 7a 54 62 6c 2c 20 7a 53 71  pIter->zTbl, zSq
fd50: 6c 2c 20 0a 20 20 20 20 20 20 20 20 28 70 49 74  l, .        (pIt
fd60: 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
fd70: 4b 5f 57 49 54 48 4f 55 54 5f 52 4f 57 49 44 20  K_WITHOUT_ROWID 
fd80: 3f 20 22 20 57 49 54 48 4f 55 54 20 52 4f 57 49  ? " WITHOUT ROWI
fd90: 44 22 20 3a 20 22 22 29 0a 20 20 20 20 29 3b 0a  D" : "").    );.
fda0: 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74      sqlite3_test
fdb0: 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
fdc0: 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45  TESTCTRL_IMPOSTE
fdd0: 52 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d  R, p->dbMain, "m
fde0: 61 69 6e 22 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  ain", 0, 0);.  }
fdf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72  .}../*.** Prepar
fe00: 65 20 61 20 73 74 61 74 65 6d 65 6e 74 20 75 73  e a statement us
fe10: 65 64 20 74 6f 20 69 6e 73 65 72 74 20 72 6f 77  ed to insert row
fe20: 73 20 69 6e 74 6f 20 74 68 65 20 22 72 62 75 5f  s into the "rbu_
fe30: 74 6d 70 5f 78 78 78 22 20 74 61 62 6c 65 2e 0a  tmp_xxx" table..
fe40: 2a 2a 20 53 70 65 63 69 66 69 63 61 6c 6c 79 20  ** Specifically 
fe50: 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 66 20 74  a statement of t
fe60: 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
fe70: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 72     INSERT INTO r
fe80: 62 75 5f 74 6d 70 5f 78 78 78 20 56 41 4c 55 45  bu_tmp_xxx VALUE
fe90: 53 28 3f 2c 20 3f 2c 20 3f 20 2e 2e 2e 29 3b 0a  S(?, ?, ? ...);.
fea0: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72  **.** The number
feb0: 20 6f 66 20 62 6f 75 6e 64 20 76 61 72 69 61 62   of bound variab
fec0: 6c 65 73 20 69 73 20 65 71 75 61 6c 20 74 6f 20  les is equal to 
fed0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
fee0: 6c 75 6d 6e 73 20 69 6e 0a 2a 2a 20 74 68 65 20  lumns in.** the 
fef0: 74 61 72 67 65 74 20 74 61 62 6c 65 2c 20 70 6c  target table, pl
ff00: 75 73 20 6f 6e 65 20 28 66 6f 72 20 74 68 65 20  us one (for the 
ff10: 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 63 6f 6c 75  rbu_control colu
ff20: 6d 6e 29 2c 20 70 6c 75 73 20 6f 6e 65 20 6d 6f  mn), plus one mo
ff30: 72 65 20 0a 2a 2a 20 28 66 6f 72 20 74 68 65 20  re .** (for the 
ff40: 72 62 75 5f 72 6f 77 69 64 20 63 6f 6c 75 6d 6e  rbu_rowid column
ff50: 29 20 69 66 20 74 68 65 20 74 61 72 67 65 74 20  ) if the target 
ff60: 74 61 62 6c 65 20 69 73 20 61 6e 20 69 6d 70 6c  table is an impl
ff70: 69 63 69 74 20 49 50 4b 20 6f 72 20 0a 2a 2a 20  icit IPK or .** 
ff80: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
ff90: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62  /.static void rb
ffa0: 75 4f 62 6a 49 74 65 72 50 72 65 70 61 72 65 54  uObjIterPrepareT
ffb0: 6d 70 49 6e 73 65 72 74 28 0a 20 20 73 71 6c 69  mpInsert(.  sqli
ffc0: 74 65 33 72 62 75 20 2a 70 2c 20 0a 20 20 52 62  te3rbu *p, .  Rb
ffd0: 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 2c  uObjIter *pIter,
ffe0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
fff0: 43 6f 6c 6c 69 73 74 2c 0a 20 20 63 6f 6e 73 74  Collist,.  const
10000 20 63 68 61 72 20 2a 7a 52 62 75 52 6f 77 69 64   char *zRbuRowid
10010 0a 29 7b 0a 20 20 69 6e 74 20 62 52 62 75 52 6f  .){.  int bRbuRo
10020 77 69 64 20 3d 20 28 70 49 74 65 72 2d 3e 65 54  wid = (pIter->eT
10030 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45  ype==RBU_PK_EXTE
10040 52 4e 41 4c 20 7c 7c 20 70 49 74 65 72 2d 3e 65  RNAL || pIter->e
10050 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e  Type==RBU_PK_NON
10060 45 29 3b 0a 20 20 63 68 61 72 20 2a 7a 42 69 6e  E);.  char *zBin
10070 64 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 47 65  d = rbuObjIterGe
10080 74 42 69 6e 64 6c 69 73 74 28 70 2c 20 70 49 74  tBindlist(p, pIt
10090 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20 2b 20 31 20  er->nTblCol + 1 
100a0 2b 20 62 52 62 75 52 6f 77 69 64 29 3b 0a 20 20  + bRbuRowid);.  
100b0 69 66 28 20 7a 42 69 6e 64 20 29 7b 0a 20 20 20  if( zBind ){.   
100c0 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
100d0 70 54 6d 70 49 6e 73 65 72 74 3d 3d 30 20 29 3b  pTmpInsert==0 );
100e0 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65  .    p->rc = pre
100f0 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65  pareFreeAndColle
10100 63 74 45 72 72 6f 72 28 0a 20 20 20 20 20 20 20  ctError(.       
10110 20 70 2d 3e 64 62 52 62 75 2c 20 26 70 49 74 65   p->dbRbu, &pIte
10120 72 2d 3e 70 54 6d 70 49 6e 73 65 72 74 2c 20 26  r->pTmpInsert, &
10130 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 73 71 6c 69  p->zErrmsg, sqli
10140 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
10150 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49         "INSERT I
10160 4e 54 4f 20 25 73 2e 27 72 62 75 5f 74 6d 70 5f  NTO %s.'rbu_tmp_
10170 25 71 27 28 72 62 75 5f 63 6f 6e 74 72 6f 6c 2c  %q'(rbu_control,
10180 25 73 25 73 29 20 56 41 4c 55 45 53 28 25 7a 29  %s%s) VALUES(%z)
10190 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 2d  ", .          p-
101a0 3e 7a 53 74 61 74 65 44 62 2c 20 70 49 74 65 72  >zStateDb, pIter
101b0 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 7a 43 6f 6c  ->zDataTbl, zCol
101c0 6c 69 73 74 2c 20 7a 52 62 75 52 6f 77 69 64 2c  list, zRbuRowid,
101d0 20 7a 42 69 6e 64 0a 20 20 20 20 29 29 3b 0a 20   zBind.    ));. 
101e0 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
101f0 64 20 72 62 75 54 6d 70 49 6e 73 65 72 74 46 75  d rbuTmpInsertFu
10200 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
10210 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20  ntext *pCtx, .  
10220 69 6e 74 20 6e 56 61 6c 2c 0a 20 20 73 71 6c 69  int nVal,.  sqli
10230 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61  te3_value **apVa
10240 6c 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 72 62  l.){.  sqlite3rb
10250 75 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 5f 75  u *p = sqlite3_u
10260 73 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a  ser_data(pCtx);.
10270 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
10280 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  E_OK;.  int i;..
10290 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
102a0 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61  3_value_int(apVa
102b0 6c 5b 30 5d 29 21 3d 30 0a 20 20 20 20 20 20 7c  l[0])!=0.      |
102c0 7c 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 65 54 79  | p->objiter.eTy
102d0 70 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52  pe==RBU_PK_EXTER
102e0 4e 41 4c 20 0a 20 20 20 20 20 20 7c 7c 20 70 2d  NAL .      || p-
102f0 3e 6f 62 6a 69 74 65 72 2e 65 54 79 70 65 3d 3d  >objiter.eType==
10300 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 0a 20 20 29  RBU_PK_NONE .  )
10310 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ;.  if( sqlite3_
10320 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b  value_int(apVal[
10330 30 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 2d  0])!=0 ){.    p-
10340 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20 2b  >nPhaseOneStep +
10350 3d 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 6e 49 6e  = p->objiter.nIn
10360 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28  dex;.  }..  for(
10370 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
10380 4f 4b 20 26 26 20 69 3c 6e 56 61 6c 3b 20 69 2b  OK && i<nVal; i+
10390 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  +){.    rc = sql
103a0 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28  ite3_bind_value(
103b0 70 2d 3e 6f 62 6a 69 74 65 72 2e 70 54 6d 70 49  p->objiter.pTmpI
103c0 6e 73 65 72 74 2c 20 69 2b 31 2c 20 61 70 56 61  nsert, i+1, apVa
103d0 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28  l[i]);.  }.  if(
103e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
103f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  {.    sqlite3_st
10400 65 70 28 70 2d 3e 6f 62 6a 69 74 65 72 2e 70 54  ep(p->objiter.pT
10410 6d 70 49 6e 73 65 72 74 29 3b 0a 20 20 20 20 72  mpInsert);.    r
10420 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
10430 74 28 70 2d 3e 6f 62 6a 69 74 65 72 2e 70 54 6d  t(p->objiter.pTm
10440 70 49 6e 73 65 72 74 29 3b 0a 20 20 7d 0a 0a 20  pInsert);.  }.. 
10450 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10460 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
10470 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63  3_result_error_c
10480 6f 64 65 28 70 43 74 78 2c 20 72 63 29 3b 0a 20  ode(pCtx, rc);. 
10490 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 63 68 61   }.}..static cha
104a0 72 20 2a 72 62 75 4f 62 6a 49 74 65 72 47 65 74  r *rbuObjIterGet
104b0 49 6e 64 65 78 57 68 65 72 65 28 73 71 6c 69 74  IndexWhere(sqlit
104c0 65 33 72 62 75 20 2a 70 2c 20 52 62 75 4f 62 6a  e3rbu *p, RbuObj
104d0 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
104e0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
104f0 74 6d 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  tmt = 0;.  int r
10500 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 63 68 61  c = p->rc;.  cha
10510 72 20 2a 7a 52 65 74 20 3d 20 30 3b 0a 0a 20 20  r *zRet = 0;..  
10520 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
10530 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 72  K ){.    rc = pr
10540 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45  epareAndCollectE
10550 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  rror(p->dbMain, 
10560 26 70 53 74 6d 74 2c 20 26 70 2d 3e 7a 45 72 72  &pStmt, &p->zErr
10570 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 22 53 45  msg,.        "SE
10580 4c 45 43 54 20 74 72 69 6d 28 73 71 6c 29 20 46  LECT trim(sql) F
10590 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
105a0 72 20 57 48 45 52 45 20 74 79 70 65 3d 27 69 6e  r WHERE type='in
105b0 64 65 78 27 20 41 4e 44 20 6e 61 6d 65 3d 3f 22  dex' AND name=?"
105c0 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 69 66  .    );.  }.  if
105d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
105e0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  ){.    int rc2;.
105f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10600 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74  _bind_text(pStmt
10610 2c 20 31 2c 20 70 49 74 65 72 2d 3e 7a 49 64 78  , 1, pIter->zIdx
10620 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41  , -1, SQLITE_STA
10630 54 49 43 29 3b 0a 20 20 20 20 69 66 28 20 72 63  TIC);.    if( rc
10640 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53  ==SQLITE_OK && S
10650 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
10660 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29  e3_step(pStmt) )
10670 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
10680 61 72 20 2a 7a 53 71 6c 20 3d 20 28 63 6f 6e 73  ar *zSql = (cons
10690 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
106a0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
106b0 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  t, 0);.      if(
106c0 20 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 20   zSql ){.       
106d0 20 69 6e 74 20 6e 50 61 72 65 6e 20 3d 20 30 3b   int nParen = 0;
106e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
106f0 6d 62 65 72 20 6f 66 20 6f 70 65 6e 20 70 61 72  mber of open par
10700 65 6e 74 68 65 73 69 73 20 2a 2f 0a 20 20 20 20  enthesis */.    
10710 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
10720 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 53 71 6c     for(i=0; zSql
10730 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
10740 20 20 20 20 20 63 68 61 72 20 63 20 3d 20 7a 53       char c = zS
10750 71 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  ql[i];.         
10760 20 69 66 28 20 63 3d 3d 27 28 27 20 29 7b 0a 20   if( c=='(' ){. 
10770 20 20 20 20 20 20 20 20 20 20 20 6e 50 61 72 65             nPare
10780 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  n++;.          }
10790 0a 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20  .          else 
107a0 69 66 28 20 63 3d 3d 27 29 27 20 29 7b 0a 20 20  if( c==')' ){.  
107b0 20 20 20 20 20 20 20 20 20 20 6e 50 61 72 65 6e            nParen
107c0 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  --;.            
107d0 69 66 28 20 6e 50 61 72 65 6e 3d 3d 30 20 29 7b  if( nParen==0 ){
107e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
107f0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
10800 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
10810 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
10820 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 22   }else if( c=='"
10830 27 20 7c 7c 20 63 3d 3d 27 5c 27 27 20 7c 7c 20  ' || c=='\'' || 
10840 63 3d 3d 27 60 27 20 29 7b 0a 20 20 20 20 20 20  c=='`' ){.      
10850 20 20 20 20 20 20 66 6f 72 28 69 2b 2b 3b 20 31        for(i++; 1
10860 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
10870 20 20 20 20 20 20 69 66 28 20 7a 53 71 6c 5b 69        if( zSql[i
10880 5d 3d 3d 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==c ){.        
10890 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 71 6c          if( zSql
108a0 5b 69 2b 31 5d 21 3d 63 20 29 20 62 72 65 61 6b  [i+1]!=c ) break
108b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
108c0 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    i++;.         
108d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
108e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
108f0 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5b 27 20  else if( c=='[' 
10900 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
10910 6f 72 28 69 2b 2b 3b 20 31 3b 20 69 2b 2b 29 7b  or(i++; 1; i++){
10920 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
10930 66 28 20 7a 53 71 6c 5b 69 5d 3d 3d 27 5d 27 20  f( zSql[i]==']' 
10940 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
10950 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
10960 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
10970 20 20 20 20 20 69 66 28 20 7a 53 71 6c 5b 69 5d       if( zSql[i]
10980 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 52   ){.          zR
10990 65 74 20 3d 20 72 62 75 53 74 72 6e 64 75 70 28  et = rbuStrndup(
109a0 26 7a 53 71 6c 5b 69 5d 2c 20 26 72 63 29 3b 0a  &zSql[i], &rc);.
109b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
109c0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 32  }.    }..    rc2
109d0 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   = sqlite3_final
109e0 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
109f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
10a00 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20  K ) rc = rc2;.  
10a10 7d 0a 0a 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b  }..  p->rc = rc;
10a20 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a  .  return zRet;.
10a30 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20  }../*.** Ensure 
10a40 74 68 61 74 20 74 68 65 20 53 51 4c 69 74 65 20  that the SQLite 
10a50 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65  statement handle
10a60 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 75 70  s required to up
10a70 64 61 74 65 20 74 68 65 20 0a 2a 2a 20 74 61 72  date the .** tar
10a80 67 65 74 20 64 61 74 61 62 61 73 65 20 6f 62 6a  get database obj
10a90 65 63 74 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ect currently in
10aa0 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20 69  dicated by the i
10ab0 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 0a  terator passed .
10ac0 2a 2a 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ** as the second
10ad0 20 61 72 67 75 6d 65 6e 74 20 61 72 65 20 61 76   argument are av
10ae0 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ailable..*/.stat
10af0 69 63 20 69 6e 74 20 72 62 75 4f 62 6a 49 74 65  ic int rbuObjIte
10b00 72 50 72 65 70 61 72 65 41 6c 6c 28 0a 20 20 73  rPrepareAll(.  s
10b10 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 0a 20  qlite3rbu *p, . 
10b20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74   RbuObjIter *pIt
10b30 65 72 2c 0a 20 20 69 6e 74 20 6e 4f 66 66 73 65  er,.  int nOffse
10b40 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
10b50 20 20 20 20 20 20 2f 2a 20 41 64 64 20 22 4c 49        /* Add "LI
10b60 4d 49 54 20 2d 31 20 4f 46 46 53 45 54 20 24 6e  MIT -1 OFFSET $n
10b70 4f 66 66 73 65 74 22 20 74 6f 20 53 45 4c 45 43  Offset" to SELEC
10b80 54 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  T */.){.  assert
10b90 28 20 70 49 74 65 72 2d 3e 62 43 6c 65 61 6e 75  ( pIter->bCleanu
10ba0 70 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 49  p==0 );.  if( pI
10bb0 74 65 72 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  ter->pSelect==0 
10bc0 26 26 20 72 62 75 4f 62 6a 49 74 65 72 43 61 63  && rbuObjIterCac
10bd0 68 65 54 61 62 6c 65 49 6e 66 6f 28 70 2c 20 70  heTableInfo(p, p
10be0 49 74 65 72 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  Iter)==SQLITE_OK
10bf0 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e   ){.    const in
10c00 74 20 74 6e 75 6d 20 3d 20 70 49 74 65 72 2d 3e  t tnum = pIter->
10c10 69 54 6e 75 6d 3b 0a 20 20 20 20 63 68 61 72 20  iTnum;.    char 
10c20 2a 7a 43 6f 6c 6c 69 73 74 20 3d 20 30 3b 20 20  *zCollist = 0;  
10c30 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
10c40 20 6f 66 20 69 6e 64 65 78 65 64 20 63 6f 6c 75   of indexed colu
10c50 6d 6e 73 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  mns */.    char 
10c60 2a 2a 70 7a 20 3d 20 26 70 2d 3e 7a 45 72 72 6d  **pz = &p->zErrm
10c70 73 67 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  sg;.    const ch
10c80 61 72 20 2a 7a 49 64 78 20 3d 20 70 49 74 65 72  ar *zIdx = pIter
10c90 2d 3e 7a 49 64 78 3b 0a 20 20 20 20 63 68 61 72  ->zIdx;.    char
10ca0 20 2a 7a 4c 69 6d 69 74 20 3d 20 30 3b 0a 0a 20   *zLimit = 0;.. 
10cb0 20 20 20 69 66 28 20 6e 4f 66 66 73 65 74 20 29     if( nOffset )
10cc0 7b 0a 20 20 20 20 20 20 7a 4c 69 6d 69 74 20 3d  {.      zLimit =
10cd0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
10ce0 28 22 20 4c 49 4d 49 54 20 2d 31 20 4f 46 46 53  (" LIMIT -1 OFFS
10cf0 45 54 20 25 64 22 2c 20 6e 4f 66 66 73 65 74 29  ET %d", nOffset)
10d00 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 4c 69  ;.      if( !zLi
10d10 6d 69 74 20 29 20 70 2d 3e 72 63 20 3d 20 53 51  mit ) p->rc = SQ
10d20 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
10d30 7d 0a 0a 20 20 20 20 69 66 28 20 7a 49 64 78 20  }..    if( zIdx 
10d40 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
10d50 68 61 72 20 2a 7a 54 62 6c 20 3d 20 70 49 74 65  har *zTbl = pIte
10d60 72 2d 3e 7a 54 62 6c 3b 0a 20 20 20 20 20 20 63  r->zTbl;.      c
10d70 68 61 72 20 2a 7a 49 6d 70 6f 73 74 65 72 43 6f  har *zImposterCo
10d80 6c 73 20 3d 20 30 3b 20 20 20 20 2f 2a 20 43 6f  ls = 0;    /* Co
10d90 6c 75 6d 6e 73 20 66 6f 72 20 69 6d 70 6f 73 74  lumns for impost
10da0 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  er table */.    
10db0 20 20 63 68 61 72 20 2a 7a 49 6d 70 6f 73 74 65    char *zImposte
10dc0 72 50 4b 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  rPK = 0;      /*
10dd0 20 50 72 69 6d 61 72 79 20 6b 65 79 20 64 65 63   Primary key dec
10de0 6c 61 72 61 74 69 6f 6e 20 66 6f 72 20 69 6d 70  laration for imp
10df0 6f 73 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 63  oster */.      c
10e00 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b  har *zWhere = 0;
10e10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48             /* WH
10e20 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 50 4b  ERE clause on PK
10e30 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20   columns */.    
10e40 20 20 63 68 61 72 20 2a 7a 42 69 6e 64 20 3d 20    char *zBind = 
10e50 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  0;.      char *z
10e60 50 61 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Part = 0;.      
10e70 69 6e 74 20 6e 42 69 6e 64 20 3d 20 30 3b 0a 0a  int nBind = 0;..
10e80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
10e90 74 65 72 2d 3e 65 54 79 70 65 21 3d 52 42 55 5f  ter->eType!=RBU_
10ea0 50 4b 5f 56 54 41 42 20 29 3b 0a 20 20 20 20 20  PK_VTAB );.     
10eb0 20 7a 43 6f 6c 6c 69 73 74 20 3d 20 72 62 75 4f   zCollist = rbuO
10ec0 62 6a 49 74 65 72 47 65 74 49 6e 64 65 78 43 6f  bjIterGetIndexCo
10ed0 6c 73 28 0a 20 20 20 20 20 20 20 20 20 20 70 2c  ls(.          p,
10ee0 20 70 49 74 65 72 2c 20 26 7a 49 6d 70 6f 73 74   pIter, &zImpost
10ef0 65 72 43 6f 6c 73 2c 20 26 7a 49 6d 70 6f 73 74  erCols, &zImpost
10f00 65 72 50 4b 2c 20 26 7a 57 68 65 72 65 2c 20 26  erPK, &zWhere, &
10f10 6e 42 69 6e 64 0a 20 20 20 20 20 20 29 3b 0a 20  nBind.      );. 
10f20 20 20 20 20 20 7a 42 69 6e 64 20 3d 20 72 62 75       zBind = rbu
10f30 4f 62 6a 49 74 65 72 47 65 74 42 69 6e 64 6c 69  ObjIterGetBindli
10f40 73 74 28 70 2c 20 6e 42 69 6e 64 29 3b 0a 20 20  st(p, nBind);.  
10f50 20 20 20 20 7a 50 61 72 74 20 3d 20 72 62 75 4f      zPart = rbuO
10f60 62 6a 49 74 65 72 47 65 74 49 6e 64 65 78 57 68  bjIterGetIndexWh
10f70 65 72 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a  ere(p, pIter);..
10f80 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20        /* Create 
10f90 74 68 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62  the imposter tab
10fa0 6c 65 20 75 73 65 64 20 74 6f 20 77 72 69 74 65  le used to write
10fb0 20 74 6f 20 74 68 69 73 20 69 6e 64 65 78 2e 20   to this index. 
10fc0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
10fd0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
10fe0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d  LITE_TESTCTRL_IM
10ff0 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 4d 61 69  POSTER, p->dbMai
11000 6e 2c 20 22 6d 61 69 6e 22 2c 20 30 2c 20 31 29  n, "main", 0, 1)
11010 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
11020 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
11030 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50  ITE_TESTCTRL_IMP
11040 4f 53 54 45 52 2c 20 70 2d 3e 64 62 4d 61 69 6e  OSTER, p->dbMain
11050 2c 20 22 6d 61 69 6e 22 2c 20 31 2c 74 6e 75 6d  , "main", 1,tnum
11060 29 3b 0a 20 20 20 20 20 20 72 62 75 4d 50 72 69  );.      rbuMPri
11070 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64 62  ntfExec(p, p->db
11080 4d 61 69 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  Main,.          
11090 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 5c 22  "CREATE TABLE \"
110a0 72 62 75 5f 69 6d 70 5f 25 77 5c 22 28 20 25 73  rbu_imp_%w\"( %s
110b0 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 20 25  , PRIMARY KEY( %
110c0 73 20 29 20 29 20 57 49 54 48 4f 55 54 20 52 4f  s ) ) WITHOUT RO
110d0 57 49 44 22 2c 0a 20 20 20 20 20 20 20 20 20 20  WID",.          
110e0 7a 54 62 6c 2c 20 7a 49 6d 70 6f 73 74 65 72 43  zTbl, zImposterC
110f0 6f 6c 73 2c 20 7a 49 6d 70 6f 73 74 65 72 50 4b  ols, zImposterPK
11100 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
11110 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
11120 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
11130 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70  CTRL_IMPOSTER, p
11140 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22  ->dbMain, "main"
11150 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20  , 0, 0);..      
11160 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 73 74  /* Create the st
11170 61 74 65 6d 65 6e 74 20 74 6f 20 69 6e 73 65 72  atement to inser
11180 74 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20  t index entries 
11190 2a 2f 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  */.      pIter->
111a0 6e 43 6f 6c 20 3d 20 6e 42 69 6e 64 3b 0a 20 20  nCol = nBind;.  
111b0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
111c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
111d0 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70      p->rc = prep
111e0 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63  areFreeAndCollec
111f0 74 45 72 72 6f 72 28 0a 20 20 20 20 20 20 20 20  tError(.        
11200 20 20 20 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 26      p->dbMain, &
11210 70 49 74 65 72 2d 3e 70 49 6e 73 65 72 74 2c 20  pIter->pInsert, 
11220 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20  &p->zErrmsg,.   
11230 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
11240 70 72 69 6e 74 66 28 22 49 4e 53 45 52 54 20 49  printf("INSERT I
11250 4e 54 4f 20 5c 22 72 62 75 5f 69 6d 70 5f 25 77  NTO \"rbu_imp_%w
11260 5c 22 20 56 41 4c 55 45 53 28 25 73 29 22 2c 20  \" VALUES(%s)", 
11270 7a 54 62 6c 2c 20 7a 42 69 6e 64 29 0a 20 20 20  zTbl, zBind).   
11280 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
11290 0a 20 20 20 20 20 20 2f 2a 20 41 6e 64 20 74 6f  .      /* And to
112a0 20 64 65 6c 65 74 65 20 69 6e 64 65 78 20 65 6e   delete index en
112b0 74 72 69 65 73 20 2a 2f 0a 20 20 20 20 20 20 69  tries */.      i
112c0 66 28 20 72 62 75 49 73 56 61 63 75 75 6d 28 70  f( rbuIsVacuum(p
112d0 29 3d 3d 30 20 26 26 20 70 2d 3e 72 63 3d 3d 53  )==0 && p->rc==S
112e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
112f0 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70      p->rc = prep
11300 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63  areFreeAndCollec
11310 74 45 72 72 6f 72 28 0a 20 20 20 20 20 20 20 20  tError(.        
11320 20 20 20 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 26      p->dbMain, &
11330 70 49 74 65 72 2d 3e 70 44 65 6c 65 74 65 2c 20  pIter->pDelete, 
11340 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20  &p->zErrmsg,.   
11350 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
11360 70 72 69 6e 74 66 28 22 44 45 4c 45 54 45 20 46  printf("DELETE F
11370 52 4f 4d 20 5c 22 72 62 75 5f 69 6d 70 5f 25 77  ROM \"rbu_imp_%w
11380 5c 22 20 57 48 45 52 45 20 25 73 22 2c 20 7a 54  \" WHERE %s", zT
11390 62 6c 2c 20 7a 57 68 65 72 65 29 0a 20 20 20 20  bl, zWhere).    
113a0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a      );.      }..
113b0 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20        /* Create 
113c0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
113d0 6d 65 6e 74 20 74 6f 20 72 65 61 64 20 6b 65 79  ment to read key
113e0 73 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65  s in sorted orde
113f0 72 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  r */.      if( p
11400 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
11410 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
11420 2a 7a 53 71 6c 3b 0a 20 20 20 20 20 20 20 20 69  *zSql;.        i
11430 66 28 20 72 62 75 49 73 56 61 63 75 75 6d 28 70  f( rbuIsVacuum(p
11440 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ) ){.          z
11450 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
11460 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
11470 20 20 20 20 20 22 53 45 4c 45 43 54 20 25 73 2c       "SELECT %s,
11480 20 30 20 41 53 20 72 62 75 5f 63 6f 6e 74 72 6f   0 AS rbu_contro
11490 6c 20 46 52 4f 4d 20 27 25 71 27 20 25 73 20 4f  l FROM '%q' %s O
114a0 52 44 45 52 20 42 59 20 25 73 25 73 22 2c 0a 20  RDER BY %s%s",. 
114b0 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f               zCo
114c0 6c 6c 69 73 74 2c 20 0a 20 20 20 20 20 20 20 20  llist, .        
114d0 20 20 20 20 20 20 70 49 74 65 72 2d 3e 7a 44 61        pIter->zDa
114e0 74 61 54 62 6c 2c 0a 20 20 20 20 20 20 20 20 20  taTbl,.         
114f0 20 20 20 20 20 7a 50 61 72 74 2c 20 7a 43 6f 6c       zPart, zCol
11500 6c 69 73 74 2c 20 7a 4c 69 6d 69 74 0a 20 20 20  list, zLimit.   
11510 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
11520 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 20 20 20    }else..       
11530 20 69 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70   if( pIter->eTyp
11540 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e  e==RBU_PK_EXTERN
11550 41 4c 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79  AL || pIter->eTy
11560 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20  pe==RBU_PK_NONE 
11570 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 53 71  ){.          zSq
11580 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
11590 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20  ntf(.           
115a0 20 20 20 22 53 45 4c 45 43 54 20 25 73 2c 20 72     "SELECT %s, r
115b0 62 75 5f 63 6f 6e 74 72 6f 6c 20 46 52 4f 4d 20  bu_control FROM 
115c0 25 73 2e 27 72 62 75 5f 74 6d 70 5f 25 71 27 20  %s.'rbu_tmp_%q' 
115d0 25 73 20 4f 52 44 45 52 20 42 59 20 25 73 25 73  %s ORDER BY %s%s
115e0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
115f0 20 7a 43 6f 6c 6c 69 73 74 2c 20 70 2d 3e 7a 53   zCollist, p->zS
11600 74 61 74 65 44 62 2c 20 70 49 74 65 72 2d 3e 7a  tateDb, pIter->z
11610 44 61 74 61 54 62 6c 2c 0a 20 20 20 20 20 20 20  DataTbl,.       
11620 20 20 20 20 20 20 20 7a 50 61 72 74 2c 20 7a 43         zPart, zC
11630 6f 6c 6c 69 73 74 2c 20 7a 4c 69 6d 69 74 0a 20  ollist, zLimit. 
11640 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
11650 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11660 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69       zSql = sqli
11670 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
11680 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45             "SELE
11690 43 54 20 25 73 2c 20 72 62 75 5f 63 6f 6e 74 72  CT %s, rbu_contr
116a0 6f 6c 20 46 52 4f 4d 20 25 73 2e 27 72 62 75 5f  ol FROM %s.'rbu_
116b0 74 6d 70 5f 25 71 27 20 25 73 20 22 0a 20 20 20  tmp_%q' %s ".   
116c0 20 20 20 20 20 20 20 20 20 20 20 22 55 4e 49 4f             "UNIO
116d0 4e 20 41 4c 4c 20 22 0a 20 20 20 20 20 20 20 20  N ALL ".        
116e0 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 25 73        "SELECT %s
116f0 2c 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 46 52  , rbu_control FR
11700 4f 4d 20 27 25 71 27 20 22 0a 20 20 20 20 20 20  OM '%q' ".      
11710 20 20 20 20 20 20 20 20 22 25 73 20 25 73 20 74          "%s %s t
11720 79 70 65 6f 66 28 72 62 75 5f 63 6f 6e 74 72 6f  ypeof(rbu_contro
11730 6c 29 3d 27 69 6e 74 65 67 65 72 27 20 41 4e 44  l)='integer' AND
11740 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 21 3d 31 20   rbu_control!=1 
11750 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
11760 22 4f 52 44 45 52 20 42 59 20 25 73 25 73 22 2c  "ORDER BY %s%s",
11770 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  .              z
11780 43 6f 6c 6c 69 73 74 2c 20 70 2d 3e 7a 53 74 61  Collist, p->zSta
11790 74 65 44 62 2c 20 70 49 74 65 72 2d 3e 7a 44 61  teDb, pIter->zDa
117a0 74 61 54 62 6c 2c 20 7a 50 61 72 74 2c 0a 20 20  taTbl, zPart,.  
117b0 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
117c0 6c 69 73 74 2c 20 70 49 74 65 72 2d 3e 7a 44 61  list, pIter->zDa
117d0 74 61 54 62 6c 2c 20 0a 20 20 20 20 20 20 20 20  taTbl, .        
117e0 20 20 20 20 20 20 7a 50 61 72 74 2c 0a 20 20 20        zPart,.   
117f0 20 20 20 20 20 20 20 20 20 20 20 28 7a 50 61 72             (zPar
11800 74 20 3f 20 22 41 4e 44 22 20 3a 20 22 57 48 45  t ? "AND" : "WHE
11810 52 45 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20  RE"),.          
11820 20 20 20 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a 4c      zCollist, zL
11830 69 6d 69 74 0a 20 20 20 20 20 20 20 20 20 20 29  imit.          )
11840 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11850 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70      p->rc = prep
11860 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63  areFreeAndCollec
11870 74 45 72 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c  tError(p->dbRbu,
11880 20 26 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74   &pIter->pSelect
11890 2c 20 70 7a 2c 20 7a 53 71 6c 29 3b 0a 20 20 20  , pz, zSql);.   
118a0 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69     }..      sqli
118b0 74 65 33 5f 66 72 65 65 28 7a 49 6d 70 6f 73 74  te3_free(zImpost
118c0 65 72 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20 73  erCols);.      s
118d0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6d 70  qlite3_free(zImp
118e0 6f 73 74 65 72 50 4b 29 3b 0a 20 20 20 20 20 20  osterPK);.      
118f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 68  sqlite3_free(zWh
11900 65 72 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ere);.      sqli
11910 74 65 33 5f 66 72 65 65 28 7a 42 69 6e 64 29 3b  te3_free(zBind);
11920 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
11930 72 65 65 28 7a 50 61 72 74 29 3b 0a 20 20 20 20  ree(zPart);.    
11940 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
11950 20 62 52 62 75 52 6f 77 69 64 20 3d 20 28 70 49   bRbuRowid = (pI
11960 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f  ter->eType==RBU_
11970 50 4b 5f 56 54 41 42 29 0a 20 20 20 20 20 20 20  PK_VTAB).       
11980 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 28               ||(
11990 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
119a0 55 5f 50 4b 5f 4e 4f 4e 45 29 0a 20 20 20 20 20  U_PK_NONE).     
119b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
119c0 7c 28 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  |(pIter->eType==
119d0 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20  RBU_PK_EXTERNAL 
119e0 26 26 20 72 62 75 49 73 56 61 63 75 75 6d 28 70  && rbuIsVacuum(p
119f0 29 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  ));.      const 
11a00 63 68 61 72 20 2a 7a 54 62 6c 20 3d 20 70 49 74  char *zTbl = pIt
11a10 65 72 2d 3e 7a 54 62 6c 3b 20 20 20 20 20 20 20  er->zTbl;       
11a20 2f 2a 20 54 61 62 6c 65 20 74 68 69 73 20 73 74  /* Table this st
11a30 65 70 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f  ep applies to */
11a40 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
11a50 72 20 2a 7a 57 72 69 74 65 3b 20 20 20 20 20 20  r *zWrite;      
11a60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11a70 49 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20 6e  Imposter table n
11a80 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 20 20 63 68  ame */..      ch
11a90 61 72 20 2a 7a 42 69 6e 64 69 6e 67 73 20 3d 20  ar *zBindings = 
11aa0 72 62 75 4f 62 6a 49 74 65 72 47 65 74 42 69 6e  rbuObjIterGetBin
11ab0 64 6c 69 73 74 28 70 2c 20 70 49 74 65 72 2d 3e  dlist(p, pIter->
11ac0 6e 54 62 6c 43 6f 6c 20 2b 20 62 52 62 75 52 6f  nTblCol + bRbuRo
11ad0 77 69 64 29 3b 0a 20 20 20 20 20 20 63 68 61 72  wid);.      char
11ae0 20 2a 7a 57 68 65 72 65 20 3d 20 72 62 75 4f 62   *zWhere = rbuOb
11af0 6a 49 74 65 72 47 65 74 57 68 65 72 65 28 70 2c  jIterGetWhere(p,
11b00 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 63   pIter);.      c
11b10 68 61 72 20 2a 7a 4f 6c 64 6c 69 73 74 20 3d 20  har *zOldlist = 
11b20 72 62 75 4f 62 6a 49 74 65 72 47 65 74 4f 6c 64  rbuObjIterGetOld
11b30 6c 69 73 74 28 70 2c 20 70 49 74 65 72 2c 20 22  list(p, pIter, "
11b40 6f 6c 64 22 29 3b 0a 20 20 20 20 20 20 63 68 61  old");.      cha
11b50 72 20 2a 7a 4e 65 77 6c 69 73 74 20 3d 20 72 62  r *zNewlist = rb
11b60 75 4f 62 6a 49 74 65 72 47 65 74 4f 6c 64 6c 69  uObjIterGetOldli
11b70 73 74 28 70 2c 20 70 49 74 65 72 2c 20 22 6e 65  st(p, pIter, "ne
11b80 77 22 29 3b 0a 0a 20 20 20 20 20 20 7a 43 6f 6c  w");..      zCol
11b90 6c 69 73 74 20 3d 20 72 62 75 4f 62 6a 49 74 65  list = rbuObjIte
11ba0 72 47 65 74 43 6f 6c 6c 69 73 74 28 70 2c 20 70  rGetCollist(p, p
11bb0 49 74 65 72 29 3b 0a 20 20 20 20 20 20 70 49 74  Iter);.      pIt
11bc0 65 72 2d 3e 6e 43 6f 6c 20 3d 20 70 49 74 65 72  er->nCol = pIter
11bd0 2d 3e 6e 54 62 6c 43 6f 6c 3b 0a 0a 20 20 20 20  ->nTblCol;..    
11be0 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
11bf0 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20 6f  imposter table o
11c00 72 20 74 61 62 6c 65 73 20 28 69 66 20 72 65 71  r tables (if req
11c10 75 69 72 65 64 29 2e 20 2a 2f 0a 20 20 20 20 20  uired). */.     
11c20 20 72 62 75 43 72 65 61 74 65 49 6d 70 6f 73 74   rbuCreateImpost
11c30 65 72 54 61 62 6c 65 28 70 2c 20 70 49 74 65 72  erTable(p, pIter
11c40 29 3b 0a 20 20 20 20 20 20 72 62 75 43 72 65 61  );.      rbuCrea
11c50 74 65 49 6d 70 6f 73 74 65 72 54 61 62 6c 65 32  teImposterTable2
11c60 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
11c70 20 20 7a 57 72 69 74 65 20 3d 20 28 70 49 74 65    zWrite = (pIte
11c80 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
11c90 5f 56 54 41 42 20 3f 20 22 22 20 3a 20 22 72 62  _VTAB ? "" : "rb
11ca0 75 5f 69 6d 70 5f 22 29 3b 0a 0a 20 20 20 20 20  u_imp_");..     
11cb0 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 49   /* Create the I
11cc0 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 20  NSERT statement 
11cd0 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
11ce0 74 61 72 67 65 74 20 50 4b 20 62 2d 74 72 65 65  target PK b-tree
11cf0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d   */.      if( p-
11d00 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
11d10 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20  {.        p->rc 
11d20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64  = prepareFreeAnd
11d30 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e  CollectError(p->
11d40 64 62 4d 61 69 6e 2c 20 26 70 49 74 65 72 2d 3e  dbMain, &pIter->
11d50 70 49 6e 73 65 72 74 2c 20 70 7a 2c 0a 20 20 20  pInsert, pz,.   
11d60 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11d70 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
11d80 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20          "INSERT 
11d90 49 4e 54 4f 20 5c 22 25 73 25 77 5c 22 28 25 73  INTO \"%s%w\"(%s
11da0 25 73 29 20 56 41 4c 55 45 53 28 25 73 29 22 2c  %s) VALUES(%s)",
11db0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
11dc0 7a 57 72 69 74 65 2c 20 7a 54 62 6c 2c 20 7a 43  zWrite, zTbl, zC
11dd0 6f 6c 6c 69 73 74 2c 20 28 62 52 62 75 52 6f 77  ollist, (bRbuRow
11de0 69 64 20 3f 20 22 2c 20 5f 72 6f 77 69 64 5f 22  id ? ", _rowid_"
11df0 20 3a 20 22 22 29 2c 20 7a 42 69 6e 64 69 6e 67   : ""), zBinding
11e00 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 0a  s.            ).
11e10 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
11e20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65   }..      /* Cre
11e30 61 74 65 20 74 68 65 20 44 45 4c 45 54 45 20 73  ate the DELETE s
11e40 74 61 74 65 6d 65 6e 74 20 74 6f 20 77 72 69 74  tatement to writ
11e50 65 20 74 6f 20 74 68 65 20 74 61 72 67 65 74 20  e to the target 
11e60 50 4b 20 62 2d 74 72 65 65 2e 0a 20 20 20 20 20  PK b-tree..     
11e70 20 2a 2a 20 42 65 63 61 75 73 65 20 69 74 20 6f   ** Because it o
11e80 6e 6c 79 20 70 65 72 66 6f 72 6d 73 20 49 4e 53  nly performs INS
11e90 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 73 2c 20  ERT operations, 
11ea0 74 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75  this is not requ
11eb0 69 72 65 64 20 66 6f 72 0a 20 20 20 20 20 20 2a  ired for.      *
11ec0 2a 20 61 6e 20 72 62 75 20 76 61 63 75 75 6d 20  * an rbu vacuum 
11ed0 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 20 20  handle.  */.    
11ee0 20 20 69 66 28 20 72 62 75 49 73 56 61 63 75 75    if( rbuIsVacuu
11ef0 6d 28 70 29 3d 3d 30 20 26 26 20 70 2d 3e 72 63  m(p)==0 && p->rc
11f00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
11f10 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70         p->rc = p
11f20 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c  repareFreeAndCol
11f30 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d  lectError(p->dbM
11f40 61 69 6e 2c 20 26 70 49 74 65 72 2d 3e 70 44 65  ain, &pIter->pDe
11f50 6c 65 74 65 2c 20 70 7a 2c 0a 20 20 20 20 20 20  lete, pz,.      
11f60 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70        sqlite3_mp
11f70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
11f80 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
11f90 4d 20 5c 22 25 73 25 77 5c 22 20 57 48 45 52 45  M \"%s%w\" WHERE
11fa0 20 25 73 22 2c 20 7a 57 72 69 74 65 2c 20 7a 54   %s", zWrite, zT
11fb0 62 6c 2c 20 7a 57 68 65 72 65 0a 20 20 20 20 20  bl, zWhere.     
11fc0 20 20 20 20 20 20 20 29 0a 20 20 20 20 20 20 20         ).       
11fd0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   );.      }..   
11fe0 20 20 20 69 66 28 20 72 62 75 49 73 56 61 63 75     if( rbuIsVacu
11ff0 75 6d 28 70 29 3d 3d 30 20 26 26 20 70 49 74 65  um(p)==0 && pIte
12000 72 2d 3e 61 62 49 6e 64 65 78 65 64 20 29 7b 0a  r->abIndexed ){.
12010 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
12020 61 72 20 2a 7a 52 62 75 52 6f 77 69 64 20 3d 20  ar *zRbuRowid = 
12030 22 22 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  "";.        if( 
12040 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
12050 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 7c 7c  U_PK_EXTERNAL ||
12060 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52   pIter->eType==R
12070 42 55 5f 50 4b 5f 4e 4f 4e 45 20 29 7b 0a 20 20  BU_PK_NONE ){.  
12080 20 20 20 20 20 20 20 20 7a 52 62 75 52 6f 77 69          zRbuRowi
12090 64 20 3d 20 22 2c 20 72 62 75 5f 72 6f 77 69 64  d = ", rbu_rowid
120a0 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  ";.        }..  
120b0 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20        /* Create 
120c0 74 68 65 20 72 62 75 5f 74 6d 70 5f 78 78 78 20  the rbu_tmp_xxx 
120d0 74 61 62 6c 65 20 61 6e 64 20 74 68 65 20 74 72  table and the tr
120e0 69 67 67 65 72 73 20 74 6f 20 70 6f 70 75 6c 61  iggers to popula
120f0 74 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20  te it. */.      
12100 20 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63    rbuMPrintfExec
12110 28 70 2c 20 70 2d 3e 64 62 52 62 75 2c 0a 20 20  (p, p->dbRbu,.  
12120 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54            "CREAT
12130 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45  E TABLE IF NOT E
12140 58 49 53 54 53 20 25 73 2e 27 72 62 75 5f 74 6d  XISTS %s.'rbu_tm
12150 70 5f 25 71 27 20 41 53 20 22 0a 20 20 20 20 20  p_%q' AS ".     
12160 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 2a         "SELECT *
12170 25 73 20 46 52 4f 4d 20 27 25 71 27 20 57 48 45  %s FROM '%q' WHE
12180 52 45 20 30 3b 22 0a 20 20 20 20 20 20 20 20 20  RE 0;".         
12190 20 20 20 2c 20 70 2d 3e 7a 53 74 61 74 65 44 62     , p->zStateDb
121a0 2c 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62  , pIter->zDataTb
121b0 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 2c 20  l.            , 
121c0 28 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52  (pIter->eType==R
121d0 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 3f  BU_PK_EXTERNAL ?
121e0 20 22 2c 20 30 20 41 53 20 72 62 75 5f 72 6f 77   ", 0 AS rbu_row
121f0 69 64 22 20 3a 20 22 22 29 0a 20 20 20 20 20 20  id" : "").      
12200 20 20 20 20 20 20 2c 20 70 49 74 65 72 2d 3e 7a        , pIter->z
12210 44 61 74 61 54 62 6c 0a 20 20 20 20 20 20 20 20  DataTbl.        
12220 29 3b 0a 0a 20 20 20 20 20 20 20 20 72 62 75 4d  );..        rbuM
12230 50 72 69 6e 74 66 45 78 65 63 28 70 2c 20 70 2d  PrintfExec(p, p-
12240 3e 64 62 4d 61 69 6e 2c 0a 20 20 20 20 20 20 20  >dbMain,.       
12250 20 20 20 20 20 22 43 52 45 41 54 45 20 54 45 4d       "CREATE TEM
12260 50 20 54 52 49 47 47 45 52 20 72 62 75 5f 64 65  P TRIGGER rbu_de
12270 6c 65 74 65 5f 74 72 20 42 45 46 4f 52 45 20 44  lete_tr BEFORE D
12280 45 4c 45 54 45 20 4f 4e 20 5c 22 25 73 25 77 5c  ELETE ON \"%s%w\
12290 22 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  " ".            
122a0 22 42 45 47 49 4e 20 22 0a 20 20 20 20 20 20 20  "BEGIN ".       
122b0 20 20 20 20 20 22 20 20 53 45 4c 45 43 54 20 72       "  SELECT r
122c0 62 75 5f 74 6d 70 5f 69 6e 73 65 72 74 28 33 2c  bu_tmp_insert(3,
122d0 20 25 73 29 3b 22 0a 20 20 20 20 20 20 20 20 20   %s);".         
122e0 20 20 20 22 45 4e 44 3b 22 0a 0a 20 20 20 20 20     "END;"..     
122f0 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54         "CREATE T
12300 45 4d 50 20 54 52 49 47 47 45 52 20 72 62 75 5f  EMP TRIGGER rbu_
12310 75 70 64 61 74 65 31 5f 74 72 20 42 45 46 4f 52  update1_tr BEFOR
12320 45 20 55 50 44 41 54 45 20 4f 4e 20 5c 22 25 73  E UPDATE ON \"%s
12330 25 77 5c 22 20 22 0a 20 20 20 20 20 20 20 20 20  %w\" ".         
12340 20 20 20 22 42 45 47 49 4e 20 22 0a 20 20 20 20     "BEGIN ".    
12350 20 20 20 20 20 20 20 20 22 20 20 53 45 4c 45 43          "  SELEC
12360 54 20 72 62 75 5f 74 6d 70 5f 69 6e 73 65 72 74  T rbu_tmp_insert
12370 28 33 2c 20 25 73 29 3b 22 0a 20 20 20 20 20 20  (3, %s);".      
12380 20 20 20 20 20 20 22 45 4e 44 3b 22 0a 0a 20 20        "END;"..  
12390 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54            "CREAT
123a0 45 20 54 45 4d 50 20 54 52 49 47 47 45 52 20 72  E TEMP TRIGGER r
123b0 62 75 5f 75 70 64 61 74 65 32 5f 74 72 20 41 46  bu_update2_tr AF
123c0 54 45 52 20 55 50 44 41 54 45 20 4f 4e 20 5c 22  TER UPDATE ON \"
123d0 25 73 25 77 5c 22 20 22 0a 20 20 20 20 20 20 20  %s%w\" ".       
123e0 20 20 20 20 20 22 42 45 47 49 4e 20 22 0a 20 20       "BEGIN ".  
123f0 20 20 20 20 20 20 20 20 20 20 22 20 20 53 45 4c            "  SEL
12400 45 43 54 20 72 62 75 5f 74 6d 70 5f 69 6e 73 65  ECT rbu_tmp_inse
12410 72 74 28 34 2c 20 25 73 29 3b 22 0a 20 20 20 20  rt(4, %s);".    
12420 20 20 20 20 20 20 20 20 22 45 4e 44 3b 22 2c 0a          "END;",.
12430 20 20 20 20 20 20 20 20 20 20 20 20 7a 57 72 69              zWri
12440 74 65 2c 20 7a 54 62 6c 2c 20 7a 4f 6c 64 6c 69  te, zTbl, zOldli
12450 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
12460 7a 57 72 69 74 65 2c 20 7a 54 62 6c 2c 20 7a 4f  zWrite, zTbl, zO
12470 6c 64 6c 69 73 74 2c 0a 20 20 20 20 20 20 20 20  ldlist,.        
12480 20 20 20 20 7a 57 72 69 74 65 2c 20 7a 54 62 6c      zWrite, zTbl
12490 2c 20 7a 4e 65 77 6c 69 73 74 0a 20 20 20 20 20  , zNewlist.     
124a0 20 20 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 69     );..        i
124b0 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  f( pIter->eType=
124c0 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c  =RBU_PK_EXTERNAL
124d0 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65   || pIter->eType
124e0 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 29 7b  ==RBU_PK_NONE ){
124f0 0a 20 20 20 20 20 20 20 20 20 20 72 62 75 4d 50  .          rbuMP
12500 72 69 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e  rintfExec(p, p->
12510 64 62 4d 61 69 6e 2c 0a 20 20 20 20 20 20 20 20  dbMain,.        
12520 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54 45        "CREATE TE
12530 4d 50 20 54 52 49 47 47 45 52 20 72 62 75 5f 69  MP TRIGGER rbu_i
12540 6e 73 65 72 74 5f 74 72 20 41 46 54 45 52 20 49  nsert_tr AFTER I
12550 4e 53 45 52 54 20 4f 4e 20 5c 22 25 73 25 77 5c  NSERT ON \"%s%w\
12560 22 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  " ".            
12570 20 20 22 42 45 47 49 4e 20 22 0a 20 20 20 20 20    "BEGIN ".     
12580 20 20 20 20 20 20 20 20 20 22 20 20 53 45 4c 45           "  SELE
12590 43 54 20 72 62 75 5f 74 6d 70 5f 69 6e 73 65 72  CT rbu_tmp_inser
125a0 74 28 30 2c 20 25 73 29 3b 22 0a 20 20 20 20 20  t(0, %s);".     
125b0 20 20 20 20 20 20 20 20 20 22 45 4e 44 3b 22 2c           "END;",
125c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  .              z
125d0 57 72 69 74 65 2c 20 7a 54 62 6c 2c 20 7a 4e 65  Write, zTbl, zNe
125e0 77 6c 69 73 74 0a 20 20 20 20 20 20 20 20 20 20  wlist.          
125f0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
12600 20 20 20 20 20 20 72 62 75 4f 62 6a 49 74 65 72        rbuObjIter
12610 50 72 65 70 61 72 65 54 6d 70 49 6e 73 65 72 74  PrepareTmpInsert
12620 28 70 2c 20 70 49 74 65 72 2c 20 7a 43 6f 6c 6c  (p, pIter, zColl
12630 69 73 74 2c 20 7a 52 62 75 52 6f 77 69 64 29 3b  ist, zRbuRowid);
12640 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
12650 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 53 45  /* Create the SE
12660 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
12670 6f 20 72 65 61 64 20 6b 65 79 73 20 66 72 6f 6d  o read keys from
12680 20 64 61 74 61 5f 78 78 78 20 2a 2f 0a 20 20 20   data_xxx */.   
12690 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
126a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
126b0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
126c0 52 62 75 52 6f 77 69 64 20 3d 20 22 22 3b 0a 20  RbuRowid = "";. 
126d0 20 20 20 20 20 20 20 69 66 28 20 62 52 62 75 52         if( bRbuR
126e0 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  owid ){.        
126f0 20 20 7a 52 62 75 52 6f 77 69 64 20 3d 20 72 62    zRbuRowid = rb
12700 75 49 73 56 61 63 75 75 6d 28 70 29 20 3f 20 22  uIsVacuum(p) ? "
12710 2c 5f 72 6f 77 69 64 5f 20 22 20 3a 20 22 2c 72  ,_rowid_ " : ",r
12720 62 75 5f 72 6f 77 69 64 22 3b 0a 20 20 20 20 20  bu_rowid";.     
12730 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e     }.        p->
12740 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65  rc = prepareFree
12750 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
12760 70 2d 3e 64 62 52 62 75 2c 20 26 70 49 74 65 72  p->dbRbu, &pIter
12770 2d 3e 70 53 65 6c 65 63 74 2c 20 70 7a 2c 0a 20  ->pSelect, pz,. 
12780 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
12790 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
127a0 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
127b0 54 20 25 73 2c 25 73 20 72 62 75 5f 63 6f 6e 74  T %s,%s rbu_cont
127c0 72 6f 6c 25 73 20 46 52 4f 4d 20 27 25 71 27 25  rol%s FROM '%q'%
127d0 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  s", .           
127e0 20 20 20 7a 43 6f 6c 6c 69 73 74 2c 20 0a 20 20     zCollist, .  
127f0 20 20 20 20 20 20 20 20 20 20 20 20 28 72 62 75              (rbu
12800 49 73 56 61 63 75 75 6d 28 70 29 20 3f 20 22 30  IsVacuum(p) ? "0
12810 20 41 53 20 22 20 3a 20 22 22 29 2c 0a 20 20 20   AS " : ""),.   
12820 20 20 20 20 20 20 20 20 20 20 20 7a 52 62 75 52             zRbuR
12830 6f 77 69 64 2c 0a 20 20 20 20 20 20 20 20 20 20  owid,.          
12840 20 20 20 20 70 49 74 65 72 2d 3e 7a 44 61 74 61      pIter->zData
12850 54 62 6c 2c 20 7a 4c 69 6d 69 74 0a 20 20 20 20  Tbl, zLimit.    
12860 20 20 20 20 20 20 20 20 29 0a 20 20 20 20 20 20          ).      
12870 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20    );.      }..  
12880 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
12890 28 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20  (zWhere);.      
128a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 6c  sqlite3_free(zOl
128b0 64 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 73 71  dlist);.      sq
128c0 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 65 77 6c  lite3_free(zNewl
128d0 69 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ist);.      sqli
128e0 74 65 33 5f 66 72 65 65 28 7a 42 69 6e 64 69 6e  te3_free(zBindin
128f0 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  gs);.    }.    s
12900 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6c  qlite3_free(zCol
12910 6c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  list);.    sqlit
12920 65 33 5f 66 72 65 65 28 7a 4c 69 6d 69 74 29 3b  e3_free(zLimit);
12930 0a 20 20 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e  .  }.  .  return
12940 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   p->rc;.}../*.**
12950 20 53 65 74 20 6f 75 74 70 75 74 20 76 61 72 69   Set output vari
12960 61 62 6c 65 20 2a 70 70 53 74 6d 74 20 74 6f 20  able *ppStmt to 
12970 70 6f 69 6e 74 20 74 6f 20 61 6e 20 55 50 44 41  point to an UPDA
12980 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  TE statement tha
12990 74 20 6d 61 79 0a 2a 2a 20 62 65 20 75 73 65 64  t may.** be used
129a0 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 69   to update the i
129b0 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20 66 6f  mposter table fo
129c0 72 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65  r the main table
129d0 20 62 2d 74 72 65 65 20 6f 66 20 74 68 65 0a 2a   b-tree of the.*
129e0 2a 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 74  * table object t
129f0 68 61 74 20 70 49 74 65 72 20 63 75 72 72 65 6e  hat pIter curren
12a00 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2c 20 61  tly points to, a
12a10 73 73 75 6d 69 6e 67 20 74 68 61 74 20 74 68 65  ssuming that the
12a20 20 0a 2a 2a 20 72 62 75 5f 63 6f 6e 74 72 6f 6c   .** rbu_control
12a30 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 64   column of the d
12a40 61 74 61 5f 78 79 7a 20 74 61 62 6c 65 20 63 6f  ata_xyz table co
12a50 6e 74 61 69 6e 73 20 7a 4d 61 73 6b 2e 0a 2a 2a  ntains zMask..**
12a60 20 0a 2a 2a 20 49 66 20 74 68 65 20 7a 4d 61 73   .** If the zMas
12a70 6b 20 73 74 72 69 6e 67 20 64 6f 65 73 20 6e 6f  k string does no
12a80 74 20 73 70 65 63 69 66 79 20 61 6e 79 20 63 6f  t specify any co
12a90 6c 75 6d 6e 73 20 74 6f 20 75 70 64 61 74 65 2c  lumns to update,
12aa0 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 69 73   then this.** is
12ab0 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 2e 20 4f   not an error. O
12ac0 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a  utput variable *
12ad0 70 70 53 74 6d 74 20 69 73 20 73 65 74 20 74 6f  ppStmt is set to
12ae0 20 4e 55 4c 4c 20 69 6e 20 74 68 69 73 20 63 61   NULL in this ca
12af0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
12b00 74 20 72 62 75 47 65 74 55 70 64 61 74 65 53 74  t rbuGetUpdateSt
12b10 6d 74 28 0a 20 20 73 71 6c 69 74 65 33 72 62 75  mt(.  sqlite3rbu
12b20 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
12b30 20 20 20 20 20 20 2f 2a 20 52 42 55 20 68 61 6e        /* RBU han
12b40 64 6c 65 20 2a 2f 0a 20 20 52 62 75 4f 62 6a 49  dle */.  RbuObjI
12b50 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20  ter *pIter,     
12b60 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65           /* Obje
12b70 63 74 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20  ct iterator */. 
12b80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
12b90 73 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  sk,             
12ba0 20 2f 2a 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20   /* rbu_control 
12bb0 76 61 6c 75 65 20 28 27 78 2e 78 2e 27 29 20 2a  value ('x.x.') *
12bc0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
12bd0 20 2a 2a 70 70 53 74 6d 74 20 20 20 20 20 20 20   **ppStmt       
12be0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 55 50 44 41      /* OUT: UPDA
12bf0 54 45 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e  TE statement han
12c00 64 6c 65 20 2a 2f 0a 29 7b 0a 20 20 52 62 75 55  dle */.){.  RbuU
12c10 70 64 61 74 65 53 74 6d 74 20 2a 2a 70 70 3b 0a  pdateStmt **pp;.
12c20 20 20 52 62 75 55 70 64 61 74 65 53 74 6d 74 20    RbuUpdateStmt 
12c30 2a 70 55 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20  *pUp = 0;.  int 
12c40 6e 55 70 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49  nUp = 0;..  /* I
12c50 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20  n case an error 
12c60 6f 63 63 75 72 73 20 2a 2f 0a 20 20 2a 70 70 53  occurs */.  *ppS
12c70 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53  tmt = 0;..  /* S
12c80 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69  earch for an exi
12c90 73 74 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 2e  sting statement.
12ca0 20 49 66 20 6f 6e 65 20 69 73 20 66 6f 75 6e 64   If one is found
12cb0 2c 20 73 68 69 66 74 20 69 74 20 74 6f 20 74 68  , shift it to th
12cc0 65 20 66 72 6f 6e 74 0a 20 20 2a 2a 20 6f 66 20  e front.  ** of 
12cd0 74 68 65 20 4c 52 55 20 71 75 65 75 65 20 61 6e  the LRU queue an
12ce0 64 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61  d return immedia
12cf0 74 65 6c 79 2e 20 4f 74 68 65 72 77 69 73 65 2c  tely. Otherwise,
12d00 20 6c 65 61 76 65 20 6e 55 70 20 70 6f 69 6e 74   leave nUp point
12d10 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ing.  ** to the 
12d20 6e 75 6d 62 65 72 20 6f 66 20 73 74 61 74 65 6d  number of statem
12d30 65 6e 74 73 20 63 75 72 72 65 6e 74 6c 79 20 69  ents currently i
12d40 6e 20 74 68 65 20 63 61 63 68 65 20 61 6e 64 20  n the cache and 
12d50 70 55 70 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  pUp to the.  ** 
12d60 6c 61 73 74 20 6f 62 6a 65 63 74 20 69 6e 20 74  last object in t
12d70 68 65 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 66  he list.  */.  f
12d80 6f 72 28 70 70 3d 26 70 49 74 65 72 2d 3e 70 52  or(pp=&pIter->pR
12d90 62 75 55 70 64 61 74 65 3b 20 2a 70 70 3b 20 70  buUpdate; *pp; p
12da0 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74  p=&((*pp)->pNext
12db0 29 29 7b 0a 20 20 20 20 70 55 70 20 3d 20 2a 70  )){.    pUp = *p
12dc0 70 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  p;.    if( strcm
12dd0 70 28 70 55 70 2d 3e 7a 4d 61 73 6b 2c 20 7a 4d  p(pUp->zMask, zM
12de0 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
12df0 20 2a 70 70 20 3d 20 70 55 70 2d 3e 70 4e 65 78   *pp = pUp->pNex
12e00 74 3b 0a 20 20 20 20 20 20 70 55 70 2d 3e 70 4e  t;.      pUp->pN
12e10 65 78 74 20 3d 20 70 49 74 65 72 2d 3e 70 52 62  ext = pIter->pRb
12e20 75 55 70 64 61 74 65 3b 0a 20 20 20 20 20 20 70  uUpdate;.      p
12e30 49 74 65 72 2d 3e 70 52 62 75 55 70 64 61 74 65  Iter->pRbuUpdate
12e40 20 3d 20 70 55 70 3b 0a 20 20 20 20 20 20 2a 70   = pUp;.      *p
12e50 70 53 74 6d 74 20 3d 20 70 55 70 2d 3e 70 55 70  pStmt = pUp->pUp
12e60 64 61 74 65 3b 20 0a 20 20 20 20 20 20 72 65 74  date; .      ret
12e70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
12e80 20 20 20 7d 0a 20 20 20 20 6e 55 70 2b 2b 3b 0a     }.    nUp++;.
12e90 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 55    }.  assert( pU
12ea0 70 3d 3d 30 20 7c 7c 20 70 55 70 2d 3e 70 4e 65  p==0 || pUp->pNe
12eb0 78 74 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  xt==0 );..  if( 
12ec0 6e 55 70 3e 3d 53 51 4c 49 54 45 5f 52 42 55 5f  nUp>=SQLITE_RBU_
12ed0 55 50 44 41 54 45 5f 43 41 43 48 45 53 49 5a 45  UPDATE_CACHESIZE
12ee0 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 70 3d 26   ){.    for(pp=&
12ef0 70 49 74 65 72 2d 3e 70 52 62 75 55 70 64 61 74  pIter->pRbuUpdat
12f00 65 3b 20 2a 70 70 21 3d 70 55 70 3b 20 70 70 3d  e; *pp!=pUp; pp=
12f10 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29  &((*pp)->pNext))
12f20 3b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20  ;.    *pp = 0;. 
12f30 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
12f40 69 7a 65 28 70 55 70 2d 3e 70 55 70 64 61 74 65  ize(pUp->pUpdate
12f50 29 3b 0a 20 20 20 20 70 55 70 2d 3e 70 55 70 64  );.    pUp->pUpd
12f60 61 74 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ate = 0;.  }else
12f70 7b 0a 20 20 20 20 70 55 70 20 3d 20 28 52 62 75  {.    pUp = (Rbu
12f80 55 70 64 61 74 65 53 74 6d 74 2a 29 72 62 75 4d  UpdateStmt*)rbuM
12f90 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28  alloc(p, sizeof(
12fa0 52 62 75 55 70 64 61 74 65 53 74 6d 74 29 2b 70  RbuUpdateStmt)+p
12fb0 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 2b 31 29  Iter->nTblCol+1)
12fc0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 55 70  ;.  }..  if( pUp
12fd0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 57   ){.    char *zW
12fe0 68 65 72 65 20 3d 20 72 62 75 4f 62 6a 49 74 65  here = rbuObjIte
12ff0 72 47 65 74 57 68 65 72 65 28 70 2c 20 70 49 74  rGetWhere(p, pIt
13000 65 72 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  er);.    char *z
13010 53 65 74 20 3d 20 72 62 75 4f 62 6a 49 74 65 72  Set = rbuObjIter
13020 47 65 74 53 65 74 6c 69 73 74 28 70 2c 20 70 49  GetSetlist(p, pI
13030 74 65 72 2c 20 7a 4d 61 73 6b 29 3b 0a 20 20 20  ter, zMask);.   
13040 20 63 68 61 72 20 2a 7a 55 70 64 61 74 65 20 3d   char *zUpdate =
13050 20 30 3b 0a 0a 20 20 20 20 70 55 70 2d 3e 7a 4d   0;..    pUp->zM
13060 61 73 6b 20 3d 20 28 63 68 61 72 2a 29 26 70 55  ask = (char*)&pU
13070 70 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  p[1];.    memcpy
13080 28 70 55 70 2d 3e 7a 4d 61 73 6b 2c 20 7a 4d 61  (pUp->zMask, zMa
13090 73 6b 2c 20 70 49 74 65 72 2d 3e 6e 54 62 6c 43  sk, pIter->nTblC
130a0 6f 6c 29 3b 0a 20 20 20 20 70 55 70 2d 3e 70 4e  ol);.    pUp->pN
130b0 65 78 74 20 3d 20 70 49 74 65 72 2d 3e 70 52 62  ext = pIter->pRb
130c0 75 55 70 64 61 74 65 3b 0a 20 20 20 20 70 49 74  uUpdate;.    pIt
130d0 65 72 2d 3e 70 52 62 75 55 70 64 61 74 65 20 3d  er->pRbuUpdate =
130e0 20 70 55 70 3b 0a 0a 20 20 20 20 69 66 28 20 7a   pUp;..    if( z
130f0 53 65 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  Set ){.      con
13100 73 74 20 63 68 61 72 20 2a 7a 50 72 65 66 69 78  st char *zPrefix
13110 20 3d 20 22 22 3b 0a 0a 20 20 20 20 20 20 69 66   = "";..      if
13120 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65 21 3d  ( pIter->eType!=
13130 52 42 55 5f 50 4b 5f 56 54 41 42 20 29 20 7a 50  RBU_PK_VTAB ) zP
13140 72 65 66 69 78 20 3d 20 22 72 62 75 5f 69 6d 70  refix = "rbu_imp
13150 5f 22 3b 0a 20 20 20 20 20 20 7a 55 70 64 61 74  _";.      zUpdat
13160 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e = sqlite3_mpri
13170 6e 74 66 28 22 55 50 44 41 54 45 20 5c 22 25 73  ntf("UPDATE \"%s
13180 25 77 5c 22 20 53 45 54 20 25 73 20 57 48 45 52  %w\" SET %s WHER
13190 45 20 25 73 22 2c 20 0a 20 20 20 20 20 20 20 20  E %s", .        
131a0 20 20 7a 50 72 65 66 69 78 2c 20 70 49 74 65 72    zPrefix, pIter
131b0 2d 3e 7a 54 62 6c 2c 20 7a 53 65 74 2c 20 7a 57  ->zTbl, zSet, zW
131c0 68 65 72 65 0a 20 20 20 20 20 20 29 3b 0a 20 20  here.      );.  
131d0 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70      p->rc = prep
131e0 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63  areFreeAndCollec
131f0 74 45 72 72 6f 72 28 0a 20 20 20 20 20 20 20 20  tError(.        
13200 20 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 55    p->dbMain, &pU
13210 70 2d 3e 70 55 70 64 61 74 65 2c 20 26 70 2d 3e  p->pUpdate, &p->
13220 7a 45 72 72 6d 73 67 2c 20 7a 55 70 64 61 74 65  zErrmsg, zUpdate
13230 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
13240 2a 70 70 53 74 6d 74 20 3d 20 70 55 70 2d 3e 70  *ppStmt = pUp->p
13250 55 70 64 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20  Update;.    }.  
13260 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
13270 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69  Where);.    sqli
13280 74 65 33 5f 66 72 65 65 28 7a 53 65 74 29 3b 0a  te3_free(zSet);.
13290 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 2d    }..  return p-
132a0 3e 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73  >rc;.}..static s
132b0 71 6c 69 74 65 33 20 2a 72 62 75 4f 70 65 6e 44  qlite3 *rbuOpenD
132c0 62 68 61 6e 64 6c 65 28 0a 20 20 73 71 6c 69 74  bhandle(.  sqlit
132d0 65 33 72 62 75 20 2a 70 2c 20 0a 20 20 63 6f 6e  e3rbu *p, .  con
132e0 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
132f0 0a 20 20 69 6e 74 20 62 55 73 65 56 66 73 0a 29  .  int bUseVfs.)
13300 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
13310 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  = 0;.  if( p->rc
13320 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
13330 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61     const int fla
13340 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs = SQLITE_OPEN
13350 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
13360 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 53 51  E_OPEN_CREATE|SQ
13370 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20  LITE_OPEN_URI;. 
13380 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
13390 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 4e 61 6d 65  e3_open_v2(zName
133a0 2c 20 26 64 62 2c 20 66 6c 61 67 73 2c 20 62 55  , &db, flags, bU
133b0 73 65 56 66 73 20 3f 20 70 2d 3e 7a 56 66 73 4e  seVfs ? p->zVfsN
133c0 61 6d 65 20 3a 20 30 29 3b 0a 20 20 20 20 69 66  ame : 0);.    if
133d0 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 20  ( p->rc ){.     
133e0 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71   p->zErrmsg = sq
133f0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
13400 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  s", sqlite3_errm
13410 73 67 28 64 62 29 29 3b 0a 20 20 20 20 20 20 73  sg(db));.      s
13420 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29  qlite3_close(db)
13430 3b 0a 20 20 20 20 20 20 64 62 20 3d 20 30 3b 0a  ;.      db = 0;.
13440 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
13450 72 6e 20 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn db;.}../*.** 
13460 46 72 65 65 20 61 6e 20 52 62 75 53 74 61 74 65  Free an RbuState
13470 20 6f 62 6a 65 63 74 20 61 6c 6c 6f 63 61 74 65   object allocate
13480 64 20 62 79 20 72 62 75 4c 6f 61 64 53 74 61 74  d by rbuLoadStat
13490 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  e()..*/.static v
134a0 6f 69 64 20 72 62 75 46 72 65 65 53 74 61 74 65  oid rbuFreeState
134b0 28 52 62 75 53 74 61 74 65 20 2a 70 29 7b 0a 20  (RbuState *p){. 
134c0 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71   if( p ){.    sq
134d0 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 54  lite3_free(p->zT
134e0 62 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  bl);.    sqlite3
134f0 5f 66 72 65 65 28 70 2d 3e 7a 44 61 74 61 54 62  _free(p->zDataTb
13500 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  l);.    sqlite3_
13510 66 72 65 65 28 70 2d 3e 7a 49 64 78 29 3b 0a 20  free(p->zIdx);. 
13520 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
13530 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
13540 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 52 62 75   Allocate an Rbu
13550 53 74 61 74 65 20 6f 62 6a 65 63 74 20 61 6e 64  State object and
13560 20 6c 6f 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   load the conten
13570 74 73 20 6f 66 20 74 68 65 20 72 62 75 5f 73 74  ts of the rbu_st
13580 61 74 65 20 0a 2a 2a 20 74 61 62 6c 65 20 69 6e  ate .** table in
13590 74 6f 20 69 74 2e 20 52 65 74 75 72 6e 20 61 20  to it. Return a 
135a0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e  pointer to the n
135b0 65 77 20 6f 62 6a 65 63 74 2e 20 49 74 20 69 73  ew object. It is
135c0 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73   the .** respons
135d0 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
135e0 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
135f0 6c 6c 79 20 66 72 65 65 20 74 68 65 20 6f 62 6a  lly free the obj
13600 65 63 74 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c  ect using.** sql
13610 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2a 0a  ite3_free()..**.
13620 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
13630 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20  ccurs, leave an 
13640 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 6d  error code and m
13650 65 73 73 61 67 65 20 69 6e 20 74 68 65 20 72 62  essage in the rb
13660 75 20 68 61 6e 64 6c 65 0a 2a 2a 20 61 6e 64 20  u handle.** and 
13670 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
13680 73 74 61 74 69 63 20 52 62 75 53 74 61 74 65 20  static RbuState 
13690 2a 72 62 75 4c 6f 61 64 53 74 61 74 65 28 73 71  *rbuLoadState(sq
136a0 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20  lite3rbu *p){.  
136b0 52 62 75 53 74 61 74 65 20 2a 70 52 65 74 20 3d  RbuState *pRet =
136c0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   0;.  sqlite3_st
136d0 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
136e0 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 72   int rc;.  int r
136f0 63 32 3b 0a 0a 20 20 70 52 65 74 20 3d 20 28 52  c2;..  pRet = (R
13700 62 75 53 74 61 74 65 2a 29 72 62 75 4d 61 6c 6c  buState*)rbuMall
13710 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 52 62 75  oc(p, sizeof(Rbu
13720 53 74 61 74 65 29 29 3b 0a 20 20 69 66 28 20 70  State));.  if( p
13730 52 65 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Ret==0 ) return 
13740 30 3b 0a 0a 20 20 72 63 20 3d 20 70 72 65 70 61  0;..  rc = prepa
13750 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74  reFreeAndCollect
13760 45 72 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20  Error(p->dbRbu, 
13770 26 70 53 74 6d 74 2c 20 26 70 2d 3e 7a 45 72 72  &pStmt, &p->zErr
13780 6d 73 67 2c 20 0a 20 20 20 20 20 20 73 71 6c 69  msg, .      sqli
13790 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c  te3_mprintf("SEL
137a0 45 43 54 20 6b 2c 20 76 20 46 52 4f 4d 20 25 73  ECT k, v FROM %s
137b0 2e 72 62 75 5f 73 74 61 74 65 22 2c 20 70 2d 3e  .rbu_state", p->
137c0 7a 53 74 61 74 65 44 62 29 0a 20 20 29 3b 0a 20  zStateDb).  );. 
137d0 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
137e0 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f  TE_OK && SQLITE_
137f0 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
13800 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20  p(pStmt) ){.    
13810 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f  switch( sqlite3_
13820 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
13830 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 63 61  , 0) ){.      ca
13840 73 65 20 52 42 55 5f 53 54 41 54 45 5f 53 54 41  se RBU_STATE_STA
13850 47 45 3a 0a 20 20 20 20 20 20 20 20 70 52 65 74  GE:.        pRet
13860 2d 3e 65 53 74 61 67 65 20 3d 20 73 71 6c 69 74  ->eStage = sqlit
13870 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
13880 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  tmt, 1);.       
13890 20 69 66 28 20 70 52 65 74 2d 3e 65 53 74 61 67   if( pRet->eStag
138a0 65 21 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c  e!=RBU_STAGE_OAL
138b0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 52 65  .         && pRe
138c0 74 2d 3e 65 53 74 61 67 65 21 3d 52 42 55 5f 53  t->eStage!=RBU_S
138d0 54 41 47 45 5f 4d 4f 56 45 0a 20 20 20 20 20 20  TAGE_MOVE.      
138e0 20 20 20 26 26 20 70 52 65 74 2d 3e 65 53 74 61     && pRet->eSta
138f0 67 65 21 3d 52 42 55 5f 53 54 41 47 45 5f 43 4b  ge!=RBU_STAGE_CK
13900 50 54 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  PT.        ){.  
13910 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
13920 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a  SQLITE_CORRUPT;.
13930 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13940 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
13950 63 61 73 65 20 52 42 55 5f 53 54 41 54 45 5f 54  case RBU_STATE_T
13960 42 4c 3a 0a 20 20 20 20 20 20 20 20 70 52 65 74  BL:.        pRet
13970 2d 3e 7a 54 62 6c 20 3d 20 72 62 75 53 74 72 6e  ->zTbl = rbuStrn
13980 64 75 70 28 28 63 68 61 72 2a 29 73 71 6c 69 74  dup((char*)sqlit
13990 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
139a0 53 74 6d 74 2c 20 31 29 2c 20 26 72 63 29 3b 0a  Stmt, 1), &rc);.
139b0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a          break;..
139c0 20 20 20 20 20 20 63 61 73 65 20 52 42 55 5f 53        case RBU_S
139d0 54 41 54 45 5f 49 44 58 3a 0a 20 20 20 20 20 20  TATE_IDX:.      
139e0 20 20 70 52 65 74 2d 3e 7a 49 64 78 20 3d 20 72    pRet->zIdx = r
139f0 62 75 53 74 72 6e 64 75 70 28 28 63 68 61 72 2a  buStrndup((char*
13a00 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
13a10 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29 2c 20  text(pStmt, 1), 
13a20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 62 72  &rc);.        br
13a30 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65  eak;..      case
13a40 20 52 42 55 5f 53 54 41 54 45 5f 52 4f 57 3a 0a   RBU_STATE_ROW:.
13a50 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 52          pRet->nR
13a60 6f 77 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ow = sqlite3_col
13a70 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31  umn_int(pStmt, 1
13a80 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
13a90 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 52 42  ;..      case RB
13aa0 55 5f 53 54 41 54 45 5f 50 52 4f 47 52 45 53 53  U_STATE_PROGRESS
13ab0 3a 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  :.        pRet->
13ac0 6e 50 72 6f 67 72 65 73 73 20 3d 20 73 71 6c 69  nProgress = sqli
13ad0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
13ae0 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20  (pStmt, 1);.    
13af0 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
13b00 20 20 63 61 73 65 20 52 42 55 5f 53 54 41 54 45    case RBU_STATE
13b10 5f 43 4b 50 54 3a 0a 20 20 20 20 20 20 20 20 70  _CKPT:.        p
13b20 52 65 74 2d 3e 69 57 61 6c 43 6b 73 75 6d 20 3d  Ret->iWalCksum =
13b30 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
13b40 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31 29 3b  int64(pStmt, 1);
13b50 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
13b60 0a 20 20 20 20 20 20 63 61 73 65 20 52 42 55 5f  .      case RBU_
13b70 53 54 41 54 45 5f 43 4f 4f 4b 49 45 3a 0a 20 20  STATE_COOKIE:.  
13b80 20 20 20 20 20 20 70 52 65 74 2d 3e 69 43 6f 6f        pRet->iCoo
13b90 6b 69 65 20 3d 20 28 75 33 32 29 73 71 6c 69 74  kie = (u32)sqlit
13ba0 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  e3_column_int64(
13bb0 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20  pStmt, 1);.     
13bc0 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20     break;..     
13bd0 20 63 61 73 65 20 52 42 55 5f 53 54 41 54 45 5f   case RBU_STATE_
13be0 4f 41 4c 53 5a 3a 0a 20 20 20 20 20 20 20 20 70  OALSZ:.        p
13bf0 52 65 74 2d 3e 69 4f 61 6c 53 7a 20 3d 20 28 75  Ret->iOalSz = (u
13c00 33 32 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  32)sqlite3_colum
13c10 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31  n_int64(pStmt, 1
13c20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
13c30 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 52 42  ;..      case RB
13c40 55 5f 53 54 41 54 45 5f 50 48 41 53 45 4f 4e 45  U_STATE_PHASEONE
13c50 53 54 45 50 3a 0a 20 20 20 20 20 20 20 20 70 52  STEP:.        pR
13c60 65 74 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65  et->nPhaseOneSte
13c70 70 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  p = sqlite3_colu
13c80 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  mn_int64(pStmt, 
13c90 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  1);.        brea
13ca0 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 52  k;..      case R
13cb0 42 55 5f 53 54 41 54 45 5f 44 41 54 41 54 42 4c  BU_STATE_DATATBL
13cc0 3a 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  :.        pRet->
13cd0 7a 44 61 74 61 54 62 6c 20 3d 20 72 62 75 53 74  zDataTbl = rbuSt
13ce0 72 6e 64 75 70 28 28 63 68 61 72 2a 29 73 71 6c  rndup((char*)sql
13cf0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
13d00 28 70 53 74 6d 74 2c 20 31 29 2c 20 26 72 63 29  (pStmt, 1), &rc)
13d10 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
13d20 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  ..      default:
13d30 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
13d40 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
13d50 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13d60 20 7d 0a 20 20 7d 0a 20 20 72 63 32 20 3d 20 73   }.  }.  rc2 = s
13d70 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
13d80 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 72 63  pStmt);.  if( rc
13d90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  ==SQLITE_OK ) rc
13da0 20 3d 20 72 63 32 3b 0a 0a 20 20 70 2d 3e 72 63   = rc2;..  p->rc
13db0 20 3d 20 72 63 3b 0a 20 20 72 65 74 75 72 6e 20   = rc;.  return 
13dc0 70 52 65 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  pRet;.}.../*.** 
13dd0 4f 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  Open the databas
13de0 65 20 68 61 6e 64 6c 65 20 61 6e 64 20 61 74 74  e handle and att
13df0 61 63 68 20 74 68 65 20 52 42 55 20 64 61 74 61  ach the RBU data
13e00 62 61 73 65 20 61 73 20 22 72 62 75 22 2e 20 49  base as "rbu". I
13e10 66 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63  f an.** error oc
13e20 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65  curs, leave an e
13e30 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 6d 65  rror code and me
13e40 73 73 61 67 65 20 69 6e 20 74 68 65 20 52 42 55  ssage in the RBU
13e50 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74   handle..*/.stat
13e60 69 63 20 76 6f 69 64 20 72 62 75 4f 70 65 6e 44  ic void rbuOpenD
13e70 61 74 61 62 61 73 65 28 73 71 6c 69 74 65 33 72  atabase(sqlite3r
13e80 62 75 20 2a 70 2c 20 69 6e 74 20 2a 70 62 52 65  bu *p, int *pbRe
13e90 74 72 79 29 7b 0a 20 20 61 73 73 65 72 74 28 20  try){.  assert( 
13ea0 70 2d 3e 72 63 20 7c 7c 20 28 70 2d 3e 64 62 4d  p->rc || (p->dbM
13eb0 61 69 6e 3d 3d 30 20 26 26 20 70 2d 3e 64 62 52  ain==0 && p->dbR
13ec0 62 75 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73 65  bu==0) );.  asse
13ed0 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20 72 62 75  rt( p->rc || rbu
13ee0 49 73 56 61 63 75 75 6d 28 70 29 20 7c 7c 20 70  IsVacuum(p) || p
13ef0 2d 3e 7a 54 61 72 67 65 74 21 3d 30 20 29 3b 0a  ->zTarget!=0 );.
13f00 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 52  .  /* Open the R
13f10 42 55 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  BU database */. 
13f20 20 70 2d 3e 64 62 52 62 75 20 3d 20 72 62 75 4f   p->dbRbu = rbuO
13f30 70 65 6e 44 62 68 61 6e 64 6c 65 28 70 2c 20 70  penDbhandle(p, p
13f40 2d 3e 7a 52 62 75 2c 20 31 29 3b 0a 0a 20 20 69  ->zRbu, 1);..  i
13f50 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
13f60 5f 4f 4b 20 26 26 20 72 62 75 49 73 56 61 63 75  _OK && rbuIsVacu
13f70 75 6d 28 70 29 20 29 7b 0a 20 20 20 20 73 71 6c  um(p) ){.    sql
13f80 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
13f90 6c 28 70 2d 3e 64 62 52 62 75 2c 20 22 6d 61 69  l(p->dbRbu, "mai
13fa0 6e 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  n", SQLITE_FCNTL
13fb0 5f 52 42 55 43 4e 54 2c 20 28 76 6f 69 64 2a 29  _RBUCNT, (void*)
13fc0 70 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a  p);.    if( p->z
13fd0 53 74 61 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  State==0 ){.    
13fe0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
13ff0 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 64 62  ile = sqlite3_db
14000 5f 66 69 6c 65 6e 61 6d 65 28 70 2d 3e 64 62 52  _filename(p->dbR
14010 62 75 2c 20 22 6d 61 69 6e 22 29 3b 0a 20 20 20  bu, "main");.   
14020 20 20 20 70 2d 3e 7a 53 74 61 74 65 20 3d 20 72     p->zState = r
14030 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 66 69  buMPrintf(p, "fi
14040 6c 65 3a 2f 2f 25 73 2d 76 61 63 75 75 6d 3f 6d  le://%s-vacuum?m
14050 6f 64 65 6f 66 3d 25 73 22 2c 20 7a 46 69 6c 65  odeof=%s", zFile
14060 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  , zFile);.    }.
14070 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 75 73 69    }..  /* If usi
14080 6e 67 20 73 65 70 61 72 61 74 65 20 52 42 55 20  ng separate RBU 
14090 61 6e 64 20 73 74 61 74 65 20 64 61 74 61 62 61  and state databa
140a0 73 65 73 2c 20 61 74 74 61 63 68 20 74 68 65 20  ses, attach the 
140b0 73 74 61 74 65 20 64 61 74 61 62 61 73 65 20 74  state database t
140c0 6f 0a 20 20 2a 2a 20 74 68 65 20 52 42 55 20 64  o.  ** the RBU d
140d0 62 20 68 61 6e 64 6c 65 20 6e 6f 77 2e 20 20 2a  b handle now.  *
140e0 2f 0a 20 20 69 66 28 20 70 2d 3e 7a 53 74 61 74  /.  if( p->zStat
140f0 65 20 29 7b 0a 20 20 20 20 72 62 75 4d 50 72 69  e ){.    rbuMPri
14100 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64 62  ntfExec(p, p->db
14110 52 62 75 2c 20 22 41 54 54 41 43 48 20 25 51 20  Rbu, "ATTACH %Q 
14120 41 53 20 73 74 61 74 22 2c 20 70 2d 3e 7a 53 74  AS stat", p->zSt
14130 61 74 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ate);.    memcpy
14140 28 70 2d 3e 7a 53 74 61 74 65 44 62 2c 20 22 73  (p->zStateDb, "s
14150 74 61 74 22 2c 20 34 29 3b 0a 20 20 7d 65 6c 73  tat", 4);.  }els
14160 65 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d  e{.    memcpy(p-
14170 3e 7a 53 74 61 74 65 44 62 2c 20 22 6d 61 69 6e  >zStateDb, "main
14180 22 2c 20 34 29 3b 0a 20 20 7d 0a 0a 23 69 66 20  ", 4);.  }..#if 
14190 30 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  0.  if( p->rc==S
141a0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 62 75 49  QLITE_OK && rbuI
141b0 73 56 61 63 75 75 6d 28 70 29 20 29 7b 0a 20 20  sVacuum(p) ){.  
141c0 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
141d0 33 5f 65 78 65 63 28 70 2d 3e 64 62 52 62 75 2c  3_exec(p->dbRbu,
141e0 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 2c 20   "BEGIN", 0, 0, 
141f0 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  0);.  }.#endif..
14200 20 20 2f 2a 20 49 66 20 69 74 20 68 61 73 20 6e    /* If it has n
14210 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ot already been 
14220 63 72 65 61 74 65 64 2c 20 63 72 65 61 74 65 20  created, create 
14230 74 68 65 20 72 62 75 5f 73 74 61 74 65 20 74 61  the rbu_state ta
14240 62 6c 65 20 2a 2f 0a 20 20 72 62 75 4d 50 72 69  ble */.  rbuMPri
14250 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64 62  ntfExec(p, p->db
14260 52 62 75 2c 20 52 42 55 5f 43 52 45 41 54 45 5f  Rbu, RBU_CREATE_
14270 53 54 41 54 45 2c 20 70 2d 3e 7a 53 74 61 74 65  STATE, p->zState
14280 44 62 29 3b 0a 0a 23 69 66 20 30 0a 20 20 69 66  Db);..#if 0.  if
14290 28 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 29  ( rbuIsVacuum(p)
142a0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72   ){.    if( p->r
142b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
142c0 20 20 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20        int rc2;. 
142d0 20 20 20 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30       int bOk = 0
142e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
142f0 73 74 6d 74 20 2a 70 43 6e 74 20 3d 20 30 3b 0a  stmt *pCnt = 0;.
14300 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72        p->rc = pr
14310 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45  epareAndCollectE
14320 72 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20 26  rror(p->dbRbu, &
14330 70 43 6e 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73  pCnt, &p->zErrms
14340 67 2c 0a 20 20 20 20 20 20 20 20 20 20 22 53 45  g,.          "SE
14350 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
14360 4f 4d 20 73 74 61 74 2e 73 71 6c 69 74 65 5f 6d  OM stat.sqlite_m
14370 61 73 74 65 72 22 0a 20 20 20 20 20 20 29 3b 0a  aster".      );.
14380 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
14390 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 20  =SQLITE_OK .    
143a0 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74     && sqlite3_st
143b0 65 70 28 70 43 6e 74 29 3d 3d 53 51 4c 49 54 45  ep(pCnt)==SQLITE
143c0 5f 52 4f 57 0a 20 20 20 20 20 20 20 26 26 20 31  _ROW.       && 1
143d0 3d 3d 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ==sqlite3_column
143e0 5f 69 6e 74 28 70 43 6e 74 2c 20 30 29 0a 20 20  _int(pCnt, 0).  
143f0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 62      ){.        b
14400 4f 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  Ok = 1;.      }.
14410 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69        rc2 = sqli
14420 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 43 6e  te3_finalize(pCn
14430 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  t);.      if( p-
14440 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
14450 20 70 2d 3e 72 63 20 3d 20 72 63 32 3b 0a 0a 20   p->rc = rc2;.. 
14460 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
14470 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b  SQLITE_OK && bOk
14480 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
14490 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  ->rc = SQLITE_ER
144a0 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ROR;.        p->
144b0 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65  zErrmsg = sqlite
144c0 33 5f 6d 70 72 69 6e 74 66 28 22 69 6e 76 61 6c  3_mprintf("inval
144d0 69 64 20 73 74 61 74 65 20 64 61 74 61 62 61 73  id state databas
144e0 65 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  e");.      }.   
144f0 20 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72   .      if( p->r
14500 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
14510 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
14520 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
14530 64 62 52 62 75 2c 20 22 43 4f 4d 4d 49 54 22 2c  dbRbu, "COMMIT",
14540 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
14550 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
14560 64 69 66 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63  dif..  if( p->rc
14570 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  ==SQLITE_OK && r
14580 62 75 49 73 56 61 63 75 75 6d 28 70 29 20 29 7b  buIsVacuum(p) ){
14590 0a 20 20 20 20 69 6e 74 20 62 4f 70 65 6e 20 3d  .    int bOpen =
145a0 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   0;.    int rc;.
145b0 20 20 20 20 70 2d 3e 6e 52 62 75 20 3d 20 30 3b      p->nRbu = 0;
145c0 0a 20 20 20 20 70 2d 3e 70 52 62 75 46 64 20 3d  .    p->pRbuFd =
145d0 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   0;.    rc = sql
145e0 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
145f0 6c 28 70 2d 3e 64 62 52 62 75 2c 20 22 6d 61 69  l(p->dbRbu, "mai
14600 6e 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  n", SQLITE_FCNTL
14610 5f 52 42 55 43 4e 54 2c 20 28 76 6f 69 64 2a 29  _RBUCNT, (void*)
14620 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  p);.    if( rc!=
14630 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
14640 29 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20  ) p->rc = rc;.  
14650 20 20 69 66 28 20 70 2d 3e 65 53 74 61 67 65 3e    if( p->eStage>
14660 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 20  =RBU_STAGE_MOVE 
14670 29 7b 0a 20 20 20 20 20 20 62 4f 70 65 6e 20 3d  ){.      bOpen =
14680 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
14690 20 20 20 20 20 52 62 75 53 74 61 74 65 20 2a 70       RbuState *p
146a0 53 74 61 74 65 20 3d 20 72 62 75 4c 6f 61 64 53  State = rbuLoadS
146b0 74 61 74 65 28 70 29 3b 0a 20 20 20 20 20 20 69  tate(p);.      i
146c0 66 28 20 70 53 74 61 74 65 20 29 7b 0a 20 20 20  f( pState ){.   
146d0 20 20 20 20 20 62 4f 70 65 6e 20 3d 20 28 70 53       bOpen = (pS
146e0 74 61 74 65 2d 3e 65 53 74 61 67 65 3e 3d 52 42  tate->eStage>=RB
146f0 55 5f 53 54 41 47 45 5f 4d 4f 56 45 29 3b 0a 20  U_STAGE_MOVE);. 
14700 20 20 20 20 20 20 20 72 62 75 46 72 65 65 53 74         rbuFreeSt
14710 61 74 65 28 70 53 74 61 74 65 29 3b 0a 20 20 20  ate(pState);.   
14720 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
14730 66 28 20 62 4f 70 65 6e 20 29 20 70 2d 3e 64 62  f( bOpen ) p->db
14740 4d 61 69 6e 20 3d 20 72 62 75 4f 70 65 6e 44 62  Main = rbuOpenDb
14750 68 61 6e 64 6c 65 28 70 2c 20 70 2d 3e 7a 52 62  handle(p, p->zRb
14760 75 2c 20 70 2d 3e 6e 52 62 75 3c 3d 31 29 3b 0a  u, p->nRbu<=1);.
14770 20 20 7d 0a 0a 20 20 70 2d 3e 65 53 74 61 67 65    }..  p->eStage
14780 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72   = 0;.  if( p->r
14790 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
147a0 70 2d 3e 64 62 4d 61 69 6e 3d 3d 30 20 29 7b 0a  p->dbMain==0 ){.
147b0 20 20 20 20 69 66 28 20 21 72 62 75 49 73 56 61      if( !rbuIsVa
147c0 63 75 75 6d 28 70 29 20 29 7b 0a 20 20 20 20 20  cuum(p) ){.     
147d0 20 70 2d 3e 64 62 4d 61 69 6e 20 3d 20 72 62 75   p->dbMain = rbu
147e0 4f 70 65 6e 44 62 68 61 6e 64 6c 65 28 70 2c 20  OpenDbhandle(p, 
147f0 70 2d 3e 7a 54 61 72 67 65 74 2c 20 31 29 3b 0a  p->zTarget, 1);.
14800 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
14810 3e 70 52 62 75 46 64 2d 3e 70 57 61 6c 46 64 20  >pRbuFd->pWalFd 
14820 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 62 52  ){.      if( pbR
14830 65 74 72 79 20 29 7b 0a 20 20 20 20 20 20 20 20  etry ){.        
14840 70 2d 3e 70 52 62 75 46 64 2d 3e 62 4e 6f 6c 6f  p->pRbuFd->bNolo
14850 63 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ck = 0;.        
14860 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d  sqlite3_close(p-
14870 3e 64 62 52 62 75 29 3b 0a 20 20 20 20 20 20 20  >dbRbu);.       
14880 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70   sqlite3_close(p
14890 2d 3e 64 62 4d 61 69 6e 29 3b 0a 20 20 20 20 20  ->dbMain);.     
148a0 20 20 20 70 2d 3e 64 62 4d 61 69 6e 20 3d 20 30     p->dbMain = 0
148b0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 64 62 52  ;.        p->dbR
148c0 62 75 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  bu = 0;.        
148d0 2a 70 62 52 65 74 72 79 20 3d 20 31 3b 0a 20 20  *pbRetry = 1;.  
148e0 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
148f0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 72      }.      p->r
14900 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
14910 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 6d  ;.      p->zErrm
14920 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
14930 69 6e 74 66 28 22 63 61 6e 6e 6f 74 20 76 61 63  intf("cannot vac
14940 75 75 6d 20 77 61 6c 20 6d 6f 64 65 20 64 61 74  uum wal mode dat
14950 61 62 61 73 65 22 29 3b 0a 20 20 20 20 7d 65 6c  abase");.    }el
14960 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  se{.      char *
14970 7a 54 61 72 67 65 74 3b 0a 20 20 20 20 20 20 63  zTarget;.      c
14980 68 61 72 20 2a 7a 45 78 74 72 61 20 3d 20 30 3b  har *zExtra = 0;
14990 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6c 65  .      if( strle
149a0 6e 28 70 2d 3e 7a 52 62 75 29 3e 3d 35 20 26 26  n(p->zRbu)>=5 &&
149b0 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 66 69 6c 65   0==memcmp("file
149c0 3a 22 2c 20 70 2d 3e 7a 52 62 75 2c 20 35 29 20  :", p->zRbu, 5) 
149d0 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 78 74 72  ){.        zExtr
149e0 61 20 3d 20 26 70 2d 3e 7a 52 62 75 5b 35 5d 3b  a = &p->zRbu[5];
149f0 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
14a00 2a 7a 45 78 74 72 61 20 29 7b 0a 20 20 20 20 20  *zExtra ){.     
14a10 20 20 20 20 20 69 66 28 20 2a 7a 45 78 74 72 61       if( *zExtra
14a20 2b 2b 3d 3d 27 3f 27 20 29 20 62 72 65 61 6b 3b  ++=='?' ) break;
14a30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14a40 20 20 20 69 66 28 20 2a 7a 45 78 74 72 61 3d 3d     if( *zExtra==
14a50 27 5c 30 27 20 29 20 7a 45 78 74 72 61 20 3d 20  '\0' ) zExtra = 
14a60 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  0;.      }..    
14a70 20 20 7a 54 61 72 67 65 74 20 3d 20 73 71 6c 69    zTarget = sqli
14a80 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 66 69 6c  te3_mprintf("fil
14a90 65 3a 25 73 2d 76 61 63 74 6d 70 3f 72 62 75 5f  e:%s-vactmp?rbu_
14aa0 6d 65 6d 6f 72 79 3d 31 25 73 25 73 22 2c 20 0a  memory=1%s%s", .
14ab0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14ac0 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28 70 2d  3_db_filename(p-
14ad0 3e 64 62 52 62 75 2c 20 22 6d 61 69 6e 22 29 2c  >dbRbu, "main"),
14ae0 0a 20 20 20 20 20 20 20 20 20 20 28 7a 45 78 74  .          (zExt
14af0 72 61 3d 3d 30 20 3f 20 22 22 20 3a 20 22 26 22  ra==0 ? "" : "&"
14b00 29 2c 20 28 7a 45 78 74 72 61 3d 3d 30 20 3f 20  ), (zExtra==0 ? 
14b10 22 22 20 3a 20 7a 45 78 74 72 61 29 0a 20 20 20  "" : zExtra).   
14b20 20 20 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28     );..      if(
14b30 20 7a 54 61 72 67 65 74 3d 3d 30 20 29 7b 0a 20   zTarget==0 ){. 
14b40 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53         p->rc = S
14b50 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
14b60 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
14b70 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 64 62     }.      p->db
14b80 4d 61 69 6e 20 3d 20 72 62 75 4f 70 65 6e 44 62  Main = rbuOpenDb
14b90 68 61 6e 64 6c 65 28 70 2c 20 7a 54 61 72 67 65  handle(p, zTarge
14ba0 74 2c 20 70 2d 3e 6e 52 62 75 3c 3d 31 29 3b 0a  t, p->nRbu<=1);.
14bb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
14bc0 65 65 28 7a 54 61 72 67 65 74 29 3b 0a 20 20 20  ee(zTarget);.   
14bd0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d   }.  }..  if( p-
14be0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
14bf0 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71  {.    p->rc = sq
14c00 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
14c10 63 74 69 6f 6e 28 70 2d 3e 64 62 4d 61 69 6e 2c  ction(p->dbMain,
14c20 20 0a 20 20 20 20 20 20 20 20 22 72 62 75 5f 74   .        "rbu_t
14c30 6d 70 5f 69 6e 73 65 72 74 22 2c 20 2d 31 2c 20  mp_insert", -1, 
14c40 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 28 76 6f  SQLITE_UTF8, (vo
14c50 69 64 2a 29 70 2c 20 72 62 75 54 6d 70 49 6e 73  id*)p, rbuTmpIns
14c60 65 72 74 46 75 6e 63 2c 20 30 2c 20 30 0a 20 20  ertFunc, 0, 0.  
14c70 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20    );.  }..  if( 
14c80 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
14c90 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
14ca0 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
14cb0 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 4d 61 69  unction(p->dbMai
14cc0 6e 2c 20 0a 20 20 20 20 20 20 20 20 22 72 62 75  n, .        "rbu
14cd0 5f 66 6f 73 73 69 6c 5f 64 65 6c 74 61 22 2c 20  _fossil_delta", 
14ce0 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  2, SQLITE_UTF8, 
14cf0 30 2c 20 72 62 75 46 6f 73 73 69 6c 44 65 6c 74  0, rbuFossilDelt
14d00 61 46 75 6e 63 2c 20 30 2c 20 30 0a 20 20 20 20  aFunc, 0, 0.    
14d10 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d  );.  }..  if( p-
14d20 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
14d30 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71  {.    p->rc = sq
14d40 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
14d50 63 74 69 6f 6e 28 70 2d 3e 64 62 52 62 75 2c 20  ction(p->dbRbu, 
14d60 0a 20 20 20 20 20 20 20 20 22 72 62 75 5f 74 61  .        "rbu_ta
14d70 72 67 65 74 5f 6e 61 6d 65 22 2c 20 2d 31 2c 20  rget_name", -1, 
14d80 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 28 76 6f  SQLITE_UTF8, (vo
14d90 69 64 2a 29 70 2c 20 72 62 75 54 61 72 67 65 74  id*)p, rbuTarget
14da0 4e 61 6d 65 46 75 6e 63 2c 20 30 2c 20 30 0a 20  NameFunc, 0, 0. 
14db0 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28     );.  }..  if(
14dc0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
14dd0 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  K ){.    p->rc =
14de0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
14df0 6e 74 72 6f 6c 28 70 2d 3e 64 62 4d 61 69 6e 2c  ntrol(p->dbMain,
14e00 20 22 6d 61 69 6e 22 2c 20 53 51 4c 49 54 45 5f   "main", SQLITE_
14e10 46 43 4e 54 4c 5f 52 42 55 2c 20 28 76 6f 69 64  FCNTL_RBU, (void
14e20 2a 29 70 29 3b 0a 20 20 7d 0a 20 20 72 62 75 4d  *)p);.  }.  rbuM
14e30 50 72 69 6e 74 66 45 78 65 63 28 70 2c 20 70 2d  PrintfExec(p, p-
14e40 3e 64 62 4d 61 69 6e 2c 20 22 53 45 4c 45 43 54  >dbMain, "SELECT
14e50 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d   * FROM sqlite_m
14e60 61 73 74 65 72 22 29 3b 0a 0a 20 20 2f 2a 20 4d  aster");..  /* M
14e70 61 72 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ark the database
14e80 20 66 69 6c 65 20 6a 75 73 74 20 6f 70 65 6e 65   file just opene
14e90 64 20 61 73 20 61 6e 20 52 42 55 20 74 61 72 67  d as an RBU targ
14ea0 65 74 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  et database. If 
14eb0 0a 20 20 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  .  ** this call 
14ec0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4e  returns SQLITE_N
14ed0 4f 54 46 4f 55 4e 44 2c 20 74 68 65 6e 20 74 68  OTFOUND, then th
14ee0 65 20 52 42 55 20 76 66 73 20 69 73 20 6e 6f 74  e RBU vfs is not
14ef0 20 69 6e 20 75 73 65 2e 0a 20 20 2a 2a 20 54 68   in use..  ** Th
14f00 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20  is is an error. 
14f10 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   */.  if( p->rc=
14f20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14f30 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
14f40 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70  3_file_control(p
14f50 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22  ->dbMain, "main"
14f60 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 52  , SQLITE_FCNTL_R
14f70 42 55 2c 20 28 76 6f 69 64 2a 29 70 29 3b 0a 20  BU, (void*)p);. 
14f80 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   }..  if( p->rc=
14f90 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  =SQLITE_NOTFOUND
14fa0 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
14fb0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
14fc0 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73    p->zErrmsg = s
14fd0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
14fe0 72 62 75 20 76 66 73 20 6e 6f 74 20 66 6f 75 6e  rbu vfs not foun
14ff0 64 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  d");.  }.}../*.*
15000 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
15010 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  s a copy of the 
15020 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69  sqlite3FileSuffi
15030 78 33 28 29 20 72 6f 75 74 69 6e 65 20 66 72 6f  x3() routine fro
15040 6d 20 74 68 65 20 63 6f 72 65 2e 0a 2a 2a 20 49  m the core..** I
15050 74 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c  t is a no-op unl
15060 65 73 73 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ess SQLITE_ENABL
15070 45 5f 38 5f 33 5f 4e 41 4d 45 53 20 69 73 20 64  E_8_3_NAMES is d
15080 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  efined..**.** If
15090 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38   SQLITE_ENABLE_8
150a0 5f 33 5f 4e 41 4d 45 53 20 69 73 20 73 65 74 20  _3_NAMES is set 
150b0 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
150c0 61 6e 64 20 69 66 20 74 68 65 20 64 61 74 61 62  and if the datab
150d0 61 73 65 0a 2a 2a 20 66 69 6c 65 6e 61 6d 65 20  ase.** filename 
150e0 69 6e 20 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65  in zBaseFilename
150f0 20 69 73 20 61 20 55 52 49 20 77 69 74 68 20 74   is a URI with t
15100 68 65 20 22 38 5f 33 5f 6e 61 6d 65 73 3d 31 22  he "8_3_names=1"
15110 20 70 61 72 61 6d 65 74 65 72 20 61 6e 64 0a 2a   parameter and.*
15120 2a 20 69 66 20 66 69 6c 65 6e 61 6d 65 20 69 6e  * if filename in
15130 20 7a 5b 5d 20 68 61 73 20 61 20 73 75 66 66 69   z[] has a suffi
15140 78 20 28 61 2e 6b 2e 61 2e 20 22 65 78 74 65 6e  x (a.k.a. "exten
15150 73 69 6f 6e 22 29 20 74 68 61 74 20 69 73 20 6c  sion") that is l
15160 6f 6e 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68  onger than.** th
15170 72 65 65 20 63 68 61 72 61 63 74 65 72 73 2c 20  ree characters, 
15180 74 68 65 6e 20 73 68 6f 72 74 65 6e 20 74 68 65  then shorten the
15190 20 73 75 66 66 69 78 20 6f 6e 20 7a 5b 5d 20 74   suffix on z[] t
151a0 6f 20 62 65 20 74 68 65 20 6c 61 73 74 20 74 68  o be the last th
151b0 72 65 65 0a 2a 2a 20 63 68 61 72 61 63 74 65 72  ree.** character
151c0 73 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  s of the origina
151d0 6c 20 73 75 66 66 69 78 2e 0a 2a 2a 0a 2a 2a 20  l suffix..**.** 
151e0 49 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  If SQLITE_ENABLE
151f0 5f 38 5f 33 5f 4e 41 4d 45 53 20 69 73 20 73 65  _8_3_NAMES is se
15200 74 20 74 6f 20 32 20 61 74 20 63 6f 6d 70 69 6c  t to 2 at compil
15210 65 2d 74 69 6d 65 2c 20 74 68 65 6e 20 61 6c 77  e-time, then alw
15220 61 79 73 0a 2a 2a 20 64 6f 20 74 68 65 20 73 75  ays.** do the su
15230 66 66 69 78 20 73 68 6f 72 74 65 6e 69 6e 67 20  ffix shortening 
15240 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 55 52  regardless of UR
15250 49 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a  I parameter..**.
15260 2a 2a 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a  ** Examples:.**.
15270 2a 2a 20 20 20 20 20 74 65 73 74 2e 64 62 2d 6a  **     test.db-j
15280 6f 75 72 6e 61 6c 20 20 20 20 3d 3e 20 20 20 74  ournal    =>   t
15290 65 73 74 2e 6e 61 6c 0a 2a 2a 20 20 20 20 20 74  est.nal.**     t
152a0 65 73 74 2e 64 62 2d 77 61 6c 20 20 20 20 20 20  est.db-wal      
152b0 20 20 3d 3e 20 20 20 74 65 73 74 2e 77 61 6c 0a    =>   test.wal.
152c0 2a 2a 20 20 20 20 20 74 65 73 74 2e 64 62 2d 73  **     test.db-s
152d0 68 6d 20 20 20 20 20 20 20 20 3d 3e 20 20 20 74  hm        =>   t
152e0 65 73 74 2e 73 68 6d 0a 2a 2a 20 20 20 20 20 74  est.shm.**     t
152f0 65 73 74 2e 64 62 2d 6d 6a 37 66 33 33 31 39 66  est.db-mj7f3319f
15300 61 20 3d 3e 20 20 20 74 65 73 74 2e 39 66 61 0a  a =>   test.9fa.
15310 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
15320 62 75 46 69 6c 65 53 75 66 66 69 78 33 28 63 6f  buFileSuffix3(co
15330 6e 73 74 20 63 68 61 72 20 2a 7a 42 61 73 65 2c  nst char *zBase,
15340 20 63 68 61 72 20 2a 7a 29 7b 0a 23 69 66 64 65   char *z){.#ifde
15350 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
15360 38 5f 33 5f 4e 41 4d 45 53 0a 23 69 66 20 53 51  8_3_NAMES.#if SQ
15370 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f  LITE_ENABLE_8_3_
15380 4e 41 4d 45 53 3c 32 0a 20 20 69 66 28 20 73 71  NAMES<2.  if( sq
15390 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61  lite3_uri_boolea
153a0 6e 28 7a 42 61 73 65 2c 20 22 38 5f 33 5f 6e 61  n(zBase, "8_3_na
153b0 6d 65 73 22 2c 20 30 29 20 29 0a 23 65 6e 64 69  mes", 0) ).#endi
153c0 66 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 2c  f.  {.    int i,
153d0 20 73 7a 3b 0a 20 20 20 20 73 7a 20 3d 20 28 69   sz;.    sz = (i
153e0 6e 74 29 73 74 72 6c 65 6e 28 7a 29 26 30 78 66  nt)strlen(z)&0xf
153f0 66 66 66 66 66 3b 0a 20 20 20 20 66 6f 72 28 69  fffff;.    for(i
15400 3d 73 7a 2d 31 3b 20 69 3e 30 20 26 26 20 7a 5b  =sz-1; i>0 && z[
15410 69 5d 21 3d 27 2f 27 20 26 26 20 7a 5b 69 5d 21  i]!='/' && z[i]!
15420 3d 27 2e 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 20  ='.'; i--){}.   
15430 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2e 27 20 26   if( z[i]=='.' &
15440 26 20 73 7a 3e 69 2b 34 20 29 20 6d 65 6d 6d 6f  & sz>i+4 ) memmo
15450 76 65 28 26 7a 5b 69 2b 31 5d 2c 20 26 7a 5b 73  ve(&z[i+1], &z[s
15460 7a 2d 33 5d 2c 20 34 29 3b 0a 20 20 7d 0a 23 65  z-3], 4);.  }.#e
15470 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ndif.}../*.** Re
15480 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
15490 20 77 61 6c 2d 69 6e 64 65 78 20 68 65 61 64 65   wal-index heade
154a0 72 20 63 68 65 63 6b 73 75 6d 20 66 6f 72 20 74  r checksum for t
154b0 68 65 20 74 61 72 67 65 74 20 64 61 74 61 62 61  he target databa
154c0 73 65 20 0a 2a 2a 20 61 73 20 61 20 36 34 2d 62  se .** as a 64-b
154d0 69 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a  it integer..**.*
154e0 2a 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 69  * The checksum i
154f0 73 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20 66  s store in the f
15500 69 72 73 74 20 70 61 67 65 20 6f 66 20 78 53 68  irst page of xSh
15510 6d 4d 61 70 20 6d 65 6d 6f 72 79 20 61 73 20 61  mMap memory as a
15520 6e 20 38 2d 62 79 74 65 20 0a 2a 2a 20 62 6c 6f  n 8-byte .** blo
15530 62 20 73 74 61 72 74 69 6e 67 20 61 74 20 62 79  b starting at by
15540 74 65 20 6f 66 66 73 65 74 20 34 30 2e 0a 2a 2f  te offset 40..*/
15550 0a 73 74 61 74 69 63 20 69 36 34 20 72 62 75 53  .static i64 rbuS
15560 68 6d 43 68 65 63 6b 73 75 6d 28 73 71 6c 69 74  hmChecksum(sqlit
15570 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 69 36 34  e3rbu *p){.  i64
15580 20 69 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28   iRet = 0;.  if(
15590 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
155a0 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
155b0 5f 66 69 6c 65 20 2a 70 44 62 20 3d 20 70 2d 3e  _file *pDb = p->
155c0 70 54 61 72 67 65 74 46 64 2d 3e 70 52 65 61 6c  pTargetFd->pReal
155d0 3b 0a 20 20 20 20 75 33 32 20 76 6f 6c 61 74 69  ;.    u32 volati
155e0 6c 65 20 2a 70 74 72 3b 0a 20 20 20 20 70 2d 3e  le *ptr;.    p->
155f0 72 63 20 3d 20 70 44 62 2d 3e 70 4d 65 74 68 6f  rc = pDb->pMetho
15600 64 73 2d 3e 78 53 68 6d 4d 61 70 28 70 44 62 2c  ds->xShmMap(pDb,
15610 20 30 2c 20 33 32 2a 31 30 32 34 2c 20 30 2c 20   0, 32*1024, 0, 
15620 28 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65 2a 2a  (void volatile**
15630 29 26 70 74 72 29 3b 0a 20 20 20 20 69 66 28 20  )&ptr);.    if( 
15640 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
15650 20 29 7b 0a 20 20 20 20 20 20 69 52 65 74 20 3d   ){.      iRet =
15660 20 28 28 69 36 34 29 70 74 72 5b 31 30 5d 20 3c   ((i64)ptr[10] <
15670 3c 20 33 32 29 20 2b 20 70 74 72 5b 31 31 5d 3b  < 32) + ptr[11];
15680 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
15690 75 72 6e 20 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn iRet;.}../*.
156a0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
156b0 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61   is called as pa
156c0 72 74 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a 69  rt of initializi
156d0 6e 67 20 6f 72 20 72 65 69 6e 69 74 69 61 6c 69  ng or reinitiali
156e0 7a 69 6e 67 20 61 6e 0a 2a 2a 20 69 6e 63 72 65  zing an.** incre
156f0 6d 65 6e 74 61 6c 20 63 68 65 63 6b 70 6f 69 6e  mental checkpoin
15700 74 2e 20 0a 2a 2a 0a 2a 2a 20 49 74 20 70 6f 70  t. .**.** It pop
15710 75 6c 61 74 65 73 20 74 68 65 20 73 71 6c 69 74  ulates the sqlit
15720 65 33 72 62 75 2e 61 46 72 61 6d 65 5b 5d 20 61  e3rbu.aFrame[] a
15730 72 72 61 79 20 77 69 74 68 20 74 68 65 20 73 65  rray with the se
15740 74 20 6f 66 20 0a 2a 2a 20 28 77 61 6c 20 66 72  t of .** (wal fr
15750 61 6d 65 20 2d 3e 20 64 62 20 70 61 67 65 29 20  ame -> db page) 
15760 63 6f 70 79 20 6f 70 65 72 61 74 69 6f 6e 73 20  copy operations 
15770 72 65 71 75 69 72 65 64 20 74 6f 20 63 68 65 63  required to chec
15780 6b 70 6f 69 6e 74 20 74 68 65 20 0a 2a 2a 20 63  kpoint the .** c
15790 75 72 72 65 6e 74 20 77 61 6c 20 66 69 6c 65 2c  urrent wal file,
157a0 20 61 6e 64 20 6f 62 74 61 69 6e 73 20 74 68 65   and obtains the
157b0 20 73 65 74 20 6f 66 20 73 68 6d 20 6c 6f 63 6b   set of shm lock
157c0 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 61  s required to sa
157d0 66 65 6c 79 20 0a 2a 2a 20 70 65 72 66 6f 72 6d  fely .** perform
157e0 20 74 68 65 20 63 6f 70 79 20 6f 70 65 72 61 74   the copy operat
157f0 69 6f 6e 73 20 64 69 72 65 63 74 6c 79 20 6f 6e  ions directly on
15800 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
15810 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ..**.** If argum
15820 65 6e 74 20 70 53 74 61 74 65 20 69 73 20 6e 6f  ent pState is no
15830 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  t NULL, then the
15840 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 63 68 65   incremental che
15850 63 6b 70 6f 69 6e 74 20 69 73 0a 2a 2a 20 62 65  ckpoint is.** be
15860 69 6e 67 20 72 65 73 75 6d 65 64 2e 20 49 6e 20  ing resumed. In 
15870 74 68 69 73 20 63 61 73 65 2c 20 69 66 20 74 68  this case, if th
15880 65 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 74 68  e checksum of th
15890 65 20 77 61 6c 2d 69 6e 64 65 78 2d 68 65 61 64  e wal-index-head
158a0 65 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  er.** following 
158b0 72 65 63 6f 76 65 72 79 20 69 73 20 6e 6f 74 20  recovery is not 
158c0 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
158d0 63 68 65 63 6b 73 75 6d 20 73 61 76 65 64 20 69  checksum saved i
158e0 6e 20 74 68 65 20 52 62 75 53 74 61 74 65 0a 2a  n the RbuState.*
158f0 2a 20 6f 62 6a 65 63 74 2c 20 74 68 65 6e 20 74  * object, then t
15900 68 65 20 72 62 75 20 68 61 6e 64 6c 65 20 69 73  he rbu handle is
15910 20 73 65 74 20 74 6f 20 44 4f 4e 45 20 73 74 61   set to DONE sta
15920 74 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20  te. This occurs 
15930 69 66 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72  if some.** other
15940 20 63 6c 69 65 6e 74 20 61 70 70 65 6e 64 73 20   client appends 
15950 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f  a transaction to
15960 20 74 68 65 20 77 61 6c 20 66 69 6c 65 20 69 6e   the wal file in
15970 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a   the middle of.*
15980 2a 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  * an incremental
15990 20 63 68 65 63 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a   checkpoint..*/.
159a0 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 53  static void rbuS
159b0 65 74 75 70 43 68 65 63 6b 70 6f 69 6e 74 28 73  etupCheckpoint(s
159c0 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62  qlite3rbu *p, Rb
159d0 75 53 74 61 74 65 20 2a 70 53 74 61 74 65 29 7b  uState *pState){
159e0 0a 0a 20 20 2f 2a 20 49 66 20 70 53 74 61 74 65  ..  /* If pState
159f0 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
15a00 68 65 20 77 61 6c 20 66 69 6c 65 20 6d 61 79 20  he wal file may 
15a10 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70  not have been op
15a20 65 6e 65 64 20 61 6e 64 0a 20 20 2a 2a 20 72 65  ened and.  ** re
15a30 63 6f 76 65 72 65 64 2e 20 52 75 6e 6e 69 6e 67  covered. Running
15a40 20 61 20 72 65 61 64 2d 73 74 61 74 65 6d 65 6e   a read-statemen
15a50 74 20 68 65 72 65 20 74 6f 20 65 6e 73 75 72 65  t here to ensure
15a60 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 0a 20   that doing so. 
15a70 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 69 6e 74   ** does not int
15a80 65 72 66 65 72 65 20 77 69 74 68 20 74 68 65 20  erfere with the 
15a90 22 63 61 70 74 75 72 65 22 20 70 72 6f 63 65 73  "capture" proces
15aa0 73 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 69  s below.  */.  i
15ab0 66 28 20 70 53 74 61 74 65 3d 3d 30 20 29 7b 0a  f( pState==0 ){.
15ac0 20 20 20 20 70 2d 3e 65 53 74 61 67 65 20 3d 20      p->eStage = 
15ad0 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  0;.    if( p->rc
15ae0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
15af0 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c       p->rc = sql
15b00 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 4d  ite3_exec(p->dbM
15b10 61 69 6e 2c 20 22 53 45 4c 45 43 54 20 2a 20 46  ain, "SELECT * F
15b20 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
15b30 72 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  r", 0, 0, 0);.  
15b40 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73    }.  }..  /* As
15b50 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 20  suming no error 
15b60 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 72 75  has occurred, ru
15b70 6e 20 61 20 22 72 65 73 74 61 72 74 22 20 63 68  n a "restart" ch
15b80 65 63 6b 70 6f 69 6e 74 20 77 69 74 68 20 74 68  eckpoint with th
15b90 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 72 62  e.  ** sqlite3rb
15ba0 75 2e 65 53 74 61 67 65 20 76 61 72 69 61 62 6c  u.eStage variabl
15bb0 65 20 73 65 74 20 74 6f 20 43 41 50 54 55 52 45  e set to CAPTURE
15bc0 2e 20 54 68 69 73 20 74 75 72 6e 73 20 6f 6e 20  . This turns on 
15bd0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
15be0 2a 2a 20 73 70 65 63 69 61 6c 20 62 65 68 61 76  ** special behav
15bf0 69 6f 75 72 20 69 6e 20 74 68 65 20 72 62 75 20  iour in the rbu 
15c00 56 46 53 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  VFS:.  **.  **  
15c10 20 2a 20 49 66 20 74 68 65 20 65 78 63 6c 75 73   * If the exclus
15c20 69 76 65 20 73 68 6d 20 57 52 49 54 45 52 20 6f  ive shm WRITER o
15c30 72 20 52 45 41 44 30 20 6c 6f 63 6b 20 63 61 6e  r READ0 lock can
15c40 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c  not be obtained,
15c50 0a 20 20 2a 2a 20 20 20 20 20 74 68 65 20 63 68  .  **     the ch
15c60 65 63 6b 70 6f 69 6e 74 20 66 61 69 6c 73 20 77  eckpoint fails w
15c70 69 74 68 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ith SQLITE_BUSY 
15c80 28 6e 6f 72 6d 61 6c 6c 79 20 53 51 4c 69 74 65  (normally SQLite
15c90 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 20 20 20 20   would.  **     
15ca0 70 72 6f 63 65 65 64 20 77 69 74 68 20 72 75 6e  proceed with run
15cb0 6e 69 6e 67 20 61 20 70 61 73 73 69 76 65 20 63  ning a passive c
15cc0 68 65 63 6b 70 6f 69 6e 74 20 69 6e 73 74 65 61  heckpoint instea
15cd0 64 20 6f 66 20 66 61 69 6c 69 6e 67 29 2e 0a 20  d of failing).. 
15ce0 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 41 74 74   **.  **   * Att
15cf0 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20 66 72  empts to read fr
15d00 6f 6d 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c  om the *-wal fil
15d10 65 20 6f 72 20 77 72 69 74 65 20 74 6f 20 74 68  e or write to th
15d20 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  e database file.
15d30 20 20 2a 2a 20 20 20 20 20 64 6f 20 6e 6f 74 20    **     do not 
15d40 70 65 72 66 6f 72 6d 20 61 6e 79 20 49 4f 2e 20  perform any IO. 
15d50 49 6e 73 74 65 61 64 2c 20 74 68 65 20 66 72 61  Instead, the fra
15d60 6d 65 2f 70 61 67 65 20 63 6f 6d 62 69 6e 61 74  me/page combinat
15d70 69 6f 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 20  ions that.  **  
15d80 20 20 20 77 6f 75 6c 64 20 62 65 20 72 65 61 64     would be read
15d90 2f 77 72 69 74 74 65 6e 20 61 72 65 20 72 65 63  /written are rec
15da0 6f 72 64 65 64 20 69 6e 20 74 68 65 20 73 71 6c  orded in the sql
15db0 69 74 65 33 72 62 75 2e 61 46 72 61 6d 65 5b 5d  ite3rbu.aFrame[]
15dc0 0a 20 20 2a 2a 20 20 20 20 20 61 72 72 61 79 2e  .  **     array.
15dd0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 43  .  **.  **   * C
15de0 61 6c 6c 73 20 74 6f 20 78 53 68 6d 4c 6f 63 6b  alls to xShmLock
15df0 28 55 4e 4c 4f 43 4b 29 20 74 6f 20 72 65 6c 65  (UNLOCK) to rele
15e00 61 73 65 20 74 68 65 20 65 78 63 6c 75 73 69 76  ase the exclusiv
15e10 65 20 73 68 6d 20 57 52 49 54 45 52 2c 20 0a 20  e shm WRITER, . 
15e20 20 2a 2a 20 20 20 20 20 52 45 41 44 30 20 61 6e   **     READ0 an
15e30 64 20 43 48 45 43 4b 50 4f 49 4e 54 20 6c 6f 63  d CHECKPOINT loc
15e40 6b 73 20 74 61 6b 65 6e 20 61 73 20 70 61 72 74  ks taken as part
15e50 20 6f 66 20 74 68 65 20 63 68 65 63 6b 70 6f 69   of the checkpoi
15e60 6e 74 20 61 72 65 0a 20 20 2a 2a 20 20 20 20 20  nt are.  **     
15e70 6e 6f 2d 6f 70 73 2e 20 54 68 65 73 65 20 6c 6f  no-ops. These lo
15e80 63 6b 73 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  cks will not be 
15e90 72 65 6c 65 61 73 65 64 20 75 6e 74 69 6c 20 74  released until t
15ea0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20  he connection.  
15eb0 2a 2a 20 20 20 20 20 69 73 20 63 6c 6f 73 65 64  **     is closed
15ec0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20  ..  **.  **   * 
15ed0 41 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 78 53  Attempting to xS
15ee0 79 6e 63 28 29 20 74 68 65 20 64 61 74 61 62 61  ync() the databa
15ef0 73 65 20 66 69 6c 65 20 63 61 75 73 65 73 20 61  se file causes a
15f00 6e 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41  n SQLITE_INTERNA
15f10 4c 20 0a 20 20 2a 2a 20 20 20 20 20 65 72 72 6f  L .  **     erro
15f20 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 73 20  r..  **.  ** As 
15f30 61 20 72 65 73 75 6c 74 2c 20 75 6e 6c 65 73 73  a result, unless
15f40 20 61 6e 20 65 72 72 6f 72 20 28 69 2e 65 2e 20   an error (i.e. 
15f50 4f 4f 4d 20 6f 72 20 53 51 4c 49 54 45 5f 42 55  OOM or SQLITE_BU
15f60 53 59 29 20 6f 63 63 75 72 73 2c 20 74 68 65 0a  SY) occurs, the.
15f70 20 20 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 20    ** checkpoint 
15f80 62 65 6c 6f 77 20 66 61 69 6c 73 20 77 69 74 68  below fails with
15f90 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c   SQLITE_INTERNAL
15fa0 2c 20 61 6e 64 20 6c 65 61 76 65 73 20 74 68 65  , and leaves the
15fb0 20 61 46 72 61 6d 65 5b 5d 0a 20 20 2a 2a 20 61   aFrame[].  ** a
15fc0 72 72 61 79 20 70 6f 70 75 6c 61 74 65 64 20 77  rray populated w
15fd0 69 74 68 20 61 20 73 65 74 20 6f 66 20 28 66 72  ith a set of (fr
15fe0 61 6d 65 20 2d 3e 20 70 61 67 65 29 20 6d 61 70  ame -> page) map
15ff0 70 69 6e 67 73 2e 20 42 65 63 61 75 73 65 20 74  pings. Because t
16000 68 65 20 0a 20 20 2a 2a 20 57 52 49 54 45 52 2c  he .  ** WRITER,
16010 20 43 48 45 43 4b 50 4f 49 4e 54 20 61 6e 64 20   CHECKPOINT and 
16020 52 45 41 44 30 20 6c 6f 63 6b 73 20 61 72 65 20  READ0 locks are 
16030 73 74 69 6c 6c 20 68 65 6c 64 2c 20 69 74 20 69  still held, it i
16040 73 20 73 61 66 65 20 74 6f 20 63 6f 70 79 20 0a  s safe to copy .
16050 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74    ** data from t
16060 68 65 20 77 61 6c 20 66 69 6c 65 20 69 6e 74 6f  he wal file into
16070 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
16080 6c 65 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  le according to 
16090 74 68 65 20 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e  the .  ** conten
160a0 74 73 20 6f 66 20 61 46 72 61 6d 65 5b 5d 2e 0a  ts of aFrame[]..
160b0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63    */.  if( p->rc
160c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
160d0 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20     int rc2;.    
160e0 70 2d 3e 65 53 74 61 67 65 20 3d 20 52 42 55 5f  p->eStage = RBU_
160f0 53 54 41 47 45 5f 43 41 50 54 55 52 45 3b 0a 20  STAGE_CAPTURE;. 
16100 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
16110 5f 65 78 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c  _exec(p->dbMain,
16120 20 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 77 61   "PRAGMA main.wa
16130 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 3d 72 65 73  l_checkpoint=res
16140 74 61 72 74 22 2c 20 30 2c 20 30 2c 30 29 3b 0a  tart", 0, 0,0);.
16150 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c      if( rc2!=SQL
16160 49 54 45 5f 49 4e 54 45 52 4e 41 4c 20 29 20 70  ITE_INTERNAL ) p
16170 2d 3e 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a  ->rc = rc2;.  }.
16180 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
16190 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 6e 46  LITE_OK && p->nF
161a0 72 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20 70 2d  rame>0 ){.    p-
161b0 3e 65 53 74 61 67 65 20 3d 20 52 42 55 5f 53 54  >eStage = RBU_ST
161c0 41 47 45 5f 43 4b 50 54 3b 0a 20 20 20 20 70 2d  AGE_CKPT;.    p-
161d0 3e 6e 53 74 65 70 20 3d 20 28 70 53 74 61 74 65  >nStep = (pState
161e0 20 3f 20 70 53 74 61 74 65 2d 3e 6e 52 6f 77 20   ? pState->nRow 
161f0 3a 20 30 29 3b 0a 20 20 20 20 70 2d 3e 61 42 75  : 0);.    p->aBu
16200 66 20 3d 20 72 62 75 4d 61 6c 6c 6f 63 28 70 2c  f = rbuMalloc(p,
16210 20 70 2d 3e 70 67 73 7a 29 3b 0a 20 20 20 20 70   p->pgsz);.    p
16220 2d 3e 69 57 61 6c 43 6b 73 75 6d 20 3d 20 72 62  ->iWalCksum = rb
16230 75 53 68 6d 43 68 65 63 6b 73 75 6d 28 70 29 3b  uShmChecksum(p);
16240 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72  .  }..  if( p->r
16250 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
16260 20 20 20 20 69 66 28 20 70 2d 3e 6e 46 72 61 6d      if( p->nFram
16270 65 3d 3d 30 20 7c 7c 20 28 70 53 74 61 74 65 20  e==0 || (pState 
16280 26 26 20 70 53 74 61 74 65 2d 3e 69 57 61 6c 43  && pState->iWalC
16290 6b 73 75 6d 21 3d 70 2d 3e 69 57 61 6c 43 6b 73  ksum!=p->iWalCks
162a0 75 6d 29 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  um) ){.      p->
162b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
162c0 3b 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61 67  ;.      p->eStag
162d0 65 20 3d 20 52 42 55 5f 53 54 41 47 45 5f 44 4f  e = RBU_STAGE_DO
162e0 4e 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  NE;.    }else{. 
162f0 20 20 20 20 20 69 6e 74 20 6e 53 65 63 74 6f 72       int nSector
16300 53 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  Size;.      sqli
16310 74 65 33 5f 66 69 6c 65 20 2a 70 44 62 20 3d 20  te3_file *pDb = 
16320 70 2d 3e 70 54 61 72 67 65 74 46 64 2d 3e 70 52  p->pTargetFd->pR
16330 65 61 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eal;.      sqlit
16340 65 33 5f 66 69 6c 65 20 2a 70 57 61 6c 20 3d 20  e3_file *pWal = 
16350 70 2d 3e 70 54 61 72 67 65 74 46 64 2d 3e 70 57  p->pTargetFd->pW
16360 61 6c 46 64 2d 3e 70 52 65 61 6c 3b 0a 20 20 20  alFd->pReal;.   
16370 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 50     assert( p->nP
16380 61 67 65 50 65 72 53 65 63 74 6f 72 3d 3d 30 20  agePerSector==0 
16390 29 3b 0a 20 20 20 20 20 20 6e 53 65 63 74 6f 72  );.      nSector
163a0 53 69 7a 65 20 3d 20 70 44 62 2d 3e 70 4d 65 74  Size = pDb->pMet
163b0 68 6f 64 73 2d 3e 78 53 65 63 74 6f 72 53 69 7a  hods->xSectorSiz
163c0 65 28 70 44 62 29 3b 0a 20 20 20 20 20 20 69 66  e(pDb);.      if
163d0 28 20 6e 53 65 63 74 6f 72 53 69 7a 65 3e 70 2d  ( nSectorSize>p-
163e0 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 20  >pgsz ){.       
163f0 20 70 2d 3e 6e 50 61 67 65 50 65 72 53 65 63 74   p->nPagePerSect
16400 6f 72 20 3d 20 6e 53 65 63 74 6f 72 53 69 7a 65  or = nSectorSize
16410 20 2f 20 70 2d 3e 70 67 73 7a 3b 0a 20 20 20 20   / p->pgsz;.    
16420 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
16430 20 70 2d 3e 6e 50 61 67 65 50 65 72 53 65 63 74   p->nPagePerSect
16440 6f 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  or = 1;.      }.
16450 0a 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 20 78  .      /* Call x
16460 53 79 6e 63 28 29 20 6f 6e 20 74 68 65 20 77 61  Sync() on the wa
16470 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 61 75  l file. This cau
16480 73 65 73 20 53 51 4c 69 74 65 20 74 6f 20 73 79  ses SQLite to sy
16490 6e 63 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  nc the .      **
164a0 20 64 69 72 65 63 74 6f 72 79 20 69 6e 20 77 68   directory in wh
164b0 69 63 68 20 74 68 65 20 74 61 72 67 65 74 20 64  ich the target d
164c0 61 74 61 62 61 73 65 20 61 6e 64 20 74 68 65 20  atabase and the 
164d0 77 61 6c 20 66 69 6c 65 20 72 65 73 69 64 65 2c  wal file reside,
164e0 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 63 61   in .      ** ca
164f0 73 65 20 69 74 20 68 61 73 20 6e 6f 74 20 62 65  se it has not be
16500 65 6e 20 73 79 6e 63 65 64 20 73 69 6e 63 65 20  en synced since 
16510 74 68 65 20 72 65 6e 61 6d 65 28 29 20 63 61 6c  the rename() cal
16520 6c 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 72  l in .      ** r
16530 62 75 4d 6f 76 65 4f 61 6c 46 69 6c 65 28 29 2e  buMoveOalFile().
16540 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   */.      p->rc 
16550 3d 20 70 57 61 6c 2d 3e 70 4d 65 74 68 6f 64 73  = pWal->pMethods
16560 2d 3e 78 53 79 6e 63 28 70 57 61 6c 2c 20 53 51  ->xSync(pWal, SQ
16570 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
16580 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
16590 2f 2a 0a 2a 2a 20 43 61 6c 6c 65 64 20 77 68 65  /*.** Called whe
165a0 6e 20 69 41 6d 74 20 62 79 74 65 73 20 61 72 65  n iAmt bytes are
165b0 20 72 65 61 64 20 66 72 6f 6d 20 6f 66 66 73 65   read from offse
165c0 74 20 69 4f 66 66 20 6f 66 20 74 68 65 20 77 61  t iOff of the wa
165d0 6c 20 66 69 6c 65 20 77 68 69 6c 65 0a 2a 2a 20  l file while.** 
165e0 74 68 65 20 72 62 75 20 6f 62 6a 65 63 74 20 69  the rbu object i
165f0 73 20 69 6e 20 63 61 70 74 75 72 65 20 6d 6f 64  s in capture mod
16600 65 2e 20 52 65 63 6f 72 64 20 74 68 65 20 66 72  e. Record the fr
16610 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  ame number of th
16620 65 20 66 72 61 6d 65 0a 2a 2a 20 62 65 69 6e 67  e frame.** being
16630 20 72 65 61 64 20 69 6e 20 74 68 65 20 61 46 72   read in the aFr
16640 61 6d 65 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a  ame[] array..*/.
16650 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 43 61  static int rbuCa
16660 70 74 75 72 65 57 61 6c 52 65 61 64 28 73 71 6c  ptureWalRead(sql
16670 69 74 65 33 72 62 75 20 2a 70 52 62 75 2c 20 69  ite3rbu *pRbu, i
16680 36 34 20 69 4f 66 66 2c 20 69 6e 74 20 69 41 6d  64 iOff, int iAm
16690 74 29 7b 0a 20 20 63 6f 6e 73 74 20 75 33 32 20  t){.  const u32 
166a0 6d 52 65 71 20 3d 20 28 31 3c 3c 57 41 4c 5f 4c  mReq = (1<<WAL_L
166b0 4f 43 4b 5f 57 52 49 54 45 29 7c 28 31 3c 3c 57  OCK_WRITE)|(1<<W
166c0 41 4c 5f 4c 4f 43 4b 5f 43 4b 50 54 29 7c 28 31  AL_LOCK_CKPT)|(1
166d0 3c 3c 57 41 4c 5f 4c 4f 43 4b 5f 52 45 41 44 30  <<WAL_LOCK_READ0
166e0 29 3b 0a 20 20 75 33 32 20 69 46 72 61 6d 65 3b  );.  u32 iFrame;
166f0 0a 0a 20 20 69 66 28 20 70 52 62 75 2d 3e 6d 4c  ..  if( pRbu->mL
16700 6f 63 6b 21 3d 6d 52 65 71 20 29 7b 0a 20 20 20  ock!=mReq ){.   
16710 20 70 52 62 75 2d 3e 72 63 20 3d 20 53 51 4c 49   pRbu->rc = SQLI
16720 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 72 65 74  TE_BUSY;.    ret
16730 75 72 6e 20 53 51 4c 49 54 45 5f 49 4e 54 45 52  urn SQLITE_INTER
16740 4e 41 4c 3b 0a 20 20 7d 0a 0a 20 20 70 52 62 75  NAL;.  }..  pRbu
16750 2d 3e 70 67 73 7a 20 3d 20 69 41 6d 74 3b 0a 20  ->pgsz = iAmt;. 
16760 20 69 66 28 20 70 52 62 75 2d 3e 6e 46 72 61 6d   if( pRbu->nFram
16770 65 3d 3d 70 52 62 75 2d 3e 6e 46 72 61 6d 65 41  e==pRbu->nFrameA
16780 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69 6e 74 20  lloc ){.    int 
16790 6e 4e 65 77 20 3d 20 28 70 52 62 75 2d 3e 6e 46  nNew = (pRbu->nF
167a0 72 61 6d 65 41 6c 6c 6f 63 20 3f 20 70 52 62 75  rameAlloc ? pRbu
167b0 2d 3e 6e 46 72 61 6d 65 41 6c 6c 6f 63 20 3a 20  ->nFrameAlloc : 
167c0 36 34 29 20 2a 20 32 3b 0a 20 20 20 20 52 62 75  64) * 2;.    Rbu
167d0 46 72 61 6d 65 20 2a 61 4e 65 77 3b 0a 20 20 20  Frame *aNew;.   
167e0 20 61 4e 65 77 20 3d 20 28 52 62 75 46 72 61 6d   aNew = (RbuFram
167f0 65 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c  e*)sqlite3_reall
16800 6f 63 36 34 28 70 52 62 75 2d 3e 61 46 72 61 6d  oc64(pRbu->aFram
16810 65 2c 20 6e 4e 65 77 20 2a 20 73 69 7a 65 6f 66  e, nNew * sizeof
16820 28 52 62 75 46 72 61 6d 65 29 29 3b 0a 20 20 20  (RbuFrame));.   
16830 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 20 72   if( aNew==0 ) r
16840 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
16850 45 4d 3b 0a 20 20 20 20 70 52 62 75 2d 3e 61 46  EM;.    pRbu->aF
16860 72 61 6d 65 20 3d 20 61 4e 65 77 3b 0a 20 20 20  rame = aNew;.   
16870 20 70 52 62 75 2d 3e 6e 46 72 61 6d 65 41 6c 6c   pRbu->nFrameAll
16880 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 7d 0a 0a  oc = nNew;.  }..
16890 20 20 69 46 72 61 6d 65 20 3d 20 28 75 33 32 29    iFrame = (u32)
168a0 28 28 69 4f 66 66 2d 33 32 29 20 2f 20 28 69 36  ((iOff-32) / (i6
168b0 34 29 28 69 41 6d 74 2b 32 34 29 29 20 2b 20 31  4)(iAmt+24)) + 1
168c0 3b 0a 20 20 69 66 28 20 70 52 62 75 2d 3e 69 4d  ;.  if( pRbu->iM
168d0 61 78 46 72 61 6d 65 3c 69 46 72 61 6d 65 20 29  axFrame<iFrame )
168e0 20 70 52 62 75 2d 3e 69 4d 61 78 46 72 61 6d 65   pRbu->iMaxFrame
168f0 20 3d 20 69 46 72 61 6d 65 3b 0a 20 20 70 52 62   = iFrame;.  pRb
16900 75 2d 3e 61 46 72 61 6d 65 5b 70 52 62 75 2d 3e  u->aFrame[pRbu->
16910 6e 46 72 61 6d 65 5d 2e 69 57 61 6c 46 72 61 6d  nFrame].iWalFram
16920 65 20 3d 20 69 46 72 61 6d 65 3b 0a 20 20 70 52  e = iFrame;.  pR
16930 62 75 2d 3e 61 46 72 61 6d 65 5b 70 52 62 75 2d  bu->aFrame[pRbu-
16940 3e 6e 46 72 61 6d 65 5d 2e 69 44 62 50 61 67 65  >nFrame].iDbPage
16950 20 3d 20 30 3b 0a 20 20 70 52 62 75 2d 3e 6e 46   = 0;.  pRbu->nF
16960 72 61 6d 65 2b 2b 3b 0a 20 20 72 65 74 75 72 6e  rame++;.  return
16970 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
16980 2a 0a 2a 2a 20 43 61 6c 6c 65 64 20 77 68 65 6e  *.** Called when
16990 20 61 20 70 61 67 65 20 6f 66 20 64 61 74 61 20   a page of data 
169a0 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 6f 66  is written to of
169b0 66 73 65 74 20 69 4f 66 66 20 6f 66 20 74 68 65  fset iOff of the
169c0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
169d0 65 20 77 68 69 6c 65 20 74 68 65 20 72 62 75 20  e while the rbu 
169e0 68 61 6e 64 6c 65 20 69 73 20 69 6e 20 63 61 70  handle is in cap
169f0 74 75 72 65 20 6d 6f 64 65 2e 20 52 65 63 6f 72  ture mode. Recor
16a00 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  d the page numbe
16a10 72 20 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  r .** of the pag
16a20 65 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  e being written 
16a30 69 6e 20 74 68 65 20 61 46 72 61 6d 65 5b 5d 20  in the aFrame[] 
16a40 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  array..*/.static
16a50 20 69 6e 74 20 72 62 75 43 61 70 74 75 72 65 44   int rbuCaptureD
16a60 62 57 72 69 74 65 28 73 71 6c 69 74 65 33 72 62  bWrite(sqlite3rb
16a70 75 20 2a 70 52 62 75 2c 20 69 36 34 20 69 4f 66  u *pRbu, i64 iOf
16a80 66 29 7b 0a 20 20 70 52 62 75 2d 3e 61 46 72 61  f){.  pRbu->aFra
16a90 6d 65 5b 70 52 62 75 2d 3e 6e 46 72 61 6d 65 2d  me[pRbu->nFrame-
16aa0 31 5d 2e 69 44 62 50 61 67 65 20 3d 20 28 75 33  1].iDbPage = (u3
16ab0 32 29 28 69 4f 66 66 20 2f 20 70 52 62 75 2d 3e  2)(iOff / pRbu->
16ac0 70 67 73 7a 29 20 2b 20 31 3b 0a 20 20 72 65 74  pgsz) + 1;.  ret
16ad0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
16ae0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
16af0 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f  called as part o
16b00 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  f an incremental
16b10 20 63 68 65 63 6b 70 6f 69 6e 74 20 6f 70 65 72   checkpoint oper
16b20 61 74 69 6f 6e 2e 20 43 6f 70 79 0a 2a 2a 20 61  ation. Copy.** a
16b30 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20 6f 66   single frame of
16b40 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 77   data from the w
16b50 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65  al file into the
16b60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
16b70 61 73 0a 2a 2a 20 69 6e 64 69 63 61 74 65 64 20  as.** indicated 
16b80 62 79 20 74 68 65 20 52 62 75 46 72 61 6d 65 20  by the RbuFrame 
16b90 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  object..*/.stati
16ba0 63 20 76 6f 69 64 20 72 62 75 43 68 65 63 6b 70  c void rbuCheckp
16bb0 6f 69 6e 74 46 72 61 6d 65 28 73 71 6c 69 74 65  ointFrame(sqlite
16bc0 33 72 62 75 20 2a 70 2c 20 52 62 75 46 72 61 6d  3rbu *p, RbuFram
16bd0 65 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20 73 71  e *pFrame){.  sq
16be0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 57 61 6c  lite3_file *pWal
16bf0 20 3d 20 70 2d 3e 70 54 61 72 67 65 74 46 64 2d   = p->pTargetFd-
16c00 3e 70 57 61 6c 46 64 2d 3e 70 52 65 61 6c 3b 0a  >pWalFd->pReal;.
16c10 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
16c20 70 44 62 20 3d 20 70 2d 3e 70 54 61 72 67 65 74  pDb = p->pTarget
16c30 46 64 2d 3e 70 52 65 61 6c 3b 0a 20 20 69 36 34  Fd->pReal;.  i64
16c40 20 69 4f 66 66 3b 0a 0a 20 20 61 73 73 65 72 74   iOff;..  assert
16c50 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
16c60 4f 4b 20 29 3b 0a 20 20 69 4f 66 66 20 3d 20 28  OK );.  iOff = (
16c70 69 36 34 29 28 70 46 72 61 6d 65 2d 3e 69 57 61  i64)(pFrame->iWa
16c80 6c 46 72 61 6d 65 2d 31 29 20 2a 20 28 70 2d 3e  lFrame-1) * (p->
16c90 70 67 73 7a 20 2b 20 32 34 29 20 2b 20 33 32 20  pgsz + 24) + 32 
16ca0 2b 20 32 34 3b 0a 20 20 70 2d 3e 72 63 20 3d 20  + 24;.  p->rc = 
16cb0 70 57 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  pWal->pMethods->
16cc0 78 52 65 61 64 28 70 57 61 6c 2c 20 70 2d 3e 61  xRead(pWal, p->a
16cd0 42 75 66 2c 20 70 2d 3e 70 67 73 7a 2c 20 69 4f  Buf, p->pgsz, iO
16ce0 66 66 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  ff);.  if( p->rc
16cf0 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 4f   ) return;..  iO
16d00 66 66 20 3d 20 28 69 36 34 29 28 70 46 72 61 6d  ff = (i64)(pFram
16d10 65 2d 3e 69 44 62 50 61 67 65 2d 31 29 20 2a 20  e->iDbPage-1) * 
16d20 70 2d 3e 70 67 73 7a 3b 0a 20 20 70 2d 3e 72 63  p->pgsz;.  p->rc
16d30 20 3d 20 70 44 62 2d 3e 70 4d 65 74 68 6f 64 73   = pDb->pMethods
16d40 2d 3e 78 57 72 69 74 65 28 70 44 62 2c 20 70 2d  ->xWrite(pDb, p-
16d50 3e 61 42 75 66 2c 20 70 2d 3e 70 67 73 7a 2c 20  >aBuf, p->pgsz, 
16d60 69 4f 66 66 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  iOff);.}.../*.**
16d70 20 54 61 6b 65 20 61 6e 20 45 58 43 4c 55 53 49   Take an EXCLUSI
16d80 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
16d90 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
16da0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
16db0 4c 6f 63 6b 44 61 74 61 62 61 73 65 28 73 71 6c  LockDatabase(sql
16dc0 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 73  ite3rbu *p){.  s
16dd0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 52 65  qlite3_file *pRe
16de0 61 6c 20 3d 20 70 2d 3e 70 54 61 72 67 65 74 46  al = p->pTargetF
16df0 64 2d 3e 70 52 65 61 6c 3b 0a 20 20 61 73 73 65  d->pReal;.  asse
16e00 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
16e10 45 5f 4f 4b 20 29 3b 0a 20 20 70 2d 3e 72 63 20  E_OK );.  p->rc 
16e20 3d 20 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  = pReal->pMethod
16e30 73 2d 3e 78 4c 6f 63 6b 28 70 52 65 61 6c 2c 20  s->xLock(pReal, 
16e40 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48 41 52  SQLITE_LOCK_SHAR
16e50 45 44 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  ED);.  if( p->rc
16e60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
16e70 20 20 20 70 2d 3e 72 63 20 3d 20 70 52 65 61 6c     p->rc = pReal
16e80 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 4c 6f 63  ->pMethods->xLoc
16e90 6b 28 70 52 65 61 6c 2c 20 53 51 4c 49 54 45 5f  k(pReal, SQLITE_
16ea0 4c 4f 43 4b 5f 45 58 43 4c 55 53 49 56 45 29 3b  LOCK_EXCLUSIVE);
16eb0 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69  .  }.}..#if defi
16ec0 6e 65 64 28 5f 57 49 4e 33 32 5f 57 43 45 29 0a  ned(_WIN32_WCE).
16ed0 73 74 61 74 69 63 20 4c 50 57 53 54 52 20 72 62  static LPWSTR rb
16ee0 75 57 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64  uWinUtf8ToUnicod
16ef0 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  e(const char *zF
16f00 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20  ilename){.  int 
16f10 6e 43 68 61 72 3b 0a 20 20 4c 50 57 53 54 52 20  nChar;.  LPWSTR 
16f20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 0a  zWideFilename;..
16f30 20 20 6e 43 68 61 72 20 3d 20 4d 75 6c 74 69 42    nChar = MultiB
16f40 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 43 50  yteToWideChar(CP
16f50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e  _UTF8, 0, zFilen
16f60 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20 30  ame, -1, NULL, 0
16f70 29 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d  );.  if( nChar==
16f80 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
16f90 30 3b 0a 20 20 7d 0a 20 20 7a 57 69 64 65 46 69  0;.  }.  zWideFi
16fa0 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  lename = sqlite3
16fb0 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e 43 68 61 72  _malloc64( nChar
16fc0 2a 73 69 7a 65 6f 66 28 7a 57 69 64 65 46 69 6c  *sizeof(zWideFil
16fd0 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69  ename[0]) );.  i
16fe0 66 28 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  f( zWideFilename
16ff0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
17000 6e 20 30 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  n 0;.  }.  memse
17010 74 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c  t(zWideFilename,
17020 20 30 2c 20 6e 43 68 61 72 2a 73 69 7a 65 6f 66   0, nChar*sizeof
17030 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 5b 30  (zWideFilename[0
17040 5d 29 29 3b 0a 20 20 6e 43 68 61 72 20 3d 20 4d  ]));.  nChar = M
17050 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
17060 61 72 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a  ar(CP_UTF8, 0, z
17070 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 57  Filename, -1, zW
17080 69 64 65 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  ideFilename,.   
17090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
170a0 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 68               nCh
170b0 61 72 29 3b 0a 20 20 69 66 28 20 6e 43 68 61 72  ar);.  if( nChar
170c0 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
170d0 65 33 5f 66 72 65 65 28 7a 57 69 64 65 46 69 6c  e3_free(zWideFil
170e0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 57 69 64  ename);.    zWid
170f0 65 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20  eFilename = 0;. 
17100 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 57 69 64   }.  return zWid
17110 65 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 23 65 6e  eFilename;.}.#en
17120 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 52  dif../*.** The R
17130 42 55 20 68 61 6e 64 6c 65 20 69 73 20 63 75 72  BU handle is cur
17140 72 65 6e 74 6c 79 20 69 6e 20 52 42 55 5f 53 54  rently in RBU_ST
17150 41 47 45 5f 4f 41 4c 20 73 74 61 74 65 2c 20 77  AGE_OAL state, w
17160 69 74 68 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ith a SHARED loc
17170 6b 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61  k.** on the data
17180 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20  base file. This 
17190 70 72 6f 63 20 6d 6f 76 65 73 20 74 68 65 20 2a  proc moves the *
171a0 2d 6f 61 6c 20 66 69 6c 65 20 74 6f 20 74 68 65  -oal file to the
171b0 20 2a 2d 77 61 6c 20 70 61 74 68 2c 0a 2a 2a 20   *-wal path,.** 
171c0 74 68 65 6e 20 72 65 6f 70 65 6e 73 20 74 68 65  then reopens the
171d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
171e0 74 68 69 73 20 74 69 6d 65 20 69 6e 20 76 61 6e  this time in van
171f0 69 6c 6c 61 2c 20 6e 6f 6e 2d 6f 61 6c 2c 20 57  illa, non-oal, W
17200 41 4c 20 6d 6f 64 65 29 2e 0a 2a 2a 20 49 66 20  AL mode)..** If 
17210 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
17220 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
17230 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d  code and error m
17240 65 73 73 61 67 65 20 69 6e 20 74 68 65 20 72 62  essage in the rb
17250 75 20 0a 2a 2a 20 68 61 6e 64 6c 65 2e 0a 2a 2f  u .** handle..*/
17260 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
17270 4d 6f 76 65 4f 61 6c 46 69 6c 65 28 73 71 6c 69  MoveOalFile(sqli
17280 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 63 6f  te3rbu *p){.  co
17290 6e 73 74 20 63 68 61 72 20 2a 7a 42 61 73 65 20  nst char *zBase 
172a0 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c  = sqlite3_db_fil
172b0 65 6e 61 6d 65 28 70 2d 3e 64 62 4d 61 69 6e 2c  ename(p->dbMain,
172c0 20 22 6d 61 69 6e 22 29 3b 0a 20 20 63 6f 6e 73   "main");.  cons
172d0 74 20 63 68 61 72 20 2a 7a 4d 6f 76 65 20 3d 20  t char *zMove = 
172e0 7a 42 61 73 65 3b 0a 20 20 63 68 61 72 20 2a 7a  zBase;.  char *z
172f0 4f 61 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 57 61  Oal;.  char *zWa
17300 6c 3b 0a 0a 20 20 69 66 28 20 72 62 75 49 73 56  l;..  if( rbuIsV
17310 61 63 75 75 6d 28 70 29 20 29 7b 0a 20 20 20 20  acuum(p) ){.    
17320 7a 4d 6f 76 65 20 3d 20 73 71 6c 69 74 65 33 5f  zMove = sqlite3_
17330 64 62 5f 66 69 6c 65 6e 61 6d 65 28 70 2d 3e 64  db_filename(p->d
17340 62 52 62 75 2c 20 22 6d 61 69 6e 22 29 3b 0a 20  bRbu, "main");. 
17350 20 7d 0a 20 20 7a 4f 61 6c 20 3d 20 73 71 6c 69   }.  zOal = sqli
17360 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 2d  te3_mprintf("%s-
17370 6f 61 6c 22 2c 20 7a 4d 6f 76 65 29 3b 0a 20 20  oal", zMove);.  
17380 7a 57 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zWal = sqlite3_m
17390 70 72 69 6e 74 66 28 22 25 73 2d 77 61 6c 22 2c  printf("%s-wal",
173a0 20 7a 4d 6f 76 65 29 3b 0a 0a 20 20 61 73 73 65   zMove);..  asse
173b0 72 74 28 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52  rt( p->eStage==R
173c0 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 20 29 3b  BU_STAGE_MOVE );
173d0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
173e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
173f0 2d 3e 7a 45 72 72 6d 73 67 3d 3d 30 20 29 3b 0a  ->zErrmsg==0 );.
17400 20 20 69 66 28 20 7a 57 61 6c 3d 3d 30 20 7c 7c    if( zWal==0 ||
17410 20 7a 4f 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zOal==0 ){.    
17420 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
17430 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OMEM;.  }else{. 
17440 20 20 20 2f 2a 20 4d 6f 76 65 20 74 68 65 20 2a     /* Move the *
17450 2d 6f 61 6c 20 66 69 6c 65 20 74 6f 20 2a 2d 77  -oal file to *-w
17460 61 6c 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e  al. At this poin
17470 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 2d 3e  t connection p->
17480 64 62 20 69 73 0a 20 20 20 20 2a 2a 20 68 6f 6c  db is.    ** hol
17490 64 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f  ding a SHARED lo
174a0 63 6b 20 6f 6e 20 74 68 65 20 74 61 72 67 65 74  ck on the target
174b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
174c0 62 65 63 61 75 73 65 20 69 74 20 69 73 0a 20 20  because it is.  
174d0 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65    ** in WAL mode
174e0 29 2e 20 53 6f 20 6e 6f 20 6f 74 68 65 72 20 63  ). So no other c
174f0 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 79 20 62 65  onnection may be
17500 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 62 2e   writing the db.
17510 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
17520 49 6e 20 6f 72 64 65 72 20 74 6f 20 65 6e 73 75  In order to ensu
17530 72 65 20 74 68 61 74 20 74 68 65 72 65 20 61 72  re that there ar
17540 65 20 6e 6f 20 64 61 74 61 62 61 73 65 20 72 65  e no database re
17550 61 64 65 72 73 2c 20 61 6e 20 45 58 43 4c 55 53  aders, an EXCLUS
17560 49 56 45 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 20  IVE.    ** lock 
17570 69 73 20 6f 62 74 61 69 6e 65 64 20 68 65 72 65  is obtained here
17580 20 62 65 66 6f 72 65 20 74 68 65 20 2a 2d 6f 61   before the *-oa
17590 6c 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 2a 2d  l is moved to *-
175a0 77 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  wal..    */.    
175b0 72 62 75 4c 6f 63 6b 44 61 74 61 62 61 73 65 28  rbuLockDatabase(
175c0 70 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72  p);.    if( p->r
175d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
175e0 20 20 20 20 20 20 72 62 75 46 69 6c 65 53 75 66        rbuFileSuf
175f0 66 69 78 33 28 7a 42 61 73 65 2c 20 7a 57 61 6c  fix3(zBase, zWal
17600 29 3b 0a 20 20 20 20 20 20 72 62 75 46 69 6c 65  );.      rbuFile
17610 53 75 66 66 69 78 33 28 7a 42 61 73 65 2c 20 7a  Suffix3(zBase, z
17620 4f 61 6c 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  Oal);..      /* 
17630 52 65 2d 6f 70 65 6e 20 74 68 65 20 64 61 74 61  Re-open the data
17640 62 61 73 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  bases. */.      
17650 72 62 75 4f 62 6a 49 74 65 72 46 69 6e 61 6c 69  rbuObjIterFinali
17660 7a 65 28 26 70 2d 3e 6f 62 6a 69 74 65 72 29 3b  ze(&p->objiter);
17670 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63  .      sqlite3_c
17680 6c 6f 73 65 28 70 2d 3e 64 62 52 62 75 29 3b 0a  lose(p->dbRbu);.
17690 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c        sqlite3_cl
176a0 6f 73 65 28 70 2d 3e 64 62 4d 61 69 6e 29 3b 0a  ose(p->dbMain);.
176b0 20 20 20 20 20 20 70 2d 3e 64 62 4d 61 69 6e 20        p->dbMain 
176c0 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 64 62  = 0;.      p->db
176d0 52 62 75 20 3d 20 30 3b 0a 0a 23 69 66 20 64 65  Rbu = 0;..#if de
176e0 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57 43 45  fined(_WIN32_WCE
176f0 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  ).      {.      
17700 20 20 4c 50 57 53 54 52 20 7a 57 69 64 65 4f 61    LPWSTR zWideOa
17710 6c 3b 0a 20 20 20 20 20 20 20 20 4c 50 57 53 54  l;.        LPWST
17720 52 20 7a 57 69 64 65 57 61 6c 3b 0a 0a 20 20 20  R zWideWal;..   
17730 20 20 20 20 20 7a 57 69 64 65 4f 61 6c 20 3d 20       zWideOal = 
17740 72 62 75 57 69 6e 55 74 66 38 54 6f 55 6e 69 63  rbuWinUtf8ToUnic
17750 6f 64 65 28 7a 4f 61 6c 29 3b 0a 20 20 20 20 20  ode(zOal);.     
17760 20 20 20 69 66 28 20 7a 57 69 64 65 4f 61 6c 20     if( zWideOal 
17770 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 57 69  ){.          zWi
17780 64 65 57 61 6c 20 3d 20 72 62 75 57 69 6e 55 74  deWal = rbuWinUt
17790 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 57 61 6c  f8ToUnicode(zWal
177a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
177b0 20 7a 57 69 64 65 57 61 6c 20 29 7b 0a 20 20 20   zWideWal ){.   
177c0 20 20 20 20 20 20 20 20 20 69 66 28 20 4d 6f 76           if( Mov
177d0 65 46 69 6c 65 57 28 7a 57 69 64 65 4f 61 6c 2c  eFileW(zWideOal,
177e0 20 7a 57 69 64 65 57 61 6c 29 20 29 7b 0a 20 20   zWideWal) ){.  
177f0 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72              p->r
17800 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
17810 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
17820 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
17830 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49  p->rc = SQLITE_I
17840 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20 20 20  OERR;.          
17850 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
17860 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69  sqlite3_free(zWi
17870 64 65 57 61 6c 29 3b 0a 20 20 20 20 20 20 20 20  deWal);.        
17880 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17890 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c       p->rc = SQL
178a0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
178b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
178c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
178d0 72 65 65 28 7a 57 69 64 65 4f 61 6c 29 3b 0a 20  ree(zWideOal);. 
178e0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
178f0 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
17900 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
17910 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  EM;.        }.  
17920 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
17930 20 20 70 2d 3e 72 63 20 3d 20 72 65 6e 61 6d 65    p->rc = rename
17940 28 7a 4f 61 6c 2c 20 7a 57 61 6c 29 20 3f 20 53  (zOal, zWal) ? S
17950 51 4c 49 54 45 5f 49 4f 45 52 52 20 3a 20 53 51  QLITE_IOERR : SQ
17960 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a  LITE_OK;.#endif.
17970 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
17980 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17990 20 20 20 20 20 20 20 72 62 75 4f 70 65 6e 44 61         rbuOpenDa
179a0 74 61 62 61 73 65 28 70 2c 20 30 29 3b 0a 20 20  tabase(p, 0);.  
179b0 20 20 20 20 20 20 72 62 75 53 65 74 75 70 43 68        rbuSetupCh
179c0 65 63 6b 70 6f 69 6e 74 28 70 2c 20 30 29 3b 0a  eckpoint(p, 0);.
179d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
179e0 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  }..  sqlite3_fre
179f0 65 28 7a 57 61 6c 29 3b 0a 20 20 73 71 6c 69 74  e(zWal);.  sqlit
17a00 65 33 5f 66 72 65 65 28 7a 4f 61 6c 29 3b 0a 7d  e3_free(zOal);.}
17a10 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 53 45 4c 45  ../*.** The SELE
17a20 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 74 65  CT statement ite
17a30 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 74  rating through t
17a40 68 65 20 6b 65 79 73 20 66 6f 72 20 74 68 65 20  he keys for the 
17a50 63 75 72 72 65 6e 74 20 6f 62 6a 65 63 74 0a 2a  current object.*
17a60 2a 20 28 70 2d 3e 6f 62 6a 69 74 65 72 2e 70 53  * (p->objiter.pS
17a70 65 6c 65 63 74 29 20 63 75 72 72 65 6e 74 6c 79  elect) currently
17a80 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c   points to a val
17a90 69 64 20 72 6f 77 2e 20 54 68 69 73 20 66 75 6e  id row. This fun
17aa0 63 74 69 6f 6e 0a 2a 2a 20 64 65 74 65 72 6d 69  ction.** determi
17ab0 6e 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20  nes the type of 
17ac0 6f 70 65 72 61 74 69 6f 6e 20 72 65 71 75 65 73  operation reques
17ad0 74 65 64 20 62 79 20 74 68 69 73 20 72 6f 77 20  ted by this row 
17ae0 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a 2a 20 6f  and returns.** o
17af0 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
17b00 69 6e 67 20 76 61 6c 75 65 73 20 74 6f 20 69 6e  ing values to in
17b10 64 69 63 61 74 65 20 74 68 65 20 72 65 73 75 6c  dicate the resul
17b20 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 52  t:.**.**     * R
17b30 42 55 5f 49 4e 53 45 52 54 0a 2a 2a 20 20 20 20  BU_INSERT.**    
17b40 20 2a 20 52 42 55 5f 44 45 4c 45 54 45 0a 2a 2a   * RBU_DELETE.**
17b50 20 20 20 20 20 2a 20 52 42 55 5f 49 44 58 5f 44       * RBU_IDX_D
17b60 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20 2a 20 52  ELETE.**     * R
17b70 42 55 5f 55 50 44 41 54 45 0a 2a 2a 0a 2a 2a 20  BU_UPDATE.**.** 
17b80 49 66 20 52 42 55 5f 55 50 44 41 54 45 20 69 73  If RBU_UPDATE is
17b90 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20   returned, then 
17ba0 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20  output variable 
17bb0 2a 70 7a 4d 61 73 6b 20 69 73 20 73 65 74 20 74  *pzMask is set t
17bc0 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68  o.** point to th
17bd0 65 20 74 65 78 74 20 76 61 6c 75 65 20 69 6e 64  e text value ind
17be0 69 63 61 74 69 6e 67 20 74 68 65 20 63 6f 6c 75  icating the colu
17bf0 6d 6e 73 20 74 6f 20 75 70 64 61 74 65 2e 0a 2a  mns to update..*
17c00 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 62 75 5f  *.** If the rbu_
17c10 63 6f 6e 74 72 6f 6c 20 66 69 65 6c 64 20 63 6f  control field co
17c20 6e 74 61 69 6e 73 20 61 6e 20 69 6e 76 61 6c 69  ntains an invali
17c30 64 20 76 61 6c 75 65 2c 20 61 6e 20 65 72 72 6f  d value, an erro
17c40 72 20 63 6f 64 65 20 61 6e 64 0a 2a 2a 20 6d 65  r code and.** me
17c50 73 73 61 67 65 20 61 72 65 20 6c 65 66 74 20 69  ssage are left i
17c60 6e 20 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65  n the RBU handle
17c70 20 61 6e 64 20 7a 65 72 6f 20 72 65 74 75 72 6e   and zero return
17c80 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
17c90 74 20 72 62 75 53 74 65 70 54 79 70 65 28 73 71  t rbuStepType(sq
17ca0 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 63 6f 6e  lite3rbu *p, con
17cb0 73 74 20 63 68 61 72 20 2a 2a 70 7a 4d 61 73 6b  st char **pzMask
17cc0 29 7b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  ){.  int iCol = 
17cd0 70 2d 3e 6f 62 6a 69 74 65 72 2e 6e 43 6f 6c 3b  p->objiter.nCol;
17ce0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
17cf0 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 63 6f 6c   rbu_control col
17d00 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  umn */.  int res
17d10 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
17d20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
17d30 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 73  rn value */..  s
17d40 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f 63  witch( sqlite3_c
17d50 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 2d 3e 6f 62  olumn_type(p->ob
17d60 6a 69 74 65 72 2e 70 53 65 6c 65 63 74 2c 20 69  jiter.pSelect, i
17d70 43 6f 6c 29 20 29 7b 0a 20 20 20 20 63 61 73 65  Col) ){.    case
17d80 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a   SQLITE_INTEGER:
17d90 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 56 61   {.      int iVa
17da0 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
17db0 6d 6e 5f 69 6e 74 28 70 2d 3e 6f 62 6a 69 74 65  mn_int(p->objite
17dc0 72 2e 70 53 65 6c 65 63 74 2c 20 69 43 6f 6c 29  r.pSelect, iCol)
17dd0 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20  ;.      switch( 
17de0 69 56 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  iVal ){.        
17df0 63 61 73 65 20 30 3a 20 72 65 73 20 3d 20 52 42  case 0: res = RB
17e00 55 5f 49 4e 53 45 52 54 3b 20 20 20 20 20 62 72  U_INSERT;     br
17e10 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
17e20 65 20 31 3a 20 72 65 73 20 3d 20 52 42 55 5f 44  e 1: res = RBU_D
17e30 45 4c 45 54 45 3b 20 20 20 20 20 62 72 65 61 6b  ELETE;     break
17e40 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 32  ;.        case 2
17e50 3a 20 72 65 73 20 3d 20 52 42 55 5f 52 45 50 4c  : res = RBU_REPL
17e60 41 43 45 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  ACE;    break;. 
17e70 20 20 20 20 20 20 20 63 61 73 65 20 33 3a 20 72         case 3: r
17e80 65 73 20 3d 20 52 42 55 5f 49 44 58 5f 44 45 4c  es = RBU_IDX_DEL
17e90 45 54 45 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ETE; break;.    
17ea0 20 20 20 20 63 61 73 65 20 34 3a 20 72 65 73 20      case 4: res 
17eb0 3d 20 52 42 55 5f 49 44 58 5f 49 4e 53 45 52 54  = RBU_IDX_INSERT
17ec0 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ; break;.      }
17ed0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
17ee0 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51    }..    case SQ
17ef0 4c 49 54 45 5f 54 45 58 54 3a 20 7b 0a 20 20 20  LITE_TEXT: {.   
17f00 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
17f10 64 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69  d char *z = sqli
17f20 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
17f30 70 2d 3e 6f 62 6a 69 74 65 72 2e 70 53 65 6c 65  p->objiter.pSele
17f40 63 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20  ct, iCol);.     
17f50 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20   if( z==0 ){.   
17f60 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c       p->rc = SQL
17f70 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
17f80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17f90 2a 70 7a 4d 61 73 6b 20 3d 20 28 63 6f 6e 73 74  *pzMask = (const
17fa0 20 63 68 61 72 2a 29 7a 3b 0a 20 20 20 20 20 20   char*)z;.      
17fb0 7d 0a 20 20 20 20 20 20 72 65 73 20 3d 20 52 42  }.      res = RB
17fc0 55 5f 55 50 44 41 54 45 3b 0a 0a 20 20 20 20 20  U_UPDATE;..     
17fd0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
17fe0 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
17ff0 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
18000 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
18010 20 20 72 62 75 42 61 64 43 6f 6e 74 72 6f 6c 45    rbuBadControlE
18020 72 72 6f 72 28 70 29 3b 0a 20 20 7d 0a 20 20 72  rror(p);.  }.  r
18030 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 23 69  eturn res;.}..#i
18040 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
18050 47 0a 2f 2a 0a 2a 2a 20 41 73 73 65 72 74 20 74  G./*.** Assert t
18060 68 61 74 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 20  hat column iCol 
18070 6f 66 20 73 74 61 74 65 6d 65 6e 74 20 70 53 74  of statement pSt
18080 6d 74 20 69 73 20 6e 61 6d 65 64 20 7a 4e 61 6d  mt is named zNam
18090 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
180a0 64 20 61 73 73 65 72 74 43 6f 6c 75 6d 6e 4e 61  d assertColumnNa
180b0 6d 65 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  me(sqlite3_stmt 
180c0 2a 70 53 74 6d 74 2c 20 69 6e 74 20 69 43 6f 6c  *pStmt, int iCol
180d0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
180e0 61 6d 65 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  ame){.  const ch
180f0 61 72 20 2a 7a 43 6f 6c 20 3d 20 73 71 6c 69 74  ar *zCol = sqlit
18100 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70  e3_column_name(p
18110 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 61  Stmt, iCol);.  a
18120 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65  ssert( 0==sqlite
18130 33 5f 73 74 72 69 63 6d 70 28 7a 4e 61 6d 65 2c  3_stricmp(zName,
18140 20 7a 43 6f 6c 29 20 29 3b 0a 7d 0a 23 65 6c 73   zCol) );.}.#els
18150 65 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65 72  e.# define asser
18160 74 43 6f 6c 75 6d 6e 4e 61 6d 65 28 78 2c 79 2c  tColumnName(x,y,
18170 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  z).#endif../*.**
18180 20 41 72 67 75 6d 65 6e 74 20 65 54 79 70 65 20   Argument eType 
18190 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 52  must be one of R
181a0 42 55 5f 49 4e 53 45 52 54 2c 20 52 42 55 5f 44  BU_INSERT, RBU_D
181b0 45 4c 45 54 45 2c 20 52 42 55 5f 49 44 58 5f 49  ELETE, RBU_IDX_I
181c0 4e 53 45 52 54 20 6f 72 0a 2a 2a 20 52 42 55 5f  NSERT or.** RBU_
181d0 49 44 58 5f 44 45 4c 45 54 45 2e 20 54 68 69 73  IDX_DELETE. This
181e0 20 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72   function perfor
181f0 6d 73 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 61  ms the work of a
18200 20 73 69 6e 67 6c 65 0a 2a 2a 20 73 71 6c 69 74   single.** sqlit
18210 65 33 72 62 75 5f 73 74 65 70 28 29 20 63 61 6c  e3rbu_step() cal
18220 6c 20 66 6f 72 20 74 68 65 20 74 79 70 65 20 6f  l for the type o
18230 66 20 6f 70 65 72 61 74 69 6f 6e 20 73 70 65 63  f operation spec
18240 69 66 69 65 64 20 62 79 20 65 54 79 70 65 2e 0a  ified by eType..
18250 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
18260 62 75 53 74 65 70 4f 6e 65 4f 70 28 73 71 6c 69  buStepOneOp(sqli
18270 74 65 33 72 62 75 20 2a 70 2c 20 69 6e 74 20 65  te3rbu *p, int e
18280 54 79 70 65 29 7b 0a 20 20 52 62 75 4f 62 6a 49  Type){.  RbuObjI
18290 74 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70 2d  ter *pIter = &p-
182a0 3e 6f 62 6a 69 74 65 72 3b 0a 20 20 73 71 6c 69  >objiter;.  sqli
182b0 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b  te3_value *pVal;
182c0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
182d0 2a 70 57 72 69 74 65 72 3b 0a 20 20 69 6e 74 20  *pWriter;.  int 
182e0 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  i;..  assert( p-
182f0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
18300 3b 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  ;.  assert( eTyp
18310 65 21 3d 52 42 55 5f 44 45 4c 45 54 45 20 7c 7c  e!=RBU_DELETE ||
18320 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d 30 20   pIter->zIdx==0 
18330 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  );.  assert( eTy
18340 70 65 3d 3d 52 42 55 5f 44 45 4c 45 54 45 20 7c  pe==RBU_DELETE |
18350 7c 20 65 54 79 70 65 3d 3d 52 42 55 5f 49 44 58  | eType==RBU_IDX
18360 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20 20 7c  _DELETE.       |
18370 7c 20 65 54 79 70 65 3d 3d 52 42 55 5f 49 4e 53  | eType==RBU_INS
18380 45 52 54 20 7c 7c 20 65 54 79 70 65 3d 3d 52 42  ERT || eType==RB
18390 55 5f 49 44 58 5f 49 4e 53 45 52 54 0a 20 20 29  U_IDX_INSERT.  )
183a0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
183b0 69 73 20 61 20 64 65 6c 65 74 65 2c 20 64 65 63  is a delete, dec
183c0 72 65 6d 65 6e 74 20 6e 50 68 61 73 65 4f 6e 65  rement nPhaseOne
183d0 53 74 65 70 20 62 79 20 6e 49 6e 64 65 78 2e 20  Step by nIndex. 
183e0 49 66 20 74 68 65 20 44 45 4c 45 54 45 0a 20 20  If the DELETE.  
183f0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 65 6c  ** statement bel
18400 6f 77 20 64 6f 65 73 20 61 63 74 75 61 6c 6c 79  ow does actually
18410 20 64 65 6c 65 74 65 20 61 20 72 6f 77 2c 20 6e   delete a row, n
18420 50 68 61 73 65 4f 6e 65 53 74 65 70 20 77 69 6c  PhaseOneStep wil
18430 6c 20 62 65 0a 20 20 2a 2a 20 69 6e 63 72 65 6d  l be.  ** increm
18440 65 6e 74 65 64 20 62 79 20 74 68 65 20 73 61 6d  ented by the sam
18450 65 20 61 6d 6f 75 6e 74 20 77 68 65 6e 20 53 51  e amount when SQ
18460 4c 20 66 75 6e 63 74 69 6f 6e 20 72 62 75 5f 74  L function rbu_t
18470 6d 70 5f 69 6e 73 65 72 74 28 29 0a 20 20 2a 2a  mp_insert().  **
18480 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 74   is invoked by t
18490 68 65 20 74 72 69 67 67 65 72 2e 20 20 2a 2f 0a  he trigger.  */.
184a0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 52 42 55    if( eType==RBU
184b0 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 70  _DELETE ){.    p
184c0 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20  ->nPhaseOneStep 
184d0 2d 3d 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 6e 49  -= p->objiter.nI
184e0 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ndex;.  }..  if(
184f0 20 65 54 79 70 65 3d 3d 52 42 55 5f 49 44 58 5f   eType==RBU_IDX_
18500 44 45 4c 45 54 45 20 7c 7c 20 65 54 79 70 65 3d  DELETE || eType=
18510 3d 52 42 55 5f 44 45 4c 45 54 45 20 29 7b 0a 20  =RBU_DELETE ){. 
18520 20 20 20 70 57 72 69 74 65 72 20 3d 20 70 49 74     pWriter = pIt
18530 65 72 2d 3e 70 44 65 6c 65 74 65 3b 0a 20 20 7d  er->pDelete;.  }
18540 65 6c 73 65 7b 0a 20 20 20 20 70 57 72 69 74 65  else{.    pWrite
18550 72 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e 73 65  r = pIter->pInse
18560 72 74 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69  rt;.  }..  for(i
18570 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 43 6f  =0; i<pIter->nCo
18580 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20  l; i++){.    /* 
18590 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 49 4e  If this is an IN
185a0 53 45 52 54 20 69 6e 74 6f 20 61 20 74 61 62 6c  SERT into a tabl
185b0 65 20 62 2d 74 72 65 65 20 61 6e 64 20 74 68 65  e b-tree and the
185c0 20 74 61 62 6c 65 20 68 61 73 20 61 6e 0a 20 20   table has an.  
185d0 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 20 49 4e    ** explicit IN
185e0 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
185f0 59 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  Y, check that th
18600 69 73 20 69 73 20 6e 6f 74 20 61 6e 20 61 74 74  is is not an att
18610 65 6d 70 74 0a 20 20 20 20 2a 2a 20 74 6f 20 77  empt.    ** to w
18620 72 69 74 65 20 61 20 4e 55 4c 4c 20 69 6e 74 6f  rite a NULL into
18630 20 74 68 65 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e   the IPK column.
18640 20 54 68 61 74 20 69 73 20 6e 6f 74 20 70 65 72   That is not per
18650 6d 69 74 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20  mitted.  */.    
18660 69 66 28 20 65 54 79 70 65 3d 3d 52 42 55 5f 49  if( eType==RBU_I
18670 4e 53 45 52 54 20 0a 20 20 20 20 20 26 26 20 70  NSERT .     && p
18680 49 74 65 72 2d 3e 7a 49 64 78 3d 3d 30 20 26 26  Iter->zIdx==0 &&
18690 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52   pIter->eType==R
186a0 42 55 5f 50 4b 5f 49 50 4b 20 26 26 20 70 49 74  BU_PK_IPK && pIt
186b0 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 5d 20 0a  er->abTblPk[i] .
186c0 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f       && sqlite3_
186d0 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 49 74 65  column_type(pIte
186e0 72 2d 3e 70 53 65 6c 65 63 74 2c 20 69 29 3d 3d  r->pSelect, i)==
186f0 53 51 4c 49 54 45 5f 4e 55 4c 4c 0a 20 20 20 20  SQLITE_NULL.    
18700 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
18710 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48   SQLITE_MISMATCH
18720 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 6d  ;.      p->zErrm
18730 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
18740 69 6e 74 66 28 22 64 61 74 61 74 79 70 65 20 6d  intf("datatype m
18750 69 73 6d 61 74 63 68 22 29 3b 0a 20 20 20 20 20  ismatch");.     
18760 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a   return;.    }..
18770 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 52      if( eType==R
18780 42 55 5f 44 45 4c 45 54 45 20 26 26 20 70 49 74  BU_DELETE && pIt
18790 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 5d 3d 3d  er->abTblPk[i]==
187a0 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69  0 ){.      conti
187b0 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  nue;.    }..    
187c0 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  pVal = sqlite3_c
187d0 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 49 74 65  olumn_value(pIte
187e0 72 2d 3e 70 53 65 6c 65 63 74 2c 20 69 29 3b 0a  r->pSelect, i);.
187f0 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
18800 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70  te3_bind_value(p
18810 57 72 69 74 65 72 2c 20 69 2b 31 2c 20 70 56 61  Writer, i+1, pVa
18820 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72  l);.    if( p->r
18830 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a  c ) return;.  }.
18840 20 20 69 66 28 20 70 49 74 65 72 2d 3e 7a 49 64    if( pIter->zId
18850 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  x==0 ){.    if( 
18860 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
18870 55 5f 50 4b 5f 56 54 41 42 20 0a 20 20 20 20 20  U_PK_VTAB .     
18880 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  || pIter->eType=
18890 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 0a 20 20  =RBU_PK_NONE .  
188a0 20 20 20 7c 7c 20 28 70 49 74 65 72 2d 3e 65 54     || (pIter->eT
188b0 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45  ype==RBU_PK_EXTE
188c0 52 4e 41 4c 20 26 26 20 72 62 75 49 73 56 61 63  RNAL && rbuIsVac
188d0 75 75 6d 28 70 29 29 20 0a 20 20 20 20 29 7b 0a  uum(p)) .    ){.
188e0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 20 76        /* For a v
188f0 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 6f 72  irtual table, or
18900 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 6e 6f   a table with no
18910 20 70 72 69 6d 61 72 79 20 6b 65 79 2c 20 74 68   primary key, th
18920 65 20 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45  e .      ** SELE
18930 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 3a  CT statement is:
18940 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
18950 2a 2a 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c  **   SELECT <col
18960 73 3e 2c 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 2c  s>, rbu_control,
18970 20 72 62 75 5f 72 6f 77 69 64 20 46 52 4f 4d 20   rbu_rowid FROM 
18980 2e 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  .....      **.  
18990 20 20 20 20 2a 2a 20 48 65 6e 63 65 20 63 6f 6c      ** Hence col
189a0 75 6d 6e 5f 76 61 6c 75 65 28 70 49 74 65 72 2d  umn_value(pIter-
189b0 3e 6e 43 6f 6c 2b 31 29 2e 0a 20 20 20 20 20 20  >nCol+1)..      
189c0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 43  */.      assertC
189d0 6f 6c 75 6d 6e 4e 61 6d 65 28 70 49 74 65 72 2d  olumnName(pIter-
189e0 3e 70 53 65 6c 65 63 74 2c 20 70 49 74 65 72 2d  >pSelect, pIter-
189f0 3e 6e 43 6f 6c 2b 31 2c 20 0a 20 20 20 20 20 20  >nCol+1, .      
18a00 20 20 20 20 72 62 75 49 73 56 61 63 75 75 6d 28      rbuIsVacuum(
18a10 70 29 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 22  p) ? "rowid" : "
18a20 72 62 75 5f 72 6f 77 69 64 22 0a 20 20 20 20 20  rbu_rowid".     
18a30 20 29 3b 0a 20 20 20 20 20 20 70 56 61 6c 20 3d   );.      pVal =
18a40 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
18a50 76 61 6c 75 65 28 70 49 74 65 72 2d 3e 70 53 65  value(pIter->pSe
18a60 6c 65 63 74 2c 20 70 49 74 65 72 2d 3e 6e 43 6f  lect, pIter->nCo
18a70 6c 2b 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e 72  l+1);.      p->r
18a80 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
18a90 5f 76 61 6c 75 65 28 70 57 72 69 74 65 72 2c 20  _value(pWriter, 
18aa0 70 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31 2c 20 70  pIter->nCol+1, p
18ab0 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Val);.    }.  }.
18ac0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
18ad0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
18ae0 6c 69 74 65 33 5f 73 74 65 70 28 70 57 72 69 74  lite3_step(pWrit
18af0 65 72 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  er);.    p->rc =
18b00 20 72 65 73 65 74 41 6e 64 43 6f 6c 6c 65 63 74   resetAndCollect
18b10 45 72 72 6f 72 28 70 57 72 69 74 65 72 2c 20 26  Error(pWriter, &
18b20 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 7d  p->zErrmsg);.  }
18b30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
18b40 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74 68 65  unction does the
18b50 20 77 6f 72 6b 20 66 6f 72 20 61 6e 20 73 71 6c   work for an sql
18b60 69 74 65 33 72 62 75 5f 73 74 65 70 28 29 20 63  ite3rbu_step() c
18b70 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  all..**.** The o
18b80 62 6a 65 63 74 2d 69 74 65 72 61 74 6f 72 20 28  bject-iterator (
18b90 70 2d 3e 6f 62 6a 69 74 65 72 29 20 63 75 72 72  p->objiter) curr
18ba0 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ently points to 
18bb0 61 20 76 61 6c 69 64 20 6f 62 6a 65 63 74 2c 0a  a valid object,.
18bc0 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 70 75 74  ** and the input
18bd0 20 63 75 72 73 6f 72 20 28 70 2d 3e 6f 62 6a 69   cursor (p->obji
18be0 74 65 72 2e 70 53 65 6c 65 63 74 29 20 63 75 72  ter.pSelect) cur
18bf0 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
18c00 20 61 20 76 61 6c 69 64 0a 2a 2a 20 69 6e 70 75   a valid.** inpu
18c10 74 20 72 6f 77 2e 20 50 65 72 66 6f 72 6d 20 77  t row. Perform w
18c20 68 61 74 65 76 65 72 20 70 72 6f 63 65 73 73 69  hatever processi
18c30 6e 67 20 69 73 20 72 65 71 75 69 72 65 64 20 61  ng is required a
18c40 6e 64 20 72 65 74 75 72 6e 2e 0a 2a 2a 0a 2a 2a  nd return..**.**
18c50 20 49 66 20 6e 6f 20 20 65 72 72 6f 72 20 6f 63   If no  error oc
18c60 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  curs, SQLITE_OK 
18c70 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
18c80 65 72 77 69 73 65 2c 20 61 6e 20 65 72 72 6f 72  erwise, an error
18c90 20 63 6f 64 65 0a 2a 2a 20 61 6e 64 20 6d 65 73   code.** and mes
18ca0 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 20  sage is left in 
18cb0 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65 20 61  the RBU handle a
18cc0 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  nd a copy of the
18cd0 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 72   error code.** r
18ce0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
18cf0 69 63 20 69 6e 74 20 72 62 75 53 74 65 70 28 73  ic int rbuStep(s
18d00 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20  qlite3rbu *p){. 
18d10 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74   RbuObjIter *pIt
18d20 65 72 20 3d 20 26 70 2d 3e 6f 62 6a 69 74 65 72  er = &p->objiter
18d30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
18d40 7a 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 6e 74  zMask = 0;.  int
18d50 20 65 54 79 70 65 20 3d 20 72 62 75 53 74 65 70   eType = rbuStep
18d60 54 79 70 65 28 70 2c 20 26 7a 4d 61 73 6b 29 3b  Type(p, &zMask);
18d70 0a 0a 20 20 69 66 28 20 65 54 79 70 65 20 29 7b  ..  if( eType ){
18d80 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79  .    assert( eTy
18d90 70 65 3d 3d 52 42 55 5f 49 4e 53 45 52 54 20 20  pe==RBU_INSERT  
18da0 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 52 42 55     || eType==RBU
18db0 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20 20 20  _DELETE.        
18dc0 20 7c 7c 20 65 54 79 70 65 3d 3d 52 42 55 5f 52   || eType==RBU_R
18dd0 45 50 4c 41 43 45 20 20 20 20 7c 7c 20 65 54 79  EPLACE    || eTy
18de0 70 65 3d 3d 52 42 55 5f 49 44 58 5f 44 45 4c 45  pe==RBU_IDX_DELE
18df0 54 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 65  TE.         || e
18e00 54 79 70 65 3d 3d 52 42 55 5f 49 44 58 5f 49 4e  Type==RBU_IDX_IN
18e10 53 45 52 54 20 7c 7c 20 65 54 79 70 65 3d 3d 52  SERT || eType==R
18e20 42 55 5f 55 50 44 41 54 45 0a 20 20 20 20 29 3b  BU_UPDATE.    );
18e30 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79  .    assert( eTy
18e40 70 65 21 3d 52 42 55 5f 55 50 44 41 54 45 20 7c  pe!=RBU_UPDATE |
18e50 7c 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d 30  | pIter->zIdx==0
18e60 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 49 74   );..    if( pIt
18e70 65 72 2d 3e 7a 49 64 78 3d 3d 30 20 26 26 20 28  er->zIdx==0 && (
18e80 65 54 79 70 65 3d 3d 52 42 55 5f 49 44 58 5f 44  eType==RBU_IDX_D
18e90 45 4c 45 54 45 20 7c 7c 20 65 54 79 70 65 3d 3d  ELETE || eType==
18ea0 52 42 55 5f 49 44 58 5f 49 4e 53 45 52 54 29 20  RBU_IDX_INSERT) 
18eb0 29 7b 0a 20 20 20 20 20 20 72 62 75 42 61 64 43  ){.      rbuBadC
18ec0 6f 6e 74 72 6f 6c 45 72 72 6f 72 28 70 29 3b 0a  ontrolError(p);.
18ed0 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69      }.    else i
18ee0 66 28 20 65 54 79 70 65 3d 3d 52 42 55 5f 52 45  f( eType==RBU_RE
18ef0 50 4c 41 43 45 20 29 7b 0a 20 20 20 20 20 20 69  PLACE ){.      i
18f00 66 28 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d  f( pIter->zIdx==
18f10 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 ){.        p->
18f20 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20 2b 3d  nPhaseOneStep +=
18f30 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 6e 49 6e 64   p->objiter.nInd
18f40 65 78 3b 0a 20 20 20 20 20 20 20 20 72 62 75 53  ex;.        rbuS
18f50 74 65 70 4f 6e 65 4f 70 28 70 2c 20 52 42 55 5f  tepOneOp(p, RBU_
18f60 44 45 4c 45 54 45 29 3b 0a 20 20 20 20 20 20 7d  DELETE);.      }
18f70 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
18f80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 62  ==SQLITE_OK ) rb
18f90 75 53 74 65 70 4f 6e 65 4f 70 28 70 2c 20 52 42  uStepOneOp(p, RB
18fa0 55 5f 49 4e 53 45 52 54 29 3b 0a 20 20 20 20 7d  U_INSERT);.    }
18fb0 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 65 54  .    else if( eT
18fc0 79 70 65 21 3d 52 42 55 5f 55 50 44 41 54 45 20  ype!=RBU_UPDATE 
18fd0 29 7b 0a 20 20 20 20 20 20 72 62 75 53 74 65 70  ){.      rbuStep
18fe0 4f 6e 65 4f 70 28 70 2c 20 65 54 79 70 65 29 3b  OneOp(p, eType);
18ff0 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 7b  .    }.    else{
19000 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
19010 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 20 20  alue *pVal;.    
19020 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
19030 70 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20  pUpdate = 0;.   
19040 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65     assert( eType
19050 3d 3d 52 42 55 5f 55 50 44 41 54 45 20 29 3b 0a  ==RBU_UPDATE );.
19060 20 20 20 20 20 20 70 2d 3e 6e 50 68 61 73 65 4f        p->nPhaseO
19070 6e 65 53 74 65 70 20 2d 3d 20 70 2d 3e 6f 62 6a  neStep -= p->obj
19080 69 74 65 72 2e 6e 49 6e 64 65 78 3b 0a 20 20 20  iter.nIndex;.   
19090 20 20 20 72 62 75 47 65 74 55 70 64 61 74 65 53     rbuGetUpdateS
190a0 74 6d 74 28 70 2c 20 70 49 74 65 72 2c 20 7a 4d  tmt(p, pIter, zM
190b0 61 73 6b 2c 20 26 70 55 70 64 61 74 65 29 3b 0a  ask, &pUpdate);.
190c0 20 20 20 20 20 20 69 66 28 20 70 55 70 64 61 74        if( pUpdat
190d0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  e ){.        int
190e0 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   i;.        for(
190f0 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  i=0; p->rc==SQLI
19100 54 45 5f 4f 4b 20 26 26 20 69 3c 70 49 74 65 72  TE_OK && i<pIter
19110 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
19120 20 20 20 20 20 20 20 20 63 68 61 72 20 63 20 3d          char c =
19130 20 7a 4d 61 73 6b 5b 70 49 74 65 72 2d 3e 61 69   zMask[pIter->ai
19140 53 72 63 4f 72 64 65 72 5b 69 5d 5d 3b 0a 20 20  SrcOrder[i]];.  
19150 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 73          pVal = s
19160 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61  qlite3_column_va
19170 6c 75 65 28 70 49 74 65 72 2d 3e 70 53 65 6c 65  lue(pIter->pSele
19180 63 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  ct, i);.        
19190 20 20 69 66 28 20 70 49 74 65 72 2d 3e 61 62 54    if( pIter->abT
191a0 62 6c 50 6b 5b 69 5d 20 7c 7c 20 63 21 3d 27 2e  blPk[i] || c!='.
191b0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ' ){.           
191c0 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
191d0 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70 55 70 64  _bind_value(pUpd
191e0 61 74 65 2c 20 69 2b 31 2c 20 70 56 61 6c 29 3b  ate, i+1, pVal);
191f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
19200 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
19210 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
19220 5f 4f 4b 20 0a 20 20 20 20 20 20 20 20 20 26 26  _OK .         &&
19230 20 28 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d   (pIter->eType==
19240 52 42 55 5f 50 4b 5f 56 54 41 42 20 7c 7c 20 70  RBU_PK_VTAB || p
19250 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55  Iter->eType==RBU
19260 5f 50 4b 5f 4e 4f 4e 45 29 20 0a 20 20 20 20 20  _PK_NONE) .     
19270 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
19280 2f 2a 20 42 69 6e 64 20 74 68 65 20 72 62 75 5f  /* Bind the rbu_
19290 72 6f 77 69 64 20 76 61 6c 75 65 20 74 6f 20 63  rowid value to c
192a0 6f 6c 75 6d 6e 20 5f 72 6f 77 69 64 5f 20 2a 2f  olumn _rowid_ */
192b0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
192c0 74 43 6f 6c 75 6d 6e 4e 61 6d 65 28 70 49 74 65  tColumnName(pIte
192d0 72 2d 3e 70 53 65 6c 65 63 74 2c 20 70 49 74 65  r->pSelect, pIte
192e0 72 2d 3e 6e 43 6f 6c 2b 31 2c 20 22 72 62 75 5f  r->nCol+1, "rbu_
192f0 72 6f 77 69 64 22 29 3b 0a 20 20 20 20 20 20 20  rowid");.       
19300 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65     pVal = sqlite
19310 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70  3_column_value(p
19320 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 2c 20 70  Iter->pSelect, p
19330 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31 29 3b 0a 20  Iter->nCol+1);. 
19340 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
19350 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61   sqlite3_bind_va
19360 6c 75 65 28 70 55 70 64 61 74 65 2c 20 70 49 74  lue(pUpdate, pIt
19370 65 72 2d 3e 6e 43 6f 6c 2b 31 2c 20 70 56 61 6c  er->nCol+1, pVal
19380 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
19390 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
193a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
193b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
193c0 74 65 70 28 70 55 70 64 61 74 65 29 3b 0a 20 20  tep(pUpdate);.  
193d0 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
193e0 72 65 73 65 74 41 6e 64 43 6f 6c 6c 65 63 74 45  resetAndCollectE
193f0 72 72 6f 72 28 70 55 70 64 61 74 65 2c 20 26 70  rror(pUpdate, &p
19400 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20  ->zErrmsg);.    
19410 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
19420 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
19430 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   p->rc;.}../*.**
19440 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 73   Increment the s
19450 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 6f 66 20  chema cookie of 
19460 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
19470 65 20 6f 70 65 6e 65 64 20 62 79 20 70 2d 3e 64  e opened by p->d
19480 62 4d 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c  bMain..**.** Or,
19490 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 52   if this is an R
194a0 42 55 20 76 61 63 75 75 6d 2c 20 73 65 74 20 74  BU vacuum, set t
194b0 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
194c0 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 64 62 0a   of the main db.
194d0 2a 2a 20 6f 70 65 6e 65 64 20 62 79 20 70 2d 3e  ** opened by p->
194e0 64 62 4d 61 69 6e 20 74 6f 20 6f 6e 65 20 6d 6f  dbMain to one mo
194f0 72 65 20 74 68 61 6e 20 74 68 65 20 73 63 68 65  re than the sche
19500 6d 61 20 63 6f 6f 6b 69 65 20 6f 66 20 74 68 65  ma cookie of the
19510 20 6d 61 69 6e 0a 2a 2a 20 64 62 20 6f 70 65 6e   main.** db open
19520 65 64 20 62 79 20 70 2d 3e 64 62 52 62 75 2e 0a  ed by p->dbRbu..
19530 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
19540 62 75 49 6e 63 72 53 63 68 65 6d 61 43 6f 6f 6b  buIncrSchemaCook
19550 69 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  ie(sqlite3rbu *p
19560 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ){.  if( p->rc==
19570 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19580 20 73 71 6c 69 74 65 33 20 2a 64 62 72 65 61 64   sqlite3 *dbread
19590 20 3d 20 28 72 62 75 49 73 56 61 63 75 75 6d 28   = (rbuIsVacuum(
195a0 70 29 20 3f 20 70 2d 3e 64 62 52 62 75 20 3a 20  p) ? p->dbRbu : 
195b0 70 2d 3e 64 62 4d 61 69 6e 29 3b 0a 20 20 20 20  p->dbMain);.    
195c0 69 6e 74 20 69 43 6f 6f 6b 69 65 20 3d 20 31 30  int iCookie = 10
195d0 30 30 30 30 30 3b 0a 20 20 20 20 73 71 6c 69 74  00000;.    sqlit
195e0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
195f0 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65  .    p->rc = pre
19600 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  pareAndCollectEr
19610 72 6f 72 28 64 62 72 65 61 64 2c 20 26 70 53 74  ror(dbread, &pSt
19620 6d 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c  mt, &p->zErrmsg,
19630 20 0a 20 20 20 20 20 20 20 20 22 50 52 41 47 4d   .        "PRAGM
19640 41 20 73 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e  A schema_version
19650 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  ".    );.    if(
19660 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
19670 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f  K ){.      /* Co
19680 76 65 72 61 67 65 3a 20 69 74 20 6d 61 79 20 62  verage: it may b
19690 65 20 74 68 61 74 20 74 68 69 73 20 73 71 6c 69  e that this sqli
196a0 74 65 33 5f 73 74 65 70 28 29 20 63 61 6e 6e 6f  te3_step() canno
196b0 74 20 66 61 69 6c 2e 20 54 68 65 72 65 0a 20 20  t fail. There.  
196c0 20 20 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64      ** is alread
196d0 79 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  y a transaction 
196e0 6f 70 65 6e 2c 20 73 6f 20 74 68 65 20 70 72 65  open, so the pre
196f0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
19700 63 61 6e 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20  cannot.      ** 
19710 74 68 72 6f 77 20 61 6e 20 53 51 4c 49 54 45 5f  throw an SQLITE_
19720 53 43 48 45 4d 41 20 65 78 63 65 70 74 69 6f 6e  SCHEMA exception
19730 2e 20 54 68 65 20 6f 6e 6c 79 20 64 61 74 61 62  . The only datab
19740 61 73 65 20 70 61 67 65 20 74 68 65 0a 20 20 20  ase page the.   
19750 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
19760 72 65 61 64 73 20 69 73 20 70 61 67 65 20 31 2c  reads is page 1,
19770 20 77 68 69 63 68 20 69 73 20 67 75 61 72 61 6e   which is guaran
19780 74 65 65 64 20 74 6f 20 62 65 20 69 6e 20 74 68  teed to be in th
19790 65 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a  e cache..      *
197a0 2a 20 41 6e 64 20 6e 6f 20 6d 65 6d 6f 72 79 20  * And no memory 
197b0 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 72 65 20  allocations are 
197c0 72 65 71 75 69 72 65 64 2e 20 20 2a 2f 0a 20 20  required.  */.  
197d0 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52      if( SQLITE_R
197e0 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
197f0 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20  (pStmt) ){.     
19800 20 20 20 69 43 6f 6f 6b 69 65 20 3d 20 73 71 6c     iCookie = sql
19810 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
19820 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20  pStmt, 0);.     
19830 20 7d 0a 20 20 20 20 20 20 72 62 75 46 69 6e 61   }.      rbuFina
19840 6c 69 7a 65 28 70 2c 20 70 53 74 6d 74 29 3b 0a  lize(p, pStmt);.
19850 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
19860 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
19870 7b 0a 20 20 20 20 20 20 72 62 75 4d 50 72 69 6e  {.      rbuMPrin
19880 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64 62 4d  tfExec(p, p->dbM
19890 61 69 6e 2c 20 22 50 52 41 47 4d 41 20 73 63 68  ain, "PRAGMA sch
198a0 65 6d 61 5f 76 65 72 73 69 6f 6e 20 3d 20 25 64  ema_version = %d
198b0 22 2c 20 69 43 6f 6f 6b 69 65 2b 31 29 3b 0a 20  ", iCookie+1);. 
198c0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
198d0 2a 20 55 70 64 61 74 65 20 74 68 65 20 63 6f 6e  * Update the con
198e0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 72 62 75  tents of the rbu
198f0 5f 73 74 61 74 65 20 74 61 62 6c 65 20 77 69 74  _state table wit
19900 68 69 6e 20 74 68 65 20 72 62 75 20 64 61 74 61  hin the rbu data
19910 62 61 73 65 2e 20 54 68 65 0a 2a 2a 20 76 61 6c  base. The.** val
19920 75 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ue stored in the
19930 20 52 42 55 5f 53 54 41 54 45 5f 53 54 41 47 45   RBU_STATE_STAGE
19940 20 63 6f 6c 75 6d 6e 20 69 73 20 65 53 74 61 67   column is eStag
19950 65 2e 20 41 6c 6c 20 6f 74 68 65 72 20 76 61 6c  e. All other val
19960 75 65 73 0a 2a 2a 20 61 72 65 20 64 65 74 65 72  ues.** are deter
19970 6d 69 6e 65 64 20 62 79 20 69 6e 73 70 65 63 74  mined by inspect
19980 69 6e 67 20 74 68 65 20 72 62 75 20 68 61 6e 64  ing the rbu hand
19990 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  le passed as the
199a0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
199b0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
199c0 72 62 75 53 61 76 65 53 74 61 74 65 28 73 71 6c  rbuSaveState(sql
199d0 69 74 65 33 72 62 75 20 2a 70 2c 20 69 6e 74 20  ite3rbu *p, int 
199e0 65 53 74 61 67 65 29 7b 0a 20 20 69 66 28 20 70  eStage){.  if( p
199f0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
19a00 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  || p->rc==SQLITE
19a10 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 73 71 6c  _DONE ){.    sql
19a20 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 6e 73 65  ite3_stmt *pInse
19a30 72 74 20 3d 20 30 3b 0a 20 20 20 20 72 62 75 5f  rt = 0;.    rbu_
19a40 66 69 6c 65 20 2a 70 46 64 20 3d 20 28 72 62 75  file *pFd = (rbu
19a50 49 73 56 61 63 75 75 6d 28 70 29 20 3f 20 70 2d  IsVacuum(p) ? p-
19a60 3e 70 52 62 75 46 64 20 3a 20 70 2d 3e 70 54 61  >pRbuFd : p->pTa
19a70 72 67 65 74 46 64 29 3b 0a 20 20 20 20 69 6e 74  rgetFd);.    int
19a80 20 72 63 3b 0a 0a 20 20 20 20 61 73 73 65 72 74   rc;..    assert
19a90 28 20 70 2d 3e 7a 45 72 72 6d 73 67 3d 3d 30 20  ( p->zErrmsg==0 
19aa0 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 72 65 70  );.    rc = prep
19ab0 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63  areFreeAndCollec
19ac0 74 45 72 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c  tError(p->dbRbu,
19ad0 20 26 70 49 6e 73 65 72 74 2c 20 26 70 2d 3e 7a   &pInsert, &p->z
19ae0 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20 20 20  Errmsg, .       
19af0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
19b00 28 0a 20 20 20 20 20 20 20 20 20 20 22 49 4e 53  (.          "INS
19b10 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20 49  ERT OR REPLACE I
19b20 4e 54 4f 20 25 73 2e 72 62 75 5f 73 74 61 74 65  NTO %s.rbu_state
19b30 28 6b 2c 20 76 29 20 56 41 4c 55 45 53 20 22 0a  (k, v) VALUES ".
19b40 20 20 20 20 20 20 20 20 20 20 22 28 25 64 2c 20            "(%d, 
19b50 25 64 29 2c 20 22 0a 20 20 20 20 20 20 20 20 20  %d), ".         
19b60 20 22 28 25 64 2c 20 25 51 29 2c 20 22 0a 20 20   "(%d, %Q), ".  
19b70 20 20 20 20 20 20 20 20 22 28 25 64 2c 20 25 51          "(%d, %Q
19b80 29 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 22  ), ".          "
19b90 28 25 64 2c 20 25 64 29 2c 20 22 0a 20 20 20 20  (%d, %d), ".    
19ba0 20 20 20 20 20 20 22 28 25 64 2c 20 25 64 29 2c        "(%d, %d),
19bb0 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 28 25   ".          "(%
19bc0 64 2c 20 25 6c 6c 64 29 2c 20 22 0a 20 20 20 20  d, %lld), ".    
19bd0 20 20 20 20 20 20 22 28 25 64 2c 20 25 6c 6c 64        "(%d, %lld
19be0 29 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 22  ), ".          "
19bf0 28 25 64 2c 20 25 6c 6c 64 29 2c 20 22 0a 20 20  (%d, %lld), ".  
19c00 20 20 20 20 20 20 20 20 22 28 25 64 2c 20 25 6c          "(%d, %l
19c10 6c 64 29 2c 20 22 0a 20 20 20 20 20 20 20 20 20  ld), ".         
19c20 20 22 28 25 64 2c 20 25 51 29 20 20 22 2c 0a 20   "(%d, %Q)  ",. 
19c30 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 53 74 61           p->zSta
19c40 74 65 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20  teDb,.          
19c50 52 42 55 5f 53 54 41 54 45 5f 53 54 41 47 45 2c  RBU_STATE_STAGE,
19c60 20 65 53 74 61 67 65 2c 0a 20 20 20 20 20 20 20   eStage,.       
19c70 20 20 20 52 42 55 5f 53 54 41 54 45 5f 54 42 4c     RBU_STATE_TBL
19c80 2c 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 7a 54 62  , p->objiter.zTb
19c90 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20 52 42  l, .          RB
19ca0 55 5f 53 54 41 54 45 5f 49 44 58 2c 20 70 2d 3e  U_STATE_IDX, p->
19cb0 6f 62 6a 69 74 65 72 2e 7a 49 64 78 2c 20 0a 20  objiter.zIdx, . 
19cc0 20 20 20 20 20 20 20 20 20 52 42 55 5f 53 54 41           RBU_STA
19cd0 54 45 5f 52 4f 57 2c 20 70 2d 3e 6e 53 74 65 70  TE_ROW, p->nStep
19ce0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 52 42 55  , .          RBU
19cf0 5f 53 54 41 54 45 5f 50 52 4f 47 52 45 53 53 2c  _STATE_PROGRESS,
19d00 20 70 2d 3e 6e 50 72 6f 67 72 65 73 73 2c 0a 20   p->nProgress,. 
19d10 20 20 20 20 20 20 20 20 20 52 42 55 5f 53 54 41           RBU_STA
19d20 54 45 5f 43 4b 50 54 2c 20 70 2d 3e 69 57 61 6c  TE_CKPT, p->iWal
19d30 43 6b 73 75 6d 2c 0a 20 20 20 20 20 20 20 20 20  Cksum,.         
19d40 20 52 42 55 5f 53 54 41 54 45 5f 43 4f 4f 4b 49   RBU_STATE_COOKI
19d50 45 2c 20 28 69 36 34 29 70 46 64 2d 3e 69 43 6f  E, (i64)pFd->iCo
19d60 6f 6b 69 65 2c 0a 20 20 20 20 20 20 20 20 20 20  okie,.          
19d70 52 42 55 5f 53 54 41 54 45 5f 4f 41 4c 53 5a 2c  RBU_STATE_OALSZ,
19d80 20 70 2d 3e 69 4f 61 6c 53 7a 2c 0a 20 20 20 20   p->iOalSz,.    
19d90 20 20 20 20 20 20 52 42 55 5f 53 54 41 54 45 5f        RBU_STATE_
19da0 50 48 41 53 45 4f 4e 45 53 54 45 50 2c 20 70 2d  PHASEONESTEP, p-
19db0 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 2c 0a  >nPhaseOneStep,.
19dc0 20 20 20 20 20 20 20 20 20 20 52 42 55 5f 53 54            RBU_ST
19dd0 41 54 45 5f 44 41 54 41 54 42 4c 2c 20 70 2d 3e  ATE_DATATBL, p->
19de0 6f 62 6a 69 74 65 72 2e 7a 44 61 74 61 54 62 6c  objiter.zDataTbl
19df0 0a 20 20 20 20 20 20 29 0a 20 20 20 20 29 3b 0a  .      ).    );.
19e00 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 73      assert( pIns
19e10 65 72 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  ert==0 || rc==SQ
19e20 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20  LITE_OK );..    
19e30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19e40 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
19e50 65 33 5f 73 74 65 70 28 70 49 6e 73 65 72 74 29  e3_step(pInsert)
19e60 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
19e70 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 49  ite3_finalize(pI
19e80 6e 73 65 72 74 29 3b 0a 20 20 20 20 7d 0a 20 20  nsert);.    }.  
19e90 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19ea0 5f 4f 4b 20 29 20 70 2d 3e 72 63 20 3d 20 72 63  _OK ) p->rc = rc
19eb0 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
19ec0 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
19ed0 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  ent passed to th
19ee0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74  is function is t
19ef0 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 50 52 41  he name of a PRA
19f00 47 4d 41 20 0a 2a 2a 20 73 65 74 74 69 6e 67 20  GMA .** setting 
19f10 2d 20 22 70 61 67 65 5f 73 69 7a 65 22 2c 20 22  - "page_size", "
19f20 61 75 74 6f 5f 76 61 63 75 75 6d 22 2c 20 22 75  auto_vacuum", "u
19f30 73 65 72 5f 76 65 72 73 69 6f 6e 22 20 6f 72 20  ser_version" or 
19f40 22 61 70 70 6c 69 63 61 74 69 6f 6e 5f 69 64 22  "application_id"
19f50 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  ..** This functi
19f60 6f 6e 20 65 78 65 63 75 74 65 73 20 74 68 65 20  on executes the 
19f70 66 6f 6c 6c 6f 77 69 6e 67 20 6f 6e 20 73 71 6c  following on sql
19f80 69 74 65 33 72 62 75 2e 64 62 52 62 75 3a 0a 2a  ite3rbu.dbRbu:.*
19f90 2a 0a 2a 2a 20 20 20 22 50 52 41 47 4d 41 20 6d  *.**   "PRAGMA m
19fa0 61 69 6e 2e 24 7a 50 72 61 67 6d 61 22 0a 2a 2a  ain.$zPragma".**
19fb0 0a 2a 2a 20 77 68 65 72 65 20 24 7a 50 72 61 67  .** where $zPrag
19fc0 6d 61 20 69 73 20 74 68 65 20 73 74 72 69 6e 67  ma is the string
19fd0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
19fe0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20  econd argument, 
19ff0 74 68 65 6e 0a 2a 2a 20 6f 6e 20 73 71 6c 69 74  then.** on sqlit
1a000 65 33 72 62 75 2e 64 62 4d 61 69 6e 3a 0a 2a 2a  e3rbu.dbMain:.**
1a010 0a 2a 2a 20 20 20 22 50 52 41 47 4d 41 20 6d 61  .**   "PRAGMA ma
1a020 69 6e 2e 24 7a 50 72 61 67 6d 61 20 3d 20 24 76  in.$zPragma = $v
1a030 61 6c 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  al".**.** where 
1a040 24 76 61 6c 20 69 73 20 74 68 65 20 76 61 6c 75  $val is the valu
1a050 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
1a060 65 20 66 69 72 73 74 20 50 52 41 47 4d 41 20 69  e first PRAGMA i
1a070 6e 76 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  nvocation..**.**
1a080 20 49 6e 20 73 68 6f 72 74 2c 20 69 74 20 63 6f   In short, it co
1a090 70 69 65 73 20 74 68 65 20 76 61 6c 75 65 20 20  pies the value  
1a0a0 6f 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64  of the specified
1a0b0 20 50 52 41 47 4d 41 20 73 65 74 74 69 6e 67 20   PRAGMA setting 
1a0c0 66 72 6f 6d 0a 2a 2a 20 64 62 52 62 75 20 74 6f  from.** dbRbu to
1a0d0 20 64 62 4d 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74   dbMain..*/.stat
1a0e0 69 63 20 76 6f 69 64 20 72 62 75 43 6f 70 79 50  ic void rbuCopyP
1a0f0 72 61 67 6d 61 28 73 71 6c 69 74 65 33 72 62 75  ragma(sqlite3rbu
1a100 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
1a110 2a 7a 50 72 61 67 6d 61 29 7b 0a 20 20 69 66 28  *zPragma){.  if(
1a120 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1a130 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
1a140 5f 73 74 6d 74 20 2a 70 50 72 61 67 6d 61 20 3d  _stmt *pPragma =
1a150 20 30 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   0;.    p->rc = 
1a160 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f  prepareFreeAndCo
1a170 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62  llectError(p->db
1a180 52 62 75 2c 20 26 70 50 72 61 67 6d 61 2c 20 26  Rbu, &pPragma, &
1a190 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20  p->zErrmsg, .   
1a1a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72       sqlite3_mpr
1a1b0 69 6e 74 66 28 22 50 52 41 47 4d 41 20 6d 61 69  intf("PRAGMA mai
1a1c0 6e 2e 25 73 22 2c 20 7a 50 72 61 67 6d 61 29 0a  n.%s", zPragma).
1a1d0 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70      );.    if( p
1a1e0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1a1f0 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  && SQLITE_ROW==s
1a200 71 6c 69 74 65 33 5f 73 74 65 70 28 70 50 72 61  qlite3_step(pPra
1a210 67 6d 61 29 20 29 7b 0a 20 20 20 20 20 20 70 2d  gma) ){.      p-
1a220 3e 72 63 20 3d 20 72 62 75 4d 50 72 69 6e 74 66  >rc = rbuMPrintf
1a230 45 78 65 63 28 70 2c 20 70 2d 3e 64 62 4d 61 69  Exec(p, p->dbMai
1a240 6e 2c 20 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e  n, "PRAGMA main.
1a250 25 73 20 3d 20 25 64 22 2c 0a 20 20 20 20 20 20  %s = %d",.      
1a260 20 20 20 20 7a 50 72 61 67 6d 61 2c 20 73 71 6c      zPragma, sql
1a270 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
1a280 70 50 72 61 67 6d 61 2c 20 30 29 0a 20 20 20 20  pPragma, 0).    
1a290 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72    );.    }.    r
1a2a0 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 50  buFinalize(p, pP
1a2b0 72 61 67 6d 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ragma);.  }.}../
1a2c0 2a 0a 2a 2a 20 54 68 65 20 52 42 55 20 68 61 6e  *.** The RBU han
1a2d0 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dle passed as th
1a2e0 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20  e only argument 
1a2f0 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 6f 70  has just been op
1a300 65 6e 65 64 20 61 6e 64 20 0a 2a 2a 20 74 68 65  ened and .** the
1a310 20 73 74 61 74 65 20 64 61 74 61 62 61 73 65 20   state database 
1a320 69 73 20 65 6d 70 74 79 2e 20 49 66 20 74 68 69  is empty. If thi
1a330 73 20 52 42 55 20 68 61 6e 64 6c 65 20 77 61 73  s RBU handle was
1a340 20 6f 70 65 6e 65 64 20 66 6f 72 20 61 6e 0a 2a   opened for an.*
1a350 2a 20 52 42 55 20 76 61 63 75 75 6d 20 6f 70 65  * RBU vacuum ope
1a360 72 61 74 69 6f 6e 2c 20 63 72 65 61 74 65 20 74  ration, create t
1a370 68 65 20 73 63 68 65 6d 61 20 69 6e 20 74 68 65  he schema in the
1a380 20 74 61 72 67 65 74 20 64 62 2e 0a 2a 2f 0a 73   target db..*/.s
1a390 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 43 72  tatic void rbuCr
1a3a0 65 61 74 65 54 61 72 67 65 74 53 63 68 65 6d 61  eateTargetSchema
1a3b0 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b  (sqlite3rbu *p){
1a3c0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1a3d0 2a 70 53 71 6c 20 3d 20 30 3b 0a 20 20 73 71 6c  *pSql = 0;.  sql
1a3e0 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 6e 73 65  ite3_stmt *pInse
1a3f0 72 74 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  rt = 0;..  asser
1a400 74 28 20 72 62 75 49 73 56 61 63 75 75 6d 28 70  t( rbuIsVacuum(p
1a410 29 20 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 73  ) );.  p->rc = s
1a420 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
1a430 62 4d 61 69 6e 2c 20 22 50 52 41 47 4d 41 20 77  bMain, "PRAGMA w
1a440 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 31  ritable_schema=1
1a450 22 2c 20 30 2c 30 2c 20 26 70 2d 3e 7a 45 72 72  ", 0,0, &p->zErr
1a460 6d 73 67 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72  msg);.  if( p->r
1a470 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1a480 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70      p->rc = prep
1a490 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  areAndCollectErr
1a4a0 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20 26 70 53  or(p->dbRbu, &pS
1a4b0 71 6c 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c  ql, &p->zErrmsg,
1a4c0 20 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20   .      "SELECT 
1a4d0 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  sql FROM sqlite_
1a4e0 6d 61 73 74 65 72 20 57 48 45 52 45 20 73 71 6c  master WHERE sql
1a4f0 21 3d 27 27 20 41 4e 44 20 72 6f 6f 74 70 61 67  !='' AND rootpag
1a500 65 21 3d 30 22 0a 20 20 20 20 20 20 22 20 41 4e  e!=0".      " AN
1a510 44 20 6e 61 6d 65 21 3d 27 73 71 6c 69 74 65 5f  D name!='sqlite_
1a520 73 65 71 75 65 6e 63 65 27 20 22 0a 20 20 20 20  sequence' ".    
1a530 20 20 22 20 4f 52 44 45 52 20 42 59 20 74 79 70    " ORDER BY typ
1a540 65 20 44 45 53 43 22 0a 20 20 20 20 29 3b 0a 20  e DESC".    );. 
1a550 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e   }..  while( p->
1a560 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1a570 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
1a580 71 6c 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  ql)==SQLITE_ROW 
1a590 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
1a5a0 72 20 2a 7a 53 71 6c 20 3d 20 28 63 6f 6e 73 74  r *zSql = (const
1a5b0 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
1a5c0 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c  olumn_text(pSql,
1a5d0 20 30 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d   0);.    p->rc =
1a5e0 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
1a5f0 3e 64 62 4d 61 69 6e 2c 20 7a 53 71 6c 2c 20 30  >dbMain, zSql, 0
1a600 2c 20 30 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  , 0, &p->zErrmsg
1a610 29 3b 0a 20 20 7d 0a 20 20 72 62 75 46 69 6e 61  );.  }.  rbuFina
1a620 6c 69 7a 65 28 70 2c 20 70 53 71 6c 29 3b 0a 20  lize(p, pSql);. 
1a630 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49   if( p->rc!=SQLI
1a640 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 3b 0a  TE_OK ) return;.
1a650 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
1a660 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
1a670 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 41 6e  ->rc = prepareAn
1a680 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d  dCollectError(p-
1a690 3e 64 62 52 62 75 2c 20 26 70 53 71 6c 2c 20 26  >dbRbu, &pSql, &
1a6a0 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20  p->zErrmsg, .   
1a6b0 20 20 20 20 20 22 53 45 4c 45 43 54 20 2a 20 46       "SELECT * F
1a6c0 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
1a6d0 72 20 57 48 45 52 45 20 72 6f 6f 74 70 61 67 65  r WHERE rootpage
1a6e0 3d 30 20 4f 52 20 72 6f 6f 74 70 61 67 65 20 49  =0 OR rootpage I
1a6f0 53 20 4e 55 4c 4c 22 20 0a 20 20 20 20 29 3b 0a  S NULL" .    );.
1a700 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63    }..  if( p->rc
1a710 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1a720 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61     p->rc = prepa
1a730 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f  reAndCollectErro
1a740 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 49  r(p->dbMain, &pI
1a750 6e 73 65 72 74 2c 20 26 70 2d 3e 7a 45 72 72 6d  nsert, &p->zErrm
1a760 73 67 2c 20 0a 20 20 20 20 20 20 20 20 22 49 4e  sg, .        "IN
1a770 53 45 52 54 20 49 4e 54 4f 20 73 71 6c 69 74 65  SERT INTO sqlite
1a780 5f 6d 61 73 74 65 72 20 56 41 4c 55 45 53 28 3f  _master VALUES(?
1a790 2c 3f 2c 3f 2c 3f 2c 3f 29 22 0a 20 20 20 20 29  ,?,?,?,?)".    )
1a7a0 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  ;.  }..  while( 
1a7b0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1a7c0 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 65 70   && sqlite3_step
1a7d0 28 70 53 71 6c 29 3d 3d 53 51 4c 49 54 45 5f 52  (pSql)==SQLITE_R
1a7e0 4f 57 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  OW ){.    int i;
1a7f0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1a800 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  5; i++){.      s
1a810 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75  qlite3_bind_valu
1a820 65 28 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20  e(pInsert, i+1, 
1a830 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76  sqlite3_column_v
1a840 61 6c 75 65 28 70 53 71 6c 2c 20 69 29 29 3b 0a  alue(pSql, i));.
1a850 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1a860 33 5f 73 74 65 70 28 70 49 6e 73 65 72 74 29 3b  3_step(pInsert);
1a870 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c  .    p->rc = sql
1a880 69 74 65 33 5f 72 65 73 65 74 28 70 49 6e 73 65  ite3_reset(pInse
1a890 72 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  rt);.  }.  if( p
1a8a0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1a8b0 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  ){.    p->rc = s
1a8c0 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
1a8d0 62 4d 61 69 6e 2c 20 22 50 52 41 47 4d 41 20 77  bMain, "PRAGMA w
1a8e0 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 30  ritable_schema=0
1a8f0 22 2c 30 2c 30 2c 26 70 2d 3e 7a 45 72 72 6d 73  ",0,0,&p->zErrms
1a900 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 62 75 46 69  g);.  }..  rbuFi
1a910 6e 61 6c 69 7a 65 28 70 2c 20 70 53 71 6c 29 3b  nalize(p, pSql);
1a920 0a 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70  .  rbuFinalize(p
1a930 2c 20 70 49 6e 73 65 72 74 29 3b 0a 7d 0a 0a 2f  , pInsert);.}../
1a940 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 52 42  *.** Step the RB
1a950 55 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 69 6e 74  U object..*/.int
1a960 20 73 71 6c 69 74 65 33 72 62 75 5f 73 74 65 70   sqlite3rbu_step
1a970 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b  (sqlite3rbu *p){
1a980 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
1a990 73 77 69 74 63 68 28 20 70 2d 3e 65 53 74 61 67  switch( p->eStag
1a9a0 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
1a9b0 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 3a 20 7b  RBU_STAGE_OAL: {
1a9c0 0a 20 20 20 20 20 20 20 20 52 62 75 4f 62 6a 49  .        RbuObjI
1a9d0 74 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70 2d  ter *pIter = &p-
1a9e0 3e 6f 62 6a 69 74 65 72 3b 0a 0a 20 20 20 20 20  >objiter;..     
1a9f0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
1aa00 20 61 6e 20 52 42 55 20 76 61 63 75 75 6d 20 6f   an RBU vacuum o
1aa10 70 65 72 61 74 69 6f 6e 20 61 6e 64 20 74 68 65  peration and the
1aa20 20 73 74 61 74 65 20 74 61 62 6c 65 20 77 61 73   state table was
1aa30 20 65 6d 70 74 79 0a 20 20 20 20 20 20 20 20 2a   empty.        *
1aa40 2a 20 77 68 65 6e 20 74 68 69 73 20 68 61 6e 64  * when this hand
1aa50 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 2c 20 63  le was opened, c
1aa60 72 65 61 74 65 20 74 68 65 20 74 61 72 67 65 74  reate the target
1aa70 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
1aa80 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
1aa90 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 29 20   rbuIsVacuum(p) 
1aaa0 26 26 20 70 2d 3e 6e 50 72 6f 67 72 65 73 73 3d  && p->nProgress=
1aab0 3d 30 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c  =0 && p->rc==SQL
1aac0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1aad0 20 20 20 20 72 62 75 43 72 65 61 74 65 54 61 72      rbuCreateTar
1aae0 67 65 74 53 63 68 65 6d 61 28 70 29 3b 0a 20 20  getSchema(p);.  
1aaf0 20 20 20 20 20 20 20 20 72 62 75 43 6f 70 79 50          rbuCopyP
1ab00 72 61 67 6d 61 28 70 2c 20 22 75 73 65 72 5f 76  ragma(p, "user_v
1ab10 65 72 73 69 6f 6e 22 29 3b 0a 20 20 20 20 20 20  ersion");.      
1ab20 20 20 20 20 72 62 75 43 6f 70 79 50 72 61 67 6d      rbuCopyPragm
1ab30 61 28 70 2c 20 22 61 70 70 6c 69 63 61 74 69 6f  a(p, "applicatio
1ab40 6e 5f 69 64 22 29 3b 0a 20 20 20 20 20 20 20 20  n_id");.        
1ab50 7d 0a 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  }..        while
1ab60 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1ab70 4f 4b 20 26 26 20 70 49 74 65 72 2d 3e 7a 54 62  OK && pIter->zTb
1ab80 6c 20 29 7b 0a 0a 20 20 20 20 20 20 20 20 20 20  l ){..          
1ab90 69 66 28 20 70 49 74 65 72 2d 3e 62 43 6c 65 61  if( pIter->bClea
1aba0 6e 75 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nup ){.         
1abb0 20 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 74     /* Clean up t
1abc0 68 65 20 72 62 75 5f 74 6d 70 5f 78 78 78 20 74  he rbu_tmp_xxx t
1abd0 61 62 6c 65 20 66 6f 72 20 74 68 65 20 70 72 65  able for the pre
1abe0 76 69 6f 75 73 20 74 61 62 6c 65 2e 20 49 74 20  vious table. It 
1abf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1ac00 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65  cannot be droppe
1ac10 64 20 61 73 20 74 68 65 72 65 20 61 72 65 20 63  d as there are c
1ac20 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20  urrently active 
1ac30 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  SQL statements..
1ac40 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 42              ** B
1ac50 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ut the contents 
1ac60 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e 20  can be deleted. 
1ac70 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1ac80 69 66 28 20 72 62 75 49 73 56 61 63 75 75 6d 28  if( rbuIsVacuum(
1ac90 70 29 3d 3d 30 20 26 26 20 70 49 74 65 72 2d 3e  p)==0 && pIter->
1aca0 61 62 49 6e 64 65 78 65 64 20 29 7b 0a 20 20 20  abIndexed ){.   
1acb0 20 20 20 20 20 20 20 20 20 20 20 72 62 75 4d 50             rbuMP
1acc0 72 69 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e  rintfExec(p, p->
1acd0 64 62 52 62 75 2c 20 0a 20 20 20 20 20 20 20 20  dbRbu, .        
1ace0 20 20 20 20 20 20 20 20 20 20 22 44 45 4c 45 54            "DELET
1acf0 45 20 46 52 4f 4d 20 25 73 2e 27 72 62 75 5f 74  E FROM %s.'rbu_t
1ad00 6d 70 5f 25 71 27 22 2c 20 70 2d 3e 7a 53 74 61  mp_%q'", p->zSta
1ad10 74 65 44 62 2c 20 70 49 74 65 72 2d 3e 7a 44 61  teDb, pIter->zDa
1ad20 74 61 54 62 6c 0a 20 20 20 20 20 20 20 20 20 20  taTbl.          
1ad30 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20      );.         
1ad40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
1ad50 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1ad60 20 20 72 62 75 4f 62 6a 49 74 65 72 50 72 65 70    rbuObjIterPrep
1ad70 61 72 65 41 6c 6c 28 70 2c 20 70 49 74 65 72 2c  areAll(p, pIter,
1ad80 20 30 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20   0);..          
1ad90 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 74 6f 20    /* Advance to 
1ada0 74 68 65 20 6e 65 78 74 20 72 6f 77 20 74 6f 20  the next row to 
1adb0 70 72 6f 63 65 73 73 2e 20 2a 2f 0a 20 20 20 20  process. */.    
1adc0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
1add0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1ade0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
1adf0 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73  t rc = sqlite3_s
1ae00 74 65 70 28 70 49 74 65 72 2d 3e 70 53 65 6c 65  tep(pIter->pSele
1ae10 63 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ct);.           
1ae20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1ae30 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20  E_ROW ){.       
1ae40 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 50 72 6f           p->nPro
1ae50 67 72 65 73 73 2b 2b 3b 0a 20 20 20 20 20 20 20  gress++;.       
1ae60 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 74 65           p->nSte
1ae70 70 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  p++;.           
1ae80 20 20 20 20 20 72 65 74 75 72 6e 20 72 62 75 53       return rbuS
1ae90 74 65 70 28 70 29 3b 0a 20 20 20 20 20 20 20 20  tep(p);.        
1aea0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1aeb0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71        p->rc = sq
1aec0 6c 69 74 65 33 5f 72 65 73 65 74 28 70 49 74 65  lite3_reset(pIte
1aed0 72 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  r->pSelect);.   
1aee0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 53             p->nS
1aef0 74 65 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tep = 0;.       
1af00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1af10 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 72 62   }..          rb
1af20 75 4f 62 6a 49 74 65 72 4e 65 78 74 28 70 2c 20  uObjIterNext(p, 
1af30 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  pIter);.        
1af40 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  }..        if( p
1af50 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1af60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
1af70 65 72 74 28 20 70 49 74 65 72 2d 3e 7a 54 62 6c  ert( pIter->zTbl
1af80 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
1af90 20 72 62 75 53 61 76 65 53 74 61 74 65 28 70 2c   rbuSaveState(p,
1afa0 20 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 29   RBU_STAGE_MOVE)
1afb0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 62 75 49  ;.          rbuI
1afc0 6e 63 72 53 63 68 65 6d 61 43 6f 6f 6b 69 65 28  ncrSchemaCookie(
1afd0 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  p);.          if
1afe0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1aff0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1b000 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
1b010 33 5f 65 78 65 63 28 70 2d 3e 64 62 4d 61 69 6e  3_exec(p->dbMain
1b020 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30  , "COMMIT", 0, 0
1b030 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a  , &p->zErrmsg);.
1b040 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1b050 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
1b060 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b070 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
1b080 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  = sqlite3_exec(p
1b090 2d 3e 64 62 52 62 75 2c 20 22 43 4f 4d 4d 49 54  ->dbRbu, "COMMIT
1b0a0 22 2c 20 30 2c 20 30 2c 20 26 70 2d 3e 7a 45 72  ", 0, 0, &p->zEr
1b0b0 72 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20  rmsg);.         
1b0c0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
1b0d0 65 53 74 61 67 65 20 3d 20 52 42 55 5f 53 54 41  eStage = RBU_STA
1b0e0 47 45 5f 4d 4f 56 45 3b 0a 20 20 20 20 20 20 20  GE_MOVE;.       
1b0f0 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
1b100 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1b110 20 63 61 73 65 20 52 42 55 5f 53 54 41 47 45 5f   case RBU_STAGE_
1b120 4d 4f 56 45 3a 20 7b 0a 20 20 20 20 20 20 20 20  MOVE: {.        
1b130 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1b140 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1b150 20 20 72 62 75 4d 6f 76 65 4f 61 6c 46 69 6c 65    rbuMoveOalFile
1b160 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  (p);.          p
1b170 2d 3e 6e 50 72 6f 67 72 65 73 73 2b 2b 3b 0a 20  ->nProgress++;. 
1b180 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b190 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1b1a0 0a 20 20 20 20 20 20 63 61 73 65 20 52 42 55 5f  .      case RBU_
1b1b0 53 54 41 47 45 5f 43 4b 50 54 3a 20 7b 0a 20 20  STAGE_CKPT: {.  
1b1c0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
1b1d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b1e0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e          if( p->n
1b1f0 53 74 65 70 3e 3d 70 2d 3e 6e 46 72 61 6d 65 20  Step>=p->nFrame 
1b200 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
1b210 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 44 62  qlite3_file *pDb
1b220 20 3d 20 70 2d 3e 70 54 61 72 67 65 74 46 64 2d   = p->pTargetFd-
1b230 3e 70 52 65 61 6c 3b 0a 20 20 0a 20 20 20 20 20  >pReal;.  .     
1b240 20 20 20 20 20 20 20 2f 2a 20 53 79 6e 63 20 74         /* Sync t
1b250 68 65 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20  he db file */.  
1b260 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
1b270 3d 20 70 44 62 2d 3e 70 4d 65 74 68 6f 64 73 2d  = pDb->pMethods-
1b280 3e 78 53 79 6e 63 28 70 44 62 2c 20 53 51 4c 49  >xSync(pDb, SQLI
1b290 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b  TE_SYNC_NORMAL);
1b2a0 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  .  .            
1b2b0 2f 2a 20 55 70 64 61 74 65 20 6e 42 61 63 6b 66  /* Update nBackf
1b2c0 69 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ill */.         
1b2d0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
1b2e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1b2f0 20 20 20 20 20 20 20 20 20 76 6f 69 64 20 76 6f           void vo
1b300 6c 61 74 69 6c 65 20 2a 70 74 72 3b 0a 20 20 20  latile *ptr;.   
1b310 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63             p->rc
1b320 20 3d 20 70 44 62 2d 3e 70 4d 65 74 68 6f 64 73   = pDb->pMethods
1b330 2d 3e 78 53 68 6d 4d 61 70 28 70 44 62 2c 20 30  ->xShmMap(pDb, 0
1b340 2c 20 33 32 2a 31 30 32 34 2c 20 30 2c 20 26 70  , 32*1024, 0, &p
1b350 74 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  tr);.           
1b360 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
1b370 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1b380 20 20 20 20 20 20 20 20 20 20 20 28 28 75 33 32             ((u32
1b390 20 76 6f 6c 61 74 69 6c 65 2a 29 70 74 72 29 5b   volatile*)ptr)[
1b3a0 32 34 5d 20 3d 20 70 2d 3e 69 4d 61 78 46 72 61  24] = p->iMaxFra
1b3b0 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
1b3c0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1b3d0 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  }.  .           
1b3e0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1b3f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1b400 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 67 65         p->eStage
1b410 20 3d 20 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e   = RBU_STAGE_DON
1b420 45 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  E;.             
1b430 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
1b440 44 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 20 20  DONE;.          
1b450 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
1b460 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1b470 20 2f 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74   /* At one point
1b480 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   the following b
1b490 6c 6f 63 6b 20 63 6f 70 69 65 64 20 61 20 73 69  lock copied a si
1b4a0 6e 67 6c 65 20 66 72 61 6d 65 20 66 72 6f 6d 20  ngle frame from 
1b4b0 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
1b4c0 2a 2a 20 77 61 6c 20 66 69 6c 65 20 74 6f 20 74  ** wal file to t
1b4d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1b4e0 2e 20 53 6f 20 74 68 61 74 20 6f 6e 65 20 63 61  . So that one ca
1b4f0 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 72 62 75  ll to sqlite3rbu
1b500 5f 73 74 65 70 28 29 0a 20 20 20 20 20 20 20 20  _step().        
1b510 20 20 20 20 2a 2a 20 63 68 65 63 6b 70 6f 69 6e      ** checkpoin
1b520 74 65 64 20 61 20 73 69 6e 67 6c 65 20 66 72 61  ted a single fra
1b530 6d 65 2e 20 0a 20 20 20 20 20 20 20 20 20 20 20  me. .           
1b540 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20   **.            
1b550 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74  ** However, if t
1b560 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69  he sector-size i
1b570 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
1b580 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 61 6e 64  e page-size, and
1b590 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
1b5a0 20 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20   ** application 
1b5b0 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 72 62 75  calls sqlite3rbu
1b5c0 5f 73 61 76 65 73 74 61 74 65 28 29 20 6f 72 20  _savestate() or 
1b5d0 63 6c 6f 73 65 28 29 20 69 6d 6d 65 64 69 61 74  close() immediat
1b5e0 65 6c 79 0a 20 20 20 20 20 20 20 20 20 20 20 20  ely.            
1b5f0 2a 2a 20 61 66 74 65 72 20 74 68 69 73 20 73 74  ** after this st
1b600 65 70 2c 20 74 68 65 6e 20 72 62 75 5f 73 74 65  ep, then rbu_ste
1b610 70 28 29 20 61 67 61 69 6e 2c 20 74 68 65 6e 20  p() again, then 
1b620 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
1b630 6f 63 63 75 72 73 2c 0a 20 20 20 20 20 20 20 20  occurs,.        
1b640 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20      ** then the 
1b650 64 61 74 61 62 61 73 65 20 70 61 67 65 20 77 72  database page wr
1b660 69 74 74 65 6e 20 68 65 72 65 20 6d 61 79 20 62  itten here may b
1b670 65 20 64 61 6d 61 67 65 64 2e 20 57 6f 72 6b 20  e damaged. Work 
1b680 61 72 6f 75 6e 64 0a 20 20 20 20 20 20 20 20 20  around.         
1b690 20 20 20 2a 2a 20 74 68 69 73 20 62 79 20 63 68     ** this by ch
1b6a0 65 63 6b 70 6f 69 6e 74 69 6e 67 20 66 72 61 6d  eckpointing fram
1b6b0 65 73 20 75 6e 74 69 6c 20 74 68 65 20 6e 65 78  es until the nex
1b6c0 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 61 46  t page in the aF
1b6d0 72 61 6d 65 5b 5d 0a 20 20 20 20 20 20 20 20 20  rame[].         
1b6e0 20 20 20 2a 2a 20 6c 69 65 73 20 6f 6e 20 61 20     ** lies on a 
1b6f0 64 69 66 66 65 72 65 6e 74 20 64 69 73 6b 20 73  different disk s
1b700 65 63 74 6f 72 20 74 6f 20 74 68 65 20 63 75 72  ector to the cur
1b710 72 65 6e 74 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20  rent one. */.   
1b720 20 20 20 20 20 20 20 20 20 75 33 32 20 69 53 65           u32 iSe
1b730 63 74 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  ctor;.          
1b740 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20    do{.          
1b750 20 20 20 20 52 62 75 46 72 61 6d 65 20 2a 70 46      RbuFrame *pF
1b760 72 61 6d 65 20 3d 20 26 70 2d 3e 61 46 72 61 6d  rame = &p->aFram
1b770 65 5b 70 2d 3e 6e 53 74 65 70 5d 3b 0a 20 20 20  e[p->nStep];.   
1b780 20 20 20 20 20 20 20 20 20 20 20 69 53 65 63 74             iSect
1b790 6f 72 20 3d 20 28 70 46 72 61 6d 65 2d 3e 69 44  or = (pFrame->iD
1b7a0 62 50 61 67 65 2d 31 29 20 2f 20 70 2d 3e 6e 50  bPage-1) / p->nP
1b7b0 61 67 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20  agePerSector;.  
1b7c0 20 20 20 20 20 20 20 20 20 20 20 20 72 62 75 43              rbuC
1b7d0 68 65 63 6b 70 6f 69 6e 74 46 72 61 6d 65 28 70  heckpointFrame(p
1b7e0 2c 20 70 46 72 61 6d 65 29 3b 0a 20 20 20 20 20  , pFrame);.     
1b7f0 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 74 65           p->nSte
1b800 70 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  p++;.           
1b810 20 7d 77 68 69 6c 65 28 20 70 2d 3e 6e 53 74 65   }while( p->nSte
1b820 70 3c 70 2d 3e 6e 46 72 61 6d 65 20 0a 20 20 20  p<p->nFrame .   
1b830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
1b840 20 69 53 65 63 74 6f 72 3d 3d 28 28 70 2d 3e 61   iSector==((p->a
1b850 46 72 61 6d 65 5b 70 2d 3e 6e 53 74 65 70 5d 2e  Frame[p->nStep].
1b860 69 44 62 50 61 67 65 2d 31 29 20 2f 20 70 2d 3e  iDbPage-1) / p->
1b870 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 29 0a  nPagePerSector).
1b880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b890 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   && p->rc==SQLIT
1b8a0 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20  E_OK.           
1b8b0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   );.          }.
1b8c0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 50 72            p->nPr
1b8d0 6f 67 72 65 73 73 2b 2b 3b 0a 20 20 20 20 20 20  ogress++;.      
1b8e0 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
1b8f0 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
1b900 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
1b910 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1b920 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63      return p->rc
1b930 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1b940 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
1b950 45 4d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  EM;.  }.}../*.**
1b960 20 43 6f 6d 70 61 72 65 20 73 74 72 69 6e 67 73   Compare strings
1b970 20 7a 31 20 61 6e 64 20 7a 32 2c 20 72 65 74 75   z1 and z2, retu
1b980 72 6e 69 6e 67 20 30 20 69 66 20 74 68 65 79 20  rning 0 if they 
1b990 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2c 20 6f  are identical, o
1b9a0 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74  r non-zero.** ot
1b9b0 68 65 72 77 69 73 65 2e 20 45 69 74 68 65 72 20  herwise. Either 
1b9c0 6f 72 20 62 6f 74 68 20 61 72 67 75 6d 65 6e 74  or both argument
1b9d0 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 54 77   may be NULL. Tw
1b9e0 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72  o NULL values ar
1b9f0 65 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20  e.** considered 
1ba00 65 71 75 61 6c 2c 20 61 6e 64 20 4e 55 4c 4c 20  equal, and NULL 
1ba10 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 64 69  is considered di
1ba20 73 74 69 6e 63 74 20 66 72 6f 6d 20 61 6c 6c 20  stinct from all 
1ba30 6f 74 68 65 72 20 76 61 6c 75 65 73 2e 0a 2a 2f  other values..*/
1ba40 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 53  .static int rbuS
1ba50 74 72 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20  trCompare(const 
1ba60 63 68 61 72 20 2a 7a 31 2c 20 63 6f 6e 73 74 20  char *z1, const 
1ba70 63 68 61 72 20 2a 7a 32 29 7b 0a 20 20 69 66 28  char *z2){.  if(
1ba80 20 7a 31 3d 3d 30 20 26 26 20 7a 32 3d 3d 30 20   z1==0 && z2==0 
1ba90 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
1baa0 28 20 7a 31 3d 3d 30 20 7c 7c 20 7a 32 3d 3d 30  ( z1==0 || z2==0
1bab0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72   ) return 1;.  r
1bac0 65 74 75 72 6e 20 28 73 71 6c 69 74 65 33 5f 73  eturn (sqlite3_s
1bad0 74 72 69 63 6d 70 28 7a 31 2c 20 7a 32 29 21 3d  tricmp(z1, z2)!=
1bae0 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  0);.}../*.** Thi
1baf0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1bb00 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  lled as part of 
1bb10 73 71 6c 69 74 65 33 72 62 75 5f 6f 70 65 6e 28  sqlite3rbu_open(
1bb20 29 20 77 68 65 6e 20 69 6e 69 74 69 61 6c 69 7a  ) when initializ
1bb30 69 6e 67 0a 2a 2a 20 61 6e 20 72 62 75 20 68 61  ing.** an rbu ha
1bb40 6e 64 6c 65 20 69 6e 20 4f 41 4c 20 73 74 61 67  ndle in OAL stag
1bb50 65 2e 20 49 66 20 74 68 65 20 72 62 75 20 75 70  e. If the rbu up
1bb60 64 61 74 65 20 68 61 73 20 6e 6f 74 20 73 74 61  date has not sta
1bb70 72 74 65 64 20 28 69 2e 65 2e 0a 2a 2a 20 74 68  rted (i.e..** th
1bb80 65 20 72 62 75 5f 73 74 61 74 65 20 74 61 62 6c  e rbu_state tabl
1bb90 65 20 77 61 73 20 65 6d 70 74 79 29 20 69 74 20  e was empty) it 
1bba0 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65  is a no-op. Othe
1bbb0 72 77 69 73 65 2c 20 69 74 20 61 72 72 61 6e 67  rwise, it arrang
1bbc0 65 73 0a 2a 2a 20 74 68 69 6e 67 73 20 73 6f 20  es.** things so 
1bbd0 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 63 61  that the next ca
1bbe0 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 72 62 75  ll to sqlite3rbu
1bbf0 5f 73 74 65 70 28 29 20 63 6f 6e 74 69 6e 75 65  _step() continue
1bc00 73 20 6f 6e 20 66 72 6f 6d 0a 2a 2a 20 77 68 65  s on from.** whe
1bc10 72 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  re the previous 
1bc20 72 62 75 20 68 61 6e 64 6c 65 20 6c 65 66 74 20  rbu handle left 
1bc30 6f 66 66 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  off..**.** If an
1bc40 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
1bc50 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  n error code and
1bc60 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61   error message a
1bc70 72 65 20 6c 65 66 74 20 69 6e 20 74 68 65 0a 2a  re left in the.*
1bc80 2a 20 72 62 75 20 68 61 6e 64 6c 65 20 70 61 73  * rbu handle pas
1bc90 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
1bca0 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
1bcb0 61 74 69 63 20 76 6f 69 64 20 72 62 75 53 65 74  atic void rbuSet
1bcc0 75 70 4f 61 6c 28 73 71 6c 69 74 65 33 72 62 75  upOal(sqlite3rbu
1bcd0 20 2a 70 2c 20 52 62 75 53 74 61 74 65 20 2a 70   *p, RbuState *p
1bce0 53 74 61 74 65 29 7b 0a 20 20 61 73 73 65 72 74  State){.  assert
1bcf0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1bd00 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 53 74 61  OK );.  if( pSta
1bd10 74 65 2d 3e 7a 54 62 6c 20 29 7b 0a 20 20 20 20  te->zTbl ){.    
1bd20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65  RbuObjIter *pIte
1bd30 72 20 3d 20 26 70 2d 3e 6f 62 6a 69 74 65 72 3b  r = &p->objiter;
1bd40 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51  .    int rc = SQ
1bd50 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 20 20 77 68  LITE_OK;..    wh
1bd60 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
1bd70 4f 4b 20 26 26 20 70 49 74 65 72 2d 3e 7a 54 62  OK && pIter->zTb
1bd80 6c 20 26 26 20 28 70 49 74 65 72 2d 3e 62 43 6c  l && (pIter->bCl
1bd90 65 61 6e 75 70 20 0a 20 20 20 20 20 20 20 7c 7c  eanup .       ||
1bda0 20 72 62 75 53 74 72 43 6f 6d 70 61 72 65 28 70   rbuStrCompare(p
1bdb0 49 74 65 72 2d 3e 7a 49 64 78 2c 20 70 53 74 61  Iter->zIdx, pSta
1bdc0 74 65 2d 3e 7a 49 64 78 29 0a 20 20 20 20 20 20  te->zIdx).      
1bdd0 20 7c 7c 20 28 70 53 74 61 74 65 2d 3e 7a 44 61   || (pState->zDa
1bde0 74 61 54 62 6c 3d 3d 30 20 26 26 20 72 62 75 53  taTbl==0 && rbuS
1bdf0 74 72 43 6f 6d 70 61 72 65 28 70 49 74 65 72 2d  trCompare(pIter-
1be00 3e 7a 54 62 6c 2c 20 70 53 74 61 74 65 2d 3e 7a  >zTbl, pState->z
1be10 54 62 6c 29 29 0a 20 20 20 20 20 20 20 7c 7c 20  Tbl)).       || 
1be20 28 70 53 74 61 74 65 2d 3e 7a 44 61 74 61 54 62  (pState->zDataTb
1be30 6c 20 26 26 20 72 62 75 53 74 72 43 6f 6d 70 61  l && rbuStrCompa
1be40 72 65 28 70 49 74 65 72 2d 3e 7a 44 61 74 61 54  re(pIter->zDataT
1be50 62 6c 2c 20 70 53 74 61 74 65 2d 3e 7a 44 61 74  bl, pState->zDat
1be60 61 54 62 6c 29 29 0a 20 20 20 20 29 29 7b 0a 20  aTbl)).    )){. 
1be70 20 20 20 20 20 72 63 20 3d 20 72 62 75 4f 62 6a       rc = rbuObj
1be80 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65  IterNext(p, pIte
1be90 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  r);.    }..    i
1bea0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1beb0 20 26 26 20 21 70 49 74 65 72 2d 3e 7a 54 62 6c   && !pIter->zTbl
1bec0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1bed0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
1bee0 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20     p->zErrmsg = 
1bef0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
1bf00 22 72 62 75 5f 73 74 61 74 65 20 6d 69 73 6d 61  "rbu_state misma
1bf10 74 63 68 20 65 72 72 6f 72 22 29 3b 0a 20 20 20  tch error");.   
1bf20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   }..    if( rc==
1bf30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1bf40 20 20 20 70 2d 3e 6e 53 74 65 70 20 3d 20 70 53     p->nStep = pS
1bf50 74 61 74 65 2d 3e 6e 52 6f 77 3b 0a 20 20 20 20  tate->nRow;.    
1bf60 20 20 72 63 20 3d 20 72 62 75 4f 62 6a 49 74 65    rc = rbuObjIte
1bf70 72 50 72 65 70 61 72 65 41 6c 6c 28 70 2c 20 26  rPrepareAll(p, &
1bf80 70 2d 3e 6f 62 6a 69 74 65 72 2c 20 70 2d 3e 6e  p->objiter, p->n
1bf90 53 74 65 70 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Step);.    }..  
1bfa0 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
1bfb0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  }.}../*.** If th
1bfc0 65 72 65 20 69 73 20 61 20 22 2a 2d 6f 61 6c 22  ere is a "*-oal"
1bfd0 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c   file in the fil
1bfe0 65 2d 73 79 73 74 65 6d 20 63 6f 72 72 65 73 70  e-system corresp
1bff0 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a  onding to the.**
1c000 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65   target database
1c010 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73   in the file-sys
1c020 74 65 6d 2c 20 64 65 6c 65 74 65 20 69 74 2e 20  tem, delete it. 
1c030 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1c040 72 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20  rs,.** leave an 
1c050 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65  error code and e
1c060 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
1c070 74 68 65 20 72 62 75 20 68 61 6e 64 6c 65 2e 0a  the rbu handle..
1c080 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
1c090 62 75 44 65 6c 65 74 65 4f 61 6c 46 69 6c 65 28  buDeleteOalFile(
1c0a0 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a  sqlite3rbu *p){.
1c0b0 20 20 63 68 61 72 20 2a 7a 4f 61 6c 20 3d 20 72    char *zOal = r
1c0c0 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 73  buMPrintf(p, "%s
1c0d0 2d 6f 61 6c 22 2c 20 70 2d 3e 7a 54 61 72 67 65  -oal", p->zTarge
1c0e0 74 29 3b 0a 20 20 69 66 28 20 7a 4f 61 6c 20 29  t);.  if( zOal )
1c0f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  {.    sqlite3_vf
1c100 73 20 2a 70 56 66 73 20 3d 20 73 71 6c 69 74 65  s *pVfs = sqlite
1c110 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20  3_vfs_find(0);. 
1c120 20 20 20 61 73 73 65 72 74 28 20 70 56 66 73 20     assert( pVfs 
1c130 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  && p->rc==SQLITE
1c140 5f 4f 4b 20 26 26 20 70 2d 3e 7a 45 72 72 6d 73  _OK && p->zErrms
1c150 67 3d 3d 30 20 29 3b 0a 20 20 20 20 70 56 66 73  g==0 );.    pVfs
1c160 2d 3e 78 44 65 6c 65 74 65 28 70 56 66 73 2c 20  ->xDelete(pVfs, 
1c170 7a 4f 61 6c 2c 20 30 29 3b 0a 20 20 20 20 73 71  zOal, 0);.    sq
1c180 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 61 6c 29  lite3_free(zOal)
1c190 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
1c1a0 6c 6c 6f 63 61 74 65 20 61 20 70 72 69 76 61 74  llocate a privat
1c1b0 65 20 72 62 75 20 56 46 53 20 66 6f 72 20 74 68  e rbu VFS for th
1c1c0 65 20 72 62 75 20 68 61 6e 64 6c 65 20 70 61 73  e rbu handle pas
1c1d0 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 0a  sed as the only.
1c1e0 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69  ** argument. Thi
1c1f0 73 20 56 46 53 20 77 69 6c 6c 20 62 65 20 75 73  s VFS will be us
1c200 65 64 20 75 6e 6c 65 73 73 20 74 68 65 20 63 61  ed unless the ca
1c210 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 72 62 75  ll to sqlite3rbu
1c220 5f 6f 70 65 6e 28 29 0a 2a 2a 20 73 70 65 63 69  _open().** speci
1c230 66 69 65 64 20 61 20 55 52 49 20 77 69 74 68 20  fied a URI with 
1c240 61 20 76 66 73 3d 3f 20 6f 70 74 69 6f 6e 20 69  a vfs=? option i
1c250 6e 20 70 6c 61 63 65 20 6f 66 20 61 20 74 61 72  n place of a tar
1c260 67 65 74 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  get database.** 
1c270 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74  file name..*/.st
1c280 61 74 69 63 20 76 6f 69 64 20 72 62 75 43 72 65  atic void rbuCre
1c290 61 74 65 56 66 73 28 73 71 6c 69 74 65 33 72 62  ateVfs(sqlite3rb
1c2a0 75 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 6e 64  u *p){.  int rnd
1c2b0 3b 0a 20 20 63 68 61 72 20 7a 52 6e 64 5b 36 34  ;.  char zRnd[64
1c2c0 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  ];..  assert( p-
1c2d0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1c2e0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64  ;.  sqlite3_rand
1c2f0 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 69 6e  omness(sizeof(in
1c300 74 29 2c 20 28 76 6f 69 64 2a 29 26 72 6e 64 29  t), (void*)&rnd)
1c310 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ;.  sqlite3_snpr
1c320 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 52 6e 64  intf(sizeof(zRnd
1c330 29 2c 20 7a 52 6e 64 2c 20 22 72 62 75 5f 76 66  ), zRnd, "rbu_vf
1c340 73 5f 25 64 22 2c 20 72 6e 64 29 3b 0a 20 20 70  s_%d", rnd);.  p
1c350 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 72 62  ->rc = sqlite3rb
1c360 75 5f 63 72 65 61 74 65 5f 76 66 73 28 7a 52 6e  u_create_vfs(zRn
1c370 64 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 2d 3e  d, 0);.  if( p->
1c380 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1c390 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
1c3a0 20 2a 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33   *pVfs = sqlite3
1c3b0 5f 76 66 73 5f 66 69 6e 64 28 7a 52 6e 64 29 3b  _vfs_find(zRnd);
1c3c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 56 66  .    assert( pVf
1c3d0 73 20 29 3b 0a 20 20 20 20 70 2d 3e 7a 56 66 73  s );.    p->zVfs
1c3e0 4e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 7a 4e 61  Name = pVfs->zNa
1c3f0 6d 65 3b 0a 20 20 20 20 28 28 72 62 75 5f 76 66  me;.    ((rbu_vf
1c400 73 2a 29 70 56 66 73 29 2d 3e 70 52 62 75 20 3d  s*)pVfs)->pRbu =
1c410 20 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   p;.  }.}../*.**
1c420 20 44 65 73 74 72 6f 79 20 74 68 65 20 70 72 69   Destroy the pri
1c430 76 61 74 65 20 56 46 53 20 63 72 65 61 74 65 64  vate VFS created
1c440 20 66 6f 72 20 74 68 65 20 72 62 75 20 68 61 6e   for the rbu han
1c450 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dle passed as th
1c460 65 20 6f 6e 6c 79 0a 2a 2a 20 61 72 67 75 6d 65  e only.** argume
1c470 6e 74 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  nt by an earlier
1c480 20 63 61 6c 6c 20 74 6f 20 72 62 75 43 72 65 61   call to rbuCrea
1c490 74 65 56 66 73 28 29 2e 0a 2a 2f 0a 73 74 61 74  teVfs()..*/.stat
1c4a0 69 63 20 76 6f 69 64 20 72 62 75 44 65 6c 65 74  ic void rbuDelet
1c4b0 65 56 66 73 28 73 71 6c 69 74 65 33 72 62 75 20  eVfs(sqlite3rbu 
1c4c0 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 7a 56  *p){.  if( p->zV
1c4d0 66 73 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71  fsName ){.    sq
1c4e0 6c 69 74 65 33 72 62 75 5f 64 65 73 74 72 6f 79  lite3rbu_destroy
1c4f0 5f 76 66 73 28 70 2d 3e 7a 56 66 73 4e 61 6d 65  _vfs(p->zVfsName
1c500 29 3b 0a 20 20 20 20 70 2d 3e 7a 56 66 73 4e 61  );.    p->zVfsNa
1c510 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  me = 0;.  }.}../
1c520 2a 0a 2a 2a 20 54 68 69 73 20 75 73 65 72 2d 64  *.** This user-d
1c530 65 66 69 6e 65 64 20 53 51 4c 20 66 75 6e 63 74  efined SQL funct
1c540 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 77  ion is invoked w
1c550 69 74 68 20 61 20 73 69 6e 67 6c 65 20 61 72 67  ith a single arg
1c560 75 6d 65 6e 74 20 2d 20 74 68 65 0a 2a 2a 20 6e  ument - the.** n
1c570 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20 65  ame of a table e
1c580 78 70 65 63 74 65 64 20 74 6f 20 61 70 70 65 61  xpected to appea
1c590 72 20 69 6e 20 74 68 65 20 74 61 72 67 65 74 20  r in the target 
1c5a0 64 61 74 61 62 61 73 65 2e 20 49 74 20 72 65 74  database. It ret
1c5b0 75 72 6e 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  urns.** the numb
1c5c0 65 72 20 6f 66 20 61 75 78 69 6c 6c 69 61 72 79  er of auxilliary
1c5d0 20 69 6e 64 65 78 65 73 20 6f 6e 20 74 68 65 20   indexes on the 
1c5e0 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
1c5f0 20 76 6f 69 64 20 72 62 75 49 6e 64 65 78 43 6e   void rbuIndexCn
1c600 74 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  tFunc(.  sqlite3
1c610 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20  _context *pCtx, 
1c620 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20 73  .  int nVal,.  s
1c630 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
1c640 70 56 61 6c 0a 29 7b 0a 20 20 73 71 6c 69 74 65  pVal.){.  sqlite
1c650 33 72 62 75 20 2a 70 20 3d 20 28 73 71 6c 69 74  3rbu *p = (sqlit
1c660 65 33 72 62 75 2a 29 73 71 6c 69 74 65 33 5f 75  e3rbu*)sqlite3_u
1c670 73 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a  ser_data(pCtx);.
1c680 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1c690 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61  pStmt = 0;.  cha
1c6a0 72 20 2a 7a 45 72 72 6d 73 67 20 3d 20 30 3b 0a  r *zErrmsg = 0;.
1c6b0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
1c6c0 65 72 74 28 20 6e 56 61 6c 3d 3d 31 20 29 3b 0a  ert( nVal==1 );.
1c6d0 20 20 0a 20 20 72 63 20 3d 20 70 72 65 70 61 72    .  rc = prepar
1c6e0 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45  eFreeAndCollectE
1c6f0 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  rror(p->dbMain, 
1c700 26 70 53 74 6d 74 2c 20 26 7a 45 72 72 6d 73 67  &pStmt, &zErrmsg
1c710 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  , .      sqlite3
1c720 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
1c730 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 73   count(*) FROM s
1c740 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20  qlite_master ". 
1c750 20 20 20 20 20 20 20 22 57 48 45 52 45 20 74 79         "WHERE ty
1c760 70 65 3d 27 69 6e 64 65 78 27 20 41 4e 44 20 74  pe='index' AND t
1c770 62 6c 5f 6e 61 6d 65 20 3d 20 25 51 22 2c 20 73  bl_name = %Q", s
1c780 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
1c790 74 28 61 70 56 61 6c 5b 30 5d 29 29 0a 20 20 29  t(apVal[0])).  )
1c7a0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1c7b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
1c7c0 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
1c7d0 72 28 70 43 74 78 2c 20 7a 45 72 72 6d 73 67 2c  r(pCtx, zErrmsg,
1c7e0 20 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   -1);.  }else{. 
1c7f0 20 20 20 69 6e 74 20 6e 49 6e 64 65 78 20 3d 20     int nIndex = 
1c800 30 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  0;.    if( SQLIT
1c810 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
1c820 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20  tep(pStmt) ){.  
1c830 20 20 20 20 6e 49 6e 64 65 78 20 3d 20 73 71 6c      nIndex = sql
1c840 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
1c850 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d  pStmt, 0);.    }
1c860 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1c870 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
1c880 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1c890 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c8a0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
1c8b0 5f 69 6e 74 28 70 43 74 78 2c 20 6e 49 6e 64 65  _int(pCtx, nInde
1c8c0 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  x);.    }else{. 
1c8d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
1c8e0 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20  ult_error(pCtx, 
1c8f0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
1c900 2d 3e 64 62 4d 61 69 6e 29 2c 20 2d 31 29 3b 0a  ->dbMain), -1);.
1c910 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c      }.  }..  sql
1c920 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 6d 73  ite3_free(zErrms
1c930 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  g);.}../*.** If 
1c940 74 68 65 20 52 42 55 20 64 61 74 61 62 61 73 65  the RBU database
1c950 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 72 62   contains the rb
1c960 75 5f 63 6f 75 6e 74 20 74 61 62 6c 65 2c 20 75  u_count table, u
1c970 73 65 20 69 74 20 74 6f 20 69 6e 69 74 69 61 6c  se it to initial
1c980 69 7a 65 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74  ize.** the sqlit
1c990 65 33 72 62 75 2e 6e 50 68 61 73 65 4f 6e 65 53  e3rbu.nPhaseOneS
1c9a0 74 65 70 20 76 61 72 69 61 62 6c 65 2e 20 54 68  tep variable. Th
1c9b0 65 20 73 63 68 65 6d 61 20 6f 66 20 74 68 65 20  e schema of the 
1c9c0 72 62 75 5f 63 6f 75 6e 74 20 74 61 62 6c 65 0a  rbu_count table.
1c9d0 2a 2a 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  ** is assumed to
1c9e0 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d   contain the sam
1c9f0 65 20 63 6f 6c 75 6d 6e 73 20 61 73 3a 0a 2a 2a  e columns as:.**
1ca00 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42  .**   CREATE TAB
1ca10 4c 45 20 72 62 75 5f 63 6f 75 6e 74 28 74 62 6c  LE rbu_count(tbl
1ca20 20 54 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45   TEXT PRIMARY KE
1ca30 59 2c 20 63 6e 74 20 49 4e 54 45 47 45 52 29 20  Y, cnt INTEGER) 
1ca40 57 49 54 48 4f 55 54 20 52 4f 57 49 44 3b 0a 2a  WITHOUT ROWID;.*
1ca50 2a 0a 2a 2a 20 54 68 65 72 65 20 73 68 6f 75 6c  *.** There shoul
1ca60 64 20 62 65 20 6f 6e 65 20 72 6f 77 20 69 6e 20  d be one row in 
1ca70 74 68 65 20 74 61 62 6c 65 20 66 6f 72 20 65 61  the table for ea
1ca80 63 68 20 64 61 74 61 5f 78 78 78 20 74 61 62 6c  ch data_xxx tabl
1ca90 65 20 69 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61  e in the.** data
1caa0 62 61 73 65 2e 20 54 68 65 20 27 74 62 6c 27 20  base. The 'tbl' 
1cab0 63 6f 6c 75 6d 6e 20 73 68 6f 75 6c 64 20 63 6f  column should co
1cac0 6e 74 61 69 6e 20 74 68 65 20 6e 61 6d 65 20 6f  ntain the name o
1cad0 66 20 61 20 64 61 74 61 5f 78 78 78 20 74 61 62  f a data_xxx tab
1cae0 6c 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63  le,.** and the c
1caf0 6e 74 20 63 6f 6c 75 6d 6e 20 74 68 65 20 6e 75  nt column the nu
1cb00 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 74 20  mber of rows it 
1cb10 63 6f 6e 74 61 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20  contains..**.** 
1cb20 73 71 6c 69 74 65 33 72 62 75 2e 6e 50 68 61 73  sqlite3rbu.nPhas
1cb30 65 4f 6e 65 53 74 65 70 20 69 73 20 69 6e 69 74  eOneStep is init
1cb40 69 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20 73  ialized to the s
1cb50 75 6d 20 6f 66 20 28 31 20 2b 20 6e 49 6e 64 65  um of (1 + nInde
1cb60 78 29 20 2a 20 63 6e 74 0a 2a 2a 20 66 6f 72 20  x) * cnt.** for 
1cb70 61 6c 6c 20 72 6f 77 73 20 69 6e 20 74 68 65 20  all rows in the 
1cb80 72 62 75 5f 63 6f 75 6e 74 20 74 61 62 6c 65 2c  rbu_count table,
1cb90 20 77 68 65 72 65 20 6e 49 6e 64 65 78 20 69 73   where nIndex is
1cba0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a   the number of .
1cbb0 2a 2a 20 69 6e 64 65 78 65 73 20 6f 6e 20 74 68  ** indexes on th
1cbc0 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
1cbd0 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20  target database 
1cbe0 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
1cbf0 20 76 6f 69 64 20 72 62 75 49 6e 69 74 50 68 61   void rbuInitPha
1cc00 73 65 4f 6e 65 53 74 65 70 73 28 73 71 6c 69 74  seOneSteps(sqlit
1cc10 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 69 66 28  e3rbu *p){.  if(
1cc20 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1cc30 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
1cc40 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
1cc50 3b 0a 20 20 20 20 69 6e 74 20 62 45 78 69 73 74  ;.    int bExist
1cc60 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
1cc70 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1cc80 20 72 62 75 5f 63 6f 75 6e 74 20 65 78 69 73 74   rbu_count exist
1cc90 73 20 2a 2f 0a 0a 20 20 20 20 70 2d 3e 6e 50 68  s */..    p->nPh
1cca0 61 73 65 4f 6e 65 53 74 65 70 20 3d 20 2d 31 3b  aseOneStep = -1;
1ccb0 0a 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71  ..    p->rc = sq
1ccc0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
1ccd0 63 74 69 6f 6e 28 70 2d 3e 64 62 52 62 75 2c 20  ction(p->dbRbu, 
1cce0 0a 20 20 20 20 20 20 20 20 22 72 62 75 5f 69 6e  .        "rbu_in
1ccf0 64 65 78 5f 63 6e 74 22 2c 20 31 2c 20 53 51 4c  dex_cnt", 1, SQL
1cd00 49 54 45 5f 55 54 46 38 2c 20 28 76 6f 69 64 2a  ITE_UTF8, (void*
1cd10 29 70 2c 20 72 62 75 49 6e 64 65 78 43 6e 74 46  )p, rbuIndexCntF
1cd20 75 6e 63 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b  unc, 0, 0.    );
1cd30 0a 20 20 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  .  .    /* Check
1cd40 20 66 6f 72 20 74 68 65 20 72 62 75 5f 63 6f 75   for the rbu_cou
1cd50 6e 74 20 74 61 62 6c 65 2e 20 49 66 20 69 74 20  nt table. If it 
1cd60 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
1cd70 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 0a 20  or if an error. 
1cd80 20 20 20 2a 2a 20 6f 63 63 75 72 73 2c 20 6e 50     ** occurs, nP
1cd90 68 61 73 65 4f 6e 65 53 74 65 70 20 77 69 6c 6c  haseOneStep will
1cda0 20 62 65 20 6c 65 66 74 20 73 65 74 20 74 6f 20   be left set to 
1cdb0 2d 31 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  -1. */.    if( p
1cdc0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1cdd0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
1cde0 20 70 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65   prepareAndColle
1cdf0 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 52 62 75  ctError(p->dbRbu
1ce00 2c 20 26 70 53 74 6d 74 2c 20 26 70 2d 3e 7a 45  , &pStmt, &p->zE
1ce10 72 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 20  rrmsg,.         
1ce20 20 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20   "SELECT 1 FROM 
1ce30 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48  sqlite_master WH
1ce40 45 52 45 20 74 62 6c 5f 6e 61 6d 65 20 3d 20 27  ERE tbl_name = '
1ce50 72 62 75 5f 63 6f 75 6e 74 27 22 0a 20 20 20 20  rbu_count'".    
1ce60 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69    );.    }.    i
1ce70 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1ce80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
1ce90 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
1cea0 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
1ceb0 20 29 7b 0a 20 20 20 20 20 20 20 20 62 45 78 69   ){.        bExi
1cec0 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  sts = 1;.      }
1ced0 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  .      p->rc = s
1cee0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
1cef0 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20  pStmt);.    }.  
1cf00 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  .    if( p->rc==
1cf10 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 45 78  SQLITE_OK && bEx
1cf20 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 70 2d  ists ){.      p-
1cf30 3e 72 63 20 3d 20 70 72 65 70 61 72 65 41 6e 64  >rc = prepareAnd
1cf40 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e  CollectError(p->
1cf50 64 62 52 62 75 2c 20 26 70 53 74 6d 74 2c 20 26  dbRbu, &pStmt, &
1cf60 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20  p->zErrmsg,.    
1cf70 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 73 75        "SELECT su
1cf80 6d 28 63 6e 74 20 2a 20 28 31 20 2b 20 72 62 75  m(cnt * (1 + rbu
1cf90 5f 69 6e 64 65 78 5f 63 6e 74 28 72 62 75 5f 74  _index_cnt(rbu_t
1cfa0 61 72 67 65 74 5f 6e 61 6d 65 28 74 62 6c 29 29  arget_name(tbl))
1cfb0 29 29 22 0a 20 20 20 20 20 20 20 20 20 20 22 46  ))".          "F
1cfc0 52 4f 4d 20 72 62 75 5f 63 6f 75 6e 74 22 0a 20  ROM rbu_count". 
1cfd0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66       );.      if
1cfe0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1cff0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  OK ){.        if
1d000 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ( SQLITE_ROW==sq
1d010 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
1d020 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
1d030 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20  ->nPhaseOneStep 
1d040 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
1d050 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 30 29  _int64(pStmt, 0)
1d060 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1d070 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
1d080 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
1d090 6d 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  mt);.      }.   
1d0a0 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 73 74 61 74 69   }.  }.}...stati
1d0b0 63 20 73 71 6c 69 74 65 33 72 62 75 20 2a 6f 70  c sqlite3rbu *op
1d0c0 65 6e 52 62 75 48 61 6e 64 6c 65 28 0a 20 20 63  enRbuHandle(.  c
1d0d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 72 67  onst char *zTarg
1d0e0 65 74 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  et, .  const cha
1d0f0 72 20 2a 7a 52 62 75 2c 0a 20 20 63 6f 6e 73 74  r *zRbu,.  const
1d100 20 63 68 61 72 20 2a 7a 53 74 61 74 65 0a 29 7b   char *zState.){
1d110 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70  .  sqlite3rbu *p
1d120 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 54 61 72 67  ;.  size_t nTarg
1d130 65 74 20 3d 20 7a 54 61 72 67 65 74 20 3f 20 73  et = zTarget ? s
1d140 74 72 6c 65 6e 28 7a 54 61 72 67 65 74 29 20 3a  trlen(zTarget) :
1d150 20 30 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 52 62   0;.  size_t nRb
1d160 75 20 3d 20 73 74 72 6c 65 6e 28 7a 52 62 75 29  u = strlen(zRbu)
1d170 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 42 79 74 65  ;.  size_t nByte
1d180 20 3d 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65   = sizeof(sqlite
1d190 33 72 62 75 29 20 2b 20 6e 54 61 72 67 65 74 2b  3rbu) + nTarget+
1d1a0 31 20 2b 20 6e 52 62 75 2b 31 3b 0a 0a 20 20 70  1 + nRbu+1;..  p
1d1b0 20 3d 20 28 73 71 6c 69 74 65 33 72 62 75 2a 29   = (sqlite3rbu*)
1d1c0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
1d1d0 28 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 70  (nByte);.  if( p
1d1e0 20 29 7b 0a 20 20 20 20 52 62 75 53 74 61 74 65   ){.    RbuState
1d1f0 20 2a 70 53 74 61 74 65 20 3d 20 30 3b 0a 0a 20   *pState = 0;.. 
1d200 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65     /* Create the
1d210 20 63 75 73 74 6f 6d 20 56 46 53 2e 20 2a 2f 0a   custom VFS. */.
1d220 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c      memset(p, 0,
1d230 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 72   sizeof(sqlite3r
1d240 62 75 29 29 3b 0a 20 20 20 20 72 62 75 43 72 65  bu));.    rbuCre
1d250 61 74 65 56 66 73 28 70 29 3b 0a 0a 20 20 20 20  ateVfs(p);..    
1d260 2f 2a 20 4f 70 65 6e 20 74 68 65 20 74 61 72 67  /* Open the targ
1d270 65 74 2c 20 52 42 55 20 61 6e 64 20 73 74 61 74  et, RBU and stat
1d280 65 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20  e databases */. 
1d290 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
1d2a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1d2b0 20 63 68 61 72 20 2a 70 43 73 72 20 3d 20 28 63   char *pCsr = (c
1d2c0 68 61 72 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20  har*)&p[1];.    
1d2d0 20 20 69 6e 74 20 62 52 65 74 72 79 20 3d 20 30    int bRetry = 0
1d2e0 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 54 61 72  ;.      if( zTar
1d2f0 67 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  get ){.        p
1d300 2d 3e 7a 54 61 72 67 65 74 20 3d 20 70 43 73 72  ->zTarget = pCsr
1d310 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
1d320 28 70 2d 3e 7a 54 61 72 67 65 74 2c 20 7a 54 61  (p->zTarget, zTa
1d330 72 67 65 74 2c 20 6e 54 61 72 67 65 74 2b 31 29  rget, nTarget+1)
1d340 3b 0a 20 20 20 20 20 20 20 20 70 43 73 72 20 2b  ;.        pCsr +
1d350 3d 20 6e 54 61 72 67 65 74 2b 31 3b 0a 20 20 20  = nTarget+1;.   
1d360 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 7a 52     }.      p->zR
1d370 62 75 20 3d 20 70 43 73 72 3b 0a 20 20 20 20 20  bu = pCsr;.     
1d380 20 6d 65 6d 63 70 79 28 70 2d 3e 7a 52 62 75 2c   memcpy(p->zRbu,
1d390 20 7a 52 62 75 2c 20 6e 52 62 75 2b 31 29 3b 0a   zRbu, nRbu+1);.
1d3a0 20 20 20 20 20 20 70 43 73 72 20 2b 3d 20 6e 52        pCsr += nR
1d3b0 62 75 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20  bu+1;.      if( 
1d3c0 7a 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  zState ){.      
1d3d0 20 20 70 2d 3e 7a 53 74 61 74 65 20 3d 20 72 62    p->zState = rb
1d3e0 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 73 22  uMPrintf(p, "%s"
1d3f0 2c 20 7a 53 74 61 74 65 29 3b 0a 20 20 20 20 20  , zState);.     
1d400 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
1d410 74 68 65 20 66 69 72 73 74 20 61 74 74 65 6d 70  the first attemp
1d420 74 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 64 61  t to open the da
1d430 74 61 62 61 73 65 20 66 69 6c 65 20 66 61 69 6c  tabase file fail
1d440 73 20 61 6e 64 20 74 68 65 20 62 52 65 74 72 79  s and the bRetry
1d450 0a 20 20 20 20 20 20 2a 2a 20 66 6c 61 67 20 69  .      ** flag i
1d460 74 20 73 65 74 2c 20 74 68 69 73 20 6d 65 61 6e  t set, this mean
1d470 73 20 74 68 61 74 20 74 68 65 20 64 62 20 77 61  s that the db wa
1d480 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 62 65 63  s not opened bec
1d490 61 75 73 65 20 69 74 20 73 65 65 6d 65 64 0a 20  ause it seemed. 
1d4a0 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 61 20       ** to be a 
1d4b0 77 61 6c 2d 6d 6f 64 65 20 64 62 2e 20 42 75 74  wal-mode db. But
1d4c0 2c 20 74 68 69 73 20 6d 61 79 20 68 61 76 65 20  , this may have 
1d4d0 68 61 70 70 65 6e 65 64 20 64 75 65 20 74 6f 20  happened due to 
1d4e0 61 6e 20 65 61 72 6c 69 65 72 0a 20 20 20 20 20  an earlier.     
1d4f0 20 2a 2a 20 52 42 55 20 76 61 63 75 75 6d 20 6f   ** RBU vacuum o
1d500 70 65 72 61 74 69 6f 6e 20 6c 65 61 76 69 6e 67  peration leaving
1d510 20 61 6e 20 6f 6c 64 20 77 61 6c 20 66 69 6c 65   an old wal file
1d520 20 69 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72   in the director
1d530 79 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74  y..      ** If t
1d540 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
1d550 20 69 74 20 77 69 6c 6c 20 68 61 76 65 20 62 65   it will have be
1d560 65 6e 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20  en checkpointed 
1d570 61 6e 64 20 64 65 6c 65 74 65 64 0a 20 20 20 20  and deleted.    
1d580 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 68 61    ** when the ha
1d590 6e 64 6c 65 20 77 61 73 20 63 6c 6f 73 65 64 20  ndle was closed 
1d5a0 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 61 74 74  and a second att
1d5b0 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 74 68 65  empt to open the
1d5c0 20 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62   .      ** datab
1d5d0 61 73 65 20 6d 61 79 20 73 75 63 63 65 65 64 2e  ase may succeed.
1d5e0 20 20 2a 2f 0a 20 20 20 20 20 20 72 62 75 4f 70    */.      rbuOp
1d5f0 65 6e 44 61 74 61 62 61 73 65 28 70 2c 20 26 62  enDatabase(p, &b
1d600 52 65 74 72 79 29 3b 0a 20 20 20 20 20 20 69 66  Retry);.      if
1d610 28 20 62 52 65 74 72 79 20 29 7b 0a 20 20 20 20  ( bRetry ){.    
1d620 20 20 20 20 72 62 75 4f 70 65 6e 44 61 74 61 62      rbuOpenDatab
1d630 61 73 65 28 70 2c 20 30 29 3b 0a 20 20 20 20 20  ase(p, 0);.     
1d640 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66   }.    }..    if
1d650 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1d660 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 53 74 61  OK ){.      pSta
1d670 74 65 20 3d 20 72 62 75 4c 6f 61 64 53 74 61 74  te = rbuLoadStat
1d680 65 28 70 29 3b 0a 20 20 20 20 20 20 61 73 73 65  e(p);.      asse
1d690 72 74 28 20 70 53 74 61 74 65 20 7c 7c 20 70 2d  rt( pState || p-
1d6a0 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc!=SQLITE_OK )
1d6b0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  ;.      if( p->r
1d6c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1d6d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 74  .        if( pSt
1d6e0 61 74 65 2d 3e 65 53 74 61 67 65 3d 3d 30 20 29  ate->eStage==0 )
1d6f0 7b 20 0a 20 20 20 20 20 20 20 20 20 20 72 62 75  { .          rbu
1d700 44 65 6c 65 74 65 4f 61 6c 46 69 6c 65 28 70 29  DeleteOalFile(p)
1d710 3b 0a 20 20 20 20 20 20 20 20 20 20 72 62 75 49  ;.          rbuI
1d720 6e 69 74 50 68 61 73 65 4f 6e 65 53 74 65 70 73  nitPhaseOneSteps
1d730 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  (p);.          p
1d740 2d 3e 65 53 74 61 67 65 20 3d 20 52 42 55 5f 53  ->eStage = RBU_S
1d750 54 41 47 45 5f 4f 41 4c 3b 0a 20 20 20 20 20 20  TAGE_OAL;.      
1d760 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1d770 20 20 20 70 2d 3e 65 53 74 61 67 65 20 3d 20 70     p->eStage = p
1d780 53 74 61 74 65 2d 3e 65 53 74 61 67 65 3b 0a 20  State->eStage;. 
1d790 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 50 68 61           p->nPha
1d7a0 73 65 4f 6e 65 53 74 65 70 20 3d 20 70 53 74 61  seOneStep = pSta
1d7b0 74 65 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65  te->nPhaseOneSte
1d7c0 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
1d7d0 20 20 20 20 20 70 2d 3e 6e 50 72 6f 67 72 65 73       p->nProgres
1d7e0 73 20 3d 20 70 53 74 61 74 65 2d 3e 6e 50 72 6f  s = pState->nPro
1d7f0 67 72 65 73 73 3b 0a 20 20 20 20 20 20 20 20 70  gress;.        p
1d800 2d 3e 69 4f 61 6c 53 7a 20 3d 20 70 53 74 61 74  ->iOalSz = pStat
1d810 65 2d 3e 69 4f 61 6c 53 7a 3b 0a 20 20 20 20 20  e->iOalSz;.     
1d820 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
1d830 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49  ert( p->rc!=SQLI
1d840 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 53 74 61  TE_OK || p->eSta
1d850 67 65 21 3d 30 20 29 3b 0a 0a 20 20 20 20 69 66  ge!=0 );..    if
1d860 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1d870 4f 4b 20 26 26 20 70 2d 3e 70 54 61 72 67 65 74  OK && p->pTarget
1d880 46 64 2d 3e 70 57 61 6c 46 64 20 29 7b 0a 20 20  Fd->pWalFd ){.  
1d890 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 67      if( p->eStag
1d8a0 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c  e==RBU_STAGE_OAL
1d8b0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   ){.        p->r
1d8c0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
1d8d0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72  ;.        p->zEr
1d8e0 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rmsg = sqlite3_m
1d8f0 70 72 69 6e 74 66 28 22 63 61 6e 6e 6f 74 20 75  printf("cannot u
1d900 70 64 61 74 65 20 77 61 6c 20 6d 6f 64 65 20 64  pdate wal mode d
1d910 61 74 61 62 61 73 65 22 29 3b 0a 20 20 20 20 20  atabase");.     
1d920 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 53   }else if( p->eS
1d930 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f  tage==RBU_STAGE_
1d940 4d 4f 56 45 20 29 7b 0a 20 20 20 20 20 20 20 20  MOVE ){.        
1d950 70 2d 3e 65 53 74 61 67 65 20 3d 20 52 42 55 5f  p->eStage = RBU_
1d960 53 54 41 47 45 5f 43 4b 50 54 3b 0a 20 20 20 20  STAGE_CKPT;.    
1d970 20 20 20 20 70 2d 3e 6e 53 74 65 70 20 3d 20 30      p->nStep = 0
1d980 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d990 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  .    if( p->rc==
1d9a0 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 20 20  SQLITE_OK .     
1d9b0 26 26 20 28 70 2d 3e 65 53 74 61 67 65 3d 3d 52  && (p->eStage==R
1d9c0 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 7c 7c 20  BU_STAGE_OAL || 
1d9d0 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53  p->eStage==RBU_S
1d9e0 54 41 47 45 5f 4d 4f 56 45 29 0a 20 20 20 20 20  TAGE_MOVE).     
1d9f0 26 26 20 70 53 74 61 74 65 2d 3e 65 53 74 61 67  && pState->eStag
1da00 65 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  e!=0.    ){.    
1da10 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 46 64 20    rbu_file *pFd 
1da20 3d 20 28 72 62 75 49 73 56 61 63 75 75 6d 28 70  = (rbuIsVacuum(p
1da30 29 20 3f 20 70 2d 3e 70 52 62 75 46 64 20 3a 20  ) ? p->pRbuFd : 
1da40 70 2d 3e 70 54 61 72 67 65 74 46 64 29 3b 0a 20  p->pTargetFd);. 
1da50 20 20 20 20 20 69 66 28 20 70 46 64 2d 3e 69 43       if( pFd->iC
1da60 6f 6f 6b 69 65 21 3d 70 53 74 61 74 65 2d 3e 69  ookie!=pState->i
1da70 43 6f 6f 6b 69 65 20 29 7b 20 20 20 0a 20 20 20  Cookie ){   .   
1da80 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20       /* At this 
1da90 70 6f 69 6e 74 20 28 70 54 61 72 67 65 74 46 64  point (pTargetFd
1daa0 2d 3e 69 43 6f 6f 6b 69 65 29 20 63 6f 6e 74 61  ->iCookie) conta
1dab0 69 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ins the value of
1dac0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
1dad0 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 63  change-counter c
1dae0 6f 6f 6b 69 65 20 28 74 68 65 20 74 68 69 6e 67  ookie (the thing
1daf0 20 74 68 61 74 20 67 65 74 73 20 69 6e 63 72 65   that gets incre
1db00 6d 65 6e 74 65 64 20 77 68 65 6e 20 61 20 0a 20  mented when a . 
1db10 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61         ** transa
1db20 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
1db30 65 64 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d  ed in rollback m
1db40 6f 64 65 29 20 63 75 72 72 65 6e 74 6c 79 20 73  ode) currently s
1db50 74 6f 72 65 64 20 6f 6e 20 0a 20 20 20 20 20 20  tored on .      
1db60 20 20 2a 2a 20 70 61 67 65 20 31 20 6f 66 20 74    ** page 1 of t
1db70 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1db80 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 2d 3e  . */.        p->
1db90 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
1dba0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72  ;.        p->zEr
1dbb0 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rmsg = sqlite3_m
1dbc0 70 72 69 6e 74 66 28 22 64 61 74 61 62 61 73 65  printf("database
1dbd0 20 6d 6f 64 69 66 69 65 64 20 64 75 72 69 6e 67   modified during
1dbe0 20 72 62 75 20 25 73 22 2c 0a 20 20 20 20 20 20   rbu %s",.      
1dbf0 20 20 20 20 20 20 28 72 62 75 49 73 56 61 63 75        (rbuIsVacu
1dc00 75 6d 28 70 29 20 3f 20 22 76 61 63 75 75 6d 22  um(p) ? "vacuum"
1dc10 20 3a 20 22 75 70 64 61 74 65 22 29 0a 20 20 20   : "update").   
1dc20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
1dc30 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
1dc40 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1dc50 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
1dc60 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47  eStage==RBU_STAG
1dc70 45 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  E_OAL ){.       
1dc80 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1dc90 2d 3e 64 62 4d 61 69 6e 3b 0a 20 20 20 20 20 20  ->dbMain;.      
1dca0 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
1dcb0 33 5f 65 78 65 63 28 70 2d 3e 64 62 52 62 75 2c  3_exec(p->dbRbu,
1dcc0 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 2c 20   "BEGIN", 0, 0, 
1dcd0 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 0a 20  &p->zErrmsg);.. 
1dce0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 20         /* Point 
1dcf0 74 68 65 20 6f 62 6a 65 63 74 20 69 74 65 72 61  the object itera
1dd00 74 6f 72 20 61 74 20 74 68 65 20 66 69 72 73 74  tor at the first
1dd10 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 20   object */.     
1dd20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
1dd30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1dd40 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 62 75       p->rc = rbu
1dd50 4f 62 6a 49 74 65 72 46 69 72 73 74 28 70 2c 20  ObjIterFirst(p, 
1dd60 26 70 2d 3e 6f 62 6a 69 74 65 72 29 3b 0a 20 20  &p->objiter);.  
1dd70 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
1dd80 20 2f 2a 20 49 66 20 74 68 65 20 52 42 55 20 64   /* If the RBU d
1dd90 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 73  atabase contains
1dda0 20 6e 6f 20 64 61 74 61 5f 78 78 78 20 74 61 62   no data_xxx tab
1ddb0 6c 65 73 2c 20 64 65 63 6c 61 72 65 20 74 68 65  les, declare the
1ddc0 20 52 42 55 0a 20 20 20 20 20 20 20 20 2a 2a 20   RBU.        ** 
1ddd0 75 70 64 61 74 65 20 66 69 6e 69 73 68 65 64 2e  update finished.
1dde0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
1ddf0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1de00 4b 20 26 26 20 70 2d 3e 6f 62 6a 69 74 65 72 2e  K && p->objiter.
1de10 7a 54 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zTbl==0 ){.     
1de20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c       p->rc = SQL
1de30 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20  ITE_DONE;.      
1de40 20 20 20 20 70 2d 3e 65 53 74 61 67 65 20 3d 20      p->eStage = 
1de50 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45 3b 0a  RBU_STAGE_DONE;.
1de60 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1de70 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
1de80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1de90 20 70 53 74 61 74 65 2d 3e 65 53 74 61 67 65 3d   pState->eStage=
1dea0 3d 30 20 26 26 20 72 62 75 49 73 56 61 63 75 75  =0 && rbuIsVacuu
1deb0 6d 28 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20  m(p) ){.        
1dec0 20 20 20 20 72 62 75 43 6f 70 79 50 72 61 67 6d      rbuCopyPragm
1ded0 61 28 70 2c 20 22 70 61 67 65 5f 73 69 7a 65 22  a(p, "page_size"
1dee0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
1def0 62 75 43 6f 70 79 50 72 61 67 6d 61 28 70 2c 20  buCopyPragma(p, 
1df00 22 61 75 74 6f 5f 76 61 63 75 75 6d 22 29 3b 0a  "auto_vacuum");.
1df10 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
1df20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74         /* Open t
1df30 72 61 6e 73 61 63 74 69 6f 6e 73 20 62 6f 74 68  ransactions both
1df40 20 64 61 74 61 62 61 73 65 73 2e 20 54 68 65 20   databases. The 
1df50 2a 2d 6f 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  *-oal file is op
1df60 65 6e 65 64 20 6f 72 0a 20 20 20 20 20 20 20 20  ened or.        
1df70 20 20 2a 2a 20 63 72 65 61 74 65 64 20 61 74 20    ** created at 
1df80 74 68 69 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20  this point. */. 
1df90 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
1dfa0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1dfb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
1dfc0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
1dfd0 63 28 64 62 2c 20 22 42 45 47 49 4e 20 49 4d 4d  c(db, "BEGIN IMM
1dfe0 45 44 49 41 54 45 22 2c 20 30 2c 20 30 2c 20 26  EDIATE", 0, 0, &
1dff0 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20  p->zErrmsg);.   
1e000 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1e010 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
1e020 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
1e030 65 20 69 73 20 61 20 7a 69 70 76 66 73 20 64 62  e is a zipvfs db
1e040 2e 20 49 66 20 69 74 20 69 73 2c 20 73 65 74 20  . If it is, set 
1e050 74 68 65 20 75 70 70 65 72 0a 20 20 20 20 20 20  the upper.      
1e060 20 20 20 20 2a 2a 20 6c 65 76 65 6c 20 70 61 67      ** level pag
1e070 65 72 20 74 6f 20 75 73 65 20 22 6a 6f 75 72 6e  er to use "journ
1e080 61 6c 5f 6d 6f 64 65 3d 6f 66 66 22 2e 20 54 68  al_mode=off". Th
1e090 69 73 20 70 72 65 76 65 6e 74 73 20 69 74 20 66  is prevents it f
1e0a0 72 6f 6d 20 0a 20 20 20 20 20 20 20 20 20 20 2a  rom .          *
1e0b0 2a 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 6c  * generating a l
1e0c0 61 72 67 65 20 6a 6f 75 72 6e 61 6c 20 75 73 69  arge journal usi
1e0d0 6e 67 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20  ng a temp file. 
1e0e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
1e0f0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1e100 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1e110 20 20 69 6e 74 20 66 72 63 20 3d 20 73 71 6c 69    int frc = sqli
1e120 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
1e130 28 64 62 2c 20 22 6d 61 69 6e 22 2c 20 53 51 4c  (db, "main", SQL
1e140 49 54 45 5f 46 43 4e 54 4c 5f 5a 49 50 56 46 53  ITE_FCNTL_ZIPVFS
1e150 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
1e160 20 20 69 66 28 20 66 72 63 3d 3d 53 51 4c 49 54    if( frc==SQLIT
1e170 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1e180 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71        p->rc = sq
1e190 6c 69 74 65 33 5f 65 78 65 63 28 0a 20 20 20 20  lite3_exec(.    
1e1a0 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2c 20              db, 
1e1b0 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f  "PRAGMA journal_
1e1c0 6d 6f 64 65 3d 6f 66 66 22 2c 30 2c 30 2c 26 70  mode=off",0,0,&p
1e1d0 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20  ->zErrmsg);.    
1e1e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e1f0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
1e200 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1e210 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1e220 20 20 20 20 20 72 62 75 53 65 74 75 70 4f 61 6c       rbuSetupOal
1e230 28 70 2c 20 70 53 74 61 74 65 29 3b 0a 20 20 20  (p, pState);.   
1e240 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e250 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
1e260 66 28 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42  f( p->eStage==RB
1e270 55 5f 53 54 41 47 45 5f 4d 4f 56 45 20 29 7b 0a  U_STAGE_MOVE ){.
1e280 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70          /* no-op
1e290 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   */.      }else 
1e2a0 69 66 28 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52  if( p->eStage==R
1e2b0 42 55 5f 53 54 41 47 45 5f 43 4b 50 54 20 29 7b  BU_STAGE_CKPT ){
1e2c0 0a 20 20 20 20 20 20 20 20 72 62 75 53 65 74 75  .        rbuSetu
1e2d0 70 43 68 65 63 6b 70 6f 69 6e 74 28 70 2c 20 70  pCheckpoint(p, p
1e2e0 53 74 61 74 65 29 3b 0a 20 20 20 20 20 20 7d 65  State);.      }e
1e2f0 6c 73 65 20 69 66 28 20 70 2d 3e 65 53 74 61 67  lse if( p->eStag
1e300 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e  e==RBU_STAGE_DON
1e310 45 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  E ){.        p->
1e320 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
1e330 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1e340 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53         p->rc = S
1e350 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
1e360 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1e370 20 20 72 62 75 46 72 65 65 53 74 61 74 65 28 70    rbuFreeState(p
1e380 53 74 61 74 65 29 3b 0a 20 20 7d 0a 0a 20 20 72  State);.  }..  r
1e390 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
1e3a0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72  * Allocate and r
1e3b0 65 74 75 72 6e 20 61 6e 20 52 42 55 20 68 61 6e  eturn an RBU han
1e3c0 64 6c 65 20 77 69 74 68 20 61 6c 6c 20 66 69 65  dle with all fie
1e3d0 6c 64 73 20 7a 65 72 6f 65 64 20 65 78 63 65 70  lds zeroed excep
1e3e0 74 20 66 6f 72 20 74 68 65 0a 2a 2a 20 65 72 72  t for the.** err
1e3f0 6f 72 20 63 6f 64 65 2c 20 77 68 69 63 68 20 69  or code, which i
1e400 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
1e410 4d 49 53 55 53 45 2e 0a 2a 2f 0a 73 74 61 74 69  MISUSE..*/.stati
1e420 63 20 73 71 6c 69 74 65 33 72 62 75 20 2a 72 62  c sqlite3rbu *rb
1e430 75 4d 69 73 75 73 65 45 72 72 6f 72 28 76 6f 69  uMisuseError(voi
1e440 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 72 62 75  d){.  sqlite3rbu
1e450 20 2a 70 52 65 74 3b 0a 20 20 70 52 65 74 20 3d   *pRet;.  pRet =
1e460 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
1e470 34 28 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33  4(sizeof(sqlite3
1e480 72 62 75 29 29 3b 0a 20 20 69 66 28 20 70 52 65  rbu));.  if( pRe
1e490 74 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  t ){.    memset(
1e4a0 70 52 65 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pRet, 0, sizeof(
1e4b0 73 71 6c 69 74 65 33 72 62 75 29 29 3b 0a 20 20  sqlite3rbu));.  
1e4c0 20 20 70 52 65 74 2d 3e 72 63 20 3d 20 53 51 4c    pRet->rc = SQL
1e4d0 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a  ITE_MISUSE;.  }.
1e4e0 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
1e4f0 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 6e 64  ../*.** Open and
1e500 20 72 65 74 75 72 6e 20 61 20 6e 65 77 20 52 42   return a new RB
1e510 55 20 68 61 6e 64 6c 65 2e 20 0a 2a 2f 0a 73 71  U handle. .*/.sq
1e520 6c 69 74 65 33 72 62 75 20 2a 73 71 6c 69 74 65  lite3rbu *sqlite
1e530 33 72 62 75 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e  3rbu_open(.  con
1e540 73 74 20 63 68 61 72 20 2a 7a 54 61 72 67 65 74  st char *zTarget
1e550 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
1e560 2a 7a 52 62 75 2c 0a 20 20 63 6f 6e 73 74 20 63  *zRbu,.  const c
1e570 68 61 72 20 2a 7a 53 74 61 74 65 0a 29 7b 0a 20  har *zState.){. 
1e580 20 69 66 28 20 7a 54 61 72 67 65 74 3d 3d 30 20   if( zTarget==0 
1e590 7c 7c 20 7a 52 62 75 3d 3d 30 20 29 7b 20 72 65  || zRbu==0 ){ re
1e5a0 74 75 72 6e 20 72 62 75 4d 69 73 75 73 65 45 72  turn rbuMisuseEr
1e5b0 72 6f 72 28 29 3b 20 7d 0a 20 20 2f 2a 20 54 4f  ror(); }.  /* TO
1e5c0 44 4f 3a 20 43 68 65 63 6b 20 74 68 61 74 20 7a  DO: Check that z
1e5d0 54 61 72 67 65 74 20 61 6e 64 20 7a 52 62 75 20  Target and zRbu 
1e5e0 61 72 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 2a 2f 0a  are non-NULL */.
1e5f0 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 52 62 75    return openRbu
1e600 48 61 6e 64 6c 65 28 7a 54 61 72 67 65 74 2c 20  Handle(zTarget, 
1e610 7a 52 62 75 2c 20 7a 53 74 61 74 65 29 3b 0a 7d  zRbu, zState);.}
1e620 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 68  ../*.** Open a h
1e630 61 6e 64 6c 65 20 74 6f 20 62 65 67 69 6e 20 6f  andle to begin o
1e640 72 20 72 65 73 75 6d 65 20 61 6e 20 52 42 55 20  r resume an RBU 
1e650 56 41 43 55 55 4d 20 6f 70 65 72 61 74 69 6f 6e  VACUUM operation
1e660 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 72 62 75 20  ..*/.sqlite3rbu 
1e670 2a 73 71 6c 69 74 65 33 72 62 75 5f 76 61 63 75  *sqlite3rbu_vacu
1e680 75 6d 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  um(.  const char
1e690 20 2a 7a 54 61 72 67 65 74 2c 20 0a 20 20 63 6f   *zTarget, .  co
1e6a0 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61 74 65  nst char *zState
1e6b0 0a 29 7b 0a 20 20 69 66 28 20 7a 54 61 72 67 65  .){.  if( zTarge
1e6c0 74 3d 3d 30 20 29 7b 20 72 65 74 75 72 6e 20 72  t==0 ){ return r
1e6d0 62 75 4d 69 73 75 73 65 45 72 72 6f 72 28 29 3b  buMisuseError();
1e6e0 20 7d 0a 20 20 69 66 28 20 7a 53 74 61 74 65 20   }.  if( zState 
1e6f0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  ){.    int n = s
1e700 74 72 6c 65 6e 28 7a 53 74 61 74 65 29 3b 0a 20  trlen(zState);. 
1e710 20 20 20 69 66 28 20 6e 3e 3d 37 20 26 26 20 30     if( n>=7 && 0
1e720 3d 3d 6d 65 6d 63 6d 70 28 22 2d 76 61 63 74 6d  ==memcmp("-vactm
1e730 70 22 2c 20 26 7a 53 74 61 74 65 5b 6e 2d 37 5d  p", &zState[n-7]
1e740 2c 20 37 29 20 29 7b 0a 20 20 20 20 20 20 72 65  , 7) ){.      re
1e750 74 75 72 6e 20 72 62 75 4d 69 73 75 73 65 45 72  turn rbuMisuseEr
1e760 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ror();.    }.  }
1e770 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63  .  /* TODO: Chec
1e780 6b 20 74 68 61 74 20 62 6f 74 68 20 61 72 67 75  k that both argu
1e790 6d 65 6e 74 73 20 61 72 65 20 6e 6f 6e 2d 4e 55  ments are non-NU
1e7a0 4c 4c 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6f  LL */.  return o
1e7b0 70 65 6e 52 62 75 48 61 6e 64 6c 65 28 30 2c 20  penRbuHandle(0, 
1e7c0 7a 54 61 72 67 65 74 2c 20 7a 53 74 61 74 65 29  zTarget, zState)
1e7d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1e7e0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
1e7f0 61 6e 64 6c 65 20 75 73 65 64 20 62 79 20 70 52  andle used by pR
1e800 62 75 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a  bu..*/.sqlite3 *
1e810 73 71 6c 69 74 65 33 72 62 75 5f 64 62 28 73 71  sqlite3rbu_db(sq
1e820 6c 69 74 65 33 72 62 75 20 2a 70 52 62 75 2c 20  lite3rbu *pRbu, 
1e830 69 6e 74 20 62 52 62 75 29 7b 0a 20 20 73 71 6c  int bRbu){.  sql
1e840 69 74 65 33 20 2a 64 62 20 3d 20 30 3b 0a 20 20  ite3 *db = 0;.  
1e850 69 66 28 20 70 52 62 75 20 29 7b 0a 20 20 20 20  if( pRbu ){.    
1e860 64 62 20 3d 20 28 62 52 62 75 20 3f 20 70 52 62  db = (bRbu ? pRb
1e870 75 2d 3e 64 62 52 62 75 20 3a 20 70 52 62 75 2d  u->dbRbu : pRbu-
1e880 3e 64 62 4d 61 69 6e 29 3b 0a 20 20 7d 0a 20 20  >dbMain);.  }.  
1e890 72 65 74 75 72 6e 20 64 62 3b 0a 7d 0a 0a 0a 2f  return db;.}.../
1e8a0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f  *.** If the erro
1e8b0 72 20 63 6f 64 65 20 63 75 72 72 65 6e 74 6c 79  r code currently
1e8c0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 52   stored in the R
1e8d0 42 55 20 68 61 6e 64 6c 65 20 69 73 20 53 51 4c  BU handle is SQL
1e8e0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 0a  ITE_CONSTRAINT,.
1e8f0 2a 2a 20 74 68 65 6e 20 65 64 69 74 20 61 6e 79  ** then edit any
1e900 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73   error message s
1e910 74 72 69 6e 67 20 73 6f 20 61 73 20 74 6f 20 72  tring so as to r
1e920 65 6d 6f 76 65 20 61 6c 6c 20 6f 63 63 75 72 72  emove all occurr
1e930 65 6e 63 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  ences of.** the 
1e940 70 61 74 74 65 72 6e 20 22 72 62 75 5f 69 6d 70  pattern "rbu_imp
1e950 5f 5b 30 2d 39 5d 2a 22 2e 0a 2a 2f 0a 73 74 61  _[0-9]*"..*/.sta
1e960 74 69 63 20 76 6f 69 64 20 72 62 75 45 64 69 74  tic void rbuEdit
1e970 45 72 72 6d 73 67 28 73 71 6c 69 74 65 33 72 62  Errmsg(sqlite3rb
1e980 75 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  u *p){.  if( p->
1e990 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54  rc==SQLITE_CONST
1e9a0 52 41 49 4e 54 20 26 26 20 70 2d 3e 7a 45 72 72  RAINT && p->zErr
1e9b0 6d 73 67 20 29 7b 0a 20 20 20 20 75 6e 73 69 67  msg ){.    unsig
1e9c0 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 20 20 73  ned int i;.    s
1e9d0 69 7a 65 5f 74 20 6e 45 72 72 6d 73 67 20 3d 20  ize_t nErrmsg = 
1e9e0 73 74 72 6c 65 6e 28 70 2d 3e 7a 45 72 72 6d 73  strlen(p->zErrms
1e9f0 67 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  g);.    for(i=0;
1ea00 20 69 3c 28 6e 45 72 72 6d 73 67 2d 38 29 3b 20   i<(nErrmsg-8); 
1ea10 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
1ea20 6d 65 6d 63 6d 70 28 26 70 2d 3e 7a 45 72 72 6d  memcmp(&p->zErrm
1ea30 73 67 5b 69 5d 2c 20 22 72 62 75 5f 69 6d 70 5f  sg[i], "rbu_imp_
1ea40 22 2c 20 38 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", 8)==0 ){.    
1ea50 20 20 20 20 69 6e 74 20 6e 44 65 6c 20 3d 20 38      int nDel = 8
1ea60 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
1ea70 20 70 2d 3e 7a 45 72 72 6d 73 67 5b 69 2b 6e 44   p->zErrmsg[i+nD
1ea80 65 6c 5d 3e 3d 27 30 27 20 26 26 20 70 2d 3e 7a  el]>='0' && p->z
1ea90 45 72 72 6d 73 67 5b 69 2b 6e 44 65 6c 5d 3c 3d  Errmsg[i+nDel]<=
1eaa0 27 39 27 20 29 20 6e 44 65 6c 2b 2b 3b 0a 20 20  '9' ) nDel++;.  
1eab0 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 70        memmove(&p
1eac0 2d 3e 7a 45 72 72 6d 73 67 5b 69 5d 2c 20 26 70  ->zErrmsg[i], &p
1ead0 2d 3e 7a 45 72 72 6d 73 67 5b 69 2b 6e 44 65 6c  ->zErrmsg[i+nDel
1eae0 5d 2c 20 6e 45 72 72 6d 73 67 20 2b 20 31 20 2d  ], nErrmsg + 1 -
1eaf0 20 69 20 2d 20 6e 44 65 6c 29 3b 0a 20 20 20 20   i - nDel);.    
1eb00 20 20 20 20 6e 45 72 72 6d 73 67 20 2d 3d 20 6e      nErrmsg -= n
1eb10 44 65 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Del;.      }.   
1eb20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
1eb30 43 6c 6f 73 65 20 74 68 65 20 52 42 55 20 68 61  Close the RBU ha
1eb40 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ndle..*/.int sql
1eb50 69 74 65 33 72 62 75 5f 63 6c 6f 73 65 28 73 71  ite3rbu_close(sq
1eb60 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 63 68 61  lite3rbu *p, cha
1eb70 72 20 2a 2a 70 7a 45 72 72 6d 73 67 29 7b 0a 20  r **pzErrmsg){. 
1eb80 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70   int rc;.  if( p
1eb90 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 6d   ){..    /* Comm
1eba0 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
1ebb0 6f 6e 20 74 6f 20 74 68 65 20 2a 2d 6f 61 6c 20  on to the *-oal 
1ebc0 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  file. */.    if(
1ebd0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1ebe0 4b 20 26 26 20 70 2d 3e 65 53 74 61 67 65 3d 3d  K && p->eStage==
1ebf0 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 29 7b  RBU_STAGE_OAL ){
1ec00 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  .      p->rc = s
1ec10 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
1ec20 62 4d 61 69 6e 2c 20 22 43 4f 4d 4d 49 54 22 2c  bMain, "COMMIT",
1ec30 20 30 2c 20 30 2c 20 26 70 2d 3e 7a 45 72 72 6d   0, 0, &p->zErrm
1ec40 73 67 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  sg);.    }..    
1ec50 2f 2a 20 53 79 6e 63 20 74 68 65 20 64 62 20 66  /* Sync the db f
1ec60 69 6c 65 20 69 66 20 63 75 72 72 65 6e 74 6c 79  ile if currently
1ec70 20 64 6f 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d   doing an increm
1ec80 65 6e 74 61 6c 20 63 68 65 63 6b 70 6f 69 6e 74  ental checkpoint
1ec90 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72   */.    if( p->r
1eca0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1ecb0 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53  p->eStage==RBU_S
1ecc0 54 41 47 45 5f 43 4b 50 54 20 29 7b 0a 20 20 20  TAGE_CKPT ){.   
1ecd0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
1ece0 2a 70 44 62 20 3d 20 70 2d 3e 70 54 61 72 67 65  *pDb = p->pTarge
1ecf0 74 46 64 2d 3e 70 52 65 61 6c 3b 0a 20 20 20 20  tFd->pReal;.    
1ed00 20 20 70 2d 3e 72 63 20 3d 20 70 44 62 2d 3e 70    p->rc = pDb->p
1ed10 4d 65 74 68 6f 64 73 2d 3e 78 53 79 6e 63 28 70  Methods->xSync(p
1ed20 44 62 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  Db, SQLITE_SYNC_
1ed30 4e 4f 52 4d 41 4c 29 3b 0a 20 20 20 20 7d 0a 0a  NORMAL);.    }..
1ed40 20 20 20 20 72 62 75 53 61 76 65 53 74 61 74 65      rbuSaveState
1ed50 28 70 2c 20 70 2d 3e 65 53 74 61 67 65 29 3b 0a  (p, p->eStage);.
1ed60 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  .    if( p->rc==
1ed70 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e  SQLITE_OK && p->
1ed80 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47  eStage==RBU_STAG
1ed90 45 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 20 20 70  E_OAL ){.      p
1eda0 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65  ->rc = sqlite3_e
1edb0 78 65 63 28 70 2d 3e 64 62 52 62 75 2c 20 22 43  xec(p->dbRbu, "C
1edc0 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 26 70  OMMIT", 0, 0, &p
1edd0 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20  ->zErrmsg);.    
1ede0 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65 20  }..    /* Close 
1edf0 61 6e 79 20 6f 70 65 6e 20 73 74 61 74 65 6d 65  any open stateme
1ee00 6e 74 20 68 61 6e 64 6c 65 73 2e 20 2a 2f 0a 20  nt handles. */. 
1ee10 20 20 20 72 62 75 4f 62 6a 49 74 65 72 46 69 6e     rbuObjIterFin
1ee20 61 6c 69 7a 65 28 26 70 2d 3e 6f 62 6a 69 74 65  alize(&p->objite
1ee30 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  r);..    /* If t
1ee40 68 69 73 20 69 73 20 61 6e 20 52 42 55 20 76 61  his is an RBU va
1ee50 63 75 75 6d 20 68 61 6e 64 6c 65 20 61 6e 64 20  cuum handle and 
1ee60 74 68 65 20 76 61 63 75 75 6d 20 68 61 73 20 65  the vacuum has e
1ee70 69 74 68 65 72 20 66 69 6e 69 73 68 65 64 0a 20  ither finished. 
1ee80 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c     ** successful
1ee90 6c 79 20 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65  ly or encountere
1eea0 64 20 61 6e 20 65 72 72 6f 72 2c 20 64 65 6c 65  d an error, dele
1eeb0 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  te the contents 
1eec0 6f 66 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73  of the .    ** s
1eed0 74 61 74 65 20 74 61 62 6c 65 2e 20 54 68 69 73  tate table. This
1eee0 20 63 61 75 73 65 73 20 74 68 65 20 6e 65 78 74   causes the next
1eef0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
1ef00 72 62 75 5f 76 61 63 75 75 6d 28 29 20 0a 20 20  rbu_vacuum() .  
1ef10 20 20 2a 2a 20 73 70 65 63 69 66 79 69 6e 67 20    ** specifying 
1ef20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 72 67  the current targ
1ef30 65 74 20 61 6e 64 20 73 74 61 74 65 20 64 61 74  et and state dat
1ef40 61 62 61 73 65 73 20 74 6f 20 73 74 61 72 74 20  abases to start 
1ef50 61 20 6e 65 77 0a 20 20 20 20 2a 2a 20 76 61 63  a new.    ** vac
1ef60 75 75 6d 20 66 72 6f 6d 20 73 63 72 61 74 63 68  uum from scratch
1ef70 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 62  .  */.    if( rb
1ef80 75 49 73 56 61 63 75 75 6d 28 70 29 20 26 26 20  uIsVacuum(p) && 
1ef90 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
1efa0 20 26 26 20 70 2d 3e 64 62 52 62 75 20 29 7b 0a   && p->dbRbu ){.
1efb0 20 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20        int rc2 = 
1efc0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
1efd0 64 62 52 62 75 2c 20 22 44 45 4c 45 54 45 20 46  dbRbu, "DELETE F
1efe0 52 4f 4d 20 73 74 61 74 2e 72 62 75 5f 73 74 61  ROM stat.rbu_sta
1eff0 74 65 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  te", 0, 0, 0);. 
1f000 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
1f010 53 51 4c 49 54 45 5f 44 4f 4e 45 20 26 26 20 72  SQLITE_DONE && r
1f020 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  c2!=SQLITE_OK ) 
1f030 70 2d 3e 72 63 20 3d 20 72 63 32 3b 0a 20 20 20  p->rc = rc2;.   
1f040 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65   }..    /* Close
1f050 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
1f060 73 65 20 68 61 6e 64 6c 65 20 61 6e 64 20 56 46  se handle and VF
1f070 53 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 20  S object. */.   
1f080 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70   sqlite3_close(p
1f090 2d 3e 64 62 52 62 75 29 3b 0a 20 20 20 20 73 71  ->dbRbu);.    sq
1f0a0 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64  lite3_close(p->d
1f0b0 62 4d 61 69 6e 29 3b 0a 20 20 20 20 61 73 73 65  bMain);.    asse
1f0c0 72 74 28 20 70 2d 3e 73 7a 54 65 6d 70 3d 3d 30  rt( p->szTemp==0
1f0d0 20 29 3b 0a 20 20 20 20 72 62 75 44 65 6c 65 74   );.    rbuDelet
1f0e0 65 56 66 73 28 70 29 3b 0a 20 20 20 20 73 71 6c  eVfs(p);.    sql
1f0f0 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 42 75  ite3_free(p->aBu
1f100 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  f);.    sqlite3_
1f110 66 72 65 65 28 70 2d 3e 61 46 72 61 6d 65 29 3b  free(p->aFrame);
1f120 0a 0a 20 20 20 20 72 62 75 45 64 69 74 45 72 72  ..    rbuEditErr
1f130 6d 73 67 28 70 29 3b 0a 20 20 20 20 72 63 20 3d  msg(p);.    rc =
1f140 20 70 2d 3e 72 63 3b 0a 20 20 20 20 69 66 28 20   p->rc;.    if( 
1f150 70 7a 45 72 72 6d 73 67 20 29 7b 0a 20 20 20 20  pzErrmsg ){.    
1f160 20 20 2a 70 7a 45 72 72 6d 73 67 20 3d 20 70 2d    *pzErrmsg = p-
1f170 3e 7a 45 72 72 6d 73 67 3b 0a 20 20 20 20 7d 65  >zErrmsg;.    }e
1f180 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
1f190 65 33 5f 66 72 65 65 28 70 2d 3e 7a 45 72 72 6d  e3_free(p->zErrm
1f1a0 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  sg);.    }.    s
1f1b0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a  qlite3_free(p->z
1f1c0 53 74 61 74 65 29 3b 0a 20 20 20 20 73 71 6c 69  State);.    sqli
1f1d0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d  te3_free(p);.  }
1f1e0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
1f1f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1f200 20 2a 70 7a 45 72 72 6d 73 67 20 3d 20 30 3b 0a   *pzErrmsg = 0;.
1f210 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1f220 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1f230 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
1f240 72 20 6f 66 20 6b 65 79 2d 76 61 6c 75 65 20 6f  r of key-value o
1f250 70 65 72 61 74 69 6f 6e 73 20 28 69 6e 73 65 72  perations (inser
1f260 74 73 2c 20 64 65 6c 65 74 65 73 20 6f 72 20 0a  ts, deletes or .
1f270 2a 2a 20 75 70 64 61 74 65 73 29 20 74 68 61 74  ** updates) that
1f280 20 68 61 76 65 20 62 65 65 6e 20 70 65 72 66 6f   have been perfo
1f290 72 6d 65 64 20 6f 6e 20 74 68 65 20 74 61 72 67  rmed on the targ
1f2a0 65 74 20 64 61 74 61 62 61 73 65 20 73 69 6e 63  et database sinc
1f2b0 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  e the.** current
1f2c0 20 52 42 55 20 75 70 64 61 74 65 20 77 61 73 20   RBU update was 
1f2d0 73 74 61 72 74 65 64 2e 0a 2a 2f 0a 73 71 6c 69  started..*/.sqli
1f2e0 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65  te3_int64 sqlite
1f2f0 33 72 62 75 5f 70 72 6f 67 72 65 73 73 28 73 71  3rbu_progress(sq
1f300 6c 69 74 65 33 72 62 75 20 2a 70 52 62 75 29 7b  lite3rbu *pRbu){
1f310 0a 20 20 72 65 74 75 72 6e 20 70 52 62 75 2d 3e  .  return pRbu->
1f320 6e 50 72 6f 67 72 65 73 73 3b 0a 7d 0a 0a 2f 2a  nProgress;.}../*
1f330 0a 2a 2a 20 52 65 74 75 72 6e 20 70 65 72 6d 79  .** Return permy
1f340 72 69 61 64 61 67 65 20 70 72 6f 67 72 65 73 73  riadage progress
1f350 20 69 6e 64 69 63 61 74 69 6f 6e 73 20 66 6f 72   indications for
1f360 20 74 68 65 20 74 77 6f 20 6d 61 69 6e 20 73 74   the two main st
1f370 61 67 65 73 20 6f 66 0a 2a 2a 20 61 6e 20 52 42  ages of.** an RB
1f380 55 20 75 70 64 61 74 65 2e 0a 2a 2f 0a 76 6f 69  U update..*/.voi
1f390 64 20 73 71 6c 69 74 65 33 72 62 75 5f 62 70 5f  d sqlite3rbu_bp_
1f3a0 70 72 6f 67 72 65 73 73 28 73 71 6c 69 74 65 33  progress(sqlite3
1f3b0 72 62 75 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f  rbu *p, int *pnO
1f3c0 6e 65 2c 20 69 6e 74 20 2a 70 6e 54 77 6f 29 7b  ne, int *pnTwo){
1f3d0 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 4d 41 58  .  const int MAX
1f3e0 5f 50 52 4f 47 52 45 53 53 20 3d 20 31 30 30 30  _PROGRESS = 1000
1f3f0 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e  0;.  switch( p->
1f400 65 53 74 61 67 65 20 29 7b 0a 20 20 20 20 63 61  eStage ){.    ca
1f410 73 65 20 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c  se RBU_STAGE_OAL
1f420 3a 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  :.      if( p->n
1f430 50 68 61 73 65 4f 6e 65 53 74 65 70 3e 30 20 29  PhaseOneStep>0 )
1f440 7b 0a 20 20 20 20 20 20 20 20 2a 70 6e 4f 6e 65  {.        *pnOne
1f450 20 3d 20 28 69 6e 74 29 28 4d 41 58 5f 50 52 4f   = (int)(MAX_PRO
1f460 47 52 45 53 53 20 2a 20 28 69 36 34 29 70 2d 3e  GRESS * (i64)p->
1f470 6e 50 72 6f 67 72 65 73 73 2f 28 69 36 34 29 70  nProgress/(i64)p
1f480 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 29  ->nPhaseOneStep)
1f490 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1f4a0 20 20 20 20 20 20 20 2a 70 6e 4f 6e 65 20 3d 20         *pnOne = 
1f4b0 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
1f4c0 20 20 2a 70 6e 54 77 6f 20 3d 20 30 3b 0a 20 20    *pnTwo = 0;.  
1f4d0 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
1f4e0 63 61 73 65 20 52 42 55 5f 53 54 41 47 45 5f 4d  case RBU_STAGE_M
1f4f0 4f 56 45 3a 0a 20 20 20 20 20 20 2a 70 6e 4f 6e  OVE:.      *pnOn
1f500 65 20 3d 20 4d 41 58 5f 50 52 4f 47 52 45 53 53  e = MAX_PROGRESS
1f510 3b 0a 20 20 20 20 20 20 2a 70 6e 54 77 6f 20 3d  ;.      *pnTwo =
1f520 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
1f530 0a 0a 20 20 20 20 63 61 73 65 20 52 42 55 5f 53  ..    case RBU_S
1f540 54 41 47 45 5f 43 4b 50 54 3a 0a 20 20 20 20 20  TAGE_CKPT:.     
1f550 20 2a 70 6e 4f 6e 65 20 3d 20 4d 41 58 5f 50 52   *pnOne = MAX_PR
1f560 4f 47 52 45 53 53 3b 0a 20 20 20 20 20 20 2a 70  OGRESS;.      *p
1f570 6e 54 77 6f 20 3d 20 28 69 6e 74 29 28 4d 41 58  nTwo = (int)(MAX
1f580 5f 50 52 4f 47 52 45 53 53 20 2a 20 28 69 36 34  _PROGRESS * (i64
1f590 29 70 2d 3e 6e 53 74 65 70 20 2f 20 28 69 36 34  )p->nStep / (i64
1f5a0 29 70 2d 3e 6e 46 72 61 6d 65 29 3b 0a 20 20 20  )p->nFrame);.   
1f5b0 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
1f5c0 61 73 65 20 52 42 55 5f 53 54 41 47 45 5f 44 4f  ase RBU_STAGE_DO
1f5d0 4e 45 3a 0a 20 20 20 20 20 20 2a 70 6e 4f 6e 65  NE:.      *pnOne
1f5e0 20 3d 20 4d 41 58 5f 50 52 4f 47 52 45 53 53 3b   = MAX_PROGRESS;
1f5f0 0a 20 20 20 20 20 20 2a 70 6e 54 77 6f 20 3d 20  .      *pnTwo = 
1f600 4d 41 58 5f 50 52 4f 47 52 45 53 53 3b 0a 20 20  MAX_PROGRESS;.  
1f610 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
1f620 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61  default:.      a
1f630 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a  ssert( 0 );.  }.
1f640 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1f650 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
1f660 65 20 6f 66 20 74 68 65 20 52 42 55 20 76 61 63  e of the RBU vac
1f670 75 75 6d 20 6f 72 20 75 70 64 61 74 65 20 6f 70  uum or update op
1f680 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  eration..*/.int 
1f690 73 71 6c 69 74 65 33 72 62 75 5f 73 74 61 74 65  sqlite3rbu_state
1f6a0 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b  (sqlite3rbu *p){
1f6b0 0a 20 20 69 6e 74 20 61 52 65 73 5b 5d 20 3d 20  .  int aRes[] = 
1f6c0 7b 0a 20 20 20 20 30 2c 20 53 51 4c 49 54 45 5f  {.    0, SQLITE_
1f6d0 52 42 55 5f 53 54 41 54 45 5f 4f 41 4c 2c 20 53  RBU_STATE_OAL, S
1f6e0 51 4c 49 54 45 5f 52 42 55 5f 53 54 41 54 45 5f  QLITE_RBU_STATE_
1f6f0 4d 4f 56 45 2c 0a 20 20 20 20 30 2c 20 53 51 4c  MOVE,.    0, SQL
1f700 49 54 45 5f 52 42 55 5f 53 54 41 54 45 5f 43 48  ITE_RBU_STATE_CH
1f710 45 43 4b 50 4f 49 4e 54 2c 20 53 51 4c 49 54 45  ECKPOINT, SQLITE
1f720 5f 52 42 55 5f 53 54 41 54 45 5f 44 4f 4e 45 0a  _RBU_STATE_DONE.
1f730 20 20 7d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20    };..  assert( 
1f740 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 3d 3d 31  RBU_STAGE_OAL==1
1f750 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 52 42   );.  assert( RB
1f760 55 5f 53 54 41 47 45 5f 4d 4f 56 45 3d 3d 32 20  U_STAGE_MOVE==2 
1f770 29 3b 0a 20 20 61 73 73 65 72 74 28 20 52 42 55  );.  assert( RBU
1f780 5f 53 54 41 47 45 5f 43 4b 50 54 3d 3d 34 20 29  _STAGE_CKPT==4 )
1f790 3b 0a 20 20 61 73 73 65 72 74 28 20 52 42 55 5f  ;.  assert( RBU_
1f7a0 53 54 41 47 45 5f 44 4f 4e 45 3d 3d 35 20 29 3b  STAGE_DONE==5 );
1f7b0 0a 20 20 61 73 73 65 72 74 28 20 61 52 65 73 5b  .  assert( aRes[
1f7c0 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 5d 3d 3d  RBU_STAGE_OAL]==
1f7d0 53 51 4c 49 54 45 5f 52 42 55 5f 53 54 41 54 45  SQLITE_RBU_STATE
1f7e0 5f 4f 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74  _OAL );.  assert
1f7f0 28 20 61 52 65 73 5b 52 42 55 5f 53 54 41 47 45  ( aRes[RBU_STAGE
1f800 5f 4d 4f 56 45 5d 3d 3d 53 51 4c 49 54 45 5f 52  _MOVE]==SQLITE_R
1f810 42 55 5f 53 54 41 54 45 5f 4d 4f 56 45 20 29 3b  BU_STATE_MOVE );
1f820 0a 20 20 61 73 73 65 72 74 28 20 61 52 65 73 5b  .  assert( aRes[
1f830 52 42 55 5f 53 54 41 47 45 5f 43 4b 50 54 5d 3d  RBU_STAGE_CKPT]=
1f840 3d 53 51 4c 49 54 45 5f 52 42 55 5f 53 54 41 54  =SQLITE_RBU_STAT
1f850 45 5f 43 48 45 43 4b 50 4f 49 4e 54 20 29 3b 0a  E_CHECKPOINT );.
1f860 20 20 61 73 73 65 72 74 28 20 61 52 65 73 5b 52    assert( aRes[R
1f870 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45 5d 3d 3d  BU_STAGE_DONE]==
1f880 53 51 4c 49 54 45 5f 52 42 55 5f 53 54 41 54 45  SQLITE_RBU_STATE
1f890 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20 69 66 28 20  _DONE );..  if( 
1f8a0 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
1f8b0 20 26 26 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54   && p->rc!=SQLIT
1f8c0 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 72 65  E_DONE ){.    re
1f8d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 42 55 5f  turn SQLITE_RBU_
1f8e0 53 54 41 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  STATE_ERROR;.  }
1f8f0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
1f900 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
1f910 44 4f 4e 45 20 7c 7c 20 70 2d 3e 65 53 74 61 67  DONE || p->eStag
1f920 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e  e==RBU_STAGE_DON
1f930 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
1f940 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f   p->eStage==RBU_
1f950 53 54 41 47 45 5f 4f 41 4c 0a 20 20 20 20 20 20  STAGE_OAL.      
1f960 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 67 65 3d     || p->eStage=
1f970 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 0a  =RBU_STAGE_MOVE.
1f980 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65           || p->e
1f990 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45  Stage==RBU_STAGE
1f9a0 5f 43 4b 50 54 0a 20 20 20 20 20 20 20 20 20 7c  _CKPT.         |
1f9b0 7c 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55  | p->eStage==RBU
1f9c0 5f 53 54 41 47 45 5f 44 4f 4e 45 0a 20 20 20 20  _STAGE_DONE.    
1f9d0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 52  );.    return aR
1f9e0 65 73 5b 70 2d 3e 65 53 74 61 67 65 5d 3b 0a 20  es[p->eStage];. 
1f9f0 20 7d 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65   }.}..int sqlite
1fa00 33 72 62 75 5f 73 61 76 65 73 74 61 74 65 28 73  3rbu_savestate(s
1fa10 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20  qlite3rbu *p){. 
1fa20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b   int rc = p->rc;
1fa30 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1fa40 45 5f 44 4f 4e 45 20 29 20 72 65 74 75 72 6e 20  E_DONE ) return 
1fa50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
1fa60 73 65 72 74 28 20 70 2d 3e 65 53 74 61 67 65 3e  sert( p->eStage>
1fa70 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 26  =RBU_STAGE_OAL &
1fa80 26 20 70 2d 3e 65 53 74 61 67 65 3c 3d 52 42 55  & p->eStage<=RBU
1fa90 5f 53 54 41 47 45 5f 44 4f 4e 45 20 29 3b 0a 20  _STAGE_DONE );. 
1faa0 20 69 66 28 20 70 2d 3e 65 53 74 61 67 65 3d 3d   if( p->eStage==
1fab0 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 29 7b  RBU_STAGE_OAL ){
1fac0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
1fad0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
1fae0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1faf0 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 73 71 6c  TE_OK ) rc = sql
1fb00 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 4d  ite3_exec(p->dbM
1fb10 61 69 6e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30  ain, "COMMIT", 0
1fb20 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , 0, 0);.  }..  
1fb30 2f 2a 20 53 79 6e 63 20 74 68 65 20 64 62 20 66  /* Sync the db f
1fb40 69 6c 65 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ile */.  if( rc=
1fb50 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d  =SQLITE_OK && p-
1fb60 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41  >eStage==RBU_STA
1fb70 47 45 5f 43 4b 50 54 20 29 7b 0a 20 20 20 20 73  GE_CKPT ){.    s
1fb80 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 44 62  qlite3_file *pDb
1fb90 20 3d 20 70 2d 3e 70 54 61 72 67 65 74 46 64 2d   = p->pTargetFd-
1fba0 3e 70 52 65 61 6c 3b 0a 20 20 20 20 72 63 20 3d  >pReal;.    rc =
1fbb0 20 70 44 62 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e   pDb->pMethods->
1fbc0 78 53 79 6e 63 28 70 44 62 2c 20 53 51 4c 49 54  xSync(pDb, SQLIT
1fbd0 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a  E_SYNC_NORMAL);.
1fbe0 20 20 7d 0a 0a 20 20 70 2d 3e 72 63 20 3d 20 72    }..  p->rc = r
1fbf0 63 3b 0a 20 20 72 62 75 53 61 76 65 53 74 61 74  c;.  rbuSaveStat
1fc00 65 28 70 2c 20 70 2d 3e 65 53 74 61 67 65 29 3b  e(p, p->eStage);
1fc10 0a 20 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 0a  .  rc = p->rc;..
1fc20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 67 65 3d    if( p->eStage=
1fc30 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 29  =RBU_STAGE_OAL )
1fc40 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  {.    assert( rc
1fc50 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
1fc60 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1fc70 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 73 71  ITE_OK ) rc = sq
1fc80 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
1fc90 52 62 75 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30  Rbu, "COMMIT", 0
1fca0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
1fcb0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1fcc0 7b 20 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  { .      const c
1fcd0 68 61 72 20 2a 7a 42 65 67 69 6e 20 3d 20 72 62  har *zBegin = rb
1fce0 75 49 73 56 61 63 75 75 6d 28 70 29 20 3f 20 22  uIsVacuum(p) ? "
1fcf0 42 45 47 49 4e 22 20 3a 20 22 42 45 47 49 4e 20  BEGIN" : "BEGIN 
1fd00 49 4d 4d 45 44 49 41 54 45 22 3b 0a 20 20 20 20  IMMEDIATE";.    
1fd10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
1fd20 78 65 63 28 70 2d 3e 64 62 52 62 75 2c 20 7a 42  xec(p->dbRbu, zB
1fd30 65 67 69 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  egin, 0, 0, 0);.
1fd40 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
1fd50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  ==SQLITE_OK ) rc
1fd60 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
1fd70 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 42 45 47 49  p->dbMain, "BEGI
1fd80 4e 20 49 4d 4d 45 44 49 41 54 45 22 2c 20 30 2c  N IMMEDIATE", 0,
1fd90 20 30 2c 30 29 3b 0a 20 20 7d 0a 0a 20 20 70 2d   0,0);.  }..  p-
1fda0 3e 72 63 20 3d 20 72 63 3b 0a 20 20 72 65 74 75  >rc = rc;.  retu
1fdb0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a  rn rc;.}../*****
1fdc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fdd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fde0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fdf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fe00 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 67 69 6e 6e 69  *****.** Beginni
1fe10 6e 67 20 6f 66 20 52 42 55 20 56 46 53 20 73 68  ng of RBU VFS sh
1fe20 69 6d 20 6d 65 74 68 6f 64 73 2e 20 54 68 65 20  im methods. The 
1fe30 56 46 53 20 73 68 69 6d 20 6d 6f 64 69 66 69 65  VFS shim modifie
1fe40 73 20 74 68 65 20 62 65 68 61 76 69 6f 75 72 0a  s the behaviour.
1fe50 2a 2a 20 6f 66 20 61 20 73 74 61 6e 64 61 72 64  ** of a standard
1fe60 20 56 46 53 20 69 6e 20 74 68 65 20 66 6f 6c 6c   VFS in the foll
1fe70 6f 77 69 6e 67 20 77 61 79 73 3a 0a 2a 2a 0a 2a  owing ways:.**.*
1fe80 2a 20 31 2e 20 57 68 65 6e 65 76 65 72 20 74 68  * 1. Whenever th
1fe90 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
1fea0 61 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  a main database 
1feb0 66 69 6c 65 20 69 73 20 72 65 61 64 20 6f 72 20  file is read or 
1fec0 0a 2a 2a 20 20 20 20 77 72 69 74 74 65 6e 2c 20  .**    written, 
1fed0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
1fee0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
1fef0 63 6f 6f 6b 69 65 20 69 73 20 73 74 6f 72 65 64  cookie is stored
1ff00 20 69 6e 0a 2a 2a 20 20 20 20 72 62 75 5f 66 69   in.**    rbu_fi
1ff10 6c 65 2e 69 43 6f 6f 6b 69 65 2e 20 53 69 6d 69  le.iCookie. Simi
1ff20 6c 61 72 6c 79 2c 20 74 68 65 20 76 61 6c 75 65  larly, the value
1ff30 20 6f 66 20 74 68 65 20 22 77 72 69 74 65 2d 76   of the "write-v
1ff40 65 72 73 69 6f 6e 22 0a 2a 2a 20 20 20 20 64 61  ersion".**    da
1ff50 74 61 62 61 73 65 20 68 65 61 64 65 72 20 66 69  tabase header fi
1ff60 65 6c 64 20 69 73 20 73 74 6f 72 65 64 20 69 6e  eld is stored in
1ff70 20 72 62 75 5f 66 69 6c 65 2e 69 57 72 69 74 65   rbu_file.iWrite
1ff80 56 65 72 2e 20 54 68 69 73 20 65 6e 73 75 72 65  Ver. This ensure
1ff90 73 0a 2a 2a 20 20 20 20 74 68 61 74 20 74 68 65  s.**    that the
1ffa0 20 76 61 6c 75 65 73 20 61 72 65 20 61 6c 77 61   values are alwa
1ffb0 79 73 20 74 72 75 73 74 77 6f 72 74 68 79 20 77  ys trustworthy w
1ffc0 69 74 68 69 6e 20 61 6e 20 6f 70 65 6e 20 74 72  ithin an open tr
1ffd0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
1ffe0 20 32 2e 20 57 68 65 6e 65 76 65 72 20 61 6e 20   2. Whenever an 
1fff0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20  SQLITE_OPEN_WAL 
20000 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 2c 20  file is opened, 
20010 74 68 65 20 28 72 62 75 5f 66 69 6c 65 2e 70 57  the (rbu_file.pW
20020 61 6c 46 64 29 0a 2a 2a 20 20 20 20 6d 65 6d 62  alFd).**    memb
20030 65 72 20 76 61 72 69 61 62 6c 65 20 6f 66 20 74  er variable of t
20040 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 64 61  he associated da
20050 74 61 62 61 73 65 20 66 69 6c 65 20 64 65 73 63  tabase file desc
20060 72 69 70 74 6f 72 20 69 73 20 73 65 74 0a 2a 2a  riptor is set.**
20070 20 20 20 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20      to point to 
20080 74 68 65 20 6e 65 77 20 66 69 6c 65 2e 20 41 20  the new file. A 
20090 6d 75 74 65 78 20 70 72 6f 74 65 63 74 65 64 20  mutex protected 
200a0 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 61  linked list of a
200b0 6c 6c 20 6d 61 69 6e 20 0a 2a 2a 20 20 20 20 64  ll main .**    d
200c0 62 20 66 64 73 20 6f 70 65 6e 65 64 20 75 73 69  b fds opened usi
200d0 6e 67 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  ng a particular 
200e0 52 42 55 20 56 46 53 20 69 73 20 6d 61 69 6e 74  RBU VFS is maint
200f0 61 69 6e 65 64 20 61 74 20 0a 2a 2a 20 20 20 20  ained at .**    
20100 72 62 75 5f 76 66 73 2e 70 4d 61 69 6e 20 74 6f  rbu_vfs.pMain to
20110 20 66 61 63 69 6c 69 74 61 74 65 20 74 68 69 73   facilitate this
20120 2e 0a 2a 2a 0a 2a 2a 20 33 2e 20 55 73 69 6e 67  ..**.** 3. Using
20130 20 61 20 6e 65 77 20 66 69 6c 65 2d 63 6f 6e 74   a new file-cont
20140 72 6f 6c 20 22 53 51 4c 49 54 45 5f 46 43 4e 54  rol "SQLITE_FCNT
20150 4c 5f 52 42 55 22 2c 20 61 20 6d 61 69 6e 20 64  L_RBU", a main d
20160 62 20 72 62 75 5f 66 69 6c 65 20 0a 2a 2a 20 20  b rbu_file .**  
20170 20 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 20    object can be 
20180 6d 61 72 6b 65 64 20 61 73 20 74 68 65 20 74 61  marked as the ta
20190 72 67 65 74 20 64 61 74 61 62 61 73 65 20 6f 66  rget database of
201a0 20 61 6e 20 52 42 55 20 75 70 64 61 74 65 2e 20   an RBU update. 
201b0 54 68 69 73 0a 2a 2a 20 20 20 20 74 75 72 6e 73  This.**    turns
201c0 20 6f 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   on the followin
201d0 67 20 65 78 74 72 61 20 73 70 65 63 69 61 6c 20  g extra special 
201e0 62 65 68 61 76 69 6f 75 72 3a 0a 2a 2a 0a 2a 2a  behaviour:.**.**
201f0 20 33 61 2e 20 49 66 20 78 41 63 63 65 73 73 28   3a. If xAccess(
20200 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63  ) is called to c
20210 68 65 63 6b 20 69 66 20 74 68 65 72 65 20 65 78  heck if there ex
20220 69 73 74 73 20 61 20 2a 2d 77 61 6c 20 66 69 6c  ists a *-wal fil
20230 65 20 0a 2a 2a 20 20 20 20 20 61 73 73 6f 63 69  e .**     associ
20240 61 74 65 64 20 77 69 74 68 20 61 6e 20 52 42 55  ated with an RBU
20250 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65   target database
20260 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 52 42   currently in RB
20270 55 5f 53 54 41 47 45 5f 4f 41 4c 0a 2a 2a 20 20  U_STAGE_OAL.**  
20280 20 20 20 73 74 61 67 65 20 28 70 72 65 70 61 72     stage (prepar
20290 69 6e 67 20 74 68 65 20 2a 2d 6f 61 6c 20 66 69  ing the *-oal fi
202a0 6c 65 29 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  le), the followi
202b0 6e 67 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c  ng special handl
202c0 69 6e 67 0a 2a 2a 20 20 20 20 20 61 70 70 6c 69  ing.**     appli
202d0 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 2a  es:.**.**      *
202e0 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69   if the *-wal fi
202f0 6c 65 20 64 6f 65 73 20 65 78 69 73 74 2c 20 72  le does exist, r
20300 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
20310 54 4f 50 45 4e 2e 20 41 6e 20 52 42 55 0a 2a 2a  TOPEN. An RBU.**
20320 20 20 20 20 20 20 20 20 74 61 72 67 65 74 20 64          target d
20330 61 74 61 62 61 73 65 20 6d 61 79 20 6e 6f 74 20  atabase may not 
20340 62 65 20 69 6e 20 77 61 6c 20 6d 6f 64 65 20 61  be in wal mode a
20350 6c 72 65 61 64 79 2e 0a 2a 2a 0a 2a 2a 20 20 20  lready..**.**   
20360 20 20 20 2a 20 69 66 20 74 68 65 20 2a 2d 77 61     * if the *-wa
20370 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  l file does not 
20380 65 78 69 73 74 2c 20 73 65 74 20 74 68 65 20 6f  exist, set the o
20390 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 20  utput parameter 
203a0 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 6e 6f 6e  to.**        non
203b0 2d 7a 65 72 6f 20 28 74 6f 20 74 65 6c 6c 20 53  -zero (to tell S
203c0 51 4c 69 74 65 20 74 68 61 74 20 69 74 20 64 6f  QLite that it do
203d0 65 73 20 65 78 69 73 74 29 20 61 6e 79 77 61 79  es exist) anyway
203e0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 65 6e  ..**.**     Then
203f0 2c 20 77 68 65 6e 20 78 4f 70 65 6e 28 29 20 69  , when xOpen() i
20400 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 70 65 6e  s called to open
20410 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20   the *-wal file 
20420 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
20430 2a 2a 20 20 20 20 20 74 68 65 20 52 42 55 20 74  **     the RBU t
20440 61 72 67 65 74 20 69 6e 20 52 42 55 5f 53 54 41  arget in RBU_STA
20450 47 45 5f 4f 41 4c 20 73 74 61 67 65 2c 20 69 6e  GE_OAL stage, in
20460 73 74 65 61 64 20 6f 66 20 6f 70 65 6e 69 6e 67  stead of opening
20470 20 74 68 65 20 2a 2d 77 61 6c 0a 2a 2a 20 20 20   the *-wal.**   
20480 20 20 66 69 6c 65 2c 20 74 68 65 20 72 62 75 20    file, the rbu 
20490 76 66 73 20 6f 70 65 6e 73 20 74 68 65 20 63 6f  vfs opens the co
204a0 72 72 65 73 70 6f 6e 64 69 6e 67 20 2a 2d 6f 61  rresponding *-oa
204b0 6c 20 66 69 6c 65 20 69 6e 73 74 65 61 64 2e 20  l file instead. 
204c0 0a 2a 2a 0a 2a 2a 20 33 62 2e 20 54 68 65 20 2a  .**.** 3b. The *
204d0 2d 73 68 6d 20 70 61 67 65 73 20 72 65 74 75 72  -shm pages retur
204e0 6e 65 64 20 62 79 20 78 53 68 6d 4d 61 70 28 29  ned by xShmMap()
204f0 20 66 6f 72 20 61 20 74 61 72 67 65 74 20 64 62   for a target db
20500 20 66 69 6c 65 20 69 6e 0a 2a 2a 20 20 20 20 20   file in.**     
20510 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 6d 6f  RBU_STAGE_OAL mo
20520 64 65 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20  de are actually 
20530 73 74 6f 72 65 64 20 69 6e 20 68 65 61 70 20 6d  stored in heap m
20540 65 6d 6f 72 79 2e 20 54 68 69 73 20 69 73 20 74  emory. This is t
20550 6f 0a 2a 2a 20 20 20 20 20 61 76 6f 69 64 20 63  o.**     avoid c
20560 72 65 61 74 69 6e 67 20 61 20 2a 2d 73 68 6d 20  reating a *-shm 
20570 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 41 64  file on disk. Ad
20580 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 78 53 68 6d  ditionally, xShm
20590 4c 6f 63 6b 28 29 20 63 61 6c 6c 73 0a 2a 2a 20  Lock() calls.** 
205a0 20 20 20 20 61 72 65 20 6e 6f 2d 6f 70 73 20 6f      are no-ops o
205b0 6e 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73  n target databas
205c0 65 20 66 69 6c 65 73 20 69 6e 20 52 42 55 5f 53  e files in RBU_S
205d0 54 41 47 45 5f 4f 41 4c 20 6d 6f 64 65 2e 20 54  TAGE_OAL mode. T
205e0 68 69 73 20 69 73 0a 2a 2a 20 20 20 20 20 62 65  his is.**     be
205f0 63 61 75 73 65 20 61 73 73 65 72 74 28 29 20 73  cause assert() s
20600 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 73 6f 6d  tatements in som
20610 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61  e VFS implementa
20620 74 69 6f 6e 73 20 66 61 69 6c 20 69 66 20 0a 2a  tions fail if .*
20630 2a 20 20 20 20 20 78 53 68 6d 4c 6f 63 6b 28 29  *     xShmLock()
20640 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   is called befor
20650 65 20 78 53 68 6d 4d 61 70 28 29 2e 0a 2a 2a 0a  e xShmMap()..**.
20660 2a 2a 20 33 63 2e 20 49 66 20 61 6e 20 45 58 43  ** 3c. If an EXC
20670 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 61  LUSIVE lock is a
20680 74 74 65 6d 70 74 65 64 20 6f 6e 20 61 20 74 61  ttempted on a ta
20690 72 67 65 74 20 64 61 74 61 62 61 73 65 20 66 69  rget database fi
206a0 6c 65 20 69 6e 20 61 6e 79 0a 2a 2a 20 20 20 20  le in any.**    
206b0 20 6d 6f 64 65 20 65 78 63 65 70 74 20 52 42 55   mode except RBU
206c0 5f 53 54 41 47 45 5f 44 4f 4e 45 20 28 61 6c 6c  _STAGE_DONE (all
206d0 20 77 6f 72 6b 20 63 6f 6d 70 6c 65 74 65 64 20   work completed 
206e0 61 6e 64 20 63 68 65 63 6b 70 6f 69 6e 74 65 64  and checkpointed
206f0 29 2c 20 69 74 20 0a 2a 2a 20 20 20 20 20 66 61  ), it .**     fa
20700 69 6c 73 20 77 69 74 68 20 61 6e 20 53 51 4c 49  ils with an SQLI
20710 54 45 5f 42 55 53 59 20 65 72 72 6f 72 2e 20 54  TE_BUSY error. T
20720 68 69 73 20 69 73 20 74 6f 20 73 74 6f 70 20 52  his is to stop R
20730 42 55 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a  BU connections.*
20740 2a 20 20 20 20 20 66 72 6f 6d 20 61 75 74 6f 6d  *     from autom
20750 61 74 69 63 61 6c 6c 79 20 63 68 65 63 6b 70 6f  atically checkpo
20760 69 6e 74 69 6e 67 20 61 20 2a 2d 77 61 6c 20 28  inting a *-wal (
20770 6f 72 20 2a 2d 6f 61 6c 29 20 66 69 6c 65 20 66  or *-oal) file f
20780 72 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a 20 20 20  rom within.**   
20790 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
207a0 29 2e 0a 2a 2a 0a 2a 2a 20 33 64 2e 20 49 6e 20  )..**.** 3d. In 
207b0 52 42 55 5f 53 54 41 47 45 5f 43 41 50 54 55 52  RBU_STAGE_CAPTUR
207c0 45 20 6d 6f 64 65 2c 20 61 6c 6c 20 78 52 65 61  E mode, all xRea
207d0 64 28 29 20 63 61 6c 6c 73 20 6f 6e 20 74 68 65  d() calls on the
207e0 20 77 61 6c 20 66 69 6c 65 2c 20 61 6e 64 0a 2a   wal file, and.*
207f0 2a 20 20 20 20 20 61 6c 6c 20 78 57 72 69 74 65  *     all xWrite
20800 28 29 20 63 61 6c 6c 73 20 6f 6e 20 74 68 65 20  () calls on the 
20810 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20  target database 
20820 66 69 6c 65 20 70 65 72 66 6f 72 6d 20 6e 6f 20  file perform no 
20830 49 4f 2e 20 0a 2a 2a 20 20 20 20 20 49 6e 73 74  IO. .**     Inst
20840 65 61 64 20 74 68 65 20 66 72 61 6d 65 20 61 6e  ead the frame an
20850 64 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 74  d page numbers t
20860 68 61 74 20 77 6f 75 6c 64 20 62 65 20 72 65 61  hat would be rea
20870 64 20 61 6e 64 20 77 72 69 74 74 65 6e 0a 2a 2a  d and written.**
20880 20 20 20 20 20 61 72 65 20 72 65 63 6f 72 64 65       are recorde
20890 64 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  d. Additionally,
208a0 20 73 75 63 63 65 73 73 66 75 6c 20 61 74 74 65   successful atte
208b0 6d 70 74 73 20 74 6f 20 6f 62 74 61 69 6e 20 65  mpts to obtain e
208c0 78 63 6c 75 73 69 76 65 0a 2a 2a 20 20 20 20 20  xclusive.**     
208d0 78 53 68 6d 4c 6f 63 6b 28 29 20 57 52 49 54 45  xShmLock() WRITE
208e0 52 2c 20 43 48 45 43 4b 50 4f 49 4e 54 45 52 20  R, CHECKPOINTER 
208f0 61 6e 64 20 52 45 41 44 30 20 6c 6f 63 6b 73 20  and READ0 locks 
20900 6f 6e 20 74 68 65 20 74 61 72 67 65 74 20 0a 2a  on the target .*
20910 2a 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66  *     database f
20920 69 6c 65 20 61 72 65 20 72 65 63 6f 72 64 65 64  ile are recorded
20930 2e 20 78 53 68 6d 4c 6f 63 6b 28 29 20 63 61 6c  . xShmLock() cal
20940 6c 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65  ls to unlock the
20950 20 73 61 6d 65 0a 2a 2a 20 20 20 20 20 6c 6f 63   same.**     loc
20960 6b 73 20 61 72 65 20 6e 6f 2d 6f 70 73 20 28 73  ks are no-ops (s
20970 6f 20 74 68 61 74 20 6f 6e 63 65 20 6f 62 74 61  o that once obta
20980 69 6e 65 64 2c 20 74 68 65 73 65 20 6c 6f 63 6b  ined, these lock
20990 73 20 61 72 65 20 6e 65 76 65 72 0a 2a 2a 20 20  s are never.**  
209a0 20 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64 29     relinquished)
209b0 2e 20 46 69 6e 61 6c 6c 79 2c 20 63 61 6c 6c 73  . Finally, calls
209c0 20 74 6f 20 78 53 79 6e 63 28 29 20 6f 6e 20 74   to xSync() on t
209d0 68 65 20 74 61 72 67 65 74 20 64 61 74 61 62 61  he target databa
209e0 73 65 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 66  se.**     file f
209f0 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ail with SQLITE_
20a00 49 4e 54 45 52 4e 41 4c 20 65 72 72 6f 72 73 2e  INTERNAL errors.
20a10 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/..static void
20a20 20 72 62 75 55 6e 6c 6f 63 6b 53 68 6d 28 72 62   rbuUnlockShm(rb
20a30 75 5f 66 69 6c 65 20 2a 70 29 7b 0a 20 20 61 73  u_file *p){.  as
20a40 73 65 72 74 28 20 70 2d 3e 6f 70 65 6e 46 6c 61  sert( p->openFla
20a50 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
20a60 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 69 66  _MAIN_DB );.  if
20a70 28 20 70 2d 3e 70 52 62 75 20 29 7b 0a 20 20 20  ( p->pRbu ){.   
20a80 20 69 6e 74 20 28 2a 78 53 68 6d 4c 6f 63 6b 29   int (*xShmLock)
20a90 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69  (sqlite3_file*,i
20aa0 6e 74 2c 69 6e 74 2c 69 6e 74 29 20 3d 20 70 2d  nt,int,int) = p-
20ab0 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73  >pReal->pMethods
20ac0 2d 3e 78 53 68 6d 4c 6f 63 6b 3b 0a 20 20 20 20  ->xShmLock;.    
20ad0 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
20ae0 3d 30 3b 20 69 3c 53 51 4c 49 54 45 5f 53 48 4d  =0; i<SQLITE_SHM
20af0 5f 4e 4c 4f 43 4b 3b 69 2b 2b 29 7b 0a 20 20 20  _NLOCK;i++){.   
20b00 20 20 20 69 66 28 20 28 31 3c 3c 69 29 20 26 20     if( (1<<i) & 
20b10 70 2d 3e 70 52 62 75 2d 3e 6d 4c 6f 63 6b 20 29  p->pRbu->mLock )
20b20 7b 0a 20 20 20 20 20 20 20 20 78 53 68 6d 4c 6f  {.        xShmLo
20b30 63 6b 28 70 2d 3e 70 52 65 61 6c 2c 20 69 2c 20  ck(p->pReal, i, 
20b40 31 2c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e  1, SQLITE_SHM_UN
20b50 4c 4f 43 4b 7c 53 51 4c 49 54 45 5f 53 48 4d 5f  LOCK|SQLITE_SHM_
20b60 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 20 20  EXCLUSIVE);.    
20b70 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d    }.    }.    p-
20b80 3e 70 52 62 75 2d 3e 6d 4c 6f 63 6b 20 3d 20 30  >pRbu->mLock = 0
20b90 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2f 0a 73  ;.  }.}../*.*/.s
20ba0 74 61 74 69 63 20 69 6e 74 20 72 62 75 55 70 64  tatic int rbuUpd
20bb0 61 74 65 54 65 6d 70 53 69 7a 65 28 72 62 75 5f  ateTempSize(rbu_
20bc0 66 69 6c 65 20 2a 70 46 64 2c 20 73 71 6c 69 74  file *pFd, sqlit
20bd0 65 33 5f 69 6e 74 36 34 20 6e 4e 65 77 29 7b 0a  e3_int64 nNew){.
20be0 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 52    sqlite3rbu *pR
20bf0 62 75 20 3d 20 70 46 64 2d 3e 70 52 62 75 3b 0a  bu = pFd->pRbu;.
20c00 20 20 69 36 34 20 6e 44 69 66 66 20 3d 20 6e 4e    i64 nDiff = nN
20c10 65 77 20 2d 20 70 46 64 2d 3e 73 7a 3b 0a 20 20  ew - pFd->sz;.  
20c20 70 52 62 75 2d 3e 73 7a 54 65 6d 70 20 2b 3d 20  pRbu->szTemp += 
20c30 6e 44 69 66 66 3b 0a 20 20 70 46 64 2d 3e 73 7a  nDiff;.  pFd->sz
20c40 20 3d 20 6e 4e 65 77 3b 0a 20 20 61 73 73 65 72   = nNew;.  asser
20c50 74 28 20 70 52 62 75 2d 3e 73 7a 54 65 6d 70 3e  t( pRbu->szTemp>
20c60 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52 62 75  =0 );.  if( pRbu
20c70 2d 3e 73 7a 54 65 6d 70 4c 69 6d 69 74 20 26 26  ->szTempLimit &&
20c80 20 70 52 62 75 2d 3e 73 7a 54 65 6d 70 3e 70 52   pRbu->szTemp>pR
20c90 62 75 2d 3e 73 7a 54 65 6d 70 4c 69 6d 69 74 20  bu->szTempLimit 
20ca0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
20cb0 46 55 4c 4c 3b 0a 20 20 72 65 74 75 72 6e 20 53  FULL;.  return S
20cc0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
20cd0 2a 2a 20 41 64 64 20 61 6e 20 69 74 65 6d 20 74  ** Add an item t
20ce0 6f 20 74 68 65 20 6d 61 69 6e 2d 64 62 20 6c 69  o the main-db li
20cf0 73 74 73 2c 20 69 66 20 69 74 20 69 73 20 6e 6f  sts, if it is no
20d00 74 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e  t already presen
20d10 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61  t..**.** There a
20d20 72 65 20 74 77 6f 20 6d 61 69 6e 2d 64 62 20 6c  re two main-db l
20d30 69 73 74 73 2e 20 4f 6e 65 20 66 6f 72 20 61 6c  ists. One for al
20d40 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
20d50 72 73 2c 20 61 6e 64 20 6f 6e 65 0a 2a 2a 20 66  rs, and one.** f
20d60 6f 72 20 61 6c 6c 20 66 69 6c 65 20 64 65 73 63  or all file desc
20d70 72 69 70 74 6f 72 73 20 77 69 74 68 20 72 62 75  riptors with rbu
20d80 5f 66 69 6c 65 2e 70 44 62 21 3d 30 2e 20 49 66  _file.pDb!=0. If
20d90 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61   the argument ha
20da0 73 0a 2a 2a 20 72 62 75 5f 66 69 6c 65 2e 70 44  s.** rbu_file.pD
20db0 62 21 3d 30 2c 20 74 68 65 6e 20 69 74 20 69 73  b!=0, then it is
20dc0 20 61 73 73 75 6d 65 64 20 74 6f 20 61 6c 72 65   assumed to alre
20dd0 61 64 79 20 62 65 20 70 72 65 73 65 6e 74 20 6f  ady be present o
20de0 6e 20 74 68 65 0a 2a 2a 20 6d 61 69 6e 20 6c 69  n the.** main li
20df0 73 74 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 61  st and is only a
20e00 64 64 65 64 20 74 6f 20 74 68 65 20 70 44 62 21  dded to the pDb!
20e10 3d 30 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  =0 list..*/.stat
20e20 69 63 20 76 6f 69 64 20 72 62 75 4d 61 69 6e 6c  ic void rbuMainl
20e30 69 73 74 41 64 64 28 72 62 75 5f 66 69 6c 65 20  istAdd(rbu_file 
20e40 2a 70 29 7b 0a 20 20 72 62 75 5f 76 66 73 20 2a  *p){.  rbu_vfs *
20e50 70 52 62 75 56 66 73 20 3d 20 70 2d 3e 70 52 62  pRbuVfs = p->pRb
20e60 75 56 66 73 3b 0a 20 20 72 62 75 5f 66 69 6c 65  uVfs;.  rbu_file
20e70 20 2a 70 49 74 65 72 3b 0a 20 20 61 73 73 65 72   *pIter;.  asser
20e80 74 28 20 28 70 2d 3e 6f 70 65 6e 46 6c 61 67 73  t( (p->openFlags
20e90 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d   & SQLITE_OPEN_M
20ea0 41 49 4e 5f 44 42 29 20 29 3b 0a 20 20 73 71 6c  AIN_DB) );.  sql
20eb0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
20ec0 28 70 52 62 75 56 66 73 2d 3e 6d 75 74 65 78 29  (pRbuVfs->mutex)
20ed0 3b 0a 20 20 69 66 28 20 70 2d 3e 70 52 62 75 3d  ;.  if( p->pRbu=
20ee0 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49  =0 ){.    for(pI
20ef0 74 65 72 3d 70 52 62 75 56 66 73 2d 3e 70 4d 61  ter=pRbuVfs->pMa
20f00 69 6e 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72  in; pIter; pIter
20f10 3d 70 49 74 65 72 2d 3e 70 4d 61 69 6e 4e 65 78  =pIter->pMainNex
20f20 74 29 3b 0a 20 20 20 20 70 2d 3e 70 4d 61 69 6e  t);.    p->pMain
20f30 4e 65 78 74 20 3d 20 70 52 62 75 56 66 73 2d 3e  Next = pRbuVfs->
20f40 70 4d 61 69 6e 3b 0a 20 20 20 20 70 52 62 75 56  pMain;.    pRbuV
20f50 66 73 2d 3e 70 4d 61 69 6e 20 3d 20 70 3b 0a 20  fs->pMain = p;. 
20f60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28   }else{.    for(
20f70 70 49 74 65 72 3d 70 52 62 75 56 66 73 2d 3e 70  pIter=pRbuVfs->p
20f80 4d 61 69 6e 52 62 75 3b 20 70 49 74 65 72 20 26  MainRbu; pIter &
20f90 26 20 70 49 74 65 72 21 3d 70 3b 20 70 49 74 65  & pIter!=p; pIte
20fa0 72 3d 70 49 74 65 72 2d 3e 70 4d 61 69 6e 52 62  r=pIter->pMainRb
20fb0 75 4e 65 78 74 29 7b 7d 0a 20 20 20 20 69 66 28  uNext){}.    if(
20fc0 20 70 49 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20   pIter==0 ){.   
20fd0 20 20 20 70 2d 3e 70 4d 61 69 6e 52 62 75 4e 65     p->pMainRbuNe
20fe0 78 74 20 3d 20 70 52 62 75 56 66 73 2d 3e 70 4d  xt = pRbuVfs->pM
20ff0 61 69 6e 52 62 75 3b 0a 20 20 20 20 20 20 70 52  ainRbu;.      pR
21000 62 75 56 66 73 2d 3e 70 4d 61 69 6e 52 62 75 20  buVfs->pMainRbu 
21010 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = p;.    }.  }. 
21020 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
21030 65 61 76 65 28 70 52 62 75 56 66 73 2d 3e 6d 75  eave(pRbuVfs->mu
21040 74 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  tex);.}../*.** R
21050 65 6d 6f 76 65 20 61 6e 20 69 74 65 6d 20 66 72  emove an item fr
21060 6f 6d 20 74 68 65 20 6d 61 69 6e 2d 64 62 20 6c  om the main-db l
21070 69 73 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ists..*/.static 
21080 76 6f 69 64 20 72 62 75 4d 61 69 6e 6c 69 73 74  void rbuMainlist
21090 52 65 6d 6f 76 65 28 72 62 75 5f 66 69 6c 65 20  Remove(rbu_file 
210a0 2a 70 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20  *p){.  rbu_file 
210b0 2a 2a 70 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f  **pp;.  sqlite3_
210c0 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 2d 3e 70  mutex_enter(p->p
210d0 52 62 75 56 66 73 2d 3e 6d 75 74 65 78 29 3b 0a  RbuVfs->mutex);.
210e0 20 20 66 6f 72 28 70 70 3d 26 70 2d 3e 70 52 62    for(pp=&p->pRb
210f0 75 56 66 73 2d 3e 70 4d 61 69 6e 3b 20 2a 70 70  uVfs->pMain; *pp
21100 20 26 26 20 2a 70 70 21 3d 70 3b 20 70 70 3d 26   && *pp!=p; pp=&
21110 28 28 2a 70 70 29 2d 3e 70 4d 61 69 6e 4e 65 78  ((*pp)->pMainNex
21120 74 29 29 7b 7d 0a 20 20 69 66 28 20 2a 70 70 20  t)){}.  if( *pp 
21130 29 20 2a 70 70 20 3d 20 70 2d 3e 70 4d 61 69 6e  ) *pp = p->pMain
21140 4e 65 78 74 3b 0a 20 20 70 2d 3e 70 4d 61 69 6e  Next;.  p->pMain
21150 4e 65 78 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28  Next = 0;.  for(
21160 70 70 3d 26 70 2d 3e 70 52 62 75 56 66 73 2d 3e  pp=&p->pRbuVfs->
21170 70 4d 61 69 6e 52 62 75 3b 20 2a 70 70 20 26 26  pMainRbu; *pp &&
21180 20 2a 70 70 21 3d 70 3b 20 70 70 3d 26 28 28 2a   *pp!=p; pp=&((*
21190 70 70 29 2d 3e 70 4d 61 69 6e 52 62 75 4e 65 78  pp)->pMainRbuNex
211a0 74 29 29 7b 7d 0a 20 20 69 66 28 20 2a 70 70 20  t)){}.  if( *pp 
211b0 29 20 2a 70 70 20 3d 20 70 2d 3e 70 4d 61 69 6e  ) *pp = p->pMain
211c0 52 62 75 4e 65 78 74 3b 0a 20 20 70 2d 3e 70 4d  RbuNext;.  p->pM
211d0 61 69 6e 52 62 75 4e 65 78 74 20 3d 20 30 3b 0a  ainRbuNext = 0;.
211e0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
211f0 6c 65 61 76 65 28 70 2d 3e 70 52 62 75 56 66 73  leave(p->pRbuVfs
21200 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a  ->mutex);.}../*.
21210 2a 2a 20 47 69 76 65 6e 20 74 68 61 74 20 7a 57  ** Given that zW
21220 61 6c 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62  al points to a b
21230 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
21240 20 61 20 77 61 6c 20 66 69 6c 65 20 6e 61 6d 65   a wal file name
21250 20 70 61 73 73 65 64 20 74 6f 20 0a 2a 2a 20 65   passed to .** e
21260 69 74 68 65 72 20 74 68 65 20 78 4f 70 65 6e 28  ither the xOpen(
21270 29 20 6f 72 20 78 41 63 63 65 73 73 28 29 20 56  ) or xAccess() V
21280 46 53 20 6d 65 74 68 6f 64 2c 20 73 65 61 72 63  FS method, searc
21290 68 20 74 68 65 20 6d 61 69 6e 2d 64 62 20 6c 69  h the main-db li
212a0 73 74 20 66 6f 72 0a 2a 2a 20 61 20 66 69 6c 65  st for.** a file
212b0 2d 68 61 6e 64 6c 65 20 6f 70 65 6e 65 64 20 62  -handle opened b
212c0 79 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  y the same datab
212d0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  ase connection o
212e0 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  n the correspond
212f0 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ing.** database 
21300 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  file..**.** If p
21310 61 72 61 6d 65 74 65 72 20 62 52 62 75 20 69 73  arameter bRbu is
21320 20 74 72 75 65 2c 20 6f 6e 6c 79 20 73 65 61 72   true, only sear
21330 63 68 20 66 6f 72 20 66 69 6c 65 2d 64 65 73 63  ch for file-desc
21340 72 69 70 74 6f 72 73 20 77 69 74 68 0a 2a 2a 20  riptors with.** 
21350 72 62 75 5f 66 69 6c 65 2e 70 44 62 21 3d 30 2e  rbu_file.pDb!=0.
21360 0a 2a 2f 0a 73 74 61 74 69 63 20 72 62 75 5f 66  .*/.static rbu_f
21370 69 6c 65 20 2a 72 62 75 46 69 6e 64 4d 61 69 6e  ile *rbuFindMain
21380 64 62 28 72 62 75 5f 76 66 73 20 2a 70 52 62 75  db(rbu_vfs *pRbu
21390 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Vfs, const char 
213a0 2a 7a 57 61 6c 2c 20 69 6e 74 20 62 52 62 75 29  *zWal, int bRbu)
213b0 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 44  {.  rbu_file *pD
213c0 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  b;.  sqlite3_mut
213d0 65 78 5f 65 6e 74 65 72 28 70 52 62 75 56 66 73  ex_enter(pRbuVfs
213e0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
213f0 62 52 62 75 20 29 7b 0a 20 20 20 20 66 6f 72 28  bRbu ){.    for(
21400 70 44 62 3d 70 52 62 75 56 66 73 2d 3e 70 4d 61  pDb=pRbuVfs->pMa
21410 69 6e 52 62 75 3b 20 70 44 62 20 26 26 20 70 44  inRbu; pDb && pD
21420 62 2d 3e 7a 57 61 6c 21 3d 7a 57 61 6c 3b 20 70  b->zWal!=zWal; p
21430 44 62 3d 70 44 62 2d 3e 70 4d 61 69 6e 52 62 75  Db=pDb->pMainRbu
21440 4e 65 78 74 29 7b 7d 0a 20 20 7d 65 6c 73 65 7b  Next){}.  }else{
21450 0a 20 20 20 20 66 6f 72 28 70 44 62 3d 70 52 62  .    for(pDb=pRb
21460 75 56 66 73 2d 3e 70 4d 61 69 6e 3b 20 70 44 62  uVfs->pMain; pDb
21470 20 26 26 20 70 44 62 2d 3e 7a 57 61 6c 21 3d 7a   && pDb->zWal!=z
21480 57 61 6c 3b 20 70 44 62 3d 70 44 62 2d 3e 70 4d  Wal; pDb=pDb->pM
21490 61 69 6e 4e 65 78 74 29 7b 7d 0a 20 20 7d 0a 20  ainNext){}.  }. 
214a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
214b0 65 61 76 65 28 70 52 62 75 56 66 73 2d 3e 6d 75  eave(pRbuVfs->mu
214c0 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
214d0 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  Db;.}../*.** Clo
214e0 73 65 20 61 6e 20 72 62 75 20 66 69 6c 65 2e 0a  se an rbu file..
214f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62  */.static int rb
21500 75 56 66 73 43 6c 6f 73 65 28 73 71 6c 69 74 65  uVfsClose(sqlite
21510 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  3_file *pFile){.
21520 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20    rbu_file *p = 
21530 28 72 62 75 5f 66 69 6c 65 2a 29 70 46 69 6c 65  (rbu_file*)pFile
21540 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
21550 74 20 69 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20  t i;..  /* Free 
21560 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
21570 74 68 65 20 61 70 53 68 6d 5b 5d 20 61 72 72 61  the apShm[] arra
21580 79 2e 20 41 6e 64 20 74 68 65 20 61 72 72 61 79  y. And the array
21590 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 66 6f   itself. */.  fo
215a0 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 68 6d  r(i=0; i<p->nShm
215b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
215c0 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 53 68  te3_free(p->apSh
215d0 6d 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  m[i]);.  }.  sql
215e0 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 53  ite3_free(p->apS
215f0 68 6d 29 3b 0a 20 20 70 2d 3e 61 70 53 68 6d 20  hm);.  p->apShm 
21600 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  = 0;.  sqlite3_f
21610 72 65 65 28 70 2d 3e 7a 44 65 6c 29 3b 0a 0a 20  ree(p->zDel);.. 
21620 20 69 66 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67   if( p->openFlag
21630 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
21640 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20 72  MAIN_DB ){.    r
21650 62 75 4d 61 69 6e 6c 69 73 74 52 65 6d 6f 76 65  buMainlistRemove
21660 28 70 29 3b 0a 20 20 20 20 72 62 75 55 6e 6c 6f  (p);.    rbuUnlo
21670 63 6b 53 68 6d 28 70 29 3b 0a 20 20 20 20 70 2d  ckShm(p);.    p-
21680 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73  >pReal->pMethods
21690 2d 3e 78 53 68 6d 55 6e 6d 61 70 28 70 2d 3e 70  ->xShmUnmap(p->p
216a0 52 65 61 6c 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  Real, 0);.  }.  
216b0 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 6f 70 65  else if( (p->ope
216c0 6e 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  nFlags & SQLITE_
216d0 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
216e0 53 45 29 20 26 26 20 70 2d 3e 70 52 62 75 20 29  SE) && p->pRbu )
216f0 7b 0a 20 20 20 20 72 62 75 55 70 64 61 74 65 54  {.    rbuUpdateT
21700 65 6d 70 53 69 7a 65 28 70 2c 20 30 29 3b 0a 20  empSize(p, 0);. 
21710 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
21720 70 4d 61 69 6e 4e 65 78 74 3d 3d 30 20 26 26 20  pMainNext==0 && 
21730 70 2d 3e 70 52 62 75 56 66 73 2d 3e 70 4d 61 69  p->pRbuVfs->pMai
21740 6e 21 3d 70 20 29 3b 0a 0a 20 20 2f 2a 20 43 6c  n!=p );..  /* Cl
21750 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ose the underlyi
21760 6e 67 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a  ng file handle *
21770 2f 0a 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61  /.  rc = p->pRea
21780 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 43 6c  l->pMethods->xCl
21790 6f 73 65 28 70 2d 3e 70 52 65 61 6c 29 3b 0a 20  ose(p->pReal);. 
217a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
217b0 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 64 20 72  /*.** Read and r
217c0 65 74 75 72 6e 20 61 6e 20 75 6e 73 69 67 6e 65  eturn an unsigne
217d0 64 20 33 32 2d 62 69 74 20 62 69 67 2d 65 6e 64  d 32-bit big-end
217e0 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  ian integer from
217f0 20 74 68 65 20 62 75 66 66 65 72 20 0a 2a 2a 20   the buffer .** 
21800 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e  passed as the on
21810 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ly argument..*/.
21820 73 74 61 74 69 63 20 75 33 32 20 72 62 75 47 65  static u32 rbuGe
21830 74 55 33 32 28 75 38 20 2a 61 42 75 66 29 7b 0a  tU32(u8 *aBuf){.
21840 20 20 72 65 74 75 72 6e 20 28 28 75 33 32 29 61    return ((u32)a
21850 42 75 66 5b 30 5d 20 3c 3c 20 32 34 29 0a 20 20  Buf[0] << 24).  
21860 20 20 20 20 20 2b 20 28 28 75 33 32 29 61 42 75       + ((u32)aBu
21870 66 5b 31 5d 20 3c 3c 20 31 36 29 0a 20 20 20 20  f[1] << 16).    
21880 20 20 20 2b 20 28 28 75 33 32 29 61 42 75 66 5b     + ((u32)aBuf[
21890 32 5d 20 3c 3c 20 20 38 29 0a 20 20 20 20 20 20  2] <<  8).      
218a0 20 2b 20 28 28 75 33 32 29 61 42 75 66 5b 33 5d   + ((u32)aBuf[3]
218b0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  );.}../*.** Writ
218c0 65 20 61 6e 20 75 6e 73 69 67 6e 65 64 20 33 32  e an unsigned 32
218d0 2d 62 69 74 20 76 61 6c 75 65 20 69 6e 20 62 69  -bit value in bi
218e0 67 2d 65 6e 64 69 61 6e 20 66 6f 72 6d 61 74 20  g-endian format 
218f0 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 0a  to the supplied.
21900 2a 2a 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74  ** buffer..*/.st
21910 61 74 69 63 20 76 6f 69 64 20 72 62 75 50 75 74  atic void rbuPut
21920 55 33 32 28 75 38 20 2a 61 42 75 66 2c 20 75 33  U32(u8 *aBuf, u3
21930 32 20 69 56 61 6c 29 7b 0a 20 20 61 42 75 66 5b  2 iVal){.  aBuf[
21940 30 5d 20 3d 20 28 69 56 61 6c 20 3e 3e 20 32 34  0] = (iVal >> 24
21950 29 20 26 20 30 78 46 46 3b 0a 20 20 61 42 75 66  ) & 0xFF;.  aBuf
21960 5b 31 5d 20 3d 20 28 69 56 61 6c 20 3e 3e 20 31  [1] = (iVal >> 1
21970 36 29 20 26 20 30 78 46 46 3b 0a 20 20 61 42 75  6) & 0xFF;.  aBu
21980 66 5b 32 5d 20 3d 20 28 69 56 61 6c 20 3e 3e 20  f[2] = (iVal >> 
21990 20 38 29 20 26 20 30 78 46 46 3b 0a 20 20 61 42   8) & 0xFF;.  aB
219a0 75 66 5b 33 5d 20 3d 20 28 69 56 61 6c 20 3e 3e  uf[3] = (iVal >>
219b0 20 20 30 29 20 26 20 30 78 46 46 3b 0a 7d 0a 0a    0) & 0xFF;.}..
219c0 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 50  static void rbuP
219d0 75 74 55 31 36 28 75 38 20 2a 61 42 75 66 2c 20  utU16(u8 *aBuf, 
219e0 75 31 36 20 69 56 61 6c 29 7b 0a 20 20 61 42 75  u16 iVal){.  aBu
219f0 66 5b 30 5d 20 3d 20 28 69 56 61 6c 20 3e 3e 20  f[0] = (iVal >> 
21a00 20 38 29 20 26 20 30 78 46 46 3b 0a 20 20 61 42   8) & 0xFF;.  aB
21a10 75 66 5b 31 5d 20 3d 20 28 69 56 61 6c 20 3e 3e  uf[1] = (iVal >>
21a20 20 20 30 29 20 26 20 30 78 46 46 3b 0a 7d 0a 0a    0) & 0xFF;.}..
21a30 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20  /*.** Read data 
21a40 66 72 6f 6d 20 61 6e 20 72 62 75 56 66 73 2d 66  from an rbuVfs-f
21a50 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
21a60 6e 74 20 72 62 75 56 66 73 52 65 61 64 28 0a 20  nt rbuVfsRead(. 
21a70 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
21a80 46 69 6c 65 2c 20 0a 20 20 76 6f 69 64 20 2a 7a  File, .  void *z
21a90 42 75 66 2c 20 0a 20 20 69 6e 74 20 69 41 6d 74  Buf, .  int iAmt
21aa0 2c 20 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36  , .  sqlite_int6
21ab0 34 20 69 4f 66 73 74 0a 29 7b 0a 20 20 72 62 75  4 iOfst.){.  rbu
21ac0 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f  _file *p = (rbu_
21ad0 66 69 6c 65 2a 29 70 46 69 6c 65 3b 0a 20 20 73  file*)pFile;.  s
21ae0 71 6c 69 74 65 33 72 62 75 20 2a 70 52 62 75 20  qlite3rbu *pRbu 
21af0 3d 20 70 2d 3e 70 52 62 75 3b 0a 20 20 69 6e 74  = p->pRbu;.  int
21b00 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 52 62 75   rc;..  if( pRbu
21b10 20 26 26 20 70 52 62 75 2d 3e 65 53 74 61 67 65   && pRbu->eStage
21b20 3d 3d 52 42 55 5f 53 54 41 47 45 5f 43 41 50 54  ==RBU_STAGE_CAPT
21b30 55 52 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72  URE ){.    asser
21b40 74 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20  t( p->openFlags 
21b50 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  & SQLITE_OPEN_WA
21b60 4c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 72 62  L );.    rc = rb
21b70 75 43 61 70 74 75 72 65 57 61 6c 52 65 61 64 28  uCaptureWalRead(
21b80 70 2d 3e 70 52 62 75 2c 20 69 4f 66 73 74 2c 20  p->pRbu, iOfst, 
21b90 69 41 6d 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iAmt);.  }else{.
21ba0 20 20 20 20 69 66 28 20 70 52 62 75 20 26 26 20      if( pRbu && 
21bb0 70 52 62 75 2d 3e 65 53 74 61 67 65 3d 3d 52 42  pRbu->eStage==RB
21bc0 55 5f 53 54 41 47 45 5f 4f 41 4c 20 0a 20 20 20  U_STAGE_OAL .   
21bd0 20 20 26 26 20 28 70 2d 3e 6f 70 65 6e 46 6c 61    && (p->openFla
21be0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
21bf0 5f 57 41 4c 29 20 0a 20 20 20 20 20 26 26 20 69  _WAL) .     && i
21c00 4f 66 73 74 3e 3d 70 52 62 75 2d 3e 69 4f 61 6c  Ofst>=pRbu->iOal
21c10 53 7a 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Sz .    ){.     
21c20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
21c30 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 7a 42  .      memset(zB
21c40 75 66 2c 20 30 2c 20 69 41 6d 74 29 3b 0a 20 20  uf, 0, iAmt);.  
21c50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
21c60 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d  c = p->pReal->pM
21c70 65 74 68 6f 64 73 2d 3e 78 52 65 61 64 28 70 2d  ethods->xRead(p-
21c80 3e 70 52 65 61 6c 2c 20 7a 42 75 66 2c 20 69 41  >pReal, zBuf, iA
21c90 6d 74 2c 20 69 4f 66 73 74 29 3b 0a 23 69 66 20  mt, iOfst);.#if 
21ca0 31 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  1.      /* If th
21cb0 69 73 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c  is is being call
21cc0 65 64 20 74 6f 20 72 65 61 64 20 74 68 65 20 66  ed to read the f
21cd0 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
21ce0 20 74 61 72 67 65 74 20 0a 20 20 20 20 20 20 2a   target .      *
21cf0 2a 20 64 61 74 61 62 61 73 65 20 61 73 20 70 61  * database as pa
21d00 72 74 20 6f 66 20 61 6e 20 72 62 75 20 76 61 63  rt of an rbu vac
21d10 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2c 20 73  uum operation, s
21d20 79 6e 74 68 65 73 69 7a 65 20 74 68 65 20 0a 20  ynthesize the . 
21d30 20 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 73       ** contents
21d40 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61   of the first pa
21d50 67 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  ge if it does no
21d60 74 20 79 65 74 20 65 78 69 73 74 2e 20 4f 74 68  t yet exist. Oth
21d70 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a  erwise,.      **
21d80 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74   SQLite will not
21d90 20 63 68 65 63 6b 20 66 6f 72 20 61 20 2a 2d 77   check for a *-w
21da0 61 6c 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20  al file.  */.   
21db0 20 20 20 69 66 28 20 70 52 62 75 20 26 26 20 72     if( pRbu && r
21dc0 62 75 49 73 56 61 63 75 75 6d 28 70 52 62 75 29  buIsVacuum(pRbu)
21dd0 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 72   .          && r
21de0 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
21df0 53 48 4f 52 54 5f 52 45 41 44 20 26 26 20 69 4f  SHORT_READ && iO
21e00 66 73 74 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  fst==0.         
21e10 20 26 26 20 28 70 2d 3e 6f 70 65 6e 46 6c 61 67   && (p->openFlag
21e20 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
21e30 4d 41 49 4e 5f 44 42 29 0a 20 20 20 20 20 20 20  MAIN_DB).       
21e40 20 20 20 26 26 20 70 52 62 75 2d 3e 72 63 3d 3d     && pRbu->rc==
21e50 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20  SQLITE_OK.      
21e60 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
21e70 65 33 5f 66 69 6c 65 20 2a 70 46 64 20 3d 20 28  e3_file *pFd = (
21e80 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 52  sqlite3_file*)pR
21e90 62 75 2d 3e 70 52 62 75 46 64 3b 0a 20 20 20 20  bu->pRbuFd;.    
21ea0 20 20 20 20 72 63 20 3d 20 70 46 64 2d 3e 70 4d      rc = pFd->pM
21eb0 65 74 68 6f 64 73 2d 3e 78 52 65 61 64 28 70 46  ethods->xRead(pF
21ec0 64 2c 20 7a 42 75 66 2c 20 69 41 6d 74 2c 20 69  d, zBuf, iAmt, i
21ed0 4f 66 73 74 29 3b 0a 20 20 20 20 20 20 20 20 69  Ofst);.        i
21ee0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21ef0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38   ){.          u8
21f00 20 2a 61 42 75 66 20 3d 20 28 75 38 2a 29 7a 42   *aBuf = (u8*)zB
21f10 75 66 3b 0a 20 20 20 20 20 20 20 20 20 20 75 33  uf;.          u3
21f20 32 20 69 52 6f 6f 74 20 3d 20 72 62 75 47 65 74  2 iRoot = rbuGet
21f30 55 33 32 28 26 61 42 75 66 5b 35 32 5d 29 20 3f  U32(&aBuf[52]) ?
21f40 20 31 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20   1 : 0;.        
21f50 20 20 72 62 75 50 75 74 55 33 32 28 26 61 42 75    rbuPutU32(&aBu
21f60 66 5b 35 32 5d 2c 20 69 52 6f 6f 74 29 3b 20 20  f[52], iRoot);  
21f70 20 20 20 20 2f 2a 20 6c 61 72 67 65 73 74 20 72      /* largest r
21f80 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
21f90 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 62 75  */.          rbu
21fa0 50 75 74 55 33 32 28 26 61 42 75 66 5b 33 36 5d  PutU32(&aBuf[36]
21fb0 2c 20 30 29 3b 20 20 20 20 20 20 20 20 20 20 2f  , 0);          /
21fc0 2a 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65  * number of free
21fd0 20 70 61 67 65 73 20 2a 2f 0a 20 20 20 20 20 20   pages */.      
21fe0 20 20 20 20 72 62 75 50 75 74 55 33 32 28 26 61      rbuPutU32(&a
21ff0 42 75 66 5b 33 32 5d 2c 20 30 29 3b 20 20 20 20  Buf[32], 0);    
22000 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20 70        /* first p
22010 61 67 65 20 6f 6e 20 66 72 65 65 20 6c 69 73 74  age on free list
22020 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20   trunk */.      
22030 20 20 20 20 72 62 75 50 75 74 55 33 32 28 26 61      rbuPutU32(&a
22040 42 75 66 5b 32 38 5d 2c 20 31 29 3b 20 20 20 20  Buf[28], 1);    
22050 20 20 20 20 20 20 2f 2a 20 73 69 7a 65 20 6f 66        /* size of
22060 20 64 62 20 66 69 6c 65 20 69 6e 20 70 61 67 65   db file in page
22070 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  s */.          r
22080 62 75 50 75 74 55 33 32 28 26 61 42 75 66 5b 32  buPutU32(&aBuf[2
22090 34 5d 2c 20 70 52 62 75 2d 3e 70 52 62 75 46 64  4], pRbu->pRbuFd
220a0 2d 3e 69 43 6f 6f 6b 69 65 2b 31 29 3b 20 20 2f  ->iCookie+1);  /
220b0 2a 20 43 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  * Change counter
220c0 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 69   */..          i
220d0 66 28 20 69 41 6d 74 3e 31 30 30 20 29 7b 0a 20  f( iAmt>100 ){. 
220e0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65             memse
220f0 74 28 26 61 42 75 66 5b 31 30 30 5d 2c 20 30 2c  t(&aBuf[100], 0,
22100 20 69 41 6d 74 2d 31 30 30 29 3b 0a 20 20 20 20   iAmt-100);.    
22110 20 20 20 20 20 20 20 20 72 62 75 50 75 74 55 31          rbuPutU1
22120 36 28 26 61 42 75 66 5b 31 30 35 5d 2c 20 69 41  6(&aBuf[105], iA
22130 6d 74 20 26 20 30 78 46 46 46 46 29 3b 0a 20 20  mt & 0xFFFF);.  
22140 20 20 20 20 20 20 20 20 20 20 61 42 75 66 5b 31            aBuf[1
22150 30 30 5d 20 3d 20 30 78 30 44 3b 0a 20 20 20 20  00] = 0x0D;.    
22160 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22170 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  }.      }.#endif
22180 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
22190 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
221a0 69 4f 66 73 74 3d 3d 30 20 26 26 20 28 70 2d 3e  iOfst==0 && (p->
221b0 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49  openFlags & SQLI
221c0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29  TE_OPEN_MAIN_DB)
221d0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
221e0 73 65 20 6c 6f 6f 6b 20 6c 69 6b 65 20 6d 61 67  se look like mag
221f0 69 63 20 6e 75 6d 62 65 72 73 2e 20 42 75 74 20  ic numbers. But 
22200 74 68 65 79 20 61 72 65 20 73 74 61 62 6c 65 2c  they are stable,
22210 20 61 73 20 74 68 65 79 20 61 72 65 20 70 61 72   as they are par
22220 74 0a 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  t.       ** of t
22230 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66  he definition of
22240 20 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c 65   the SQLite file
22250 20 66 6f 72 6d 61 74 2c 20 77 68 69 63 68 20 6d   format, which m
22260 61 79 20 6e 6f 74 20 63 68 61 6e 67 65 2e 20 2a  ay not change. *
22270 2f 0a 20 20 20 20 20 20 75 38 20 2a 70 42 75 66  /.      u8 *pBuf
22280 20 3d 20 28 75 38 2a 29 7a 42 75 66 3b 0a 20 20   = (u8*)zBuf;.  
22290 20 20 20 20 70 2d 3e 69 43 6f 6f 6b 69 65 20 3d      p->iCookie =
222a0 20 72 62 75 47 65 74 55 33 32 28 26 70 42 75 66   rbuGetU32(&pBuf
222b0 5b 32 34 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e  [24]);.      p->
222c0 69 57 72 69 74 65 56 65 72 20 3d 20 70 42 75 66  iWriteVer = pBuf
222d0 5b 31 39 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  [19];.    }.  }.
222e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
222f0 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61  /*.** Write data
22300 20 74 6f 20 61 6e 20 72 62 75 56 66 73 2d 66 69   to an rbuVfs-fi
22310 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
22320 74 20 72 62 75 56 66 73 57 72 69 74 65 28 0a 20  t rbuVfsWrite(. 
22330 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
22340 46 69 6c 65 2c 20 0a 20 20 63 6f 6e 73 74 20 76  File, .  const v
22350 6f 69 64 20 2a 7a 42 75 66 2c 20 0a 20 20 69 6e  oid *zBuf, .  in
22360 74 20 69 41 6d 74 2c 20 0a 20 20 73 71 6c 69 74  t iAmt, .  sqlit
22370 65 5f 69 6e 74 36 34 20 69 4f 66 73 74 0a 29 7b  e_int64 iOfst.){
22380 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d  .  rbu_file *p =
22390 20 28 72 62 75 5f 66 69 6c 65 2a 29 70 46 69 6c   (rbu_file*)pFil
223a0 65 3b 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20  e;.  sqlite3rbu 
223b0 2a 70 52 62 75 20 3d 20 70 2d 3e 70 52 62 75 3b  *pRbu = p->pRbu;
223c0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
223d0 28 20 70 52 62 75 20 26 26 20 70 52 62 75 2d 3e  ( pRbu && pRbu->
223e0 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47  eStage==RBU_STAG
223f0 45 5f 43 41 50 54 55 52 45 20 29 7b 0a 20 20 20  E_CAPTURE ){.   
22400 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 65 6e   assert( p->open
22410 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
22420 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20  PEN_MAIN_DB );. 
22430 20 20 20 72 63 20 3d 20 72 62 75 43 61 70 74 75     rc = rbuCaptu
22440 72 65 44 62 57 72 69 74 65 28 70 2d 3e 70 52 62  reDbWrite(p->pRb
22450 75 2c 20 69 4f 66 73 74 29 3b 0a 20 20 7d 65 6c  u, iOfst);.  }el
22460 73 65 7b 0a 20 20 20 20 69 66 28 20 70 52 62 75  se{.    if( pRbu
22470 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52   ){.      if( pR
22480 62 75 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f  bu->eStage==RBU_
22490 53 54 41 47 45 5f 4f 41 4c 20 0a 20 20 20 20 20  STAGE_OAL .     
224a0 20 20 26 26 20 28 70 2d 3e 6f 70 65 6e 46 6c 61    && (p->openFla
224b0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
224c0 5f 57 41 4c 29 20 0a 20 20 20 20 20 20 20 26 26  _WAL) .       &&
224d0 20 69 4f 66 73 74 3e 3d 70 52 62 75 2d 3e 69 4f   iOfst>=pRbu->iO
224e0 61 6c 53 7a 0a 20 20 20 20 20 20 29 7b 0a 20 20  alSz.      ){.  
224f0 20 20 20 20 20 20 70 52 62 75 2d 3e 69 4f 61 6c        pRbu->iOal
22500 53 7a 20 3d 20 69 41 6d 74 20 2b 20 69 4f 66 73  Sz = iAmt + iOfs
22510 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  t;.      }else i
22520 66 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20  f( p->openFlags 
22530 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  & SQLITE_OPEN_DE
22540 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a 20  LETEONCLOSE ){. 
22550 20 20 20 20 20 20 20 69 36 34 20 73 7a 4e 65 77         i64 szNew
22560 20 3d 20 69 41 6d 74 2b 69 4f 66 73 74 3b 0a 20   = iAmt+iOfst;. 
22570 20 20 20 20 20 20 20 69 66 28 20 73 7a 4e 65 77         if( szNew
22580 3e 70 2d 3e 73 7a 20 29 7b 0a 20 20 20 20 20 20  >p->sz ){.      
22590 20 20 20 20 72 63 20 3d 20 72 62 75 55 70 64 61      rc = rbuUpda
225a0 74 65 54 65 6d 70 53 69 7a 65 28 70 2c 20 73 7a  teTempSize(p, sz
225b0 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20  New);.          
225c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
225d0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
225e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
225f0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
22600 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f  p->pReal->pMetho
22610 64 73 2d 3e 78 57 72 69 74 65 28 70 2d 3e 70 52  ds->xWrite(p->pR
22620 65 61 6c 2c 20 7a 42 75 66 2c 20 69 41 6d 74 2c  eal, zBuf, iAmt,
22630 20 69 4f 66 73 74 29 3b 0a 20 20 20 20 69 66 28   iOfst);.    if(
22640 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
22650 26 20 69 4f 66 73 74 3d 3d 30 20 26 26 20 28 70  & iOfst==0 && (p
22660 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51  ->openFlags & SQ
22670 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
22680 42 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  B) ){.      /* T
22690 68 65 73 65 20 6c 6f 6f 6b 20 6c 69 6b 65 20 6d  hese look like m
226a0 61 67 69 63 20 6e 75 6d 62 65 72 73 2e 20 42 75  agic numbers. Bu
226b0 74 20 74 68 65 79 20 61 72 65 20 73 74 61 62 6c  t they are stabl
226c0 65 2c 20 61 73 20 74 68 65 79 20 61 72 65 20 70  e, as they are p
226d0 61 72 74 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  art.      ** of 
226e0 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f  the definition o
226f0 66 20 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c  f the SQLite fil
22700 65 20 66 6f 72 6d 61 74 2c 20 77 68 69 63 68 20  e format, which 
22710 6d 61 79 20 6e 6f 74 20 63 68 61 6e 67 65 2e 20  may not change. 
22720 2a 2f 0a 20 20 20 20 20 20 75 38 20 2a 70 42 75  */.      u8 *pBu
22730 66 20 3d 20 28 75 38 2a 29 7a 42 75 66 3b 0a 20  f = (u8*)zBuf;. 
22740 20 20 20 20 20 70 2d 3e 69 43 6f 6f 6b 69 65 20       p->iCookie 
22750 3d 20 72 62 75 47 65 74 55 33 32 28 26 70 42 75  = rbuGetU32(&pBu
22760 66 5b 32 34 5d 29 3b 0a 20 20 20 20 20 20 70 2d  f[24]);.      p-
22770 3e 69 57 72 69 74 65 56 65 72 20 3d 20 70 42 75  >iWriteVer = pBu
22780 66 5b 31 39 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d  f[19];.    }.  }
22790 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
227a0 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
227b0 61 6e 20 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a  an rbuVfs-file..
227c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62  */.static int rb
227d0 75 56 66 73 54 72 75 6e 63 61 74 65 28 73 71 6c  uVfsTruncate(sql
227e0 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
227f0 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 73  , sqlite_int64 s
22800 69 7a 65 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65  ize){.  rbu_file
22810 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 2a   *p = (rbu_file*
22820 29 70 46 69 6c 65 3b 0a 20 20 69 66 28 20 28 70  )pFile;.  if( (p
22830 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51  ->openFlags & SQ
22840 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
22850 4f 4e 43 4c 4f 53 45 29 20 26 26 20 70 2d 3e 70  ONCLOSE) && p->p
22860 52 62 75 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  Rbu ){.    int r
22870 63 20 3d 20 72 62 75 55 70 64 61 74 65 54 65 6d  c = rbuUpdateTem
22880 70 53 69 7a 65 28 70 2c 20 73 69 7a 65 29 3b 0a  pSize(p, size);.
22890 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
228a0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
228b0 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  c;.  }.  return 
228c0 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f  p->pReal->pMetho
228d0 64 73 2d 3e 78 54 72 75 6e 63 61 74 65 28 70 2d  ds->xTruncate(p-
228e0 3e 70 52 65 61 6c 2c 20 73 69 7a 65 29 3b 0a 7d  >pReal, size);.}
228f0 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 61 6e 20  ../*.** Sync an 
22900 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a  rbuVfs-file..*/.
22910 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66  static int rbuVf
22920 73 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69  sSync(sqlite3_fi
22930 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 66  le *pFile, int f
22940 6c 61 67 73 29 7b 0a 20 20 72 62 75 5f 66 69 6c  lags){.  rbu_fil
22950 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65  e *p = (rbu_file
22960 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 66 28 20   *)pFile;.  if( 
22970 70 2d 3e 70 52 62 75 20 26 26 20 70 2d 3e 70 52  p->pRbu && p->pR
22980 62 75 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f  bu->eStage==RBU_
22990 53 54 41 47 45 5f 43 41 50 54 55 52 45 20 29 7b  STAGE_CAPTURE ){
229a0 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e  .    if( p->open
229b0 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
229c0 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20  PEN_MAIN_DB ){. 
229d0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
229e0 54 45 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20 20  TE_INTERNAL;.   
229f0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51   }.    return SQ
22a00 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
22a10 65 74 75 72 6e 20 70 2d 3e 70 52 65 61 6c 2d 3e  eturn p->pReal->
22a20 70 4d 65 74 68 6f 64 73 2d 3e 78 53 79 6e 63 28  pMethods->xSync(
22a30 70 2d 3e 70 52 65 61 6c 2c 20 66 6c 61 67 73 29  p->pReal, flags)
22a40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
22a50 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 69  n the current fi
22a60 6c 65 2d 73 69 7a 65 20 6f 66 20 61 6e 20 72 62  le-size of an rb
22a70 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74  uVfs-file..*/.st
22a80 61 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 46  atic int rbuVfsF
22a90 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  ileSize(sqlite3_
22aa0 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c  file *pFile, sql
22ab0 69 74 65 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65  ite_int64 *pSize
22ac0 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70  ){.  rbu_file *p
22ad0 20 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a 29 70   = (rbu_file *)p
22ae0 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  File;.  int rc;.
22af0 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d    rc = p->pReal-
22b00 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 46 69 6c 65  >pMethods->xFile
22b10 53 69 7a 65 28 70 2d 3e 70 52 65 61 6c 2c 20 70  Size(p->pReal, p
22b20 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  Size);..  /* If 
22b30 74 68 69 73 20 69 73 20 61 6e 20 52 42 55 20 76  this is an RBU v
22b40 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 20  acuum operation 
22b50 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20  and this is the 
22b60 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65 2c  target database,
22b70 0a 20 20 2a 2a 20 70 72 65 74 65 6e 64 20 74 68  .  ** pretend th
22b80 61 74 20 69 74 20 68 61 73 20 61 74 20 6c 65 61  at it has at lea
22b90 73 74 20 6f 6e 65 20 70 61 67 65 2e 20 4f 74 68  st one page. Oth
22ba0 65 72 77 69 73 65 2c 20 53 51 4c 69 74 65 20 77  erwise, SQLite w
22bb0 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 63 68 65  ill not.  ** che
22bc0 63 6b 20 66 6f 72 20 74 68 65 20 65 78 69 73 74  ck for the exist
22bd0 61 6e 63 65 20 6f 66 20 61 20 2a 2d 77 61 6c 20  ance of a *-wal 
22be0 66 69 6c 65 2e 20 72 62 75 56 66 73 52 65 61 64  file. rbuVfsRead
22bf0 28 29 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 2a  () contains .  *
22c00 2a 20 73 69 6d 69 6c 61 72 20 6c 6f 67 69 63 2e  * similar logic.
22c10 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
22c20 51 4c 49 54 45 5f 4f 4b 20 26 26 20 2a 70 53 69  QLITE_OK && *pSi
22c30 7a 65 3d 3d 30 20 0a 20 20 20 26 26 20 70 2d 3e  ze==0 .   && p->
22c40 70 52 62 75 20 26 26 20 72 62 75 49 73 56 61 63  pRbu && rbuIsVac
22c50 75 75 6d 28 70 2d 3e 70 52 62 75 29 20 0a 20 20  uum(p->pRbu) .  
22c60 20 26 26 20 28 70 2d 3e 6f 70 65 6e 46 6c 61 67   && (p->openFlag
22c70 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
22c80 4d 41 49 4e 5f 44 42 29 0a 20 20 29 7b 0a 20 20  MAIN_DB).  ){.  
22c90 20 20 2a 70 53 69 7a 65 20 3d 20 31 30 32 34 3b    *pSize = 1024;
22ca0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
22cb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
22cc0 61 6e 20 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a  an rbuVfs-file..
22cd0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62  */.static int rb
22ce0 75 56 66 73 4c 6f 63 6b 28 73 71 6c 69 74 65 33  uVfsLock(sqlite3
22cf0 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e  _file *pFile, in
22d00 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 72 62 75 5f  t eLock){.  rbu_
22d10 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66  file *p = (rbu_f
22d20 69 6c 65 2a 29 70 46 69 6c 65 3b 0a 20 20 73 71  ile*)pFile;.  sq
22d30 6c 69 74 65 33 72 62 75 20 2a 70 52 62 75 20 3d  lite3rbu *pRbu =
22d40 20 70 2d 3e 70 52 62 75 3b 0a 20 20 69 6e 74 20   p->pRbu;.  int 
22d50 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
22d60 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70  .  assert( p->op
22d70 65 6e 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54  enFlags & (SQLIT
22d80 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 7c 53  E_OPEN_MAIN_DB|S
22d90 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
22da0 44 42 29 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f  DB) );.  if( eLo
22db0 63 6b 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f  ck==SQLITE_LOCK_
22dc0 45 58 43 4c 55 53 49 56 45 20 0a 20 20 20 26 26  EXCLUSIVE .   &&
22dd0 20 28 70 2d 3e 62 4e 6f 6c 6f 63 6b 20 7c 7c 20   (p->bNolock || 
22de0 28 70 52 62 75 20 26 26 20 70 52 62 75 2d 3e 65  (pRbu && pRbu->e
22df0 53 74 61 67 65 21 3d 52 42 55 5f 53 54 41 47 45  Stage!=RBU_STAGE
22e00 5f 44 4f 4e 45 29 29 0a 20 20 29 7b 0a 20 20 20  _DONE)).  ){.   
22e10 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77   /* Do not allow
22e20 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73   EXCLUSIVE locks
22e30 2e 20 50 72 65 76 65 6e 74 69 6e 67 20 53 51 4c  . Preventing SQL
22e40 69 74 65 20 66 72 6f 6d 20 74 61 6b 69 6e 67 20  ite from taking 
22e50 74 68 69 73 20 0a 20 20 20 20 2a 2a 20 70 72 65  this .    ** pre
22e60 76 65 6e 74 73 20 69 74 20 66 72 6f 6d 20 63 68  vents it from ch
22e70 65 63 6b 70 6f 69 6e 74 69 6e 67 20 74 68 65 20  eckpointing the 
22e80 64 61 74 61 62 61 73 65 20 66 72 6f 6d 20 73 71  database from sq
22e90 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 2e 20 2a  lite3_close(). *
22ea0 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  /.    rc = SQLIT
22eb0 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b  E_BUSY;.  }else{
22ec0 0a 20 20 20 20 72 63 20 3d 20 70 2d 3e 70 52 65  .    rc = p->pRe
22ed0 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 4c  al->pMethods->xL
22ee0 6f 63 6b 28 70 2d 3e 70 52 65 61 6c 2c 20 65 4c  ock(p->pReal, eL
22ef0 6f 63 6b 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ock);.  }..  ret
22f00 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
22f10 20 55 6e 6c 6f 63 6b 20 61 6e 20 72 62 75 56 66   Unlock an rbuVf
22f20 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  s-file..*/.stati
22f30 63 20 69 6e 74 20 72 62 75 56 66 73 55 6e 6c 6f  c int rbuVfsUnlo
22f40 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
22f50 2a 70 46 69 6c 65 2c 20 69 6e 74 20 65 4c 6f 63  *pFile, int eLoc
22f60 6b 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a  k){.  rbu_file *
22f70 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a 29  p = (rbu_file *)
22f80 70 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20  pFile;.  return 
22f90 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f  p->pReal->pMetho
22fa0 64 73 2d 3e 78 55 6e 6c 6f 63 6b 28 70 2d 3e 70  ds->xUnlock(p->p
22fb0 52 65 61 6c 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a  Real, eLock);.}.
22fc0 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20  ./*.** Check if 
22fd0 61 6e 6f 74 68 65 72 20 66 69 6c 65 2d 68 61 6e  another file-han
22fe0 64 6c 65 20 68 6f 6c 64 73 20 61 20 52 45 53 45  dle holds a RESE
22ff0 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 61 6e 20  RVED lock on an 
23000 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a  rbuVfs-file..*/.
23010 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66  static int rbuVf
23020 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  sCheckReservedLo
23030 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
23040 2a 70 46 69 6c 65 2c 20 69 6e 74 20 2a 70 52 65  *pFile, int *pRe
23050 73 4f 75 74 29 7b 0a 20 20 72 62 75 5f 66 69 6c  sOut){.  rbu_fil
23060 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65  e *p = (rbu_file
23070 20 2a 29 70 46 69 6c 65 3b 0a 20 20 72 65 74 75   *)pFile;.  retu
23080 72 6e 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65  rn p->pReal->pMe
23090 74 68 6f 64 73 2d 3e 78 43 68 65 63 6b 52 65 73  thods->xCheckRes
230a0 65 72 76 65 64 4c 6f 63 6b 28 70 2d 3e 70 52 65  ervedLock(p->pRe
230b0 61 6c 2c 20 70 52 65 73 4f 75 74 29 3b 0a 7d 0a  al, pResOut);.}.
230c0 0a 2f 2a 0a 2a 2a 20 46 69 6c 65 20 63 6f 6e 74  ./*.** File cont
230d0 72 6f 6c 20 6d 65 74 68 6f 64 2e 20 46 6f 72 20  rol method. For 
230e0 63 75 73 74 6f 6d 20 6f 70 65 72 61 74 69 6f 6e  custom operation
230f0 73 20 6f 6e 20 61 6e 20 72 62 75 56 66 73 2d 66  s on an rbuVfs-f
23100 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
23110 6e 74 20 72 62 75 56 66 73 46 69 6c 65 43 6f 6e  nt rbuVfsFileCon
23120 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  trol(sqlite3_fil
23130 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 6f 70  e *pFile, int op
23140 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
23150 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28   rbu_file *p = (
23160 72 62 75 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65  rbu_file *)pFile
23170 3b 0a 20 20 69 6e 74 20 28 2a 78 43 6f 6e 74 72  ;.  int (*xContr
23180 6f 6c 29 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ol)(sqlite3_file
23190 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29 20 3d 20 70  *,int,void*) = p
231a0 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
231b0 73 2d 3e 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 3b  s->xFileControl;
231c0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
231d0 73 65 72 74 28 20 70 2d 3e 6f 70 65 6e 46 6c 61  sert( p->openFla
231e0 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs & (SQLITE_OPE
231f0 4e 5f 4d 41 49 4e 5f 44 42 7c 53 51 4c 49 54 45  N_MAIN_DB|SQLITE
23200 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 29 0a 20  _OPEN_TEMP_DB). 
23210 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6f 70 65 6e        || p->open
23220 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f  Flags & (SQLITE_
23230 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44  OPEN_TRANSIENT_D
23240 42 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  B|SQLITE_OPEN_TE
23250 4d 50 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 29 3b  MP_JOURNAL).  );
23260 0a 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54  .  if( op==SQLIT
23270 45 5f 46 43 4e 54 4c 5f 52 42 55 20 29 7b 0a 20  E_FCNTL_RBU ){. 
23280 20 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70     sqlite3rbu *p
23290 52 62 75 20 3d 20 28 73 71 6c 69 74 65 33 72 62  Rbu = (sqlite3rb
232a0 75 2a 29 70 41 72 67 3b 0a 0a 20 20 20 20 2f 2a  u*)pArg;..    /*
232b0 20 46 69 72 73 74 20 74 72 79 20 74 6f 20 66 69   First try to fi
232c0 6e 64 20 61 6e 6f 74 68 65 72 20 52 42 55 20 76  nd another RBU v
232d0 66 73 20 6c 6f 77 65 72 20 64 6f 77 6e 20 69 6e  fs lower down in
232e0 20 74 68 65 20 76 66 73 20 73 74 61 63 6b 2e 20   the vfs stack. 
232f0 49 66 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 69 73  If.    ** one is
23300 20 66 6f 75 6e 64 2c 20 74 68 69 73 20 76 66 73   found, this vfs
23310 20 77 69 6c 6c 20 6f 70 65 72 61 74 65 20 69 6e   will operate in
23320 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20 6d 6f   pass-through mo
23330 64 65 2e 20 54 68 65 20 6c 6f 77 65 72 0a 20 20  de. The lower.  
23340 20 20 2a 2a 20 6c 65 76 65 6c 20 76 66 73 20 77    ** level vfs w
23350 69 6c 6c 20 64 6f 20 74 68 65 20 73 70 65 63 69  ill do the speci
23360 61 6c 20 52 42 55 20 68 61 6e 64 6c 69 6e 67 2e  al RBU handling.
23370 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 78 43    */.    rc = xC
23380 6f 6e 74 72 6f 6c 28 70 2d 3e 70 52 65 61 6c 2c  ontrol(p->pReal,
23390 20 6f 70 2c 20 70 41 72 67 29 3b 0a 0a 20 20 20   op, pArg);..   
233a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
233b0 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20  NOTFOUND ){.    
233c0 20 20 2f 2a 20 4e 6f 77 20 73 65 61 72 63 68 20    /* Now search 
233d0 66 6f 72 20 61 20 7a 69 70 76 66 73 20 69 6e 73  for a zipvfs ins
233e0 74 61 6e 63 65 20 6c 6f 77 65 72 20 64 6f 77 6e  tance lower down
233f0 20 69 6e 20 74 68 65 20 56 46 53 20 73 74 61 63   in the VFS stac
23400 6b 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 6f  k. If.      ** o
23410 6e 65 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 69  ne is found, thi
23420 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 20  s is an error.  
23430 2a 2f 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 64  */.      void *d
23440 75 6d 6d 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  ummy = 0;.      
23450 72 63 20 3d 20 78 43 6f 6e 74 72 6f 6c 28 70 2d  rc = xControl(p-
23460 3e 70 52 65 61 6c 2c 20 53 51 4c 49 54 45 5f 46  >pReal, SQLITE_F
23470 43 4e 54 4c 5f 5a 49 50 56 46 53 2c 20 26 64 75  CNTL_ZIPVFS, &du
23480 6d 6d 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20  mmy);.      if( 
23490 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
234a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
234b0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
234c0 20 20 20 20 70 52 62 75 2d 3e 7a 45 72 72 6d 73      pRbu->zErrms
234d0 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
234e0 6e 74 66 28 22 72 62 75 2f 7a 69 70 76 66 73 20  ntf("rbu/zipvfs 
234f0 73 65 74 75 70 20 65 72 72 6f 72 22 29 3b 0a 20  setup error");. 
23500 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
23510 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  c==SQLITE_NOTFOU
23520 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52  ND ){.        pR
23530 62 75 2d 3e 70 54 61 72 67 65 74 46 64 20 3d 20  bu->pTargetFd = 
23540 70 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 52  p;.        p->pR
23550 62 75 20 3d 20 70 52 62 75 3b 0a 20 20 20 20 20  bu = pRbu;.     
23560 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e 46 6c     if( p->openFl
23570 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
23580 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20 20  N_MAIN_DB ){.   
23590 20 20 20 20 20 20 20 72 62 75 4d 61 69 6e 6c 69         rbuMainli
235a0 73 74 41 64 64 28 70 29 3b 0a 20 20 20 20 20 20  stAdd(p);.      
235b0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
235c0 70 2d 3e 70 57 61 6c 46 64 20 29 20 70 2d 3e 70  p->pWalFd ) p->p
235d0 57 61 6c 46 64 2d 3e 70 52 62 75 20 3d 20 70 52  WalFd->pRbu = pR
235e0 62 75 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  bu;.        rc =
235f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
23600 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65    }.    }.    re
23610 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 65  turn rc;.  }.  e
23620 6c 73 65 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49  lse if( op==SQLI
23630 54 45 5f 46 43 4e 54 4c 5f 52 42 55 43 4e 54 20  TE_FCNTL_RBUCNT 
23640 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 72 62  ){.    sqlite3rb
23650 75 20 2a 70 52 62 75 20 3d 20 28 73 71 6c 69 74  u *pRbu = (sqlit
23660 65 33 72 62 75 2a 29 70 41 72 67 3b 0a 20 20 20  e3rbu*)pArg;.   
23670 20 70 52 62 75 2d 3e 6e 52 62 75 2b 2b 3b 0a 20   pRbu->nRbu++;. 
23680 20 20 20 70 52 62 75 2d 3e 70 52 62 75 46 64 20     pRbu->pRbuFd 
23690 3d 20 70 3b 0a 20 20 20 20 70 2d 3e 62 4e 6f 6c  = p;.    p->bNol
236a0 6f 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  ock = 1;.  }..  
236b0 72 63 20 3d 20 78 43 6f 6e 74 72 6f 6c 28 70 2d  rc = xControl(p-
236c0 3e 70 52 65 61 6c 2c 20 6f 70 2c 20 70 41 72 67  >pReal, op, pArg
236d0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
236e0 49 54 45 5f 4f 4b 20 26 26 20 6f 70 3d 3d 53 51  ITE_OK && op==SQ
236f0 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41  LITE_FCNTL_VFSNA
23700 4d 45 20 29 7b 0a 20 20 20 20 72 62 75 5f 76 66  ME ){.    rbu_vf
23710 73 20 2a 70 52 62 75 56 66 73 20 3d 20 70 2d 3e  s *pRbuVfs = p->
23720 70 52 62 75 56 66 73 3b 0a 20 20 20 20 63 68 61  pRbuVfs;.    cha
23730 72 20 2a 7a 49 6e 20 3d 20 2a 28 63 68 61 72 2a  r *zIn = *(char*
23740 2a 29 70 41 72 67 3b 0a 20 20 20 20 63 68 61 72  *)pArg;.    char
23750 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33   *zOut = sqlite3
23760 5f 6d 70 72 69 6e 74 66 28 22 72 62 75 28 25 73  _mprintf("rbu(%s
23770 29 2f 25 7a 22 2c 20 70 52 62 75 56 66 73 2d 3e  )/%z", pRbuVfs->
23780 62 61 73 65 2e 7a 4e 61 6d 65 2c 20 7a 49 6e 29  base.zName, zIn)
23790 3b 0a 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70  ;.    *(char**)p
237a0 41 72 67 20 3d 20 7a 4f 75 74 3b 0a 20 20 20 20  Arg = zOut;.    
237b0 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29 20 72 63  if( zOut==0 ) rc
237c0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
237d0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
237e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
237f0 72 6e 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69  rn the sector-si
23800 7a 65 20 69 6e 20 62 79 74 65 73 20 66 6f 72 20  ze in bytes for 
23810 61 6e 20 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a  an rbuVfs-file..
23820 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62  */.static int rb
23830 75 56 66 73 53 65 63 74 6f 72 53 69 7a 65 28 73  uVfsSectorSize(s
23840 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
23850 6c 65 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20  le){.  rbu_file 
23860 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a  *p = (rbu_file *
23870 29 70 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e  )pFile;.  return
23880 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68   p->pReal->pMeth
23890 6f 64 73 2d 3e 78 53 65 63 74 6f 72 53 69 7a 65  ods->xSectorSize
238a0 28 70 2d 3e 70 52 65 61 6c 29 3b 0a 7d 0a 0a 2f  (p->pReal);.}../
238b0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
238c0 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  device character
238d0 69 73 74 69 63 20 66 6c 61 67 73 20 73 75 70 70  istic flags supp
238e0 6f 72 74 65 64 20 62 79 20 61 6e 20 72 62 75 56  orted by an rbuV
238f0 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  fs-file..*/.stat
23900 69 63 20 69 6e 74 20 72 62 75 56 66 73 44 65 76  ic int rbuVfsDev
23910 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
23920 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  cs(sqlite3_file 
23930 2a 70 46 69 6c 65 29 7b 0a 20 20 72 62 75 5f 66  *pFile){.  rbu_f
23940 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69  ile *p = (rbu_fi
23950 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 72 65  le *)pFile;.  re
23960 74 75 72 6e 20 70 2d 3e 70 52 65 61 6c 2d 3e 70  turn p->pReal->p
23970 4d 65 74 68 6f 64 73 2d 3e 78 44 65 76 69 63 65  Methods->xDevice
23980 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
23990 70 2d 3e 70 52 65 61 6c 29 3b 0a 7d 0a 0a 2f 2a  p->pReal);.}../*
239a0 0a 2a 2a 20 54 61 6b 65 20 6f 72 20 72 65 6c 65  .** Take or rele
239b0 61 73 65 20 61 20 73 68 61 72 65 64 2d 6d 65 6d  ase a shared-mem
239c0 6f 72 79 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61  ory lock..*/.sta
239d0 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 53 68  tic int rbuVfsSh
239e0 6d 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  mLock(sqlite3_fi
239f0 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 6f  le *pFile, int o
23a00 66 73 74 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20  fst, int n, int 
23a10 66 6c 61 67 73 29 7b 0a 20 20 72 62 75 5f 66 69  flags){.  rbu_fi
23a20 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c  le *p = (rbu_fil
23a30 65 2a 29 70 46 69 6c 65 3b 0a 20 20 73 71 6c 69  e*)pFile;.  sqli
23a40 74 65 33 72 62 75 20 2a 70 52 62 75 20 3d 20 70  te3rbu *pRbu = p
23a50 2d 3e 70 52 62 75 3b 0a 20 20 69 6e 74 20 72 63  ->pRbu;.  int rc
23a60 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23   = SQLITE_OK;..#
23a70 69 66 64 65 66 20 53 51 4c 49 54 45 5f 41 4d 41  ifdef SQLITE_AMA
23a80 4c 47 41 4d 41 54 49 4f 4e 0a 20 20 20 20 61 73  LGAMATION.    as
23a90 73 65 72 74 28 20 57 41 4c 5f 43 4b 50 54 5f 4c  sert( WAL_CKPT_L
23aa0 4f 43 4b 3d 3d 31 20 29 3b 0a 23 65 6e 64 69 66  OCK==1 );.#endif
23ab0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f  ..  assert( p->o
23ac0 70 65 6e 46 6c 61 67 73 20 26 20 28 53 51 4c 49  penFlags & (SQLI
23ad0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 7c  TE_OPEN_MAIN_DB|
23ae0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
23af0 5f 44 42 29 20 29 3b 0a 20 20 69 66 28 20 70 52  _DB) );.  if( pR
23b00 62 75 20 26 26 20 28 70 52 62 75 2d 3e 65 53 74  bu && (pRbu->eSt
23b10 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f  age==RBU_STAGE_O
23b20 41 4c 20 7c 7c 20 70 52 62 75 2d 3e 65 53 74 61  AL || pRbu->eSta
23b30 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f  ge==RBU_STAGE_MO
23b40 56 45 29 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 61  VE) ){.    /* Ma
23b50 67 69 63 20 6e 75 6d 62 65 72 20 31 20 69 73 20  gic number 1 is 
23b60 74 68 65 20 57 41 4c 5f 43 4b 50 54 5f 4c 4f 43  the WAL_CKPT_LOC
23b70 4b 20 6c 6f 63 6b 2e 20 50 72 65 76 65 6e 74 69  K lock. Preventi
23b80 6e 67 20 53 51 4c 69 74 65 20 66 72 6f 6d 0a 20  ng SQLite from. 
23b90 20 20 20 2a 2a 20 74 61 6b 69 6e 67 20 74 68 69     ** taking thi
23ba0 73 20 6c 6f 63 6b 20 61 6c 73 6f 20 70 72 65 76  s lock also prev
23bb0 65 6e 74 73 20 61 6e 79 20 63 68 65 63 6b 70 6f  ents any checkpo
23bc0 69 6e 74 73 20 66 72 6f 6d 20 6f 63 63 75 72 72  ints from occurr
23bd0 69 6e 67 2e 20 0a 20 20 20 20 2a 2a 20 74 6f 64  ing. .    ** tod
23be0 6f 3a 20 72 65 61 6c 6c 79 2c 20 69 74 27 73 20  o: really, it's 
23bf0 6e 6f 74 20 63 6c 65 61 72 20 77 68 79 20 74 68  not clear why th
23c00 69 73 20 6d 69 67 68 74 20 6f 63 63 75 72 2c 20  is might occur, 
23c10 61 73 20 0a 20 20 20 20 2a 2a 20 77 61 6c 5f 61  as .    ** wal_a
23c20 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 20 6f 75  utocheckpoint ou
23c30 67 68 74 20 74 6f 20 62 65 20 74 75 72 6e 65 64  ght to be turned
23c40 20 6f 66 66 2e 20 20 2a 2f 0a 20 20 20 20 69 66   off.  */.    if
23c50 28 20 6f 66 73 74 3d 3d 57 41 4c 5f 4c 4f 43 4b  ( ofst==WAL_LOCK
23c60 5f 43 4b 50 54 20 26 26 20 6e 3d 3d 31 20 29 20  _CKPT && n==1 ) 
23c70 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
23c80 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
23c90 6e 74 20 62 43 61 70 74 75 72 65 20 3d 20 30 3b  nt bCapture = 0;
23ca0 0a 20 20 20 20 69 66 28 20 6e 3d 3d 31 20 26 26  .    if( n==1 &&
23cb0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
23cc0 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a  _SHM_EXCLUSIVE).
23cd0 20 20 20 20 20 26 26 20 70 52 62 75 20 26 26 20       && pRbu && 
23ce0 70 52 62 75 2d 3e 65 53 74 61 67 65 3d 3d 52 42  pRbu->eStage==RB
23cf0 55 5f 53 54 41 47 45 5f 43 41 50 54 55 52 45 0a  U_STAGE_CAPTURE.
23d00 20 20 20 20 20 26 26 20 28 6f 66 73 74 3d 3d 57       && (ofst==W
23d10 41 4c 5f 4c 4f 43 4b 5f 57 52 49 54 45 20 7c 7c  AL_LOCK_WRITE ||
23d20 20 6f 66 73 74 3d 3d 57 41 4c 5f 4c 4f 43 4b 5f   ofst==WAL_LOCK_
23d30 43 4b 50 54 20 7c 7c 20 6f 66 73 74 3d 3d 57 41  CKPT || ofst==WA
23d40 4c 5f 4c 4f 43 4b 5f 52 45 41 44 30 29 0a 20 20  L_LOCK_READ0).  
23d50 20 20 29 7b 0a 20 20 20 20 20 20 62 43 61 70 74    ){.      bCapt
23d60 75 72 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  ure = 1;.    }..
23d70 20 20 20 20 69 66 28 20 62 43 61 70 74 75 72 65      if( bCapture
23d80 3d 3d 30 20 7c 7c 20 30 3d 3d 28 66 6c 61 67 73  ==0 || 0==(flags
23d90 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e   & SQLITE_SHM_UN
23da0 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 72  LOCK) ){.      r
23db0 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d  c = p->pReal->pM
23dc0 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4c 6f 63 6b  ethods->xShmLock
23dd0 28 70 2d 3e 70 52 65 61 6c 2c 20 6f 66 73 74 2c  (p->pReal, ofst,
23de0 20 6e 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20   n, flags);.    
23df0 20 20 69 66 28 20 62 43 61 70 74 75 72 65 20 26    if( bCapture &
23e00 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
23e10 29 7b 0a 20 20 20 20 20 20 20 20 70 52 62 75 2d  ){.        pRbu-
23e20 3e 6d 4c 6f 63 6b 20 7c 3d 20 28 31 20 3c 3c 20  >mLock |= (1 << 
23e30 6f 66 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ofst);.      }. 
23e40 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
23e50 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
23e60 4f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72  Obtain a pointer
23e70 20 74 6f 20 61 20 6d 61 70 70 69 6e 67 20 6f 66   to a mapping of
23e80 20 61 20 73 69 6e 67 6c 65 20 33 32 4b 69 42 20   a single 32KiB 
23e90 70 61 67 65 20 6f 66 20 74 68 65 20 2a 2d 73 68  page of the *-sh
23ea0 6d 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  m file..*/.stati
23eb0 63 20 69 6e 74 20 72 62 75 56 66 73 53 68 6d 4d  c int rbuVfsShmM
23ec0 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ap(.  sqlite3_fi
23ed0 6c 65 20 2a 70 46 69 6c 65 2c 20 0a 20 20 69 6e  le *pFile, .  in
23ee0 74 20 69 52 65 67 69 6f 6e 2c 20 0a 20 20 69 6e  t iRegion, .  in
23ef0 74 20 73 7a 52 65 67 69 6f 6e 2c 20 0a 20 20 69  t szRegion, .  i
23f00 6e 74 20 69 73 57 72 69 74 65 2c 20 0a 20 20 76  nt isWrite, .  v
23f10 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70  oid volatile **p
23f20 70 0a 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20  p.){.  rbu_file 
23f30 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 2a 29  *p = (rbu_file*)
23f40 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20  pFile;.  int rc 
23f50 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
23f60 6e 74 20 65 53 74 61 67 65 20 3d 20 28 70 2d 3e  nt eStage = (p->
23f70 70 52 62 75 20 3f 20 70 2d 3e 70 52 62 75 2d 3e  pRbu ? p->pRbu->
23f80 65 53 74 61 67 65 20 3a 20 30 29 3b 0a 0a 20 20  eStage : 0);..  
23f90 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 20 52 42 55  /* If not in RBU
23fa0 5f 53 54 41 47 45 5f 4f 41 4c 2c 20 61 6c 6c 6f  _STAGE_OAL, allo
23fb0 77 20 74 68 69 73 20 63 61 6c 6c 20 74 6f 20 70  w this call to p
23fc0 61 73 73 20 74 68 72 6f 75 67 68 2e 20 4f 72 2c  ass through. Or,
23fd0 20 69 66 20 74 68 69 73 0a 20 20 2a 2a 20 72 62   if this.  ** rb
23fe0 75 20 69 73 20 69 6e 20 74 68 65 20 52 42 55 5f  u is in the RBU_
23ff0 53 54 41 47 45 5f 4f 41 4c 20 73 74 61 74 65 2c  STAGE_OAL state,
24000 20 75 73 65 20 68 65 61 70 20 6d 65 6d 6f 72 79   use heap memory
24010 20 66 6f 72 20 2a 2d 73 68 6d 20 73 70 61 63 65   for *-shm space
24020 20 0a 20 20 2a 2a 20 69 6e 73 74 65 61 64 20 6f   .  ** instead o
24030 66 20 61 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  f a file on disk
24040 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
24050 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 28  p->openFlags & (
24060 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
24070 5f 44 42 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  _DB|SQLITE_OPEN_
24080 54 45 4d 50 5f 44 42 29 20 29 3b 0a 20 20 69 66  TEMP_DB) );.  if
24090 28 20 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  ( eStage==RBU_ST
240a0 41 47 45 5f 4f 41 4c 20 7c 7c 20 65 53 74 61 67  AGE_OAL || eStag
240b0 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56  e==RBU_STAGE_MOV
240c0 45 20 29 7b 0a 20 20 20 20 69 66 28 20 69 52 65  E ){.    if( iRe
240d0 67 69 6f 6e 3c 3d 70 2d 3e 6e 53 68 6d 20 29 7b  gion<=p->nShm ){
240e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
240f0 6e 74 36 34 20 6e 42 79 74 65 20 3d 20 28 69 52  nt64 nByte = (iR
24100 65 67 69 6f 6e 2b 31 29 20 2a 20 73 69 7a 65 6f  egion+1) * sizeo
24110 66 28 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20  f(char*);.      
24120 63 68 61 72 20 2a 2a 61 70 4e 65 77 20 3d 20 28  char **apNew = (
24130 63 68 61 72 2a 2a 29 73 71 6c 69 74 65 33 5f 72  char**)sqlite3_r
24140 65 61 6c 6c 6f 63 36 34 28 70 2d 3e 61 70 53 68  ealloc64(p->apSh
24150 6d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  m, nByte);.     
24160 20 69 66 28 20 61 70 4e 65 77 3d 3d 30 20 29 7b   if( apNew==0 ){
24170 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
24180 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
24190 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
241a0 20 6d 65 6d 73 65 74 28 26 61 70 4e 65 77 5b 70   memset(&apNew[p
241b0 2d 3e 6e 53 68 6d 5d 2c 20 30 2c 20 73 69 7a 65  ->nShm], 0, size
241c0 6f 66 28 63 68 61 72 2a 29 20 2a 20 28 31 20 2b  of(char*) * (1 +
241d0 20 69 52 65 67 69 6f 6e 20 2d 20 70 2d 3e 6e 53   iRegion - p->nS
241e0 68 6d 29 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  hm));.        p-
241f0 3e 61 70 53 68 6d 20 3d 20 61 70 4e 65 77 3b 0a  >apShm = apNew;.
24200 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 68 6d 20          p->nShm 
24210 3d 20 69 52 65 67 69 6f 6e 2b 31 3b 0a 20 20 20  = iRegion+1;.   
24220 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
24230 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
24240 4b 20 26 26 20 70 2d 3e 61 70 53 68 6d 5b 69 52  K && p->apShm[iR
24250 65 67 69 6f 6e 5d 3d 3d 30 20 29 7b 0a 20 20 20  egion]==0 ){.   
24260 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20     char *pNew = 
24270 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 6d  (char*)sqlite3_m
24280 61 6c 6c 6f 63 36 34 28 73 7a 52 65 67 69 6f 6e  alloc64(szRegion
24290 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
242a0 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w==0 ){.        
242b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
242c0 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  M;.      }else{.
242d0 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
242e0 4e 65 77 2c 20 30 2c 20 73 7a 52 65 67 69 6f 6e  New, 0, szRegion
242f0 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70  );.        p->ap
24300 53 68 6d 5b 69 52 65 67 69 6f 6e 5d 20 3d 20 70  Shm[iRegion] = p
24310 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  New;.      }.   
24320 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   }..    if( rc==
24330 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24340 20 20 20 2a 70 70 20 3d 20 70 2d 3e 61 70 53 68     *pp = p->apSh
24350 6d 5b 69 52 65 67 69 6f 6e 5d 3b 0a 20 20 20 20  m[iRegion];.    
24360 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 70  }else{.      *pp
24370 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 0;.    }.  }e
24380 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
24390 20 70 2d 3e 61 70 53 68 6d 3d 3d 30 20 29 3b 0a   p->apShm==0 );.
243a0 20 20 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61      rc = p->pRea
243b0 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68  l->pMethods->xSh
243c0 6d 4d 61 70 28 70 2d 3e 70 52 65 61 6c 2c 20 69  mMap(p->pReal, i
243d0 52 65 67 69 6f 6e 2c 20 73 7a 52 65 67 69 6f 6e  Region, szRegion
243e0 2c 20 69 73 57 72 69 74 65 2c 20 70 70 29 3b 0a  , isWrite, pp);.
243f0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
24400 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72  ;.}../*.** Memor
24410 79 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74  y barrier..*/.st
24420 61 74 69 63 20 76 6f 69 64 20 72 62 75 56 66 73  atic void rbuVfs
24430 53 68 6d 42 61 72 72 69 65 72 28 73 71 6c 69 74  ShmBarrier(sqlit
24440 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b  e3_file *pFile){
24450 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d  .  rbu_file *p =
24460 20 28 72 62 75 5f 66 69 6c 65 20 2a 29 70 46 69   (rbu_file *)pFi
24470 6c 65 3b 0a 20 20 70 2d 3e 70 52 65 61 6c 2d 3e  le;.  p->pReal->
24480 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 42 61  pMethods->xShmBa
24490 72 72 69 65 72 28 70 2d 3e 70 52 65 61 6c 29 3b  rrier(p->pReal);
244a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 78 53  .}../*.** The xS
244b0 68 6d 55 6e 6d 61 70 20 6d 65 74 68 6f 64 2e 0a  hmUnmap method..
244c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62  */.static int rb
244d0 75 56 66 73 53 68 6d 55 6e 6d 61 70 28 73 71 6c  uVfsShmUnmap(sql
244e0 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
244f0 2c 20 69 6e 74 20 64 65 6c 46 6c 61 67 29 7b 0a  , int delFlag){.
24500 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20    rbu_file *p = 
24510 28 72 62 75 5f 66 69 6c 65 2a 29 70 46 69 6c 65  (rbu_file*)pFile
24520 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
24530 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 65 53  ITE_OK;.  int eS
24540 74 61 67 65 20 3d 20 28 70 2d 3e 70 52 62 75 20  tage = (p->pRbu 
24550 3f 20 70 2d 3e 70 52 62 75 2d 3e 65 53 74 61 67  ? p->pRbu->eStag
24560 65 20 3a 20 30 29 3b 0a 0a 20 20 61 73 73 65 72  e : 0);..  asser
24570 74 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20  t( p->openFlags 
24580 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  & (SQLITE_OPEN_M
24590 41 49 4e 5f 44 42 7c 53 51 4c 49 54 45 5f 4f 50  AIN_DB|SQLITE_OP
245a0 45 4e 5f 54 45 4d 50 5f 44 42 29 20 29 3b 0a 20  EN_TEMP_DB) );. 
245b0 20 69 66 28 20 65 53 74 61 67 65 3d 3d 52 42 55   if( eStage==RBU
245c0 5f 53 54 41 47 45 5f 4f 41 4c 20 7c 7c 20 65 53  _STAGE_OAL || eS
245d0 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f  tage==RBU_STAGE_
245e0 4d 4f 56 45 20 29 7b 0a 20 20 20 20 2f 2a 20 6e  MOVE ){.    /* n
245f0 6f 2d 6f 70 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  o-op */.  }else{
24600 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  .    /* Release 
24610 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 65 72  the checkpointer
24620 20 61 6e 64 20 77 72 69 74 65 72 20 6c 6f 63 6b   and writer lock
24630 73 20 2a 2f 0a 20 20 20 20 72 62 75 55 6e 6c 6f  s */.    rbuUnlo
24640 63 6b 53 68 6d 28 70 29 3b 0a 20 20 20 20 72 63  ckShm(p);.    rc
24650 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65   = p->pReal->pMe
24660 74 68 6f 64 73 2d 3e 78 53 68 6d 55 6e 6d 61 70  thods->xShmUnmap
24670 28 70 2d 3e 70 52 65 61 6c 2c 20 64 65 6c 46 6c  (p->pReal, delFl
24680 61 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ag);.  }.  retur
24690 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  n rc;.}../* .** 
246a0 41 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  A main database 
246b0 6e 61 6d 65 64 20 7a 4e 61 6d 65 20 68 61 73 20  named zName has 
246c0 6a 75 73 74 20 62 65 65 6e 20 6f 70 65 6e 65 64  just been opened
246d0 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
246e0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  .** function ret
246f0 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
24700 6f 20 61 20 62 75 66 66 65 72 20 6f 77 6e 65 64  o a buffer owned
24710 20 62 79 20 53 51 4c 69 74 65 20 74 68 61 74 20   by SQLite that 
24720 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20  contains.** the 
24730 6e 61 6d 65 20 6f 66 20 74 68 65 20 2a 2d 77 61  name of the *-wa
24740 6c 20 66 69 6c 65 20 74 68 69 73 20 64 62 20 63  l file this db c
24750 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 75  onnection will u
24760 73 65 2e 20 53 51 4c 69 74 65 0a 2a 2a 20 68 61  se. SQLite.** ha
24770 70 70 65 6e 73 20 74 6f 20 70 61 73 73 20 61 20  ppens to pass a 
24780 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20  pointer to this 
24790 62 75 66 66 65 72 20 77 68 65 6e 20 75 73 69 6e  buffer when usin
247a0 67 20 78 41 63 63 65 73 73 28 29 0a 2a 2a 20 6f  g xAccess().** o
247b0 72 20 78 4f 70 65 6e 28 29 20 74 6f 20 6f 70 65  r xOpen() to ope
247c0 72 61 74 65 20 6f 6e 20 74 68 65 20 2a 2d 77 61  rate on the *-wa
247d0 6c 20 66 69 6c 65 2e 20 20 0a 2a 2f 0a 73 74 61  l file.  .*/.sta
247e0 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
247f0 72 62 75 4d 61 69 6e 54 6f 57 61 6c 28 63 6f 6e  rbuMainToWal(con
24800 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
24810 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e  int flags){.  in
24820 74 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  t n = (int)strle
24830 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 63 6f 6e 73  n(zName);.  cons
24840 74 20 63 68 61 72 20 2a 7a 20 3d 20 26 7a 4e 61  t char *z = &zNa
24850 6d 65 5b 6e 5d 3b 0a 20 20 69 66 28 20 66 6c 61  me[n];.  if( fla
24860 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
24870 5f 55 52 49 20 29 7b 0a 20 20 20 20 69 6e 74 20  _URI ){.    int 
24880 6f 64 64 20 3d 20 30 3b 0a 20 20 20 20 77 68 69  odd = 0;.    whi
24890 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20 69  le( 1 ){.      i
248a0 66 28 20 7a 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20  f( z[0]==0 ){.  
248b0 20 20 20 20 20 20 6f 64 64 20 3d 20 31 20 2d 20        odd = 1 - 
248c0 6f 64 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28  odd;.        if(
248d0 20 6f 64 64 20 26 26 20 7a 5b 31 5d 3d 3d 30 20   odd && z[1]==0 
248e0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
248f0 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20  .      z++;.    
24900 7d 0a 20 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20  }.    z += 2;.  
24910 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
24920 28 20 2a 7a 3d 3d 30 20 29 20 7a 2b 2b 3b 0a 20  ( *z==0 ) z++;. 
24930 20 7d 0a 20 20 7a 20 2b 3d 20 28 6e 20 2b 20 38   }.  z += (n + 8
24940 20 2b 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20   + 1);.  return 
24950 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  z;.}../*.** Open
24960 20 61 6e 20 72 62 75 20 66 69 6c 65 20 68 61 6e   an rbu file han
24970 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  dle..*/.static i
24980 6e 74 20 72 62 75 56 66 73 4f 70 65 6e 28 0a 20  nt rbuVfsOpen(. 
24990 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
249a0 66 73 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  fs,.  const char
249b0 20 2a 7a 4e 61 6d 65 2c 0a 20 20 73 71 6c 69 74   *zName,.  sqlit
249c0 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 0a  e3_file *pFile,.
249d0 20 20 69 6e 74 20 66 6c 61 67 73 2c 0a 20 20 69    int flags,.  i
249e0 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 0a 29 7b  nt *pOutFlags.){
249f0 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65  .  static sqlite
24a00 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 72 62 75  3_io_methods rbu
24a10 76 66 73 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 3d  vfs_io_methods =
24a20 20 7b 0a 20 20 20 20 32 2c 20 20 20 20 20 20 20   {.    2,       
24a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a40 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
24a50 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 43 6c   */.    rbuVfsCl
24a60 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
24a70 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
24a80 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 52 65 61  */.    rbuVfsRea
24a90 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
24aa0 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f       /* xRead */
24ab0 0a 20 20 20 20 72 62 75 56 66 73 57 72 69 74 65  .    rbuVfsWrite
24ac0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24ad0 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 0a     /* xWrite */.
24ae0 20 20 20 20 72 62 75 56 66 73 54 72 75 6e 63 61      rbuVfsTrunca
24af0 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
24b00 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a    /* xTruncate *
24b10 2f 0a 20 20 20 20 72 62 75 56 66 73 53 79 6e 63  /.    rbuVfsSync
24b20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24b30 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a      /* xSync */.
24b40 20 20 20 20 72 62 75 56 66 73 46 69 6c 65 53 69      rbuVfsFileSi
24b50 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
24b60 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a    /* xFileSize *
24b70 2f 0a 20 20 20 20 72 62 75 56 66 73 4c 6f 63 6b  /.    rbuVfsLock
24b80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24b90 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a      /* xLock */.
24ba0 20 20 20 20 72 62 75 56 66 73 55 6e 6c 6f 63 6b      rbuVfsUnlock
24bb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24bc0 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a    /* xUnlock */.
24bd0 20 20 20 20 72 62 75 56 66 73 43 68 65 63 6b 52      rbuVfsCheckR
24be0 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20  eservedLock,    
24bf0 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
24c00 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20 20 20 72  vedLock */.    r
24c10 62 75 56 66 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  buVfsFileControl
24c20 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
24c30 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a  xFileControl */.
24c40 20 20 20 20 72 62 75 56 66 73 53 65 63 74 6f 72      rbuVfsSector
24c50 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
24c60 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65    /* xSectorSize
24c70 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 44 65   */.    rbuVfsDe
24c80 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
24c90 69 63 73 2c 20 20 2f 2a 20 78 44 65 76 69 63 65  ics,  /* xDevice
24ca0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
24cb0 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 53 68 6d  */.    rbuVfsShm
24cc0 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  Map,            
24cd0 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
24ce0 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 53 68 6d  */.    rbuVfsShm
24cf0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
24d00 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b       /* xShmLock
24d10 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 53 68   */.    rbuVfsSh
24d20 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20 20 20  mBarrier,       
24d30 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72        /* xShmBar
24d40 72 69 65 72 20 2a 2f 0a 20 20 20 20 72 62 75 56  rier */.    rbuV
24d50 66 73 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20  fsShmUnmap,     
24d60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
24d70 6d 55 6e 6d 61 70 20 2a 2f 0a 20 20 20 20 30 2c  mUnmap */.    0,
24d80 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
24d90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
24da0 46 65 74 63 68 2c 20 78 55 6e 66 65 74 63 68 20  Fetch, xUnfetch 
24db0 2a 2f 0a 20 20 7d 3b 0a 20 20 72 62 75 5f 76 66  */.  };.  rbu_vf
24dc0 73 20 2a 70 52 62 75 56 66 73 20 3d 20 28 72 62  s *pRbuVfs = (rb
24dd0 75 5f 76 66 73 2a 29 70 56 66 73 3b 0a 20 20 73  u_vfs*)pVfs;.  s
24de0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65 61  qlite3_vfs *pRea
24df0 6c 56 66 73 20 3d 20 70 52 62 75 56 66 73 2d 3e  lVfs = pRbuVfs->
24e00 70 52 65 61 6c 56 66 73 3b 0a 20 20 72 62 75 5f  pRealVfs;.  rbu_
24e10 66 69 6c 65 20 2a 70 46 64 20 3d 20 28 72 62 75  file *pFd = (rbu
24e20 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20  _file *)pFile;. 
24e30 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
24e40 5f 4f 4b 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  _OK;.  const cha
24e50 72 20 2a 7a 4f 70 65 6e 20 3d 20 7a 4e 61 6d 65  r *zOpen = zName
24e60 3b 0a 20 20 69 6e 74 20 6f 66 6c 61 67 73 20 3d  ;.  int oflags =
24e70 20 66 6c 61 67 73 3b 0a 0a 20 20 6d 65 6d 73 65   flags;..  memse
24e80 74 28 70 46 64 2c 20 30 2c 20 73 69 7a 65 6f 66  t(pFd, 0, sizeof
24e90 28 72 62 75 5f 66 69 6c 65 29 29 3b 0a 20 20 70  (rbu_file));.  p
24ea0 46 64 2d 3e 70 52 65 61 6c 20 3d 20 28 73 71 6c  Fd->pReal = (sql
24eb0 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 46 64 5b  ite3_file*)&pFd[
24ec0 31 5d 3b 0a 20 20 70 46 64 2d 3e 70 52 62 75 56  1];.  pFd->pRbuV
24ed0 66 73 20 3d 20 70 52 62 75 56 66 73 3b 0a 20 20  fs = pRbuVfs;.  
24ee0 70 46 64 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d  pFd->openFlags =
24ef0 20 66 6c 61 67 73 3b 0a 20 20 69 66 28 20 7a 4e   flags;.  if( zN
24f00 61 6d 65 20 29 7b 0a 20 20 20 20 69 66 28 20 66  ame ){.    if( f
24f10 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
24f20 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20  EN_MAIN_DB ){.  
24f30 20 20 20 20 2f 2a 20 41 20 6d 61 69 6e 20 64 61      /* A main da
24f40 74 61 62 61 73 65 20 68 61 73 20 6a 75 73 74 20  tabase has just 
24f50 62 65 65 6e 20 6f 70 65 6e 65 64 2e 20 54 68 65  been opened. The
24f60 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
24f70 20 73 65 74 73 0a 20 20 20 20 20 20 2a 2a 20 28   sets.      ** (
24f80 70 46 64 2d 3e 7a 57 61 6c 29 20 74 6f 20 70 6f  pFd->zWal) to po
24f90 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
24fa0 6f 77 6e 65 64 20 62 79 20 53 51 4c 69 74 65 20  owned by SQLite 
24fb0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20  that contains.  
24fc0 20 20 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65 20      ** the name 
24fd0 6f 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c  of the *-wal fil
24fe0 65 20 74 68 69 73 20 64 62 20 63 6f 6e 6e 65 63  e this db connec
24ff0 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65 2e 20 53  tion will use. S
25000 51 4c 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 68  QLite.      ** h
25010 61 70 70 65 6e 73 20 74 6f 20 70 61 73 73 20 61  appens to pass a
25020 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
25030 20 62 75 66 66 65 72 20 77 68 65 6e 20 75 73 69   buffer when usi
25040 6e 67 20 78 41 63 63 65 73 73 28 29 0a 20 20 20  ng xAccess().   
25050 20 20 20 2a 2a 20 6f 72 20 78 4f 70 65 6e 28 29     ** or xOpen()
25060 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74   to operate on t
25070 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 2e 20 20  he *-wal file.  
25080 2a 2f 0a 20 20 20 20 20 20 70 46 64 2d 3e 7a 57  */.      pFd->zW
25090 61 6c 20 3d 20 72 62 75 4d 61 69 6e 54 6f 57 61  al = rbuMainToWa
250a0 6c 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 29 3b  l(zName, flags);
250b0 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20  .    }.    else 
250c0 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
250d0 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 7b 0a 20  TE_OPEN_WAL ){. 
250e0 20 20 20 20 20 72 62 75 5f 66 69 6c 65 20 2a 70       rbu_file *p
250f0 44 62 20 3d 20 72 62 75 46 69 6e 64 4d 61 69 6e  Db = rbuFindMain
25100 64 62 28 70 52 62 75 56 66 73 2c 20 7a 4e 61 6d  db(pRbuVfs, zNam
25110 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  e, 0);.      if(
25120 20 70 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20   pDb ){.        
25130 69 66 28 20 70 44 62 2d 3e 70 52 62 75 20 26 26  if( pDb->pRbu &&
25140 20 70 44 62 2d 3e 70 52 62 75 2d 3e 65 53 74 61   pDb->pRbu->eSta
25150 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41  ge==RBU_STAGE_OA
25160 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  L ){.          /
25170 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 74  * This call is t
25180 6f 20 6f 70 65 6e 20 61 20 2a 2d 77 61 6c 20 66  o open a *-wal f
25190 69 6c 65 2e 20 49 6e 74 65 61 64 2c 20 6f 70 65  ile. Intead, ope
251a0 6e 20 74 68 65 20 2a 2d 6f 61 6c 2e 20 54 68 69  n the *-oal. Thi
251b0 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  s.          ** c
251c0 6f 64 65 20 65 6e 73 75 72 65 73 20 74 68 61 74  ode ensures that
251d0 20 74 68 65 20 73 74 72 69 6e 67 20 70 61 73 73   the string pass
251e0 65 64 20 74 6f 20 78 4f 70 65 6e 28 29 20 69 73  ed to xOpen() is
251f0 20 74 65 72 6d 69 6e 61 74 65 64 20 62 79 20 61   terminated by a
25200 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61  .          ** pa
25210 69 72 20 6f 66 20 27 5c 30 27 20 62 79 74 65 73  ir of '\0' bytes
25220 20 69 6e 20 63 61 73 65 20 74 68 65 20 56 46 53   in case the VFS
25230 20 61 74 74 65 6d 70 74 73 20 74 6f 20 65 78 74   attempts to ext
25240 72 61 63 74 20 61 20 55 52 49 20 0a 20 20 20 20  ract a URI .    
25250 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74        ** paramet
25260 65 72 20 66 72 6f 6d 20 69 74 2e 20 20 2a 2f 0a  er from it.  */.
25270 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
25280 63 68 61 72 20 2a 7a 42 61 73 65 20 3d 20 7a 4e  char *zBase = zN
25290 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ame;.          s
252a0 69 7a 65 5f 74 20 6e 43 6f 70 79 3b 0a 20 20 20  ize_t nCopy;.   
252b0 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f         char *zCo
252c0 70 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  py;.          if
252d0 28 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 44  ( rbuIsVacuum(pD
252e0 62 2d 3e 70 52 62 75 29 20 29 7b 0a 20 20 20 20  b->pRbu) ){.    
252f0 20 20 20 20 20 20 20 20 7a 42 61 73 65 20 3d 20          zBase = 
25300 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e  sqlite3_db_filen
25310 61 6d 65 28 70 44 62 2d 3e 70 52 62 75 2d 3e 64  ame(pDb->pRbu->d
25320 62 52 62 75 2c 20 22 6d 61 69 6e 22 29 3b 0a 20  bRbu, "main");. 
25330 20 20 20 20 20 20 20 20 20 20 20 7a 42 61 73 65             zBase
25340 20 3d 20 72 62 75 4d 61 69 6e 54 6f 57 61 6c 28   = rbuMainToWal(
25350 7a 42 61 73 65 2c 20 53 51 4c 49 54 45 5f 4f 50  zBase, SQLITE_OP
25360 45 4e 5f 55 52 49 29 3b 0a 20 20 20 20 20 20 20  EN_URI);.       
25370 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6e     }.          n
25380 43 6f 70 79 20 3d 20 73 74 72 6c 65 6e 28 7a 42  Copy = strlen(zB
25390 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ase);.          
253a0 7a 43 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 5f  zCopy = sqlite3_
253b0 6d 61 6c 6c 6f 63 36 34 28 6e 43 6f 70 79 2b 32  malloc64(nCopy+2
253c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
253d0 20 7a 43 6f 70 79 20 29 7b 0a 20 20 20 20 20 20   zCopy ){.      
253e0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 43 6f        memcpy(zCo
253f0 70 79 2c 20 7a 42 61 73 65 2c 20 6e 43 6f 70 79  py, zBase, nCopy
25400 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  );.            z
25410 43 6f 70 79 5b 6e 43 6f 70 79 2d 33 5d 20 3d 20  Copy[nCopy-3] = 
25420 27 6f 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20  'o';.           
25430 20 7a 43 6f 70 79 5b 6e 43 6f 70 79 5d 20 3d 20   zCopy[nCopy] = 
25440 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20  '\0';.          
25450 20 20 7a 43 6f 70 79 5b 6e 43 6f 70 79 2b 31 5d    zCopy[nCopy+1]
25460 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20   = '\0';.       
25470 20 20 20 20 20 7a 4f 70 65 6e 20 3d 20 28 63 6f       zOpen = (co
25480 6e 73 74 20 63 68 61 72 2a 29 28 70 46 64 2d 3e  nst char*)(pFd->
25490 7a 44 65 6c 20 3d 20 7a 43 6f 70 79 29 3b 0a 20  zDel = zCopy);. 
254a0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
254b0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
254c0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
254d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
254e0 20 20 20 20 20 70 46 64 2d 3e 70 52 62 75 20 3d       pFd->pRbu =
254f0 20 70 44 62 2d 3e 70 52 62 75 3b 0a 20 20 20 20   pDb->pRbu;.    
25500 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 44      }.        pD
25510 62 2d 3e 70 57 61 6c 46 64 20 3d 20 70 46 64 3b  b->pWalFd = pFd;
25520 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
25530 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 64 2d   }else{.    pFd-
25540 3e 70 52 62 75 20 3d 20 70 52 62 75 56 66 73 2d  >pRbu = pRbuVfs-
25550 3e 70 52 62 75 3b 0a 20 20 7d 0a 0a 20 20 69 66  >pRbu;.  }..  if
25560 28 20 6f 66 6c 61 67 73 20 26 20 53 51 4c 49 54  ( oflags & SQLIT
25570 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 0a  E_OPEN_MAIN_DB .
25580 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 75 72     && sqlite3_ur
25590 69 5f 62 6f 6f 6c 65 61 6e 28 7a 4e 61 6d 65 2c  i_boolean(zName,
255a0 20 22 72 62 75 5f 6d 65 6d 6f 72 79 22 2c 20 30   "rbu_memory", 0
255b0 29 20 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65  ) .  ){.    asse
255c0 72 74 28 20 6f 66 6c 61 67 73 20 26 20 53 51 4c  rt( oflags & SQL
255d0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
255e0 20 29 3b 0a 20 20 20 20 6f 66 6c 61 67 73 20 3d   );.    oflags =
255f0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45    SQLITE_OPEN_TE
25600 4d 50 5f 44 42 20 7c 20 53 51 4c 49 54 45 5f 4f  MP_DB | SQLITE_O
25610 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
25620 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
25630 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  TE |.           
25640 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
25650 58 43 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54  XCLUSIVE | SQLIT
25660 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
25670 4c 4f 53 45 3b 0a 20 20 20 20 7a 4f 70 65 6e 20  LOSE;.    zOpen 
25680 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  = 0;.  }..  if( 
25690 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
256a0 0a 20 20 20 20 72 63 20 3d 20 70 52 65 61 6c 56  .    rc = pRealV
256b0 66 73 2d 3e 78 4f 70 65 6e 28 70 52 65 61 6c 56  fs->xOpen(pRealV
256c0 66 73 2c 20 7a 4f 70 65 6e 2c 20 70 46 64 2d 3e  fs, zOpen, pFd->
256d0 70 52 65 61 6c 2c 20 6f 66 6c 61 67 73 2c 20 70  pReal, oflags, p
256e0 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 20  OutFlags);.  }. 
256f0 20 69 66 28 20 70 46 64 2d 3e 70 52 65 61 6c 2d   if( pFd->pReal-
25700 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
25710 20 2f 2a 20 54 68 65 20 78 4f 70 65 6e 28 29 20   /* The xOpen() 
25720 6f 70 65 72 61 74 69 6f 6e 20 68 61 73 20 73 75  operation has su
25730 63 63 65 65 64 65 64 2e 20 53 65 74 20 74 68 65  cceeded. Set the
25740 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2e 70 4d   sqlite3_file.pM
25750 65 74 68 6f 64 73 0a 20 20 20 20 2a 2a 20 70 6f  ethods.    ** po
25760 69 6e 74 65 72 20 61 6e 64 2c 20 69 66 20 74 68  inter and, if th
25770 65 20 66 69 6c 65 20 69 73 20 61 20 6d 61 69 6e  e file is a main
25780 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
25790 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74 68 65  link it into the
257a0 0a 20 20 20 20 2a 2a 20 6d 75 74 65 78 20 70 72  .    ** mutex pr
257b0 6f 74 65 63 74 65 64 20 6c 69 6e 6b 65 64 20 6c  otected linked l
257c0 69 73 74 20 6f 66 20 61 6c 6c 20 73 75 63 68 20  ist of all such 
257d0 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 20 20 70  files.  */.    p
257e0 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 3d  File->pMethods =
257f0 20 26 72 62 75 76 66 73 5f 69 6f 5f 6d 65 74 68   &rbuvfs_io_meth
25800 6f 64 73 3b 0a 20 20 20 20 69 66 28 20 66 6c 61  ods;.    if( fla
25810 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
25820 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20  _MAIN_DB ){.    
25830 20 20 72 62 75 4d 61 69 6e 6c 69 73 74 41 64 64    rbuMainlistAdd
25840 28 70 46 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pFd);.    }.  }
25850 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
25860 33 5f 66 72 65 65 28 70 46 64 2d 3e 7a 44 65 6c  3_free(pFd->zDel
25870 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
25880 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   rc;.}../*.** De
25890 6c 65 74 65 20 74 68 65 20 66 69 6c 65 20 6c 6f  lete the file lo
258a0 63 61 74 65 64 20 61 74 20 7a 50 61 74 68 2e 0a  cated at zPath..
258b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62  */.static int rb
258c0 75 56 66 73 44 65 6c 65 74 65 28 73 71 6c 69 74  uVfsDelete(sqlit
258d0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f  e3_vfs *pVfs, co
258e0 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
258f0 20 69 6e 74 20 64 69 72 53 79 6e 63 29 7b 0a 20   int dirSync){. 
25900 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 52   sqlite3_vfs *pR
25910 65 61 6c 56 66 73 20 3d 20 28 28 72 62 75 5f 76  ealVfs = ((rbu_v
25920 66 73 2a 29 70 56 66 73 29 2d 3e 70 52 65 61 6c  fs*)pVfs)->pReal
25930 56 66 73 3b 0a 20 20 72 65 74 75 72 6e 20 70 52  Vfs;.  return pR
25940 65 61 6c 56 66 73 2d 3e 78 44 65 6c 65 74 65 28  ealVfs->xDelete(
25950 70 52 65 61 6c 56 66 73 2c 20 7a 50 61 74 68 2c  pRealVfs, zPath,
25960 20 64 69 72 53 79 6e 63 29 3b 0a 7d 0a 0a 2f 2a   dirSync);.}../*
25970 0a 2a 2a 20 54 65 73 74 20 66 6f 72 20 61 63 63  .** Test for acc
25980 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e  ess permissions.
25990 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
259a0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70 65  the requested pe
259b0 72 6d 69 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61  rmission.** is a
259c0 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 66 61 6c  vailable, or fal
259d0 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  se otherwise..*/
259e0 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56  .static int rbuV
259f0 66 73 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69  fsAccess(.  sqli
25a00 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 0a  te3_vfs *pVfs, .
25a10 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
25a20 61 74 68 2c 20 0a 20 20 69 6e 74 20 66 6c 61 67  ath, .  int flag
25a30 73 2c 20 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f  s, .  int *pResO
25a40 75 74 0a 29 7b 0a 20 20 72 62 75 5f 76 66 73 20  ut.){.  rbu_vfs 
25a50 2a 70 52 62 75 56 66 73 20 3d 20 28 72 62 75 5f  *pRbuVfs = (rbu_
25a60 76 66 73 2a 29 70 56 66 73 3b 0a 20 20 73 71 6c  vfs*)pVfs;.  sql
25a70 69 74 65 33 5f 76 66 73 20 2a 70 52 65 61 6c 56  ite3_vfs *pRealV
25a80 66 73 20 3d 20 70 52 62 75 56 66 73 2d 3e 70 52  fs = pRbuVfs->pR
25a90 65 61 6c 56 66 73 3b 0a 20 20 69 6e 74 20 72 63  ealVfs;.  int rc
25aa0 3b 0a 0a 20 20 72 63 20 3d 20 70 52 65 61 6c 56  ;..  rc = pRealV
25ab0 66 73 2d 3e 78 41 63 63 65 73 73 28 70 52 65 61  fs->xAccess(pRea
25ac0 6c 56 66 73 2c 20 7a 50 61 74 68 2c 20 66 6c 61  lVfs, zPath, fla
25ad0 67 73 2c 20 70 52 65 73 4f 75 74 29 3b 0a 0a 20  gs, pResOut);.. 
25ae0 20 2f 2a 20 49 66 20 74 68 69 73 20 63 61 6c 6c   /* If this call
25af0 20 69 73 20 74 6f 20 63 68 65 63 6b 20 69 66 20   is to check if 
25b00 61 20 2a 2d 77 61 6c 20 66 69 6c 65 20 61 73 73  a *-wal file ass
25b10 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 6e 20  ociated with an 
25b20 52 42 55 20 74 61 72 67 65 74 0a 20 20 2a 2a 20  RBU target.  ** 
25b30 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
25b40 69 6f 6e 20 65 78 69 73 74 73 2c 20 61 6e 64 20  ion exists, and 
25b50 74 68 65 20 52 42 55 20 75 70 64 61 74 65 20 69  the RBU update i
25b60 73 20 69 6e 20 52 42 55 5f 53 54 41 47 45 5f 4f  s in RBU_STAGE_O
25b70 41 4c 2c 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c  AL,.  ** the fol
25b80 6c 6f 77 69 6e 67 20 73 70 65 63 69 61 6c 20 68  lowing special h
25b90 61 6e 64 6c 69 6e 67 20 69 73 20 61 63 74 69 76  andling is activ
25ba0 61 74 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ated:.  **.  ** 
25bb0 20 20 61 29 20 69 66 20 74 68 65 20 2a 2d 77 61    a) if the *-wa
25bc0 6c 20 66 69 6c 65 20 64 6f 65 73 20 65 78 69 73  l file does exis
25bd0 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  t, return SQLITE
25be0 5f 43 41 4e 54 4f 50 45 4e 2e 20 54 68 69 73 0a  _CANTOPEN. This.
25bf0 20 20 2a 2a 20 20 20 20 20 20 65 6e 73 75 72 65    **      ensure
25c00 73 20 74 68 61 74 20 74 68 65 20 52 42 55 20 65  s that the RBU e
25c10 78 74 65 6e 73 69 6f 6e 20 6e 65 76 65 72 20 74  xtension never t
25c20 72 69 65 73 20 74 6f 20 75 70 64 61 74 65 20 61  ries to update a
25c30 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 20   database.  **  
25c40 20 20 20 20 69 6e 20 77 61 6c 20 6d 6f 64 65 2c      in wal mode,
25c50 20 65 76 65 6e 20 69 66 20 74 68 65 20 66 69 72   even if the fir
25c60 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
25c70 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
25c80 0a 20 20 2a 2a 20 20 20 20 20 20 62 65 65 6e 20  .  **      been 
25c90 64 61 6d 61 67 65 64 2e 20 0a 20 20 2a 2a 0a 20  damaged. .  **. 
25ca0 20 2a 2a 20 20 20 62 29 20 69 66 20 74 68 65 20   **   b) if the 
25cb0 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65 73 20  *-wal file does 
25cc0 6e 6f 74 20 65 78 69 73 74 2c 20 63 6c 61 69 6d  not exist, claim
25cd0 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 61 6e   that it does an
25ce0 79 77 61 79 2c 0a 20 20 2a 2a 20 20 20 20 20 20  yway,.  **      
25cf0 63 61 75 73 69 6e 67 20 53 51 4c 69 74 65 20 74  causing SQLite t
25d00 6f 20 63 61 6c 6c 20 78 4f 70 65 6e 28 29 20 74  o call xOpen() t
25d10 6f 20 6f 70 65 6e 20 69 74 2e 20 54 68 69 73 20  o open it. This 
25d20 63 61 6c 6c 20 77 69 6c 6c 20 61 6c 73 6f 0a 20  call will also. 
25d30 20 2a 2a 20 20 20 20 20 20 62 65 20 69 6e 74 65   **      be inte
25d40 72 63 65 70 74 65 64 20 28 73 65 65 20 74 68 65  rcepted (see the
25d50 20 72 62 75 56 66 73 4f 70 65 6e 28 29 20 66 75   rbuVfsOpen() fu
25d60 6e 63 74 69 6f 6e 29 20 61 6e 64 20 74 68 65 20  nction) and the 
25d70 2a 2d 6f 61 6c 0a 20 20 2a 2a 20 20 20 20 20 20  *-oal.  **      
25d80 66 69 6c 65 20 6f 70 65 6e 65 64 20 69 6e 73 74  file opened inst
25d90 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ead..  */.  if( 
25da0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
25db0 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41   flags==SQLITE_A
25dc0 43 43 45 53 53 5f 45 58 49 53 54 53 20 29 7b 0a  CCESS_EXISTS ){.
25dd0 20 20 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 44      rbu_file *pD
25de0 62 20 3d 20 72 62 75 46 69 6e 64 4d 61 69 6e 64  b = rbuFindMaind
25df0 62 28 70 52 62 75 56 66 73 2c 20 7a 50 61 74 68  b(pRbuVfs, zPath
25e00 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70 44  , 1);.    if( pD
25e10 62 20 26 26 20 70 44 62 2d 3e 70 52 62 75 20 26  b && pDb->pRbu &
25e20 26 20 70 44 62 2d 3e 70 52 62 75 2d 3e 65 53 74  & pDb->pRbu->eSt
25e30 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f  age==RBU_STAGE_O
25e40 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  AL ){.      if( 
25e50 2a 70 52 65 73 4f 75 74 20 29 7b 0a 20 20 20 20  *pResOut ){.    
25e60 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
25e70 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 20 20  CANTOPEN;.      
25e80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
25e90 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 20  qlite3_int64 sz 
25ea0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
25eb0 3d 20 72 62 75 56 66 73 46 69 6c 65 53 69 7a 65  = rbuVfsFileSize
25ec0 28 26 70 44 62 2d 3e 62 61 73 65 2c 20 26 73 7a  (&pDb->base, &sz
25ed0 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  );.        *pRes
25ee0 4f 75 74 20 3d 20 28 73 7a 3e 30 29 3b 0a 20 20  Out = (sz>0);.  
25ef0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
25f00 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25f10 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20  ./*.** Populate 
25f20 62 75 66 66 65 72 20 7a 4f 75 74 20 77 69 74 68  buffer zOut with
25f30 20 74 68 65 20 66 75 6c 6c 20 63 61 6e 6f 6e 69   the full canoni
25f40 63 61 6c 20 70 61 74 68 6e 61 6d 65 20 63 6f 72  cal pathname cor
25f50 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f  responding.** to
25f60 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20 69 6e   the pathname in
25f70 20 7a 50 61 74 68 2e 20 7a 4f 75 74 20 69 73 20   zPath. zOut is 
25f80 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 70 6f  guaranteed to po
25f90 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 0a  int to a buffer.
25fa0 2a 2a 20 6f 66 20 61 74 20 6c 65 61 73 74 20 28  ** of at least (
25fb0 44 45 56 53 59 4d 5f 4d 41 58 5f 50 41 54 48 4e  DEVSYM_MAX_PATHN
25fc0 41 4d 45 2b 31 29 20 62 79 74 65 73 2e 0a 2a 2f  AME+1) bytes..*/
25fd0 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56  .static int rbuV
25fe0 66 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a  fsFullPathname(.
25ff0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
26000 56 66 73 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  Vfs, .  const ch
26010 61 72 20 2a 7a 50 61 74 68 2c 20 0a 20 20 69 6e  ar *zPath, .  in
26020 74 20 6e 4f 75 74 2c 20 0a 20 20 63 68 61 72 20  t nOut, .  char 
26030 2a 7a 4f 75 74 0a 29 7b 0a 20 20 73 71 6c 69 74  *zOut.){.  sqlit
26040 65 33 5f 76 66 73 20 2a 70 52 65 61 6c 56 66 73  e3_vfs *pRealVfs
26050 20 3d 20 28 28 72 62 75 5f 76 66 73 2a 29 70 56   = ((rbu_vfs*)pV
26060 66 73 29 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20  fs)->pRealVfs;. 
26070 20 72 65 74 75 72 6e 20 70 52 65 61 6c 56 66 73   return pRealVfs
26080 2d 3e 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  ->xFullPathname(
26090 70 52 65 61 6c 56 66 73 2c 20 7a 50 61 74 68 2c  pRealVfs, zPath,
260a0 20 6e 4f 75 74 2c 20 7a 4f 75 74 29 3b 0a 7d 0a   nOut, zOut);.}.
260b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
260c0 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
260d0 49 4f 4e 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74  ION./*.** Open t
260e0 68 65 20 64 79 6e 61 6d 69 63 20 6c 69 62 72 61  he dynamic libra
260f0 72 79 20 6c 6f 63 61 74 65 64 20 61 74 20 7a 50  ry located at zP
26100 61 74 68 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ath and return a
26110 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74   handle..*/.stat
26120 69 63 20 76 6f 69 64 20 2a 72 62 75 56 66 73 44  ic void *rbuVfsD
26130 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66  lOpen(sqlite3_vf
26140 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20 63  s *pVfs, const c
26150 68 61 72 20 2a 7a 50 61 74 68 29 7b 0a 20 20 73  har *zPath){.  s
26160 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65 61  qlite3_vfs *pRea
26170 6c 56 66 73 20 3d 20 28 28 72 62 75 5f 76 66 73  lVfs = ((rbu_vfs
26180 2a 29 70 56 66 73 29 2d 3e 70 52 65 61 6c 56 66  *)pVfs)->pRealVf
26190 73 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 61  s;.  return pRea
261a0 6c 56 66 73 2d 3e 78 44 6c 4f 70 65 6e 28 70 52  lVfs->xDlOpen(pR
261b0 65 61 6c 56 66 73 2c 20 7a 50 61 74 68 29 3b 0a  ealVfs, zPath);.
261c0 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74  }../*.** Populat
261d0 65 20 74 68 65 20 62 75 66 66 65 72 20 7a 45 72  e the buffer zEr
261e0 72 4d 73 67 20 28 73 69 7a 65 20 6e 42 79 74 65  rMsg (size nByte
261f0 20 62 79 74 65 73 29 20 77 69 74 68 20 61 20 68   bytes) with a h
26200 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 0a 2a 2a  uman readable.**
26210 20 75 74 66 2d 38 20 73 74 72 69 6e 67 20 64 65   utf-8 string de
26220 73 63 72 69 62 69 6e 67 20 74 68 65 20 6d 6f 73  scribing the mos
26230 74 20 72 65 63 65 6e 74 20 65 72 72 6f 72 20 65  t recent error e
26240 6e 63 6f 75 6e 74 65 72 65 64 20 61 73 73 6f 63  ncountered assoc
26250 69 61 74 65 64 20 0a 2a 2a 20 77 69 74 68 20 64  iated .** with d
26260 79 6e 61 6d 69 63 20 6c 69 62 72 61 72 69 65 73  ynamic libraries
26270 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
26280 20 72 62 75 56 66 73 44 6c 45 72 72 6f 72 28 73   rbuVfsDlError(s
26290 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
262a0 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 63 68 61  , int nByte, cha
262b0 72 20 2a 7a 45 72 72 4d 73 67 29 7b 0a 20 20 73  r *zErrMsg){.  s
262c0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65 61  qlite3_vfs *pRea
262d0 6c 56 66 73 20 3d 20 28 28 72 62 75 5f 76 66 73  lVfs = ((rbu_vfs
262e0 2a 29 70 56 66 73 29 2d 3e 70 52 65 61 6c 56 66  *)pVfs)->pRealVf
262f0 73 3b 0a 20 20 70 52 65 61 6c 56 66 73 2d 3e 78  s;.  pRealVfs->x
26300 44 6c 45 72 72 6f 72 28 70 52 65 61 6c 56 66 73  DlError(pRealVfs
26310 2c 20 6e 42 79 74 65 2c 20 7a 45 72 72 4d 73 67  , nByte, zErrMsg
26320 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
26330 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
26340 74 68 65 20 73 79 6d 62 6f 6c 20 7a 53 79 6d 62  the symbol zSymb
26350 6f 6c 20 69 6e 20 74 68 65 20 64 79 6e 61 6d 69  ol in the dynami
26360 63 20 6c 69 62 72 61 72 79 20 70 48 61 6e 64 6c  c library pHandl
26370 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
26380 64 20 28 2a 72 62 75 56 66 73 44 6c 53 79 6d 28  d (*rbuVfsDlSym(
26390 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
263a0 70 56 66 73 2c 20 0a 20 20 76 6f 69 64 20 2a 70  pVfs, .  void *p
263b0 41 72 67 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  Arg, .  const ch
263c0 61 72 20 2a 7a 53 79 6d 0a 29 29 28 76 6f 69 64  ar *zSym.))(void
263d0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
263e0 20 2a 70 52 65 61 6c 56 66 73 20 3d 20 28 28 72   *pRealVfs = ((r
263f0 62 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e 70  bu_vfs*)pVfs)->p
26400 52 65 61 6c 56 66 73 3b 0a 20 20 72 65 74 75 72  RealVfs;.  retur
26410 6e 20 70 52 65 61 6c 56 66 73 2d 3e 78 44 6c 53  n pRealVfs->xDlS
26420 79 6d 28 70 52 65 61 6c 56 66 73 2c 20 70 41 72  ym(pRealVfs, pAr
26430 67 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 0a 2f 2a 0a  g, zSym);.}../*.
26440 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 64 79 6e  ** Close the dyn
26450 61 6d 69 63 20 6c 69 62 72 61 72 79 20 68 61 6e  amic library han
26460 64 6c 65 20 70 48 61 6e 64 6c 65 2e 0a 2a 2f 0a  dle pHandle..*/.
26470 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 56  static void rbuV
26480 66 73 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65  fsDlClose(sqlite
26490 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69  3_vfs *pVfs, voi
264a0 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 73  d *pHandle){.  s
264b0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65 61  qlite3_vfs *pRea
264c0 6c 56 66 73 20 3d 20 28 28 72 62 75 5f 76 66 73  lVfs = ((rbu_vfs
264d0 2a 29 70 56 66 73 29 2d 3e 70 52 65 61 6c 56 66  *)pVfs)->pRealVf
264e0 73 3b 0a 20 20 70 52 65 61 6c 56 66 73 2d 3e 78  s;.  pRealVfs->x
264f0 44 6c 43 6c 6f 73 65 28 70 52 65 61 6c 56 66 73  DlClose(pRealVfs
26500 2c 20 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65  , pHandle);.}.#e
26510 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
26520 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
26530 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70  ON */../*.** Pop
26540 75 6c 61 74 65 20 74 68 65 20 62 75 66 66 65 72  ulate the buffer
26550 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
26560 42 75 66 4f 75 74 20 77 69 74 68 20 6e 42 79 74  BufOut with nByt
26570 65 20 62 79 74 65 73 20 6f 66 20 0a 2a 2a 20 72  e bytes of .** r
26580 61 6e 64 6f 6d 20 64 61 74 61 2e 0a 2a 2f 0a 73  andom data..*/.s
26590 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66 73  tatic int rbuVfs
265a0 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74  Randomness(sqlit
265b0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
265c0 74 20 6e 42 79 74 65 2c 20 63 68 61 72 20 2a 7a  t nByte, char *z
265d0 42 75 66 4f 75 74 29 7b 0a 20 20 73 71 6c 69 74  BufOut){.  sqlit
265e0 65 33 5f 76 66 73 20 2a 70 52 65 61 6c 56 66 73  e3_vfs *pRealVfs
265f0 20 3d 20 28 28 72 62 75 5f 76 66 73 2a 29 70 56   = ((rbu_vfs*)pV
26600 66 73 29 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20  fs)->pRealVfs;. 
26610 20 72 65 74 75 72 6e 20 70 52 65 61 6c 56 66 73   return pRealVfs
26620 2d 3e 78 52 61 6e 64 6f 6d 6e 65 73 73 28 70 52  ->xRandomness(pR
26630 65 61 6c 56 66 73 2c 20 6e 42 79 74 65 2c 20 7a  ealVfs, nByte, z
26640 42 75 66 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  BufOut);.}../*.*
26650 2a 20 53 6c 65 65 70 20 66 6f 72 20 6e 4d 69 63  * Sleep for nMic
26660 72 6f 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2e  ro microseconds.
26670 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
26680 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e  er of microsecon
26690 64 73 20 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20  ds .** actually 
266a0 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  slept..*/.static
266b0 20 69 6e 74 20 72 62 75 56 66 73 53 6c 65 65 70   int rbuVfsSleep
266c0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
266d0 66 73 2c 20 69 6e 74 20 6e 4d 69 63 72 6f 29 7b  fs, int nMicro){
266e0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
266f0 70 52 65 61 6c 56 66 73 20 3d 20 28 28 72 62 75  pRealVfs = ((rbu
26700 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e 70 52 65  _vfs*)pVfs)->pRe
26710 61 6c 56 66 73 3b 0a 20 20 72 65 74 75 72 6e 20  alVfs;.  return 
26720 70 52 65 61 6c 56 66 73 2d 3e 78 53 6c 65 65 70  pRealVfs->xSleep
26730 28 70 52 65 61 6c 56 66 73 2c 20 6e 4d 69 63 72  (pRealVfs, nMicr
26740 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  o);.}../*.** Ret
26750 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  urn the current 
26760 74 69 6d 65 20 61 73 20 61 20 4a 75 6c 69 61 6e  time as a Julian
26770 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 20 2a   Day number in *
26780 70 54 69 6d 65 4f 75 74 2e 0a 2a 2f 0a 73 74 61  pTimeOut..*/.sta
26790 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 43 75  tic int rbuVfsCu
267a0 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65  rrentTime(sqlite
267b0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 64 6f 75  3_vfs *pVfs, dou
267c0 62 6c 65 20 2a 70 54 69 6d 65 4f 75 74 29 7b 0a  ble *pTimeOut){.
267d0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
267e0 52 65 61 6c 56 66 73 20 3d 20 28 28 72 62 75 5f  RealVfs = ((rbu_
267f0 76 66 73 2a 29 70 56 66 73 29 2d 3e 70 52 65 61  vfs*)pVfs)->pRea
26800 6c 56 66 73 3b 0a 20 20 72 65 74 75 72 6e 20 70  lVfs;.  return p
26810 52 65 61 6c 56 66 73 2d 3e 78 43 75 72 72 65 6e  RealVfs->xCurren
26820 74 54 69 6d 65 28 70 52 65 61 6c 56 66 73 2c 20  tTime(pRealVfs, 
26830 70 54 69 6d 65 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a  pTimeOut);.}../*
26840 0a 2a 2a 20 4e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  .** No-op..*/.st
26850 61 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 47  atic int rbuVfsG
26860 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69  etLastError(sqli
26870 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
26880 6e 74 20 61 2c 20 63 68 61 72 20 2a 62 29 7b 0a  nt a, char *b){.
26890 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
268a0 2a 0a 2a 2a 20 44 65 72 65 67 69 73 74 65 72 20  *.** Deregister 
268b0 61 6e 64 20 64 65 73 74 72 6f 79 20 61 6e 20 52  and destroy an R
268c0 42 55 20 76 66 73 20 63 72 65 61 74 65 64 20 62  BU vfs created b
268d0 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c  y an earlier cal
268e0 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 72  l to.** sqlite3r
268f0 62 75 5f 63 72 65 61 74 65 5f 76 66 73 28 29 2e  bu_create_vfs().
26900 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
26910 72 62 75 5f 64 65 73 74 72 6f 79 5f 76 66 73 28  rbu_destroy_vfs(
26920 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
26930 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  e){.  sqlite3_vf
26940 73 20 2a 70 56 66 73 20 3d 20 73 71 6c 69 74 65  s *pVfs = sqlite
26950 33 5f 76 66 73 5f 66 69 6e 64 28 7a 4e 61 6d 65  3_vfs_find(zName
26960 29 3b 0a 20 20 69 66 28 20 70 56 66 73 20 26 26  );.  if( pVfs &&
26970 20 70 56 66 73 2d 3e 78 4f 70 65 6e 3d 3d 72 62   pVfs->xOpen==rb
26980 75 56 66 73 4f 70 65 6e 20 29 7b 0a 20 20 20 20  uVfsOpen ){.    
26990 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
269a0 65 65 28 28 28 72 62 75 5f 76 66 73 2a 29 70 56  ee(((rbu_vfs*)pV
269b0 66 73 29 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  fs)->mutex);.   
269c0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72   sqlite3_vfs_unr
269d0 65 67 69 73 74 65 72 28 70 56 66 73 29 3b 0a 20  egister(pVfs);. 
269e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
269f0 70 56 66 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pVfs);.  }.}../*
26a00 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e 20 52 42  .** Create an RB
26a10 55 20 56 46 53 20 6e 61 6d 65 64 20 7a 4e 61 6d  U VFS named zNam
26a20 65 20 74 68 61 74 20 61 63 63 65 73 73 65 73 20  e that accesses 
26a30 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 66  the underlying f
26a40 69 6c 65 2d 73 79 73 74 65 6d 0a 2a 2a 20 76 69  ile-system.** vi
26a50 61 20 65 78 69 73 74 69 6e 67 20 56 46 53 20 7a  a existing VFS z
26a60 50 61 72 65 6e 74 2e 20 54 68 65 20 6e 65 77 20  Parent. The new 
26a70 6f 62 6a 65 63 74 20 69 73 20 72 65 67 69 73 74  object is regist
26a80 65 72 65 64 20 61 73 20 61 20 6e 6f 6e 2d 64 65  ered as a non-de
26a90 66 61 75 6c 74 0a 2a 2a 20 56 46 53 20 77 69 74  fault.** VFS wit
26aa0 68 20 53 51 4c 69 74 65 20 62 65 66 6f 72 65 20  h SQLite before 
26ab0 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e  returning..*/.in
26ac0 74 20 73 71 6c 69 74 65 33 72 62 75 5f 63 72 65  t sqlite3rbu_cre
26ad0 61 74 65 5f 76 66 73 28 63 6f 6e 73 74 20 63 68  ate_vfs(const ch
26ae0 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74  ar *zName, const
26af0 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 29 7b   char *zParent){
26b00 0a 0a 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20  ..  /* Template 
26b10 66 6f 72 20 56 46 53 20 2a 2f 0a 20 20 73 74 61  for VFS */.  sta
26b20 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20  tic sqlite3_vfs 
26b30 76 66 73 5f 74 65 6d 70 6c 61 74 65 20 3d 20 7b  vfs_template = {
26b40 0a 20 20 20 20 31 2c 20 20 20 20 20 20 20 20 20  .    1,         
26b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b60 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
26b70 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  /.    0,        
26b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b90 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20      /* szOsFile 
26ba0 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20  */.    0,       
26bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26bc0 20 20 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e 61       /* mxPathna
26bd0 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20  me */.    0,    
26be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26bf0 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74          /* pNext
26c00 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20   */.    0,      
26c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a        /* zName *
26c30 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  /.    0,        
26c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c50 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20      /* pAppData 
26c60 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 4f 70 65  */.    rbuVfsOpe
26c70 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
26c80 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f       /* xOpen */
26c90 0a 20 20 20 20 72 62 75 56 66 73 44 65 6c 65 74  .    rbuVfsDelet
26ca0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
26cb0 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f     /* xDelete */
26cc0 0a 20 20 20 20 72 62 75 56 66 73 41 63 63 65 73  .    rbuVfsAcces
26cd0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
26ce0 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f     /* xAccess */
26cf0 0a 20 20 20 20 72 62 75 56 66 73 46 75 6c 6c 50  .    rbuVfsFullP
26d00 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 20 20 20  athname,        
26d10 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e     /* xFullPathn
26d20 61 6d 65 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ame */..#ifndef 
26d30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
26d40 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 72  _EXTENSION.    r
26d50 62 75 56 66 73 44 6c 4f 70 65 6e 2c 20 20 20 20  buVfsDlOpen,    
26d60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26d70 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 72  xDlOpen */.    r
26d80 62 75 56 66 73 44 6c 45 72 72 6f 72 2c 20 20 20  buVfsDlError,   
26d90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26da0 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20  xDlError */.    
26db0 72 62 75 56 66 73 44 6c 53 79 6d 2c 20 20 20 20  rbuVfsDlSym,    
26dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26dd0 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 72   xDlSym */.    r
26de0 62 75 56 66 73 44 6c 43 6c 6f 73 65 2c 20 20 20  buVfsDlClose,   
26df0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26e00 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 23 65 6c 73  xDlClose */.#els
26e10 65 0a 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30  e.    0, 0, 0, 0
26e20 2c 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 72 62  ,.#endif..    rb
26e30 75 56 66 73 52 61 6e 64 6f 6d 6e 65 73 73 2c 20  uVfsRandomness, 
26e40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
26e50 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20  Randomness */.  
26e60 20 20 72 62 75 56 66 73 53 6c 65 65 70 2c 20 20    rbuVfsSleep,  
26e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e80 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20  /* xSleep */.   
26e90 20 72 62 75 56 66 73 43 75 72 72 65 6e 74 54 69   rbuVfsCurrentTi
26ea0 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  me,            /
26eb0 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a  * xCurrentTime *
26ec0 2f 0a 20 20 20 20 72 62 75 56 66 73 47 65 74 4c  /.    rbuVfsGetL
26ed0 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 20 20  astError,       
26ee0 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45      /* xGetLastE
26ef0 72 72 6f 72 20 2a 2f 0a 20 20 20 20 30 2c 20 20  rror */.    0,  
26f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 75            /* xCu
26f20 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 28  rrentTimeInt64 (
26f30 76 65 72 73 69 6f 6e 20 32 29 20 2a 2f 0a 20 20  version 2) */.  
26f40 20 20 30 2c 20 30 2c 20 30 20 20 20 20 20 20 20    0, 0, 0       
26f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f60 2f 2a 20 55 6e 69 6d 70 6c 65 6d 65 6e 74 65 64  /* Unimplemented
26f70 20 76 65 72 73 69 6f 6e 20 33 20 6d 65 74 68 6f   version 3 metho
26f80 64 73 20 2a 2f 0a 20 20 7d 3b 0a 0a 20 20 72 62  ds */.  };..  rb
26f90 75 5f 76 66 73 20 2a 70 4e 65 77 20 3d 20 30 3b  u_vfs *pNew = 0;
26fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26fb0 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64   Newly allocated
26fc0 20 56 46 53 20 2a 2f 0a 20 20 69 6e 74 20 72 63   VFS */.  int rc
26fd0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
26fe0 73 69 7a 65 5f 74 20 6e 4e 61 6d 65 3b 0a 20 20  size_t nName;.  
26ff0 73 69 7a 65 5f 74 20 6e 42 79 74 65 3b 0a 0a 20  size_t nByte;.. 
27000 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28   nName = strlen(
27010 7a 4e 61 6d 65 29 3b 0a 20 20 6e 42 79 74 65 20  zName);.  nByte 
27020 3d 20 73 69 7a 65 6f 66 28 72 62 75 5f 76 66 73  = sizeof(rbu_vfs
27030 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 3b 0a 20  ) + nName + 1;. 
27040 20 70 4e 65 77 20 3d 20 28 72 62 75 5f 76 66 73   pNew = (rbu_vfs
27050 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
27060 36 34 28 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  64(nByte);.  if(
27070 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
27080 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
27090 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  M;.  }else{.    
270a0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 50 61  sqlite3_vfs *pPa
270b0 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  rent;           
270c0 2f 2a 20 50 61 72 65 6e 74 20 56 46 53 20 2a 2f  /* Parent VFS */
270d0 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65 77  .    memset(pNew
270e0 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  , 0, nByte);.   
270f0 20 70 50 61 72 65 6e 74 20 3d 20 73 71 6c 69 74   pParent = sqlit
27100 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a 50 61 72  e3_vfs_find(zPar
27110 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ent);.    if( pP
27120 61 72 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  arent==0 ){.    
27130 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
27140 54 46 4f 55 4e 44 3b 0a 20 20 20 20 7d 65 6c 73  TFOUND;.    }els
27150 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  e{.      char *z
27160 53 70 61 63 65 3b 0a 20 20 20 20 20 20 6d 65 6d  Space;.      mem
27170 63 70 79 28 26 70 4e 65 77 2d 3e 62 61 73 65 2c  cpy(&pNew->base,
27180 20 26 76 66 73 5f 74 65 6d 70 6c 61 74 65 2c 20   &vfs_template, 
27190 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 76  sizeof(sqlite3_v
271a0 66 73 29 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  fs));.      pNew
271b0 2d 3e 62 61 73 65 2e 6d 78 50 61 74 68 6e 61 6d  ->base.mxPathnam
271c0 65 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6d 78 50  e = pParent->mxP
271d0 61 74 68 6e 61 6d 65 3b 0a 20 20 20 20 20 20 70  athname;.      p
271e0 4e 65 77 2d 3e 62 61 73 65 2e 73 7a 4f 73 46 69  New->base.szOsFi
271f0 6c 65 20 3d 20 73 69 7a 65 6f 66 28 72 62 75 5f  le = sizeof(rbu_
27200 66 69 6c 65 29 20 2b 20 70 50 61 72 65 6e 74 2d  file) + pParent-
27210 3e 73 7a 4f 73 46 69 6c 65 3b 0a 20 20 20 20 20  >szOsFile;.     
27220 20 70 4e 65 77 2d 3e 70 52 65 61 6c 56 66 73 20   pNew->pRealVfs 
27230 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 20  = pParent;.     
27240 20 70 4e 65 77 2d 3e 62 61 73 65 2e 7a 4e 61 6d   pNew->base.zNam
27250 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  e = (const char*
27260 29 28 7a 53 70 61 63 65 20 3d 20 28 63 68 61 72  )(zSpace = (char
27270 2a 29 26 70 4e 65 77 5b 31 5d 29 3b 0a 20 20 20  *)&pNew[1]);.   
27280 20 20 20 6d 65 6d 63 70 79 28 7a 53 70 61 63 65     memcpy(zSpace
27290 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b  , zName, nName);
272a0 0a 0a 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63  ..      /* Alloc
272b0 61 74 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e  ate the mutex an
272c0 64 20 72 65 67 69 73 74 65 72 20 74 68 65 20 6e  d register the n
272d0 65 77 20 56 46 53 20 28 6e 6f 74 20 61 73 20 74  ew VFS (not as t
272e0 68 65 20 64 65 66 61 75 6c 74 29 20 2a 2f 0a 20  he default) */. 
272f0 20 20 20 20 20 70 4e 65 77 2d 3e 6d 75 74 65 78       pNew->mutex
27300 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78   = sqlite3_mutex
27310 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  _alloc(SQLITE_MU
27320 54 45 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a  TEX_RECURSIVE);.
27330 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e        if( pNew->
27340 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  mutex==0 ){.    
27350 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
27360 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c  NOMEM;.      }el
27370 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
27380 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
27390 69 73 74 65 72 28 26 70 4e 65 77 2d 3e 62 61 73  ister(&pNew->bas
273a0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  e, 0);.      }. 
273b0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
273c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
273d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
273e0 65 78 5f 66 72 65 65 28 70 4e 65 77 2d 3e 6d 75  ex_free(pNew->mu
273f0 74 65 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tex);.      sqli
27400 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a  te3_free(pNew);.
27410 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
27420 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
27430 20 43 6f 6e 66 69 67 75 72 65 20 74 68 65 20 61   Configure the a
27440 67 67 72 65 67 61 74 65 20 74 65 6d 70 20 66 69  ggregate temp fi
27450 6c 65 20 73 69 7a 65 20 6c 69 6d 69 74 20 66 6f  le size limit fo
27460 72 20 74 68 69 73 20 52 42 55 20 68 61 6e 64 6c  r this RBU handl
27470 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e  e..*/.sqlite3_in
27480 74 36 34 20 73 71 6c 69 74 65 33 72 62 75 5f 74  t64 sqlite3rbu_t
27490 65 6d 70 5f 73 69 7a 65 5f 6c 69 6d 69 74 28 73  emp_size_limit(s
274a0 71 6c 69 74 65 33 72 62 75 20 2a 70 52 62 75 2c  qlite3rbu *pRbu,
274b0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
274c0 29 7b 0a 20 20 69 66 28 20 6e 3e 3d 30 20 29 7b  ){.  if( n>=0 ){
274d0 0a 20 20 20 20 70 52 62 75 2d 3e 73 7a 54 65 6d  .    pRbu->szTem
274e0 70 4c 69 6d 69 74 20 3d 20 6e 3b 0a 20 20 7d 0a  pLimit = n;.  }.
274f0 20 20 72 65 74 75 72 6e 20 70 52 62 75 2d 3e 73    return pRbu->s
27500 7a 54 65 6d 70 4c 69 6d 69 74 3b 0a 7d 0a 0a 73  zTempLimit;.}..s
27510 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c  qlite3_int64 sql
27520 69 74 65 33 72 62 75 5f 74 65 6d 70 5f 73 69 7a  ite3rbu_temp_siz
27530 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 52  e(sqlite3rbu *pR
27540 62 75 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 52  bu){.  return pR
27550 62 75 2d 3e 73 7a 54 65 6d 70 3b 0a 7d 0a 0a 0a  bu->szTemp;.}...
27560 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
27570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
275a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 65  ***********/..#e
275b0 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
275c0 28 53 51 4c 49 54 45 5f 43 4f 52 45 29 20 7c 7c  (SQLITE_CORE) ||
275d0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
275e0 45 4e 41 42 4c 45 5f 52 42 55 29 20 2a 2f 0a     ENABLE_RBU) */.