/ Hex Artifact Content
Login

Artifact 4eea923892ab12d4dc34652bc2cab624053ec7aa234efbb8e3098dd7e7195c46:


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 2f 0a 23 64 65 66 69 6e 65 20  ile..*/.#define 
17f0: 52 42 55 5f 53 54 41 54 45 5f 53 54 41 47 45 20  RBU_STATE_STAGE 
1800: 20 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65         1.#define
1810: 20 52 42 55 5f 53 54 41 54 45 5f 54 42 4c 20 20   RBU_STATE_TBL  
1820: 20 20 20 20 20 20 20 20 32 0a 23 64 65 66 69 6e          2.#defin
1830: 65 20 52 42 55 5f 53 54 41 54 45 5f 49 44 58 20  e RBU_STATE_IDX 
1840: 20 20 20 20 20 20 20 20 20 33 0a 23 64 65 66 69           3.#defi
1850: 6e 65 20 52 42 55 5f 53 54 41 54 45 5f 52 4f 57  ne RBU_STATE_ROW
1860: 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65 66            4.#def
1870: 69 6e 65 20 52 42 55 5f 53 54 41 54 45 5f 50 52  ine RBU_STATE_PR
1880: 4f 47 52 45 53 53 20 20 20 20 20 35 0a 23 64 65  OGRESS     5.#de
1890: 66 69 6e 65 20 52 42 55 5f 53 54 41 54 45 5f 43  fine RBU_STATE_C
18a0: 4b 50 54 20 20 20 20 20 20 20 20 20 36 0a 23 64  KPT         6.#d
18b0: 65 66 69 6e 65 20 52 42 55 5f 53 54 41 54 45 5f  efine RBU_STATE_
18c0: 43 4f 4f 4b 49 45 20 20 20 20 20 20 20 37 0a 23  COOKIE       7.#
18d0: 64 65 66 69 6e 65 20 52 42 55 5f 53 54 41 54 45  define RBU_STATE
18e0: 5f 4f 41 4c 53 5a 20 20 20 20 20 20 20 20 38 0a  _OALSZ        8.
18f0: 23 64 65 66 69 6e 65 20 52 42 55 5f 53 54 41 54  #define RBU_STAT
1900: 45 5f 50 48 41 53 45 4f 4e 45 53 54 45 50 20 39  E_PHASEONESTEP 9
1910: 0a 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53 54  ..#define RBU_ST
1920: 41 47 45 5f 4f 41 4c 20 20 20 20 20 20 20 20 20  AGE_OAL         
1930: 31 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53 54  1.#define RBU_ST
1940: 41 47 45 5f 4d 4f 56 45 20 20 20 20 20 20 20 20  AGE_MOVE        
1950: 32 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53 54  2.#define RBU_ST
1960: 41 47 45 5f 43 41 50 54 55 52 45 20 20 20 20 20  AGE_CAPTURE     
1970: 33 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53 54  3.#define RBU_ST
1980: 41 47 45 5f 43 4b 50 54 20 20 20 20 20 20 20 20  AGE_CKPT        
1990: 34 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53 54  4.#define RBU_ST
19a0: 41 47 45 5f 44 4f 4e 45 20 20 20 20 20 20 20 20  AGE_DONE        
19b0: 35 0a 0a 0a 23 64 65 66 69 6e 65 20 52 42 55 5f  5...#define RBU_
19c0: 43 52 45 41 54 45 5f 53 54 41 54 45 20 5c 0a 20  CREATE_STATE \. 
19d0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49   "CREATE TABLE I
19e0: 46 20 4e 4f 54 20 45 58 49 53 54 53 20 25 73 2e  F NOT EXISTS %s.
19f0: 72 62 75 5f 73 74 61 74 65 28 6b 20 49 4e 54 45  rbu_state(k INTE
1a00: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
1a10: 20 76 29 22 0a 0a 74 79 70 65 64 65 66 20 73 74   v)"..typedef st
1a20: 72 75 63 74 20 52 62 75 46 72 61 6d 65 20 52 62  ruct RbuFrame Rb
1a30: 75 46 72 61 6d 65 3b 0a 74 79 70 65 64 65 66 20  uFrame;.typedef 
1a40: 73 74 72 75 63 74 20 52 62 75 4f 62 6a 49 74 65  struct RbuObjIte
1a50: 72 20 52 62 75 4f 62 6a 49 74 65 72 3b 0a 74 79  r RbuObjIter;.ty
1a60: 70 65 64 65 66 20 73 74 72 75 63 74 20 52 62 75  pedef struct Rbu
1a70: 53 74 61 74 65 20 52 62 75 53 74 61 74 65 3b 0a  State RbuState;.
1a80: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 72  typedef struct r
1a90: 62 75 5f 76 66 73 20 72 62 75 5f 76 66 73 3b 0a  bu_vfs rbu_vfs;.
1aa0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 72  typedef struct r
1ab0: 62 75 5f 66 69 6c 65 20 72 62 75 5f 66 69 6c 65  bu_file rbu_file
1ac0: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
1ad0: 20 52 62 75 55 70 64 61 74 65 53 74 6d 74 20 52   RbuUpdateStmt R
1ae0: 62 75 55 70 64 61 74 65 53 74 6d 74 3b 0a 0a 23  buUpdateStmt;..#
1af0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
1b00: 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 29  TE_AMALGAMATION)
1b10: 0a 74 79 70 65 64 65 66 20 75 6e 73 69 67 6e 65  .typedef unsigne
1b20: 64 20 69 6e 74 20 75 33 32 3b 0a 74 79 70 65 64  d int u32;.typed
1b30: 65 66 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72  ef unsigned shor
1b40: 74 20 75 31 36 3b 0a 74 79 70 65 64 65 66 20 75  t u16;.typedef u
1b50: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 75 38 3b  nsigned char u8;
1b60: 0a 74 79 70 65 64 65 66 20 73 71 6c 69 74 65 33  .typedef sqlite3
1b70: 5f 69 6e 74 36 34 20 69 36 34 3b 0a 23 65 6e 64  _int64 i64;.#end
1b80: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  if../*.** These 
1b90: 76 61 6c 75 65 73 20 6d 75 73 74 20 6d 61 74 63  values must matc
1ba0: 68 20 74 68 65 20 76 61 6c 75 65 73 20 64 65 66  h the values def
1bb0: 69 6e 65 64 20 69 6e 20 77 61 6c 2e 63 20 66 6f  ined in wal.c fo
1bc0: 72 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  r the equivalent
1bd0: 0a 2a 2a 20 6c 6f 63 6b 73 2e 20 54 68 65 73 65  .** locks. These
1be0: 20 61 72 65 20 6e 6f 74 20 6d 61 67 69 63 20 6e   are not magic n
1bf0: 75 6d 62 65 72 73 20 61 73 20 74 68 65 79 20 61  umbers as they a
1c00: 72 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 53  re part of the S
1c10: 51 4c 69 74 65 20 66 69 6c 65 0a 2a 2a 20 66 6f  QLite file.** fo
1c20: 72 6d 61 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  rmat..*/.#define
1c30: 20 57 41 4c 5f 4c 4f 43 4b 5f 57 52 49 54 45 20   WAL_LOCK_WRITE 
1c40: 20 30 0a 23 64 65 66 69 6e 65 20 57 41 4c 5f 4c   0.#define WAL_L
1c50: 4f 43 4b 5f 43 4b 50 54 20 20 20 31 0a 23 64 65  OCK_CKPT   1.#de
1c60: 66 69 6e 65 20 57 41 4c 5f 4c 4f 43 4b 5f 52 45  fine WAL_LOCK_RE
1c70: 41 44 30 20 20 33 0a 0a 23 64 65 66 69 6e 65 20  AD0  3..#define 
1c80: 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 42 55  SQLITE_FCNTL_RBU
1c90: 43 4e 54 20 20 20 20 35 31 34 39 32 31 36 0a 0a  CNT    5149216..
1ca0: 2f 2a 0a 2a 2a 20 41 20 73 74 72 75 63 74 75 72  /*.** A structur
1cb0: 65 20 74 6f 20 73 74 6f 72 65 20 76 61 6c 75 65  e to store value
1cc0: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
1cd0: 72 62 75 5f 73 74 61 74 65 20 74 61 62 6c 65 20  rbu_state table 
1ce0: 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  in memory..*/.st
1cf0: 72 75 63 74 20 52 62 75 53 74 61 74 65 20 7b 0a  ruct RbuState {.
1d00: 20 20 69 6e 74 20 65 53 74 61 67 65 3b 0a 20 20    int eStage;.  
1d10: 63 68 61 72 20 2a 7a 54 62 6c 3b 0a 20 20 63 68  char *zTbl;.  ch
1d20: 61 72 20 2a 7a 49 64 78 3b 0a 20 20 69 36 34 20  ar *zIdx;.  i64 
1d30: 69 57 61 6c 43 6b 73 75 6d 3b 0a 20 20 69 6e 74  iWalCksum;.  int
1d40: 20 6e 52 6f 77 3b 0a 20 20 69 36 34 20 6e 50 72   nRow;.  i64 nPr
1d50: 6f 67 72 65 73 73 3b 0a 20 20 75 33 32 20 69 43  ogress;.  u32 iC
1d60: 6f 6f 6b 69 65 3b 0a 20 20 69 36 34 20 69 4f 61  ookie;.  i64 iOa
1d70: 6c 53 7a 3b 0a 20 20 69 36 34 20 6e 50 68 61 73  lSz;.  i64 nPhas
1d80: 65 4f 6e 65 53 74 65 70 3b 0a 7d 3b 0a 0a 73 74  eOneStep;.};..st
1d90: 72 75 63 74 20 52 62 75 55 70 64 61 74 65 53 74  ruct RbuUpdateSt
1da0: 6d 74 20 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 61  mt {.  char *zMa
1db0: 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
1dc0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f         /* Copy o
1dd0: 66 20 75 70 64 61 74 65 20 6d 61 73 6b 20 75 73  f update mask us
1de0: 65 64 20 77 69 74 68 20 70 55 70 64 61 74 65 20  ed with pUpdate 
1df0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
1e00: 74 20 2a 70 55 70 64 61 74 65 3b 20 20 20 20 20  t *pUpdate;     
1e10: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 75 70 64       /* Last upd
1e20: 61 74 65 20 73 74 61 74 65 6d 65 6e 74 20 28 6f  ate statement (o
1e30: 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 52 62 75  r NULL) */.  Rbu
1e40: 55 70 64 61 74 65 53 74 6d 74 20 2a 70 4e 65 78  UpdateStmt *pNex
1e50: 74 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  t;.};../*.** An 
1e60: 69 74 65 72 61 74 6f 72 20 6f 66 20 74 68 69 73  iterator of this
1e70: 20 74 79 70 65 20 69 73 20 75 73 65 64 20 74 6f   type is used to
1e80: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
1e90: 20 61 6c 6c 20 6f 62 6a 65 63 74 73 20 69 6e 0a   all objects in.
1ea0: 2a 2a 20 74 68 65 20 74 61 72 67 65 74 20 64 61  ** the target da
1eb0: 74 61 62 61 73 65 20 74 68 61 74 20 72 65 71 75  tabase that requ
1ec0: 69 72 65 20 75 70 64 61 74 69 6e 67 2e 20 46 6f  ire updating. Fo
1ed0: 72 20 65 61 63 68 20 73 75 63 68 20 74 61 62 6c  r each such tabl
1ee0: 65 2c 20 74 68 65 0a 2a 2a 20 69 74 65 72 61 74  e, the.** iterat
1ef0: 6f 72 20 76 69 73 69 74 73 2c 20 69 6e 20 6f 72  or visits, in or
1f00: 64 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  der:.**.**     *
1f10: 20 74 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c   the table itsel
1f20: 66 2c 20 0a 2a 2a 20 20 20 20 20 2a 20 65 61 63  f, .**     * eac
1f30: 68 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 74  h index of the t
1f40: 61 62 6c 65 20 28 7a 65 72 6f 20 6f 72 20 6d 6f  able (zero or mo
1f50: 72 65 20 70 6f 69 6e 74 73 20 74 6f 20 76 69 73  re points to vis
1f60: 69 74 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20  it), and.**     
1f70: 2a 20 61 20 73 70 65 63 69 61 6c 20 22 63 6c 65  * a special "cle
1f80: 61 6e 75 70 20 74 61 62 6c 65 22 20 73 74 61 74  anup table" stat
1f90: 65 2e 0a 2a 2a 0a 2a 2a 20 61 62 49 6e 64 65 78  e..**.** abIndex
1fa0: 65 64 3a 0a 2a 2a 20 20 20 49 66 20 74 68 65 20  ed:.**   If the 
1fb0: 74 61 62 6c 65 20 68 61 73 20 6e 6f 20 69 6e 64  table has no ind
1fc0: 65 78 65 73 20 6f 6e 20 69 74 2c 20 61 62 49 6e  exes on it, abIn
1fd0: 64 65 78 65 64 20 69 73 20 73 65 74 20 74 6f 20  dexed is set to 
1fe0: 4e 55 4c 4c 2e 20 4f 74 68 65 72 77 69 73 65 2c  NULL. Otherwise,
1ff0: 0a 2a 2a 20 20 20 69 74 20 70 6f 69 6e 74 73 20  .**   it points 
2000: 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 66  to an array of f
2010: 6c 61 67 73 20 6e 54 62 6c 43 6f 6c 20 65 6c 65  lags nTblCol ele
2020: 6d 65 6e 74 73 20 69 6e 20 73 69 7a 65 2e 20 54  ments in size. T
2030: 68 65 20 66 6c 61 67 20 69 73 0a 2a 2a 20 20 20  he flag is.**   
2040: 73 65 74 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  set for each col
2050: 75 6d 6e 20 74 68 61 74 20 69 73 20 65 69 74 68  umn that is eith
2060: 65 72 20 61 20 70 61 72 74 20 6f 66 20 74 68 65  er a part of the
2070: 20 50 4b 20 6f 72 20 61 20 70 61 72 74 20 6f 66   PK or a part of
2080: 20 61 6e 0a 2a 2a 20 20 20 69 6e 64 65 78 2e 20   an.**   index. 
2090: 4f 72 20 63 6c 65 61 72 20 6f 74 68 65 72 77 69  Or clear otherwi
20a0: 73 65 2e 0a 2a 2a 20 20 20 0a 2a 2f 0a 73 74 72  se..**   .*/.str
20b0: 75 63 74 20 52 62 75 4f 62 6a 49 74 65 72 20 7b  uct RbuObjIter {
20c0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
20d0: 2a 70 54 62 6c 49 74 65 72 3b 20 20 20 20 20 20  *pTblIter;      
20e0: 20 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74 68     /* Iterate th
20f0: 72 6f 75 67 68 20 74 61 62 6c 65 73 20 2a 2f 0a  rough tables */.
2100: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
2110: 70 49 64 78 49 74 65 72 3b 20 20 20 20 20 20 20  pIdxIter;       
2120: 20 20 2f 2a 20 49 6e 64 65 78 20 69 74 65 72 61    /* Index itera
2130: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 62  tor */.  int nTb
2140: 6c 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  lCol;           
2150: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
2160: 20 6f 66 20 61 7a 54 62 6c 43 6f 6c 5b 5d 20 61   of azTblCol[] a
2170: 72 72 61 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a  rray */.  char *
2180: 2a 61 7a 54 62 6c 43 6f 6c 3b 20 20 20 20 20 20  *azTblCol;      
2190: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
21a0: 61 79 20 6f 66 20 75 6e 71 75 6f 74 65 64 20 74  ay of unquoted t
21b0: 61 72 67 65 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d  arget column nam
21c0: 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  es */.  char **a
21d0: 7a 54 62 6c 54 79 70 65 3b 20 20 20 20 20 20 20  zTblType;       
21e0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
21f0: 20 6f 66 20 74 61 72 67 65 74 20 63 6f 6c 75 6d   of target colum
2200: 6e 20 74 79 70 65 73 20 2a 2f 0a 20 20 69 6e 74  n types */.  int
2210: 20 2a 61 69 53 72 63 4f 72 64 65 72 3b 20 20 20   *aiSrcOrder;   
2220: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2230: 73 72 63 20 74 61 62 6c 65 20 63 6f 6c 20 2d 3e  src table col ->
2240: 20 74 61 72 67 65 74 20 74 61 62 6c 65 20 63 6f   target table co
2250: 6c 20 2a 2f 0a 20 20 75 38 20 2a 61 62 54 62 6c  l */.  u8 *abTbl
2260: 50 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pk;             
2270: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
2280: 6f 66 20 66 6c 61 67 73 2c 20 73 65 74 20 6f 6e  of flags, set on
2290: 20 74 61 72 67 65 74 20 50 4b 20 63 6f 6c 75 6d   target PK colum
22a0: 6e 73 20 2a 2f 0a 20 20 75 38 20 2a 61 62 4e 6f  ns */.  u8 *abNo
22b0: 74 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  tNull;          
22c0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
22d0: 20 6f 66 20 66 6c 61 67 73 2c 20 73 65 74 20 6f   of flags, set o
22e0: 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d  n NOT NULL colum
22f0: 6e 73 20 2a 2f 0a 20 20 75 38 20 2a 61 62 49 6e  ns */.  u8 *abIn
2300: 64 65 78 65 64 3b 20 20 20 20 20 20 20 20 20 20  dexed;          
2310: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
2320: 20 6f 66 20 66 6c 61 67 73 2c 20 73 65 74 20 6f   of flags, set o
2330: 6e 20 69 6e 64 65 78 65 64 20 26 20 50 4b 20 63  n indexed & PK c
2340: 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79  ols */.  int eTy
2350: 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pe;             
2360: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
2370: 65 20 74 79 70 65 20 2d 20 61 6e 20 52 42 55 5f  e type - an RBU_
2380: 50 4b 5f 58 58 58 20 76 61 6c 75 65 20 2a 2f 0a  PK_XXX value */.
2390: 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 76 61 72  .  /* Output var
23a0: 69 61 62 6c 65 73 2e 20 7a 54 62 6c 3d 3d 30 20  iables. zTbl==0 
23b0: 69 6d 70 6c 69 65 73 20 45 4f 46 2e 20 2a 2f 0a  implies EOF. */.
23c0: 20 20 69 6e 74 20 62 43 6c 65 61 6e 75 70 3b 20    int bCleanup; 
23d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e0: 20 20 2f 2a 20 54 72 75 65 20 69 6e 20 22 63 6c    /* True in "cl
23f0: 65 61 6e 75 70 22 20 73 74 61 74 65 20 2a 2f 0a  eanup" state */.
2400: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
2410: 62 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  bl;             
2420: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 72    /* Name of tar
2430: 67 65 74 20 64 62 20 74 61 62 6c 65 20 2a 2f 0a  get db table */.
2440: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
2450: 61 74 61 54 62 6c 3b 20 20 20 20 20 20 20 20 20  ataTbl;         
2460: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 72 62 75    /* Name of rbu
2470: 20 64 62 20 74 61 62 6c 65 20 28 6f 72 20 6e 75   db table (or nu
2480: 6c 6c 29 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ll) */.  const c
2490: 68 61 72 20 2a 7a 49 64 78 3b 20 20 20 20 20 20  har *zIdx;      
24a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
24b0: 20 6f 66 20 74 61 72 67 65 74 20 64 62 20 69 6e   of target db in
24c0: 64 65 78 20 28 6f 72 20 6e 75 6c 6c 29 20 2a 2f  dex (or null) */
24d0: 0a 20 20 69 6e 74 20 69 54 6e 75 6d 3b 20 20 20  .  int iTnum;   
24e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f0: 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
2500: 6f 66 20 63 75 72 72 65 6e 74 20 6f 62 6a 65 63  of current objec
2510: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6b 54 6e  t */.  int iPkTn
2520: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
2530: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 65 54 79         /* If eTy
2540: 70 65 3d 3d 45 58 54 45 52 4e 41 4c 2c 20 72 6f  pe==EXTERNAL, ro
2550: 6f 74 20 6f 66 20 50 4b 20 69 6e 64 65 78 20 2a  ot of PK index *
2560: 2f 0a 20 20 69 6e 74 20 62 55 6e 69 71 75 65 3b  /.  int bUnique;
2570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2580: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 69      /* Current i
2590: 6e 64 65 78 20 69 73 20 75 6e 69 71 75 65 20 2a  ndex is unique *
25a0: 2f 0a 20 20 69 6e 74 20 6e 49 6e 64 65 78 3b 20  /.  int nIndex; 
25b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
25d0: 20 61 75 78 2e 20 69 6e 64 65 78 65 73 20 6f 6e   aux. indexes on
25e0: 20 74 61 62 6c 65 20 7a 54 62 6c 20 2a 2f 0a 0a   table zTbl */..
25f0: 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 73 20    /* Statements 
2600: 63 72 65 61 74 65 64 20 62 79 20 72 62 75 4f 62  created by rbuOb
2610: 6a 49 74 65 72 50 72 65 70 61 72 65 41 6c 6c 28  jIterPrepareAll(
2620: 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b  ) */.  int nCol;
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2640: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2650: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 63   of columns in c
2660: 75 72 72 65 6e 74 20 6f 62 6a 65 63 74 20 2a 2f  urrent object */
2670: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
2680: 2a 70 53 65 6c 65 63 74 3b 20 20 20 20 20 20 20  *pSelect;       
2690: 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 64 61 74     /* Source dat
26a0: 61 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  a */.  sqlite3_s
26b0: 74 6d 74 20 2a 70 49 6e 73 65 72 74 3b 20 20 20  tmt *pInsert;   
26c0: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d         /* Statem
26d0: 65 6e 74 20 66 6f 72 20 49 4e 53 45 52 54 20 6f  ent for INSERT o
26e0: 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 73  perations */.  s
26f0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44 65  qlite3_stmt *pDe
2700: 6c 65 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f  lete;          /
2710: 2a 20 53 74 61 74 65 6d 65 6e 74 20 66 6f 72 20  * Statement for 
2720: 44 45 4c 45 54 45 20 6f 70 73 20 2a 2f 0a 20 20  DELETE ops */.  
2730: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 54  sqlite3_stmt *pT
2740: 6d 70 49 6e 73 65 72 74 3b 20 20 20 20 20 20 20  mpInsert;       
2750: 2f 2a 20 49 6e 73 65 72 74 20 69 6e 74 6f 20 72  /* Insert into r
2760: 62 75 5f 74 6d 70 5f 24 7a 44 61 74 61 54 62 6c  bu_tmp_$zDataTbl
2770: 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 61 73 74 20 55   */..  /* Last U
2780: 50 44 41 54 45 20 75 73 65 64 20 28 66 6f 72 20  PDATE used (for 
2790: 50 4b 20 62 2d 74 72 65 65 20 75 70 64 61 74 65  PK b-tree update
27a0: 73 20 6f 6e 6c 79 29 2c 20 6f 72 20 4e 55 4c 4c  s only), or NULL
27b0: 2e 20 2a 2f 0a 20 20 52 62 75 55 70 64 61 74 65  . */.  RbuUpdate
27c0: 53 74 6d 74 20 2a 70 52 62 75 55 70 64 61 74 65  Stmt *pRbuUpdate
27d0: 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 75  ;.};../*.** Valu
27e0: 65 73 20 66 6f 72 20 52 62 75 4f 62 6a 49 74 65  es for RbuObjIte
27f0: 72 2e 65 54 79 70 65 0a 2a 2a 0a 2a 2a 20 20 20  r.eType.**.**   
2800: 20 20 30 3a 20 54 61 62 6c 65 20 64 6f 65 73 20    0: Table does 
2810: 6e 6f 74 20 65 78 69 73 74 20 28 65 72 72 6f 72  not exist (error
2820: 29 0a 2a 2a 20 20 20 20 20 31 3a 20 54 61 62 6c  ).**     1: Tabl
2830: 65 20 68 61 73 20 61 6e 20 69 6d 70 6c 69 63 69  e has an implici
2840: 74 20 72 6f 77 69 64 2e 0a 2a 2a 20 20 20 20 20  t rowid..**     
2850: 32 3a 20 54 61 62 6c 65 20 68 61 73 20 61 6e 20  2: Table has an 
2860: 65 78 70 6c 69 63 69 74 20 49 50 4b 20 63 6f 6c  explicit IPK col
2870: 75 6d 6e 2e 0a 2a 2a 20 20 20 20 20 33 3a 20 54  umn..**     3: T
2880: 61 62 6c 65 20 68 61 73 20 61 6e 20 65 78 74 65  able has an exte
2890: 72 6e 61 6c 20 50 4b 20 69 6e 64 65 78 2e 0a 2a  rnal PK index..*
28a0: 2a 20 20 20 20 20 34 3a 20 54 61 62 6c 65 20 69  *     4: Table i
28b0: 73 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 2e  s WITHOUT ROWID.
28c0: 0a 2a 2a 20 20 20 20 20 35 3a 20 54 61 62 6c 65  .**     5: Table
28d0: 20 69 73 20 61 20 76 69 72 74 75 61 6c 20 74 61   is a virtual ta
28e0: 62 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ble..*/.#define 
28f0: 52 42 55 5f 50 4b 5f 4e 4f 54 41 42 4c 45 20 20  RBU_PK_NOTABLE  
2900: 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20        0.#define 
2910: 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 20 20 20 20  RBU_PK_NONE     
2920: 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20        1.#define 
2930: 52 42 55 5f 50 4b 5f 49 50 4b 20 20 20 20 20 20  RBU_PK_IPK      
2940: 20 20 20 20 20 20 32 0a 23 64 65 66 69 6e 65 20        2.#define 
2950: 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20  RBU_PK_EXTERNAL 
2960: 20 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20        3.#define 
2970: 52 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54 5f 52  RBU_PK_WITHOUT_R
2980: 4f 57 49 44 20 20 34 0a 23 64 65 66 69 6e 65 20  OWID  4.#define 
2990: 52 42 55 5f 50 4b 5f 56 54 41 42 20 20 20 20 20  RBU_PK_VTAB     
29a0: 20 20 20 20 20 20 35 0a 0a 0a 2f 2a 0a 2a 2a 20        5.../*.** 
29b0: 57 69 74 68 69 6e 20 74 68 65 20 52 42 55 5f 53  Within the RBU_S
29c0: 54 41 47 45 5f 4f 41 4c 20 73 74 61 67 65 2c 20  TAGE_OAL stage, 
29d0: 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 73 71 6c  each call to sql
29e0: 69 74 65 33 72 62 75 5f 73 74 65 70 28 29 20 70  ite3rbu_step() p
29f0: 65 72 66 6f 72 6d 73 0a 2a 2a 20 6f 6e 65 20 6f  erforms.** one o
2a00: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
2a10: 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 23  operations..*/.#
2a20: 64 65 66 69 6e 65 20 52 42 55 5f 49 4e 53 45 52  define RBU_INSER
2a30: 54 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20  T     1         
2a40: 20 2f 2a 20 49 6e 73 65 72 74 20 6f 6e 20 61 20   /* Insert on a 
2a50: 6d 61 69 6e 20 74 61 62 6c 65 20 62 2d 74 72 65  main table b-tre
2a60: 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52 42 55  e */.#define RBU
2a70: 5f 44 45 4c 45 54 45 20 20 20 20 20 32 20 20 20  _DELETE     2   
2a80: 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65         /* Delete
2a90: 20 61 20 72 6f 77 20 66 72 6f 6d 20 61 20 6d 61   a row from a ma
2aa0: 69 6e 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20  in table b-tree 
2ab0: 2a 2f 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 52  */.#define RBU_R
2ac0: 45 50 4c 41 43 45 20 20 20 20 33 20 20 20 20 20  EPLACE    3     
2ad0: 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 61       /* Delete a
2ae0: 6e 64 20 74 68 65 6e 20 69 6e 73 65 72 74 20 61  nd then insert a
2af0: 20 72 6f 77 20 2a 2f 0a 23 64 65 66 69 6e 65 20   row */.#define 
2b00: 52 42 55 5f 49 44 58 5f 44 45 4c 45 54 45 20 34  RBU_IDX_DELETE 4
2b10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c            /* Del
2b20: 65 74 65 20 61 20 72 6f 77 20 66 72 6f 6d 20 61  ete a row from a
2b30: 6e 20 61 75 78 2e 20 69 6e 64 65 78 20 62 2d 74  n aux. index b-t
2b40: 72 65 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52  ree */.#define R
2b50: 42 55 5f 49 44 58 5f 49 4e 53 45 52 54 20 35 20  BU_IDX_INSERT 5 
2b60: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65           /* Inse
2b70: 72 74 20 6f 6e 20 61 6e 20 61 75 78 2e 20 69 6e  rt on an aux. in
2b80: 64 65 78 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 23  dex b-tree */..#
2b90: 64 65 66 69 6e 65 20 52 42 55 5f 55 50 44 41 54  define RBU_UPDAT
2ba0: 45 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20  E     6         
2bb0: 20 2f 2a 20 55 70 64 61 74 65 20 61 20 72 6f 77   /* Update a row
2bc0: 20 69 6e 20 61 20 6d 61 69 6e 20 74 61 62 6c 65   in a main table
2bd0: 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 2f 2a 0a 2a   b-tree */../*.*
2be0: 2a 20 41 20 73 69 6e 67 6c 65 20 73 74 65 70 20  * A single step 
2bf0: 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  of an incrementa
2c00: 6c 20 63 68 65 63 6b 70 6f 69 6e 74 20 2d 20 66  l checkpoint - f
2c10: 72 61 6d 65 20 69 57 61 6c 46 72 61 6d 65 20 6f  rame iWalFrame o
2c20: 66 20 74 68 65 20 77 61 6c 0a 2a 2a 20 66 69 6c  f the wal.** fil
2c30: 65 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 70 69  e should be copi
2c40: 65 64 20 74 6f 20 70 61 67 65 20 69 44 62 50 61  ed to page iDbPa
2c50: 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
2c60: 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 72 75  se file..*/.stru
2c70: 63 74 20 52 62 75 46 72 61 6d 65 20 7b 0a 20 20  ct RbuFrame {.  
2c80: 75 33 32 20 69 44 62 50 61 67 65 3b 0a 20 20 75  u32 iDbPage;.  u
2c90: 33 32 20 69 57 61 6c 46 72 61 6d 65 3b 0a 7d 3b  32 iWalFrame;.};
2ca0: 0a 0a 2f 2a 0a 2a 2a 20 52 42 55 20 68 61 6e 64  ../*.** RBU hand
2cb0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 6e 50 68 61 73 65  le..**.** nPhase
2cc0: 4f 6e 65 53 74 65 70 3a 0a 2a 2a 20 20 20 49 66  OneStep:.**   If
2cd0: 20 74 68 65 20 52 42 55 20 64 61 74 61 62 61 73   the RBU databas
2ce0: 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 72 62  e contains an rb
2cf0: 75 5f 63 6f 75 6e 74 20 74 61 62 6c 65 2c 20 74  u_count table, t
2d00: 68 69 73 20 76 61 6c 75 65 20 69 73 20 73 65 74  his value is set
2d10: 20 74 6f 0a 2a 2a 20 20 20 61 20 72 75 6e 6e 69   to.**   a runni
2d20: 6e 67 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  ng estimate of t
2d30: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 2d 74  he number of b-t
2d40: 72 65 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 72  ree operations r
2d50: 65 71 75 69 72 65 64 20 74 6f 20 0a 2a 2a 20 20  equired to .**  
2d60: 20 66 69 6e 69 73 68 20 70 6f 70 75 6c 61 74 69   finish populati
2d70: 6e 67 20 74 68 65 20 2a 2d 6f 61 6c 20 66 69 6c  ng the *-oal fil
2d80: 65 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74  e. This allows t
2d90: 68 65 20 73 71 6c 69 74 65 33 5f 62 70 5f 70 72  he sqlite3_bp_pr
2da0: 6f 67 72 65 73 73 28 29 0a 2a 2a 20 20 20 41 50  ogress().**   AP
2db0: 49 20 74 6f 20 63 61 6c 63 75 6c 61 74 65 20 74  I to calculate t
2dc0: 68 65 20 70 65 72 6d 79 72 69 61 64 61 67 65 20  he permyriadage 
2dd0: 70 72 6f 67 72 65 73 73 20 6f 66 20 70 6f 70 75  progress of popu
2de0: 6c 61 74 69 6e 67 20 74 68 65 20 2a 2d 6f 61 6c  lating the *-oal
2df0: 20 66 69 6c 65 0a 2a 2a 20 20 20 75 73 69 6e 67   file.**   using
2e00: 20 74 68 65 20 66 6f 72 6d 75 6c 61 3a 0a 2a 2a   the formula:.**
2e10: 0a 2a 2a 20 20 20 20 20 70 65 72 6d 79 72 69 61  .**     permyria
2e20: 64 61 67 65 20 3d 20 28 31 30 30 30 30 20 2a 20  dage = (10000 * 
2e30: 6e 50 72 6f 67 72 65 73 73 29 20 2f 20 6e 50 68  nProgress) / nPh
2e40: 61 73 65 4f 6e 65 53 74 65 70 0a 2a 2a 0a 2a 2a  aseOneStep.**.**
2e50: 20 20 20 6e 50 68 61 73 65 4f 6e 65 53 74 65 70     nPhaseOneStep
2e60: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
2e70: 74 6f 20 74 68 65 20 73 75 6d 20 6f 66 3a 0a 2a  to the sum of:.*
2e80: 2a 0a 2a 2a 20 20 20 20 20 6e 52 6f 77 20 2a 20  *.**     nRow * 
2e90: 28 6e 49 6e 64 65 78 20 2b 20 31 29 0a 2a 2a 0a  (nIndex + 1).**.
2ea0: 2a 2a 20 20 20 66 6f 72 20 61 6c 6c 20 73 6f 75  **   for all sou
2eb0: 72 63 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68  rce tables in th
2ec0: 65 20 52 42 55 20 64 61 74 61 62 61 73 65 2c 20  e RBU database, 
2ed0: 77 68 65 72 65 20 6e 52 6f 77 20 69 73 20 74 68  where nRow is th
2ee0: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 6f 66  e number.**   of
2ef0: 20 72 6f 77 73 20 69 6e 20 74 68 65 20 73 6f 75   rows in the sou
2f00: 72 63 65 20 74 61 62 6c 65 20 61 6e 64 20 6e 49  rce table and nI
2f10: 6e 64 65 78 20 74 68 65 20 6e 75 6d 62 65 72 20  ndex the number 
2f20: 6f 66 20 69 6e 64 65 78 65 73 20 6f 6e 20 74 68  of indexes on th
2f30: 65 0a 2a 2a 20 20 20 63 6f 72 72 65 73 70 6f 6e  e.**   correspon
2f40: 64 69 6e 67 20 74 61 72 67 65 74 20 64 61 74 61  ding target data
2f50: 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  base table..**.*
2f60: 2a 20 20 20 54 68 69 73 20 65 73 74 69 6d 61 74  *   This estimat
2f70: 65 20 69 73 20 61 63 63 75 72 61 74 65 20 69 66  e is accurate if
2f80: 20 74 68 65 20 52 42 55 20 75 70 64 61 74 65 20   the RBU update 
2f90: 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c  consists entirel
2fa0: 79 20 6f 66 0a 2a 2a 20 20 20 49 4e 53 45 52 54  y of.**   INSERT
2fb0: 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 48 6f 77   operations. How
2fc0: 65 76 65 72 2c 20 69 74 20 69 73 20 69 6e 61 63  ever, it is inac
2fd0: 63 75 72 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a 2a  curate if:.**.**
2fe0: 20 20 20 20 20 2a 20 74 68 65 20 52 42 55 20 75       * the RBU u
2ff0: 70 64 61 74 65 20 63 6f 6e 74 61 69 6e 73 20 61  pdate contains a
3000: 6e 79 20 55 50 44 41 54 45 20 6f 70 65 72 61 74  ny UPDATE operat
3010: 69 6f 6e 73 2e 20 49 66 20 74 68 65 20 50 4b 20  ions. If the PK 
3020: 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 20 20 20  specified.**    
3030: 20 20 20 66 6f 72 20 61 6e 20 55 50 44 41 54 45     for an UPDATE
3040: 20 6f 70 65 72 61 74 69 6f 6e 20 64 6f 65 73 20   operation does 
3050: 6e 6f 74 20 65 78 69 73 74 20 69 6e 20 74 68 65  not exist in the
3060: 20 74 61 72 67 65 74 20 74 61 62 6c 65 2c 20 74   target table, t
3070: 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 6e 6f 20  hen.**       no 
3080: 62 2d 74 72 65 65 20 6f 70 65 72 61 74 69 6f 6e  b-tree operation
3090: 73 20 61 72 65 20 72 65 71 75 69 72 65 64 20 6f  s are required o
30a0: 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73 2e  n index b-trees.
30b0: 20 4f 72 20 69 66 20 74 68 65 20 0a 2a 2a 20 20   Or if the .**  
30c0: 20 20 20 20 20 73 70 65 63 69 66 69 65 64 20 50       specified P
30d0: 4b 20 64 6f 65 73 20 65 78 69 73 74 2c 20 74 68  K does exist, th
30e0: 65 6e 20 28 6e 49 6e 64 65 78 2a 32 29 20 73 75  en (nIndex*2) su
30f0: 63 68 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72  ch operations ar
3100: 65 0a 2a 2a 20 20 20 20 20 20 20 72 65 71 75 69  e.**       requi
3110: 72 65 64 20 28 6f 6e 65 20 64 65 6c 65 74 65 20  red (one delete 
3120: 61 6e 64 20 6f 6e 65 20 69 6e 73 65 72 74 20 6f  and one insert o
3130: 6e 20 65 61 63 68 20 69 6e 64 65 78 20 62 2d 74  n each index b-t
3140: 72 65 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ree)..**.**     
3150: 2a 20 74 68 65 20 52 42 55 20 75 70 64 61 74 65  * the RBU update
3160: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 44 45   contains any DE
3170: 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 20  LETE operations 
3180: 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 73 70  for which the sp
3190: 65 63 69 66 69 65 64 0a 2a 2a 20 20 20 20 20 20  ecified.**      
31a0: 20 50 4b 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   PK does not exi
31b0: 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  st. In this case
31c0: 20 6e 6f 20 6f 70 65 72 61 74 69 6f 6e 73 20 61   no operations a
31d0: 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e 20 69  re required on i
31e0: 6e 64 65 78 0a 2a 2a 20 20 20 20 20 20 20 62 2d  ndex.**       b-
31f0: 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  trees..**.**    
3200: 20 2a 20 74 68 65 20 52 42 55 20 75 70 64 61 74   * the RBU updat
3210: 65 20 63 6f 6e 74 61 69 6e 73 20 52 45 50 4c 41  e contains REPLA
3220: 43 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 54  CE operations. T
3230: 68 65 73 65 20 61 72 65 20 73 69 6d 69 6c 61 72  hese are similar
3240: 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 55 50 44   to.**       UPD
3250: 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a  ATE operations..
3260: 2a 2a 0a 2a 2a 20 20 20 6e 50 68 61 73 65 4f 6e  **.**   nPhaseOn
3270: 65 53 74 65 70 20 69 73 20 75 70 64 61 74 65 64  eStep is updated
3280: 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20   to account for 
3290: 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61  the conditions a
32a0: 62 6f 76 65 20 64 75 72 69 6e 67 20 74 68 65 0a  bove during the.
32b0: 2a 2a 20 20 20 66 69 72 73 74 20 70 61 73 73 20  **   first pass 
32c0: 6f 66 20 65 61 63 68 20 73 6f 75 72 63 65 20 74  of each source t
32d0: 61 62 6c 65 2e 20 54 68 65 20 75 70 64 61 74 65  able. The update
32e0: 64 20 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20  d nPhaseOneStep 
32f0: 76 61 6c 75 65 20 69 73 0a 2a 2a 20 20 20 73 74  value is.**   st
3300: 6f 72 65 64 20 69 6e 20 74 68 65 20 72 62 75 5f  ored in the rbu_
3310: 73 74 61 74 65 20 74 61 62 6c 65 20 69 66 20 74  state table if t
3320: 68 65 20 52 42 55 20 75 70 64 61 74 65 20 69 73  he RBU update is
3330: 20 73 75 73 70 65 6e 64 65 64 2e 0a 2a 2f 0a 73   suspended..*/.s
3340: 74 72 75 63 74 20 73 71 6c 69 74 65 33 72 62 75  truct sqlite3rbu
3350: 20 7b 0a 20 20 69 6e 74 20 65 53 74 61 67 65 3b   {.  int eStage;
3360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3370: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
3380: 20 52 42 55 5f 53 54 41 54 45 5f 53 54 41 47 45   RBU_STATE_STAGE
3390: 20 66 69 65 6c 64 20 2a 2f 0a 20 20 73 71 6c 69   field */.  sqli
33a0: 74 65 33 20 2a 64 62 4d 61 69 6e 3b 20 20 20 20  te3 *dbMain;    
33b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74              /* t
33c0: 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20 68  arget database h
33d0: 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74  andle */.  sqlit
33e0: 65 33 20 2a 64 62 52 62 75 3b 20 20 20 20 20 20  e3 *dbRbu;      
33f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 62             /* rb
3400: 75 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  u database handl
3410: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 61  e */.  char *zTa
3420: 72 67 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  rget;           
3430: 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 74         /* Path t
3440: 6f 20 74 61 72 67 65 74 20 64 62 20 2a 2f 0a 20  o target db */. 
3450: 20 63 68 61 72 20 2a 7a 52 62 75 3b 20 20 20 20   char *zRbu;    
3460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3470: 20 2f 2a 20 50 61 74 68 20 74 6f 20 72 62 75 20   /* Path to rbu 
3480: 64 62 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53  db */.  char *zS
3490: 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  tate;           
34a0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20          /* Path 
34b0: 74 6f 20 73 74 61 74 65 20 64 62 20 28 6f 72 20  to state db (or 
34c0: 4e 55 4c 4c 20 69 66 20 7a 52 62 75 29 20 2a 2f  NULL if zRbu) */
34d0: 0a 20 20 63 68 61 72 20 7a 53 74 61 74 65 44 62  .  char zStateDb
34e0: 5b 35 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  [5];            
34f0: 20 20 20 2f 2a 20 44 62 20 6e 61 6d 65 20 66 6f     /* Db name fo
3500: 72 20 73 74 61 74 65 20 28 22 73 74 61 74 22 20  r state ("stat" 
3510: 6f 72 20 22 6d 61 69 6e 22 29 20 2a 2f 0a 20 20  or "main") */.  
3520: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
3530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3540: 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65  /* Value returne
3550: 64 20 62 79 20 6c 61 73 74 20 72 62 75 5f 73 74  d by last rbu_st
3560: 65 70 28 29 20 63 61 6c 6c 20 2a 2f 0a 20 20 63  ep() call */.  c
3570: 68 61 72 20 2a 7a 45 72 72 6d 73 67 3b 20 20 20  har *zErrmsg;   
3580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3590: 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20  * Error message 
35a0: 69 66 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  if rc!=SQLITE_OK
35b0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 74 65 70 3b   */.  int nStep;
35c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35d0: 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 70 72        /* Rows pr
35e0: 6f 63 65 73 73 65 64 20 66 6f 72 20 63 75 72 72  ocessed for curr
35f0: 65 6e 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ent object */.  
3600: 69 6e 74 20 6e 50 72 6f 67 72 65 73 73 3b 20 20  int nProgress;  
3610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3620: 2f 2a 20 52 6f 77 73 20 70 72 6f 63 65 73 73 65  /* Rows processe
3630: 64 20 66 6f 72 20 61 6c 6c 20 6f 62 6a 65 63 74  d for all object
3640: 73 20 2a 2f 0a 20 20 52 62 75 4f 62 6a 49 74 65  s */.  RbuObjIte
3650: 72 20 6f 62 6a 69 74 65 72 3b 20 20 20 20 20 20  r objiter;      
3660: 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
3670: 6f 72 20 66 6f 72 20 73 6b 69 70 70 69 6e 67 20  or for skipping 
3680: 74 68 72 6f 75 67 68 20 74 62 6c 2f 69 64 78 20  through tbl/idx 
3690: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
36a0: 2a 7a 56 66 73 4e 61 6d 65 3b 20 20 20 20 20 20  *zVfsName;      
36b0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
36c0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72  automatically cr
36d0: 65 61 74 65 64 20 72 62 75 20 76 66 73 20 2a 2f  eated rbu vfs */
36e0: 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 54 61  .  rbu_file *pTa
36f0: 72 67 65 74 46 64 3b 20 20 20 20 20 20 20 20 20  rgetFd;         
3700: 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c     /* File handl
3710: 65 20 6f 70 65 6e 20 6f 6e 20 74 61 72 67 65 74  e open on target
3720: 20 64 62 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61   db */.  int nPa
3730: 67 65 50 65 72 53 65 63 74 6f 72 3b 20 20 20 20  gePerSector;    
3740: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
3750: 73 20 70 65 72 20 73 65 63 74 6f 72 20 66 6f 72  s per sector for
3760: 20 70 54 61 72 67 65 74 46 64 20 2a 2f 0a 20 20   pTargetFd */.  
3770: 69 36 34 20 69 4f 61 6c 53 7a 3b 0a 20 20 69 36  i64 iOalSz;.  i6
3780: 34 20 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 3b  4 nPhaseOneStep;
3790: 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
37a0: 77 69 6e 67 20 73 74 61 74 65 20 76 61 72 69 61  wing state varia
37b0: 62 6c 65 73 20 61 72 65 20 75 73 65 64 20 61 73  bles are used as
37c0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 63   part of the inc
37d0: 72 65 6d 65 6e 74 61 6c 0a 20 20 2a 2a 20 63 68  remental.  ** ch
37e0: 65 63 6b 70 6f 69 6e 74 20 73 74 61 67 65 20 28  eckpoint stage (
37f0: 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47  eStage==RBU_STAG
3800: 45 5f 43 4b 50 54 29 2e 20 53 65 65 20 63 6f 6d  E_CKPT). See com
3810: 6d 65 6e 74 73 20 73 75 72 72 6f 75 6e 64 69 6e  ments surroundin
3820: 67 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  g.  ** function 
3830: 72 62 75 53 65 74 75 70 43 68 65 63 6b 70 6f 69  rbuSetupCheckpoi
3840: 6e 74 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73  nt() for details
3850: 2e 20 20 2a 2f 0a 20 20 75 33 32 20 69 4d 61 78  .  */.  u32 iMax
3860: 46 72 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  Frame;          
3870: 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 72 67 65          /* Large
3880: 73 74 20 69 57 61 6c 46 72 61 6d 65 20 76 61 6c  st iWalFrame val
3890: 75 65 20 69 6e 20 61 46 72 61 6d 65 5b 5d 20 2a  ue in aFrame[] *
38a0: 2f 0a 20 20 75 33 32 20 6d 4c 6f 63 6b 3b 0a 20  /.  u32 mLock;. 
38b0: 20 69 6e 74 20 6e 46 72 61 6d 65 3b 20 20 20 20   int nFrame;    
38c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38d0: 20 2f 2a 20 45 6e 74 72 69 65 73 20 69 6e 20 61   /* Entries in a
38e0: 46 72 61 6d 65 5b 5d 20 61 72 72 61 79 20 2a 2f  Frame[] array */
38f0: 0a 20 20 69 6e 74 20 6e 46 72 61 6d 65 41 6c 6c  .  int nFrameAll
3900: 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  oc;             
3910: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
3920: 73 69 7a 65 20 6f 66 20 61 46 72 61 6d 65 5b 5d  size of aFrame[]
3930: 20 61 72 72 61 79 20 2a 2f 0a 20 20 52 62 75 46   array */.  RbuF
3940: 72 61 6d 65 20 2a 61 46 72 61 6d 65 3b 0a 20 20  rame *aFrame;.  
3950: 69 6e 74 20 70 67 73 7a 3b 0a 20 20 75 38 20 2a  int pgsz;.  u8 *
3960: 61 42 75 66 3b 0a 20 20 69 36 34 20 69 57 61 6c  aBuf;.  i64 iWal
3970: 43 6b 73 75 6d 3b 0a 20 20 69 36 34 20 73 7a 54  Cksum;.  i64 szT
3980: 65 6d 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  emp;            
3990: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
39a0: 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20  ent size of all 
39b0: 74 65 6d 70 20 66 69 6c 65 73 20 69 6e 20 75 73  temp files in us
39c0: 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a 54 65 6d  e */.  i64 szTem
39d0: 70 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20 20  pLimit;         
39e0: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
39f0: 73 69 7a 65 20 6c 69 6d 69 74 20 66 6f 72 20 74  size limit for t
3a00: 65 6d 70 20 66 69 6c 65 73 20 2a 2f 0a 0a 20 20  emp files */..  
3a10: 2f 2a 20 55 73 65 64 20 69 6e 20 52 42 55 20 76  /* Used in RBU v
3a20: 61 63 75 75 6d 20 6d 6f 64 65 20 6f 6e 6c 79 20  acuum mode only 
3a30: 2a 2f 0a 20 20 69 6e 74 20 6e 52 62 75 3b 20 20  */.  int nRbu;  
3a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a50: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3a60: 66 20 52 42 55 20 56 46 53 20 69 6e 20 74 68 65  f RBU VFS in the
3a70: 20 73 74 61 63 6b 20 2a 2f 0a 20 20 72 62 75 5f   stack */.  rbu_
3a80: 66 69 6c 65 20 2a 70 52 62 75 46 64 3b 20 20 20  file *pRbuFd;   
3a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
3aa0: 64 20 66 6f 72 20 6d 61 69 6e 20 64 62 20 6f 66  d for main db of
3ab0: 20 64 62 52 62 75 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   dbRbu */.};../*
3ac0: 0a 2a 2a 20 41 6e 20 72 62 75 20 56 46 53 20 69  .** An rbu VFS i
3ad0: 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73  s implemented us
3ae0: 69 6e 67 20 61 6e 20 69 6e 73 74 61 6e 63 65 20  ing an instance 
3af0: 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
3b00: 65 2e 0a 2a 2a 0a 2a 2a 20 56 61 72 69 61 62 6c  e..**.** Variabl
3b10: 65 20 70 52 62 75 20 69 73 20 6f 6e 6c 79 20 6e  e pRbu is only n
3b20: 6f 6e 2d 4e 55 4c 4c 20 66 6f 72 20 61 75 74 6f  on-NULL for auto
3b30: 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65  matically create
3b40: 64 20 52 42 55 20 56 46 53 20 6f 62 6a 65 63 74  d RBU VFS object
3b50: 73 2e 0a 2a 2a 20 49 74 20 69 73 20 4e 55 4c 4c  s..** It is NULL
3b60: 20 66 6f 72 20 52 42 55 20 56 46 53 20 6f 62 6a   for RBU VFS obj
3b70: 65 63 74 73 20 63 72 65 61 74 65 64 20 65 78 70  ects created exp
3b80: 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 2a 2a  licitly using.**
3b90: 20 73 71 6c 69 74 65 33 72 62 75 5f 63 72 65 61   sqlite3rbu_crea
3ba0: 74 65 5f 76 66 73 28 29 2e 20 49 74 20 69 73 20  te_vfs(). It is 
3bb0: 75 73 65 64 20 74 6f 20 74 72 61 63 6b 20 74 68  used to track th
3bc0: 65 20 74 6f 74 61 6c 20 61 6d 6f 75 6e 74 20 6f  e total amount o
3bd0: 66 20 74 65 6d 70 0a 2a 2a 20 73 70 61 63 65 20  f temp.** space 
3be0: 75 73 65 64 20 62 79 20 74 68 65 20 52 42 55 20  used by the RBU 
3bf0: 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63  handle..*/.struc
3c00: 74 20 72 62 75 5f 76 66 73 20 7b 0a 20 20 73 71  t rbu_vfs {.  sq
3c10: 6c 69 74 65 33 5f 76 66 73 20 62 61 73 65 3b 20  lite3_vfs base; 
3c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3c30: 20 72 62 75 20 56 46 53 20 73 68 69 6d 20 6d 65   rbu VFS shim me
3c40: 74 68 6f 64 73 20 2a 2f 0a 20 20 73 71 6c 69 74  thods */.  sqlit
3c50: 65 33 5f 76 66 73 20 2a 70 52 65 61 6c 56 66 73  e3_vfs *pRealVfs
3c60: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e  ;          /* Un
3c70: 64 65 72 6c 79 69 6e 67 20 56 46 53 20 2a 2f 0a  derlying VFS */.
3c80: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
3c90: 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20  *mutex;         
3ca0: 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 70 72    /* Mutex to pr
3cb0: 6f 74 65 63 74 20 70 4d 61 69 6e 20 2a 2f 0a 20  otect pMain */. 
3cc0: 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 52 62   sqlite3rbu *pRb
3cd0: 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
3ce0: 20 2f 2a 20 4f 77 6e 65 72 20 52 42 55 20 6f 62   /* Owner RBU ob
3cf0: 6a 65 63 74 20 2a 2f 0a 20 20 72 62 75 5f 66 69  ject */.  rbu_fi
3d00: 6c 65 20 2a 70 4d 61 69 6e 3b 20 20 20 20 20 20  le *pMain;      
3d10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
3d20: 74 20 6f 66 20 6d 61 69 6e 20 64 62 20 66 69 6c  t of main db fil
3d30: 65 73 20 2a 2f 0a 20 20 72 62 75 5f 66 69 6c 65  es */.  rbu_file
3d40: 20 2a 70 4d 61 69 6e 52 62 75 3b 20 20 20 20 20   *pMainRbu;     
3d50: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
3d60: 6f 66 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 73  of main db files
3d70: 20 77 69 74 68 20 70 52 62 75 21 3d 30 20 2a 2f   with pRbu!=0 */
3d80: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  .};../*.** Each 
3d90: 66 69 6c 65 20 6f 70 65 6e 65 64 20 62 79 20 61  file opened by a
3da0: 6e 20 72 62 75 20 56 46 53 20 69 73 20 72 65 70  n rbu VFS is rep
3db0: 72 65 73 65 6e 74 65 64 20 62 79 20 61 6e 20 69  resented by an i
3dc0: 6e 73 74 61 6e 63 65 20 6f 66 0a 2a 2a 20 74 68  nstance of.** th
3dd0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
3de0: 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cture..**.** If 
3df0: 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72  this is a tempor
3e00: 61 72 79 20 66 69 6c 65 20 28 70 52 62 75 21 3d  ary file (pRbu!=
3e10: 30 20 26 26 20 66 6c 61 67 73 26 44 45 4c 45 54  0 && flags&DELET
3e20: 45 5f 4f 4e 5f 43 4c 4f 53 45 29 2c 20 76 61 72  E_ON_CLOSE), var
3e30: 69 61 62 6c 65 0a 2a 2a 20 22 73 7a 22 20 69 73  iable.** "sz" is
3e40: 20 73 65 74 20 74 6f 20 74 68 65 20 63 75 72 72   set to the curr
3e50: 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ent size of the 
3e60: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
3e70: 2f 0a 73 74 72 75 63 74 20 72 62 75 5f 66 69 6c  /.struct rbu_fil
3e80: 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  e {.  sqlite3_fi
3e90: 6c 65 20 62 61 73 65 3b 20 20 20 20 20 20 20 20  le base;        
3ea0: 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
3eb0: 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 20 2a 2f  _file methods */
3ec0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
3ed0: 2a 70 52 65 61 6c 3b 20 20 20 20 20 20 20 20 20  *pReal;         
3ee0: 20 20 20 2f 2a 20 55 6e 64 65 72 6c 79 69 6e 67     /* Underlying
3ef0: 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a   file handle */.
3f00: 20 20 72 62 75 5f 76 66 73 20 2a 70 52 62 75 56    rbu_vfs *pRbuV
3f10: 66 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fs;             
3f20: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
3f30: 74 68 65 20 72 62 75 5f 76 66 73 20 6f 62 6a 65  the rbu_vfs obje
3f40: 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 72  ct */.  sqlite3r
3f50: 62 75 20 2a 70 52 62 75 3b 20 20 20 20 20 20 20  bu *pRbu;       
3f60: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
3f70: 65 72 20 74 6f 20 72 62 75 20 6f 62 6a 65 63 74  er to rbu object
3f80: 20 28 72 62 75 20 74 61 72 67 65 74 20 6f 6e 6c   (rbu target onl
3f90: 79 29 20 2a 2f 0a 20 20 69 36 34 20 73 7a 3b 20  y) */.  i64 sz; 
3fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fb0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
3fc0: 6f 66 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  of file in bytes
3fd0: 20 28 74 65 6d 70 20 6f 6e 6c 79 29 20 2a 2f 0a   (temp only) */.
3fe0: 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73  .  int openFlags
3ff0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4000: 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 68 69 73     /* Flags this
4010: 20 66 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64   file was opened
4020: 20 77 69 74 68 20 2a 2f 0a 20 20 75 33 32 20 69   with */.  u32 i
4030: 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20 20 20  Cookie;         
4040: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
4050: 6f 6b 69 65 20 76 61 6c 75 65 20 66 6f 72 20 6d  okie value for m
4060: 61 69 6e 20 64 62 20 66 69 6c 65 73 20 2a 2f 0a  ain db files */.
4070: 20 20 75 38 20 69 57 72 69 74 65 56 65 72 3b 20    u8 iWriteVer; 
4080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4090: 20 20 2f 2a 20 22 77 72 69 74 65 2d 76 65 72 73    /* "write-vers
40a0: 69 6f 6e 22 20 76 61 6c 75 65 20 66 6f 72 20 6d  ion" value for m
40b0: 61 69 6e 20 64 62 20 66 69 6c 65 73 20 2a 2f 0a  ain db files */.
40c0: 20 20 75 38 20 62 4e 6f 6c 6f 63 6b 3b 20 20 20    u8 bNolock;   
40d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40e0: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 66 61 69    /* True to fai
40f0: 6c 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  l EXCLUSIVE lock
4100: 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 53 68 6d  s */..  int nShm
4110: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4120: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4130: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
4140: 61 70 53 68 6d 5b 5d 20 61 72 72 61 79 20 2a 2f  apShm[] array */
4150: 0a 20 20 63 68 61 72 20 2a 2a 61 70 53 68 6d 3b  .  char **apShm;
4160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4170: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6d     /* Array of m
4180: 6d 61 70 27 64 20 2a 2d 73 68 6d 20 72 65 67 69  map'd *-shm regi
4190: 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ons */.  char *z
41a0: 44 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Del;            
41b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65           /* Dele
41c0: 74 65 20 74 68 69 73 20 77 68 65 6e 20 63 6c 6f  te this when clo
41d0: 73 69 6e 67 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  sing file */..  
41e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 61 6c  const char *zWal
41f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4200: 2f 2a 20 57 61 6c 20 66 69 6c 65 6e 61 6d 65 20  /* Wal filename 
4210: 66 6f 72 20 74 68 69 73 20 6d 61 69 6e 20 64 62  for this main db
4220: 20 66 69 6c 65 20 2a 2f 0a 20 20 72 62 75 5f 66   file */.  rbu_f
4230: 69 6c 65 20 2a 70 57 61 6c 46 64 3b 20 20 20 20  ile *pWalFd;    
4240: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 61             /* Wa
4250: 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
4260: 72 20 66 6f 72 20 74 68 69 73 20 6d 61 69 6e 20  r for this main 
4270: 64 62 20 2a 2f 0a 20 20 72 62 75 5f 66 69 6c 65  db */.  rbu_file
4280: 20 2a 70 4d 61 69 6e 4e 65 78 74 3b 20 20 20 20   *pMainNext;    
4290: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
42a0: 4d 41 49 4e 5f 44 42 20 66 69 6c 65 20 2a 2f 0a  MAIN_DB file */.
42b0: 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 4d 61 69    rbu_file *pMai
42c0: 6e 52 62 75 4e 65 78 74 3b 20 20 20 20 20 20 20  nRbuNext;       
42d0: 20 20 2f 2a 20 4e 65 78 74 20 4d 41 49 4e 5f 44    /* Next MAIN_D
42e0: 42 20 66 69 6c 65 20 77 69 74 68 20 70 52 62 75  B file with pRbu
42f0: 21 3d 30 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  !=0 */.};../*.**
4300: 20 54 72 75 65 20 66 6f 72 20 61 6e 20 52 42 55   True for an RBU
4310: 20 76 61 63 75 75 6d 20 68 61 6e 64 6c 65 2c 20   vacuum handle, 
4320: 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69  or false otherwi
4330: 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 72  se..*/.#define r
4340: 62 75 49 73 56 61 63 75 75 6d 28 70 29 20 28 28  buIsVacuum(p) ((
4350: 70 29 2d 3e 7a 54 61 72 67 65 74 3d 3d 30 29 0a  p)->zTarget==0).
4360: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
4370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
43a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
43b0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  The following th
43c0: 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 66  ree functions, f
43d0: 6f 75 6e 64 20 62 65 6c 6f 77 3a 0a 2a 2a 0a 2a  ound below:.**.*
43e0: 2a 20 20 20 72 62 75 44 65 6c 74 61 47 65 74 49  *   rbuDeltaGetI
43f0: 6e 74 28 29 0a 2a 2a 20 20 20 72 62 75 44 65 6c  nt().**   rbuDel
4400: 74 61 43 68 65 63 6b 73 75 6d 28 29 0a 2a 2a 20  taChecksum().** 
4410: 20 20 72 62 75 44 65 6c 74 61 41 70 70 6c 79 28    rbuDeltaApply(
4420: 29 0a 2a 2a 0a 2a 2a 20 61 72 65 20 6c 69 66 74  ).**.** are lift
4430: 65 64 20 66 72 6f 6d 20 74 68 65 20 66 6f 73 73  ed from the foss
4440: 69 6c 20 73 6f 75 72 63 65 20 63 6f 64 65 20 28  il source code (
4450: 68 74 74 70 3a 2f 2f 66 6f 73 73 69 6c 2d 73 63  http://fossil-sc
4460: 6d 2e 6f 72 67 29 2e 20 54 68 65 79 0a 2a 2a 20  m.org). They.** 
4470: 61 72 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c  are used to impl
4480: 65 6d 65 6e 74 20 74 68 65 20 73 63 61 6c 61 72  ement the scalar
4490: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 72 62   SQL function rb
44a0: 75 5f 66 6f 73 73 69 6c 5f 64 65 6c 74 61 28 29  u_fossil_delta()
44b0: 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ..*/../*.** Read
44c0: 20 62 79 74 65 73 20 66 72 6f 6d 20 2a 70 7a 20   bytes from *pz 
44d0: 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 68 65 6d  and convert them
44e0: 20 69 6e 74 6f 20 61 20 70 6f 73 69 74 69 76 65   into a positive
44f0: 20 69 6e 74 65 67 65 72 2e 20 20 57 68 65 6e 0a   integer.  When.
4500: 2a 2a 20 66 69 6e 69 73 68 65 64 2c 20 6c 65 61  ** finished, lea
4510: 76 65 20 2a 70 7a 20 70 6f 69 6e 74 69 6e 67 20  ve *pz pointing 
4520: 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 68 61  to the first cha
4530: 72 61 63 74 65 72 20 70 61 73 74 20 74 68 65 20  racter past the 
4540: 65 6e 64 20 6f 66 0a 2a 2a 20 74 68 65 20 69 6e  end of.** the in
4550: 74 65 67 65 72 2e 20 20 54 68 65 20 2a 70 4c 65  teger.  The *pLe
4560: 6e 20 70 61 72 61 6d 65 74 65 72 20 68 6f 6c 64  n parameter hold
4570: 73 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  s the length of 
4580: 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e  the string.** in
4590: 20 2a 70 7a 20 61 6e 64 20 69 73 20 64 65 63 72   *pz and is decr
45a0: 65 6d 65 6e 74 65 64 20 6f 6e 63 65 20 66 6f 72  emented once for
45b0: 20 65 61 63 68 20 63 68 61 72 61 63 74 65 72 20   each character 
45c0: 69 6e 20 74 68 65 20 69 6e 74 65 67 65 72 2e 0a  in the integer..
45d0: 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e  */.static unsign
45e0: 65 64 20 69 6e 74 20 72 62 75 44 65 6c 74 61 47  ed int rbuDeltaG
45f0: 65 74 49 6e 74 28 63 6f 6e 73 74 20 63 68 61 72  etInt(const char
4600: 20 2a 2a 70 7a 2c 20 69 6e 74 20 2a 70 4c 65 6e   **pz, int *pLen
4610: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
4620: 74 20 73 69 67 6e 65 64 20 63 68 61 72 20 7a 56  t signed char zV
4630: 61 6c 75 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 2d  alue[] = {.    -
4640: 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d  1, -1, -1, -1, -
4650: 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 20  1, -1, -1, -1,  
4660: 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c   -1, -1, -1, -1,
4670: 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c   -1, -1, -1, -1,
4680: 0a 20 20 20 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c  .    -1, -1, -1,
4690: 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c   -1, -1, -1, -1,
46a0: 20 2d 31 2c 20 20 20 2d 31 2c 20 2d 31 2c 20 2d   -1,   -1, -1, -
46b0: 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d  1, -1, -1, -1, -
46c0: 31 2c 20 2d 31 2c 0a 20 20 20 20 2d 31 2c 20 2d  1, -1,.    -1, -
46d0: 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d  1, -1, -1, -1, -
46e0: 31 2c 20 2d 31 2c 20 2d 31 2c 20 20 20 2d 31 2c  1, -1, -1,   -1,
46f0: 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c   -1, -1, -1, -1,
4700: 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 0a 20 20 20   -1, -1, -1,.   
4710: 20 20 30 2c 20 20 31 2c 20 20 32 2c 20 20 33 2c    0,  1,  2,  3,
4720: 20 20 34 2c 20 20 35 2c 20 20 36 2c 20 20 37 2c    4,  5,  6,  7,
4730: 20 20 20 20 38 2c 20 20 39 2c 20 2d 31 2c 20 2d      8,  9, -1, -
4740: 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d  1, -1, -1, -1, -
4750: 31 2c 0a 20 20 20 20 2d 31 2c 20 31 30 2c 20 31  1,.    -1, 10, 1
4760: 31 2c 20 31 32 2c 20 31 33 2c 20 31 34 2c 20 31  1, 12, 13, 14, 1
4770: 35 2c 20 31 36 2c 20 20 20 31 37 2c 20 31 38 2c  5, 16,   17, 18,
4780: 20 31 39 2c 20 32 30 2c 20 32 31 2c 20 32 32 2c   19, 20, 21, 22,
4790: 20 32 33 2c 20 32 34 2c 0a 20 20 20 20 32 35 2c   23, 24,.    25,
47a0: 20 32 36 2c 20 32 37 2c 20 32 38 2c 20 32 39 2c   26, 27, 28, 29,
47b0: 20 33 30 2c 20 33 31 2c 20 33 32 2c 20 20 20 33   30, 31, 32,   3
47c0: 33 2c 20 33 34 2c 20 33 35 2c 20 2d 31 2c 20 2d  3, 34, 35, -1, -
47d0: 31 2c 20 2d 31 2c 20 2d 31 2c 20 33 36 2c 0a 20  1, -1, -1, 36,. 
47e0: 20 20 20 2d 31 2c 20 33 37 2c 20 33 38 2c 20 33     -1, 37, 38, 3
47f0: 39 2c 20 34 30 2c 20 34 31 2c 20 34 32 2c 20 34  9, 40, 41, 42, 4
4800: 33 2c 20 20 20 34 34 2c 20 34 35 2c 20 34 36 2c  3,   44, 45, 46,
4810: 20 34 37 2c 20 34 38 2c 20 34 39 2c 20 35 30 2c   47, 48, 49, 50,
4820: 20 35 31 2c 0a 20 20 20 20 35 32 2c 20 35 33 2c   51,.    52, 53,
4830: 20 35 34 2c 20 35 35 2c 20 35 36 2c 20 35 37 2c   54, 55, 56, 57,
4840: 20 35 38 2c 20 35 39 2c 20 20 20 36 30 2c 20 36   58, 59,   60, 6
4850: 31 2c 20 36 32 2c 20 2d 31 2c 20 2d 31 2c 20 2d  1, 62, -1, -1, -
4860: 31 2c 20 36 33 2c 20 2d 31 2c 0a 20 20 7d 3b 0a  1, 63, -1,.  };.
4870: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 76    unsigned int v
4880: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63 3b 0a 20   = 0;.  int c;. 
4890: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
48a0: 7a 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  z = (unsigned ch
48b0: 61 72 2a 29 2a 70 7a 3b 0a 20 20 75 6e 73 69 67  ar*)*pz;.  unsig
48c0: 6e 65 64 20 63 68 61 72 20 2a 7a 53 74 61 72 74  ned char *zStart
48d0: 20 3d 20 7a 3b 0a 20 20 77 68 69 6c 65 28 20 28   = z;.  while( (
48e0: 63 20 3d 20 7a 56 61 6c 75 65 5b 30 78 37 66 26  c = zValue[0x7f&
48f0: 2a 28 7a 2b 2b 29 5d 29 3e 3d 30 20 29 7b 0a 20  *(z++)])>=0 ){. 
4900: 20 20 20 20 76 20 3d 20 28 76 3c 3c 36 29 20 2b      v = (v<<6) +
4910: 20 63 3b 0a 20 20 7d 0a 20 20 7a 2d 2d 3b 0a 20   c;.  }.  z--;. 
4920: 20 2a 70 4c 65 6e 20 2d 3d 20 7a 20 2d 20 7a 53   *pLen -= z - zS
4930: 74 61 72 74 3b 0a 20 20 2a 70 7a 20 3d 20 28 63  tart;.  *pz = (c
4940: 68 61 72 2a 29 7a 3b 0a 20 20 72 65 74 75 72 6e  har*)z;.  return
4950: 20 76 3b 0a 7d 0a 0a 23 69 66 20 52 42 55 5f 45   v;.}..#if RBU_E
4960: 4e 41 42 4c 45 5f 44 45 4c 54 41 5f 43 4b 53 55  NABLE_DELTA_CKSU
4970: 4d 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  M./*.** Compute 
4980: 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75  a 32-bit checksu
4990: 6d 20 6f 6e 20 74 68 65 20 4e 2d 62 79 74 65 20  m on the N-byte 
49a0: 62 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20  buffer.  Return 
49b0: 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73  the result..*/.s
49c0: 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69  tatic unsigned i
49d0: 6e 74 20 72 62 75 44 65 6c 74 61 43 68 65 63 6b  nt rbuDeltaCheck
49e0: 73 75 6d 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  sum(const char *
49f0: 7a 49 6e 2c 20 73 69 7a 65 5f 74 20 4e 29 7b 0a  zIn, size_t N){.
4a00: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
4a10: 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73   char *z = (cons
4a20: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
4a30: 2a 29 7a 49 6e 3b 0a 20 20 75 6e 73 69 67 6e 65  *)zIn;.  unsigne
4a40: 64 20 73 75 6d 30 20 3d 20 30 3b 0a 20 20 75 6e  d sum0 = 0;.  un
4a50: 73 69 67 6e 65 64 20 73 75 6d 31 20 3d 20 30 3b  signed sum1 = 0;
4a60: 0a 20 20 75 6e 73 69 67 6e 65 64 20 73 75 6d 32  .  unsigned sum2
4a70: 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64   = 0;.  unsigned
4a80: 20 73 75 6d 33 20 3d 20 30 3b 0a 20 20 77 68 69   sum3 = 0;.  whi
4a90: 6c 65 28 4e 20 3e 3d 20 31 36 29 7b 0a 20 20 20  le(N >= 16){.   
4aa0: 20 73 75 6d 30 20 2b 3d 20 28 28 75 6e 73 69 67   sum0 += ((unsig
4ab0: 6e 65 64 29 7a 5b 30 5d 20 2b 20 7a 5b 34 5d 20  ned)z[0] + z[4] 
4ac0: 2b 20 7a 5b 38 5d 20 2b 20 7a 5b 31 32 5d 29 3b  + z[8] + z[12]);
4ad0: 0a 20 20 20 20 73 75 6d 31 20 2b 3d 20 28 28 75  .    sum1 += ((u
4ae0: 6e 73 69 67 6e 65 64 29 7a 5b 31 5d 20 2b 20 7a  nsigned)z[1] + z
4af0: 5b 35 5d 20 2b 20 7a 5b 39 5d 20 2b 20 7a 5b 31  [5] + z[9] + z[1
4b00: 33 5d 29 3b 0a 20 20 20 20 73 75 6d 32 20 2b 3d  3]);.    sum2 +=
4b10: 20 28 28 75 6e 73 69 67 6e 65 64 29 7a 5b 32 5d   ((unsigned)z[2]
4b20: 20 2b 20 7a 5b 36 5d 20 2b 20 7a 5b 31 30 5d 2b   + z[6] + z[10]+
4b30: 20 7a 5b 31 34 5d 29 3b 0a 20 20 20 20 73 75 6d   z[14]);.    sum
4b40: 33 20 2b 3d 20 28 28 75 6e 73 69 67 6e 65 64 29  3 += ((unsigned)
4b50: 7a 5b 33 5d 20 2b 20 7a 5b 37 5d 20 2b 20 7a 5b  z[3] + z[7] + z[
4b60: 31 31 5d 2b 20 7a 5b 31 35 5d 29 3b 0a 20 20 20  11]+ z[15]);.   
4b70: 20 7a 20 2b 3d 20 31 36 3b 0a 20 20 20 20 4e 20   z += 16;.    N 
4b80: 2d 3d 20 31 36 3b 0a 20 20 7d 0a 20 20 77 68 69  -= 16;.  }.  whi
4b90: 6c 65 28 4e 20 3e 3d 20 34 29 7b 0a 20 20 20 20  le(N >= 4){.    
4ba0: 73 75 6d 30 20 2b 3d 20 7a 5b 30 5d 3b 0a 20 20  sum0 += z[0];.  
4bb0: 20 20 73 75 6d 31 20 2b 3d 20 7a 5b 31 5d 3b 0a    sum1 += z[1];.
4bc0: 20 20 20 20 73 75 6d 32 20 2b 3d 20 7a 5b 32 5d      sum2 += z[2]
4bd0: 3b 0a 20 20 20 20 73 75 6d 33 20 2b 3d 20 7a 5b  ;.    sum3 += z[
4be0: 33 5d 3b 0a 20 20 20 20 7a 20 2b 3d 20 34 3b 0a  3];.    z += 4;.
4bf0: 20 20 20 20 4e 20 2d 3d 20 34 3b 0a 20 20 7d 0a      N -= 4;.  }.
4c00: 20 20 73 75 6d 33 20 2b 3d 20 28 73 75 6d 32 20    sum3 += (sum2 
4c10: 3c 3c 20 38 29 20 2b 20 28 73 75 6d 31 20 3c 3c  << 8) + (sum1 <<
4c20: 20 31 36 29 20 2b 20 28 73 75 6d 30 20 3c 3c 20   16) + (sum0 << 
4c30: 32 34 29 3b 0a 20 20 73 77 69 74 63 68 28 4e 29  24);.  switch(N)
4c40: 7b 0a 20 20 20 20 63 61 73 65 20 33 3a 20 20 20  {.    case 3:   
4c50: 73 75 6d 33 20 2b 3d 20 28 7a 5b 32 5d 20 3c 3c  sum3 += (z[2] <<
4c60: 20 38 29 3b 0a 20 20 20 20 63 61 73 65 20 32 3a   8);.    case 2:
4c70: 20 20 20 73 75 6d 33 20 2b 3d 20 28 7a 5b 31 5d     sum3 += (z[1]
4c80: 20 3c 3c 20 31 36 29 3b 0a 20 20 20 20 63 61 73   << 16);.    cas
4c90: 65 20 31 3a 20 20 20 73 75 6d 33 20 2b 3d 20 28  e 1:   sum3 += (
4ca0: 7a 5b 30 5d 20 3c 3c 20 32 34 29 3b 0a 20 20 20  z[0] << 24);.   
4cb0: 20 64 65 66 61 75 6c 74 3a 20 20 3b 0a 20 20 7d   default:  ;.  }
4cc0: 0a 20 20 72 65 74 75 72 6e 20 73 75 6d 33 3b 0a  .  return sum3;.
4cd0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
4ce0: 41 70 70 6c 79 20 61 20 64 65 6c 74 61 2e 0a 2a  Apply a delta..*
4cf0: 2a 0a 2a 2a 20 54 68 65 20 6f 75 74 70 75 74 20  *.** The output 
4d00: 62 75 66 66 65 72 20 73 68 6f 75 6c 64 20 62 65  buffer should be
4d10: 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68   big enough to h
4d20: 6f 6c 64 20 74 68 65 20 77 68 6f 6c 65 20 6f 75  old the whole ou
4d30: 74 70 75 74 0a 2a 2a 20 66 69 6c 65 20 61 6e 64  tput.** file and
4d40: 20 61 20 4e 55 4c 20 74 65 72 6d 69 6e 61 74 6f   a NUL terminato
4d50: 72 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54  r at the end.  T
4d60: 68 65 20 64 65 6c 74 61 5f 6f 75 74 70 75 74 5f  he delta_output_
4d70: 73 69 7a 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  size().** routin
4d80: 65 20 77 69 6c 6c 20 64 65 74 65 72 6d 69 6e 65  e will determine
4d90: 20 74 68 69 73 20 73 69 7a 65 20 66 6f 72 20 79   this size for y
4da0: 6f 75 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  ou..**.** The de
4db0: 6c 74 61 20 73 74 72 69 6e 67 20 73 68 6f 75 6c  lta string shoul
4dc0: 64 20 62 65 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e  d be null-termin
4dd0: 61 74 65 64 2e 20 20 42 75 74 20 74 68 65 20 64  ated.  But the d
4de0: 65 6c 74 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6d  elta string.** m
4df0: 61 79 20 63 6f 6e 74 61 69 6e 20 65 6d 62 65 64  ay contain embed
4e00: 64 65 64 20 4e 55 4c 20 63 68 61 72 61 63 74 65  ded NUL characte
4e10: 72 73 20 28 69 66 20 74 68 65 20 69 6e 70 75 74  rs (if the input
4e20: 20 61 6e 64 20 6f 75 74 70 75 74 20 61 72 65 0a   and output are.
4e30: 2a 2a 20 62 69 6e 61 72 79 20 66 69 6c 65 73 29  ** binary files)
4e40: 20 73 6f 20 77 65 20 61 6c 73 6f 20 68 61 76 65   so we also have
4e50: 20 74 6f 20 70 61 73 73 20 69 6e 20 74 68 65 20   to pass in the 
4e60: 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64 65  length of the de
4e70: 6c 74 61 20 69 6e 0a 2a 2a 20 74 68 65 20 6c 65  lta in.** the le
4e80: 6e 44 65 6c 74 61 20 70 61 72 61 6d 65 74 65 72  nDelta parameter
4e90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
4ea0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
4eb0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6f 75  e size of the ou
4ec0: 74 70 75 74 20 66 69 6c 65 20 69 6e 20 62 79 74  tput file in byt
4ed0: 65 73 20 28 65 78 63 6c 75 64 69 6e 67 0a 2a 2a  es (excluding.**
4ee0: 20 74 68 65 20 66 69 6e 61 6c 20 4e 55 4c 20 74   the final NUL t
4ef0: 65 72 6d 69 6e 61 74 6f 72 20 63 68 61 72 61 63  erminator charac
4f00: 74 65 72 29 2e 20 20 45 78 63 65 70 74 2c 20 69  ter).  Except, i
4f10: 66 20 74 68 65 20 64 65 6c 74 61 20 73 74 72 69  f the delta stri
4f20: 6e 67 20 69 73 0a 2a 2a 20 6d 61 6c 66 6f 72 6d  ng is.** malform
4f30: 65 64 20 6f 72 20 69 6e 74 65 6e 64 65 64 20 66  ed or intended f
4f40: 6f 72 20 75 73 65 20 77 69 74 68 20 61 20 73 6f  or use with a so
4f50: 75 72 63 65 20 66 69 6c 65 20 6f 74 68 65 72 20  urce file other 
4f60: 74 68 61 6e 20 7a 53 72 63 2c 0a 2a 2a 20 74 68  than zSrc,.** th
4f70: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
4f80: 72 65 74 75 72 6e 73 20 2d 31 2e 0a 2a 2a 0a 2a  returns -1..**.*
4f90: 2a 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 64  * Refer to the d
4fa0: 65 6c 74 61 5f 63 72 65 61 74 65 28 29 20 64 6f  elta_create() do
4fb0: 63 75 6d 65 6e 74 61 74 69 6f 6e 20 61 62 6f 76  cumentation abov
4fc0: 65 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74  e for a descript
4fd0: 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 65  ion.** of the de
4fe0: 6c 74 61 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e  lta file format.
4ff0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
5000: 62 75 44 65 6c 74 61 41 70 70 6c 79 28 0a 20 20  buDeltaApply(.  
5010: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 72 63  const char *zSrc
5020: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6f  ,      /* The so
5030: 75 72 63 65 20 6f 72 20 70 61 74 74 65 72 6e 20  urce or pattern 
5040: 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6c 65  file */.  int le
5050: 6e 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20  nSrc,           
5060: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68   /* Length of th
5070: 65 20 73 6f 75 72 63 65 20 66 69 6c 65 20 2a 2f  e source file */
5080: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5090: 44 65 6c 74 61 2c 20 20 20 20 2f 2a 20 44 65 6c  Delta,    /* Del
50a0: 74 61 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 74  ta to apply to t
50b0: 68 65 20 70 61 74 74 65 72 6e 20 2a 2f 0a 20 20  he pattern */.  
50c0: 69 6e 74 20 6c 65 6e 44 65 6c 74 61 2c 20 20 20  int lenDelta,   
50d0: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
50e0: 20 6f 66 20 74 68 65 20 64 65 6c 74 61 20 2a 2f   of the delta */
50f0: 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 20 20  .  char *zOut   
5100: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
5110: 74 65 20 74 68 65 20 6f 75 74 70 75 74 20 69 6e  te the output in
5120: 74 6f 20 74 68 69 73 20 70 72 65 61 6c 6c 6f 63  to this prealloc
5130: 61 74 65 64 20 62 75 66 66 65 72 20 2a 2f 0a 29  ated buffer */.)
5140: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  {.  unsigned int
5150: 20 6c 69 6d 69 74 3b 0a 20 20 75 6e 73 69 67 6e   limit;.  unsign
5160: 65 64 20 69 6e 74 20 74 6f 74 61 6c 20 3d 20 30  ed int total = 0
5170: 3b 0a 23 69 66 20 52 42 55 5f 45 4e 41 42 4c 45  ;.#if RBU_ENABLE
5180: 5f 44 45 4c 54 41 5f 43 4b 53 55 4d 0a 20 20 63  _DELTA_CKSUM.  c
5190: 68 61 72 20 2a 7a 4f 72 69 67 4f 75 74 20 3d 20  har *zOrigOut = 
51a0: 7a 4f 75 74 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  zOut;.#endif..  
51b0: 6c 69 6d 69 74 20 3d 20 72 62 75 44 65 6c 74 61  limit = rbuDelta
51c0: 47 65 74 49 6e 74 28 26 7a 44 65 6c 74 61 2c 20  GetInt(&zDelta, 
51d0: 26 6c 65 6e 44 65 6c 74 61 29 3b 0a 20 20 69 66  &lenDelta);.  if
51e0: 28 20 2a 7a 44 65 6c 74 61 21 3d 27 5c 6e 27 20  ( *zDelta!='\n' 
51f0: 29 7b 0a 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a  ){.    /* ERROR:
5200: 20 73 69 7a 65 20 69 6e 74 65 67 65 72 20 6e 6f   size integer no
5210: 74 20 74 65 72 6d 69 6e 61 74 65 64 20 62 79 20  t terminated by 
5220: 22 5c 6e 22 20 2a 2f 0a 20 20 20 20 72 65 74 75  "\n" */.    retu
5230: 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 7a 44 65  rn -1;.  }.  zDe
5240: 6c 74 61 2b 2b 3b 20 6c 65 6e 44 65 6c 74 61 2d  lta++; lenDelta-
5250: 2d 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 44 65  -;.  while( *zDe
5260: 6c 74 61 20 26 26 20 6c 65 6e 44 65 6c 74 61 3e  lta && lenDelta>
5270: 30 20 29 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65  0 ){.    unsigne
5280: 64 20 69 6e 74 20 63 6e 74 2c 20 6f 66 73 74 3b  d int cnt, ofst;
5290: 0a 20 20 20 20 63 6e 74 20 3d 20 72 62 75 44 65  .    cnt = rbuDe
52a0: 6c 74 61 47 65 74 49 6e 74 28 26 7a 44 65 6c 74  ltaGetInt(&zDelt
52b0: 61 2c 20 26 6c 65 6e 44 65 6c 74 61 29 3b 0a 20  a, &lenDelta);. 
52c0: 20 20 20 73 77 69 74 63 68 28 20 7a 44 65 6c 74     switch( zDelt
52d0: 61 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 63 61  a[0] ){.      ca
52e0: 73 65 20 27 40 27 3a 20 7b 0a 20 20 20 20 20 20  se '@': {.      
52f0: 20 20 7a 44 65 6c 74 61 2b 2b 3b 20 6c 65 6e 44    zDelta++; lenD
5300: 65 6c 74 61 2d 2d 3b 0a 20 20 20 20 20 20 20 20  elta--;.        
5310: 6f 66 73 74 20 3d 20 72 62 75 44 65 6c 74 61 47  ofst = rbuDeltaG
5320: 65 74 49 6e 74 28 26 7a 44 65 6c 74 61 2c 20 26  etInt(&zDelta, &
5330: 6c 65 6e 44 65 6c 74 61 29 3b 0a 20 20 20 20 20  lenDelta);.     
5340: 20 20 20 69 66 28 20 6c 65 6e 44 65 6c 74 61 3e     if( lenDelta>
5350: 30 20 26 26 20 7a 44 65 6c 74 61 5b 30 5d 21 3d  0 && zDelta[0]!=
5360: 27 2c 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ',' ){.         
5370: 20 2f 2a 20 45 52 52 4f 52 3a 20 63 6f 70 79 20   /* ERROR: copy 
5380: 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 74 65 72 6d  command not term
5390: 69 6e 61 74 65 64 20 62 79 20 27 2c 27 20 2a 2f  inated by ',' */
53a0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
53b0: 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n -1;.        }.
53c0: 20 20 20 20 20 20 20 20 7a 44 65 6c 74 61 2b 2b          zDelta++
53d0: 3b 20 6c 65 6e 44 65 6c 74 61 2d 2d 3b 0a 20 20  ; lenDelta--;.  
53e0: 20 20 20 20 20 20 74 6f 74 61 6c 20 2b 3d 20 63        total += c
53f0: 6e 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  nt;.        if( 
5400: 74 6f 74 61 6c 3e 6c 69 6d 69 74 20 29 7b 0a 20  total>limit ){. 
5410: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 52 52 4f           /* ERRO
5420: 52 3a 20 63 6f 70 79 20 65 78 63 65 65 64 73 20  R: copy exceeds 
5430: 6f 75 74 70 75 74 20 66 69 6c 65 20 73 69 7a 65  output file size
5440: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65   */.          re
5450: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20  turn -1;.       
5460: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28   }.        if( (
5470: 69 6e 74 29 28 6f 66 73 74 2b 63 6e 74 29 20 3e  int)(ofst+cnt) >
5480: 20 6c 65 6e 53 72 63 20 29 7b 0a 20 20 20 20 20   lenSrc ){.     
5490: 20 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20 63       /* ERROR: c
54a0: 6f 70 79 20 65 78 74 65 6e 64 73 20 70 61 73 74  opy extends past
54b0: 20 65 6e 64 20 6f 66 20 69 6e 70 75 74 20 2a 2f   end of input */
54c0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
54d0: 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n -1;.        }.
54e0: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a          memcpy(z
54f0: 4f 75 74 2c 20 26 7a 53 72 63 5b 6f 66 73 74 5d  Out, &zSrc[ofst]
5500: 2c 20 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  , cnt);.        
5510: 7a 4f 75 74 20 2b 3d 20 63 6e 74 3b 0a 20 20 20  zOut += cnt;.   
5520: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5530: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 27    }.      case '
5540: 3a 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 7a 44  :': {.        zD
5550: 65 6c 74 61 2b 2b 3b 20 6c 65 6e 44 65 6c 74 61  elta++; lenDelta
5560: 2d 2d 3b 0a 20 20 20 20 20 20 20 20 74 6f 74 61  --;.        tota
5570: 6c 20 2b 3d 20 63 6e 74 3b 0a 20 20 20 20 20 20  l += cnt;.      
5580: 20 20 69 66 28 20 74 6f 74 61 6c 3e 6c 69 6d 69    if( total>limi
5590: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  t ){.          /
55a0: 2a 20 45 52 52 4f 52 3a 20 20 69 6e 73 65 72 74  * ERROR:  insert
55b0: 20 63 6f 6d 6d 61 6e 64 20 67 69 76 65 73 20 61   command gives a
55c0: 6e 20 6f 75 74 70 75 74 20 6c 61 72 67 65 72 20  n output larger 
55d0: 74 68 61 6e 20 70 72 65 64 69 63 74 65 64 20 2a  than predicted *
55e0: 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  /.          retu
55f0: 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d  rn -1;.        }
5600: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 69 6e  .        if( (in
5610: 74 29 63 6e 74 3e 6c 65 6e 44 65 6c 74 61 20 29  t)cnt>lenDelta )
5620: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  {.          /* E
5630: 52 52 4f 52 3a 20 69 6e 73 65 72 74 20 63 6f 75  RROR: insert cou
5640: 6e 74 20 65 78 63 65 65 64 73 20 73 69 7a 65 20  nt exceeds size 
5650: 6f 66 20 64 65 6c 74 61 20 2a 2f 0a 20 20 20 20  of delta */.    
5660: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
5670: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5680: 20 20 20 6d 65 6d 63 70 79 28 7a 4f 75 74 2c 20     memcpy(zOut, 
5690: 7a 44 65 6c 74 61 2c 20 63 6e 74 29 3b 0a 20 20  zDelta, cnt);.  
56a0: 20 20 20 20 20 20 7a 4f 75 74 20 2b 3d 20 63 6e        zOut += cn
56b0: 74 3b 0a 20 20 20 20 20 20 20 20 7a 44 65 6c 74  t;.        zDelt
56c0: 61 20 2b 3d 20 63 6e 74 3b 0a 20 20 20 20 20 20  a += cnt;.      
56d0: 20 20 6c 65 6e 44 65 6c 74 61 20 2d 3d 20 63 6e    lenDelta -= cn
56e0: 74 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  t;.        break
56f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5700: 63 61 73 65 20 27 3b 27 3a 20 7b 0a 20 20 20 20  case ';': {.    
5710: 20 20 20 20 7a 44 65 6c 74 61 2b 2b 3b 20 6c 65      zDelta++; le
5720: 6e 44 65 6c 74 61 2d 2d 3b 0a 20 20 20 20 20 20  nDelta--;.      
5730: 20 20 7a 4f 75 74 5b 30 5d 20 3d 20 30 3b 0a 23    zOut[0] = 0;.#
5740: 69 66 20 52 42 55 5f 45 4e 41 42 4c 45 5f 44 45  if RBU_ENABLE_DE
5750: 4c 54 41 5f 43 4b 53 55 4d 0a 20 20 20 20 20 20  LTA_CKSUM.      
5760: 20 20 69 66 28 20 63 6e 74 21 3d 72 62 75 44 65    if( cnt!=rbuDe
5770: 6c 74 61 43 68 65 63 6b 73 75 6d 28 7a 4f 72 69  ltaChecksum(zOri
5780: 67 4f 75 74 2c 20 74 6f 74 61 6c 29 20 29 7b 0a  gOut, total) ){.
5790: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 52 52            /* ERR
57a0: 4f 52 3a 20 20 62 61 64 20 63 68 65 63 6b 73 75  OR:  bad checksu
57b0: 6d 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  m */.          r
57c0: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
57d0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
57e0: 20 20 20 69 66 28 20 74 6f 74 61 6c 21 3d 6c 69     if( total!=li
57f0: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  mit ){.         
5800: 20 2f 2a 20 45 52 52 4f 52 3a 20 67 65 6e 65 72   /* ERROR: gener
5810: 61 74 65 64 20 73 69 7a 65 20 64 6f 65 73 20 6e  ated size does n
5820: 6f 74 20 6d 61 74 63 68 20 70 72 65 64 69 63 74  ot match predict
5830: 65 64 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20  ed size */.     
5840: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
5850: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5860: 20 20 72 65 74 75 72 6e 20 74 6f 74 61 6c 3b 0a    return total;.
5870: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65        }.      de
5880: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20  fault: {.       
5890: 20 2f 2a 20 45 52 52 4f 52 3a 20 75 6e 6b 6e 6f   /* ERROR: unkno
58a0: 77 6e 20 64 65 6c 74 61 20 6f 70 65 72 61 74 6f  wn delta operato
58b0: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74  r */.        ret
58c0: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  urn -1;.      }.
58d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 45      }.  }.  /* E
58e0: 52 52 4f 52 3a 20 75 6e 74 65 72 6d 69 6e 61 74  RROR: unterminat
58f0: 65 64 20 64 65 6c 74 61 20 2a 2f 0a 20 20 72 65  ed delta */.  re
5900: 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 73 74 61 74  turn -1;.}..stat
5910: 69 63 20 69 6e 74 20 72 62 75 44 65 6c 74 61 4f  ic int rbuDeltaO
5920: 75 74 70 75 74 53 69 7a 65 28 63 6f 6e 73 74 20  utputSize(const 
5930: 63 68 61 72 20 2a 7a 44 65 6c 74 61 2c 20 69 6e  char *zDelta, in
5940: 74 20 6c 65 6e 44 65 6c 74 61 29 7b 0a 20 20 69  t lenDelta){.  i
5950: 6e 74 20 73 69 7a 65 3b 0a 20 20 73 69 7a 65 20  nt size;.  size 
5960: 3d 20 72 62 75 44 65 6c 74 61 47 65 74 49 6e 74  = rbuDeltaGetInt
5970: 28 26 7a 44 65 6c 74 61 2c 20 26 6c 65 6e 44 65  (&zDelta, &lenDe
5980: 6c 74 61 29 3b 0a 20 20 69 66 28 20 2a 7a 44 65  lta);.  if( *zDe
5990: 6c 74 61 21 3d 27 5c 6e 27 20 29 7b 0a 20 20 20  lta!='\n' ){.   
59a0: 20 2f 2a 20 45 52 52 4f 52 3a 20 73 69 7a 65 20   /* ERROR: size 
59b0: 69 6e 74 65 67 65 72 20 6e 6f 74 20 74 65 72 6d  integer not term
59c0: 69 6e 61 74 65 64 20 62 79 20 22 5c 6e 22 20 2a  inated by "\n" *
59d0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  /.    return -1;
59e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 69  .  }.  return si
59f0: 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64  ze;.}../*.** End
5a00: 20 6f 66 20 63 6f 64 65 20 74 61 6b 65 6e 20 66   of code taken f
5a10: 72 6f 6d 20 66 6f 73 73 69 6c 2e 0a 2a 2a 2a 2a  rom fossil..****
5a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a60: 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d  *****/../*.** Im
5a70: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
5a80: 53 51 4c 20 73 63 61 6c 61 72 20 66 75 6e 63 74  SQL scalar funct
5a90: 69 6f 6e 20 72 62 75 5f 66 6f 73 73 69 6c 5f 64  ion rbu_fossil_d
5aa0: 65 6c 74 61 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  elta()..**.** Th
5ab0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 6c  is function appl
5ac0: 69 65 73 20 61 20 66 6f 73 73 69 6c 20 64 65 6c  ies a fossil del
5ad0: 74 61 20 70 61 74 63 68 20 74 6f 20 61 20 62 6c  ta patch to a bl
5ae0: 6f 62 2e 20 45 78 61 63 74 6c 79 20 74 77 6f 0a  ob. Exactly two.
5af0: 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 6d 75 73  ** arguments mus
5b00: 74 20 62 65 20 70 61 73 73 65 64 20 74 6f 20 74  t be passed to t
5b10: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68  his function. Th
5b20: 65 20 66 69 72 73 74 20 69 73 20 74 68 65 20 62  e first is the b
5b30: 6c 6f 62 20 74 6f 0a 2a 2a 20 70 61 74 63 68 20  lob to.** patch 
5b40: 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 74  and the second t
5b50: 68 65 20 70 61 74 63 68 20 74 6f 20 61 70 70 6c  he patch to appl
5b60: 79 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f  y. If no error o
5b70: 63 63 75 72 73 2c 20 74 68 69 73 0a 2a 2a 20 66  ccurs, this.** f
5b80: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
5b90: 74 68 65 20 70 61 74 63 68 65 64 20 62 6c 6f 62  the patched blob
5ba0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5bb0: 20 72 62 75 46 6f 73 73 69 6c 44 65 6c 74 61 46   rbuFossilDeltaF
5bc0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
5bd0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
5be0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
5bf0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
5c00: 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63  rgv.){.  const c
5c10: 68 61 72 20 2a 61 44 65 6c 74 61 3b 0a 20 20 69  har *aDelta;.  i
5c20: 6e 74 20 6e 44 65 6c 74 61 3b 0a 20 20 63 6f 6e  nt nDelta;.  con
5c30: 73 74 20 63 68 61 72 20 2a 61 4f 72 69 67 3b 0a  st char *aOrig;.
5c40: 20 20 69 6e 74 20 6e 4f 72 69 67 3b 0a 0a 20 20    int nOrig;..  
5c50: 69 6e 74 20 6e 4f 75 74 3b 0a 20 20 69 6e 74 20  int nOut;.  int 
5c60: 6e 4f 75 74 32 3b 0a 20 20 63 68 61 72 20 2a 61  nOut2;.  char *a
5c70: 4f 75 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Out;..  assert( 
5c80: 61 72 67 63 3d 3d 32 20 29 3b 0a 0a 20 20 6e 4f  argc==2 );..  nO
5c90: 72 69 67 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  rig = sqlite3_va
5ca0: 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30  lue_bytes(argv[0
5cb0: 5d 29 3b 0a 20 20 61 4f 72 69 67 20 3d 20 28 63  ]);.  aOrig = (c
5cc0: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
5cd0: 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72  e3_value_blob(ar
5ce0: 67 76 5b 30 5d 29 3b 0a 20 20 6e 44 65 6c 74 61  gv[0]);.  nDelta
5cf0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
5d00: 5f 62 79 74 65 73 28 61 72 67 76 5b 31 5d 29 3b  _bytes(argv[1]);
5d10: 0a 20 20 61 44 65 6c 74 61 20 3d 20 28 63 6f 6e  .  aDelta = (con
5d20: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
5d30: 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76  _value_blob(argv
5d40: 5b 31 5d 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75  [1]);..  /* Figu
5d50: 72 65 20 6f 75 74 20 74 68 65 20 73 69 7a 65 20  re out the size 
5d60: 6f 66 20 74 68 65 20 6f 75 74 70 75 74 20 2a 2f  of the output */
5d70: 0a 20 20 6e 4f 75 74 20 3d 20 72 62 75 44 65 6c  .  nOut = rbuDel
5d80: 74 61 4f 75 74 70 75 74 53 69 7a 65 28 61 44 65  taOutputSize(aDe
5d90: 6c 74 61 2c 20 6e 44 65 6c 74 61 29 3b 0a 20 20  lta, nDelta);.  
5da0: 69 66 28 20 6e 4f 75 74 3c 30 20 29 7b 0a 20 20  if( nOut<0 ){.  
5db0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
5dc0: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
5dd0: 22 63 6f 72 72 75 70 74 20 66 6f 73 73 69 6c 20  "corrupt fossil 
5de0: 64 65 6c 74 61 22 2c 20 2d 31 29 3b 0a 20 20 20  delta", -1);.   
5df0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
5e00: 61 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d  aOut = sqlite3_m
5e10: 61 6c 6c 6f 63 28 6e 4f 75 74 2b 31 29 3b 0a 20  alloc(nOut+1);. 
5e20: 20 69 66 28 20 61 4f 75 74 3d 3d 30 20 29 7b 0a   if( aOut==0 ){.
5e30: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
5e40: 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63  lt_error_nomem(c
5e50: 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 65 6c 73 65  ontext);.  }else
5e60: 7b 0a 20 20 20 20 6e 4f 75 74 32 20 3d 20 72 62  {.    nOut2 = rb
5e70: 75 44 65 6c 74 61 41 70 70 6c 79 28 61 4f 72 69  uDeltaApply(aOri
5e80: 67 2c 20 6e 4f 72 69 67 2c 20 61 44 65 6c 74 61  g, nOrig, aDelta
5e90: 2c 20 6e 44 65 6c 74 61 2c 20 61 4f 75 74 29 3b  , nDelta, aOut);
5ea0: 0a 20 20 20 20 69 66 28 20 6e 4f 75 74 32 21 3d  .    if( nOut2!=
5eb0: 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 73 71  nOut ){.      sq
5ec0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
5ed0: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 63 6f 72  or(context, "cor
5ee0: 72 75 70 74 20 66 6f 73 73 69 6c 20 64 65 6c 74  rupt fossil delt
5ef0: 61 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 65 6c  a", -1);.    }el
5f00: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
5f10: 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28 63 6f  3_result_blob(co
5f20: 6e 74 65 78 74 2c 20 61 4f 75 74 2c 20 6e 4f 75  ntext, aOut, nOu
5f30: 74 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29  t, sqlite3_free)
5f40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a  ;.    }.  }.}...
5f50: 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 74 68  /*.** Prepare th
5f60: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
5f70: 69 6e 20 62 75 66 66 65 72 20 7a 53 71 6c 20 61  in buffer zSql a
5f80: 67 61 69 6e 73 74 20 64 61 74 61 62 61 73 65 20  gainst database 
5f90: 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2a 20 49 66  handle db..** If
5fa0: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74   successful, set
5fb0: 20 2a 70 70 53 74 6d 74 20 74 6f 20 70 6f 69 6e   *ppStmt to poin
5fc0: 74 20 74 6f 20 74 68 65 20 6e 65 77 20 73 74 61  t to the new sta
5fd0: 74 65 6d 65 6e 74 20 61 6e 64 20 72 65 74 75 72  tement and retur
5fe0: 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  n.** SQLITE_OK. 
5ff0: 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
6000: 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 64 6f  , if an error do
6010: 65 73 20 6f 63 63 75 72 2c 20 73 65 74 20 2a 70  es occur, set *p
6020: 70 53 74 6d 74 20 74 6f 20 4e 55 4c 4c 20 61 6e  pStmt to NULL an
6030: 64 20 72 65 74 75 72 6e 0a 2a 2a 20 61 6e 20 53  d return.** an S
6040: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
6050: 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  . Additionally, 
6060: 73 65 74 20 6f 75 74 70 75 74 20 76 61 72 69 61  set output varia
6070: 62 6c 65 20 2a 70 7a 45 72 72 6d 73 67 20 74 6f  ble *pzErrmsg to
6080: 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20 62  .** point to a b
6090: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
60a0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
60b0: 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73  e. It is the res
60c0: 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 6f  ponsibility.** o
60d0: 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
60e0: 28 65 76 65 6e 74 75 61 6c 6c 79 29 20 66 72 65  (eventually) fre
60f0: 65 20 74 68 69 73 20 62 75 66 66 65 72 20 75 73  e this buffer us
6100: 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ing sqlite3_free
6110: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
6120: 74 20 70 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c  t prepareAndColl
6130: 65 63 74 45 72 72 6f 72 28 0a 20 20 73 71 6c 69  ectError(.  sqli
6140: 74 65 33 20 2a 64 62 2c 20 0a 20 20 73 71 6c 69  te3 *db, .  sqli
6150: 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d  te3_stmt **ppStm
6160: 74 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72  t,.  char **pzEr
6170: 72 6d 73 67 2c 0a 20 20 63 6f 6e 73 74 20 63 68  rmsg,.  const ch
6180: 61 72 20 2a 7a 53 71 6c 0a 29 7b 0a 20 20 69 6e  ar *zSql.){.  in
6190: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70  t rc = sqlite3_p
61a0: 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53  repare_v2(db, zS
61b0: 71 6c 2c 20 2d 31 2c 20 70 70 53 74 6d 74 2c 20  ql, -1, ppStmt, 
61c0: 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
61d0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
61e0: 70 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74  pzErrmsg = sqlit
61f0: 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
6200: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
6210: 64 62 29 29 3b 0a 20 20 20 20 2a 70 70 53 74 6d  db));.    *ppStm
6220: 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 0;.  }.  ret
6230: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
6240: 20 52 65 73 65 74 20 74 68 65 20 53 51 4c 20 73   Reset the SQL s
6250: 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20  tatement passed 
6260: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
6270: 75 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 61 20  ument. Return a 
6280: 63 6f 70 79 0a 2a 2a 20 6f 66 20 74 68 65 20 76  copy.** of the v
6290: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
62a0: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 29   sqlite3_reset()
62b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
62c0: 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
62d0: 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 7a 45 72  , then set *pzEr
62e0: 72 6d 73 67 20 74 6f 20 70 6f 69 6e 74 20 74 6f  rmsg to point to
62f0: 20 61 20 62 75 66 66 65 72 0a 2a 2a 20 63 6f 6e   a buffer.** con
6300: 74 61 69 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72  taining an error
6310: 20 6d 65 73 73 61 67 65 2e 20 49 74 20 69 73 20   message. It is 
6320: 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
6330: 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
6340: 0a 2a 2a 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  .** to eventuall
6350: 79 20 66 72 65 65 20 74 68 69 73 20 62 75 66 66  y free this buff
6360: 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  er using sqlite3
6370: 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  _free()..*/.stat
6380: 69 63 20 69 6e 74 20 72 65 73 65 74 41 6e 64 43  ic int resetAndC
6390: 6f 6c 6c 65 63 74 45 72 72 6f 72 28 73 71 6c 69  ollectError(sqli
63a0: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 2c  te3_stmt *pStmt,
63b0: 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 6d 73 67   char **pzErrmsg
63c0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71  ){.  int rc = sq
63d0: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
63e0: 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  t);.  if( rc!=SQ
63f0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
6400: 70 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74  pzErrmsg = sqlit
6410: 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
6420: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
6430: 73 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c  sqlite3_db_handl
6440: 65 28 70 53 74 6d 74 29 29 29 3b 0a 20 20 7d 0a  e(pStmt)));.  }.
6450: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
6460: 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 69 74 20  /*.** Unless it 
6470: 69 73 20 4e 55 4c 4c 2c 20 61 72 67 75 6d 65 6e  is NULL, argumen
6480: 74 20 7a 53 71 6c 20 70 6f 69 6e 74 73 20 74 6f  t zSql points to
6490: 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61   a buffer alloca
64a0: 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c  ted using.** sql
64b0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 20 63 6f 6e 74  ite3_malloc cont
64c0: 61 69 6e 69 6e 67 20 61 6e 20 53 51 4c 20 73 74  aining an SQL st
64d0: 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 66 75  atement. This fu
64e0: 6e 63 74 69 6f 6e 20 70 72 65 70 61 72 65 73 20  nction prepares 
64f0: 74 68 65 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65  the SQL.** state
6500: 6d 65 6e 74 20 61 67 61 69 6e 73 74 20 64 61 74  ment against dat
6510: 61 62 61 73 65 20 64 62 20 61 6e 64 20 66 72 65  abase db and fre
6520: 65 73 20 74 68 65 20 62 75 66 66 65 72 2e 20 49  es the buffer. I
6530: 66 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a 20  f statement .** 
6540: 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 69 73 20 73  compilation is s
6550: 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 70 53 74  uccessful, *ppSt
6560: 6d 74 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  mt is set to poi
6570: 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 73 74  nt to the new st
6580: 61 74 65 6d 65 6e 74 20 0a 2a 2a 20 68 61 6e 64  atement .** hand
6590: 6c 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  le and SQLITE_OK
65a0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a   is returned. .*
65b0: 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
65c0: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
65d0: 72 73 2c 20 2a 70 70 53 74 6d 74 20 69 73 20 73  rs, *ppStmt is s
65e0: 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 61  et to NULL and a
65f0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20  n error code.** 
6600: 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69  returned. In thi
6610: 73 20 63 61 73 65 2c 20 2a 70 7a 45 72 72 6d 73  s case, *pzErrms
6620: 67 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 73 65  g may also be se
6630: 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 6e  t to point to an
6640: 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67   error.** messag
6650: 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73  e. It is the res
6660: 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
6670: 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 66 72 65  he caller to fre
6680: 65 20 74 68 69 73 20 65 72 72 6f 72 20 6d 65 73  e this error mes
6690: 73 61 67 65 0a 2a 2a 20 62 75 66 66 65 72 20 75  sage.** buffer u
66a0: 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65  sing sqlite3_fre
66b0: 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72  e()..**.** If ar
66c0: 67 75 6d 65 6e 74 20 7a 53 71 6c 20 69 73 20 4e  gument zSql is N
66d0: 55 4c 4c 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ULL, this functi
66e0: 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  on assumes that 
66f0: 61 6e 20 4f 4f 4d 20 68 61 73 20 6f 63 63 75 72  an OOM has occur
6700: 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68 69 73 20  red..** In this 
6710: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  case SQLITE_NOME
6720: 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  M is returned an
6730: 64 20 2a 70 70 53 74 6d 74 20 73 65 74 20 74 6f  d *ppStmt set to
6740: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63   NULL..*/.static
6750: 20 69 6e 74 20 70 72 65 70 61 72 65 46 72 65 65   int prepareFree
6760: 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
6770: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
6780: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
6790: 2a 2a 70 70 53 74 6d 74 2c 0a 20 20 63 68 61 72  **ppStmt,.  char
67a0: 20 2a 2a 70 7a 45 72 72 6d 73 67 2c 0a 20 20 63   **pzErrmsg,.  c
67b0: 68 61 72 20 2a 7a 53 71 6c 0a 29 7b 0a 20 20 69  har *zSql.){.  i
67c0: 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
67d0: 20 2a 70 7a 45 72 72 6d 73 67 3d 3d 30 20 29 3b   *pzErrmsg==0 );
67e0: 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29  .  if( zSql==0 )
67f0: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
6800: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 2a 70 70  E_NOMEM;.    *pp
6810: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Stmt = 0;.  }els
6820: 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 72 65 70  e{.    rc = prep
6830: 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  areAndCollectErr
6840: 6f 72 28 64 62 2c 20 70 70 53 74 6d 74 2c 20 70  or(db, ppStmt, p
6850: 7a 45 72 72 6d 73 67 2c 20 7a 53 71 6c 29 3b 0a  zErrmsg, zSql);.
6860: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
6870: 28 7a 53 71 6c 29 3b 0a 20 20 7d 0a 20 20 72 65  (zSql);.  }.  re
6880: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
6890: 2a 20 46 72 65 65 20 74 68 65 20 52 62 75 4f 62  * Free the RbuOb
68a0: 6a 49 74 65 72 2e 61 7a 54 62 6c 43 6f 6c 5b 5d  jIter.azTblCol[]
68b0: 20 61 6e 64 20 52 62 75 4f 62 6a 49 74 65 72 2e   and RbuObjIter.
68c0: 61 62 54 62 6c 50 6b 5b 5d 20 61 72 72 61 79 73  abTblPk[] arrays
68d0: 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79   allocated.** by
68e0: 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c   an earlier call
68f0: 20 74 6f 20 72 62 75 4f 62 6a 49 74 65 72 43 61   to rbuObjIterCa
6900: 63 68 65 54 61 62 6c 65 49 6e 66 6f 28 29 2e 0a  cheTableInfo()..
6910: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
6920: 62 75 4f 62 6a 49 74 65 72 46 72 65 65 43 6f 6c  buObjIterFreeCol
6930: 73 28 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49  s(RbuObjIter *pI
6940: 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ter){.  int i;. 
6950: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65   for(i=0; i<pIte
6960: 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69 2b 2b 29  r->nTblCol; i++)
6970: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
6980: 65 65 28 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43  ee(pIter->azTblC
6990: 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 73 71 6c 69  ol[i]);.    sqli
69a0: 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 2d 3e  te3_free(pIter->
69b0: 61 7a 54 62 6c 54 79 70 65 5b 69 5d 29 3b 0a 20  azTblType[i]);. 
69c0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
69d0: 65 28 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f  e(pIter->azTblCo
69e0: 6c 29 3b 0a 20 20 70 49 74 65 72 2d 3e 61 7a 54  l);.  pIter->azT
69f0: 62 6c 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 49 74  blCol = 0;.  pIt
6a00: 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65 20 3d 20  er->azTblType = 
6a10: 30 3b 0a 20 20 70 49 74 65 72 2d 3e 61 69 53 72  0;.  pIter->aiSr
6a20: 63 4f 72 64 65 72 20 3d 20 30 3b 0a 20 20 70 49  cOrder = 0;.  pI
6a30: 74 65 72 2d 3e 61 62 54 62 6c 50 6b 20 3d 20 30  ter->abTblPk = 0
6a40: 3b 0a 20 20 70 49 74 65 72 2d 3e 61 62 4e 6f 74  ;.  pIter->abNot
6a50: 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 70 49 74 65  Null = 0;.  pIte
6a60: 72 2d 3e 6e 54 62 6c 43 6f 6c 20 3d 20 30 3b 0a  r->nTblCol = 0;.
6a70: 20 20 70 49 74 65 72 2d 3e 65 54 79 70 65 20 3d    pIter->eType =
6a80: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
6a90: 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 76 61 6c    /* Invalid val
6aa0: 75 65 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ue */.}../*.** F
6ab0: 69 6e 61 6c 69 7a 65 20 61 6c 6c 20 73 74 61 74  inalize all stat
6ac0: 65 6d 65 6e 74 73 20 61 6e 64 20 66 72 65 65 20  ements and free 
6ad0: 61 6c 6c 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  all allocations 
6ae0: 74 68 61 74 20 61 72 65 20 73 70 65 63 69 66 69  that are specifi
6af0: 63 20 74 6f 0a 2a 2a 20 74 68 65 20 63 75 72 72  c to.** the curr
6b00: 65 6e 74 20 6f 62 6a 65 63 74 20 28 74 61 62 6c  ent object (tabl
6b10: 65 2f 69 6e 64 65 78 20 70 61 69 72 29 2e 0a 2a  e/index pair)..*
6b20: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62  /.static void rb
6b30: 75 4f 62 6a 49 74 65 72 43 6c 65 61 72 53 74 61  uObjIterClearSta
6b40: 74 65 6d 65 6e 74 73 28 52 62 75 4f 62 6a 49 74  tements(RbuObjIt
6b50: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 52 62  er *pIter){.  Rb
6b60: 75 55 70 64 61 74 65 53 74 6d 74 20 2a 70 55 70  uUpdateStmt *pUp
6b70: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  ;..  sqlite3_fin
6b80: 61 6c 69 7a 65 28 70 49 74 65 72 2d 3e 70 53 65  alize(pIter->pSe
6b90: 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  lect);.  sqlite3
6ba0: 5f 66 69 6e 61 6c 69 7a 65 28 70 49 74 65 72 2d  _finalize(pIter-
6bb0: 3e 70 49 6e 73 65 72 74 29 3b 0a 20 20 73 71 6c  >pInsert);.  sql
6bc0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 49  ite3_finalize(pI
6bd0: 74 65 72 2d 3e 70 44 65 6c 65 74 65 29 3b 0a 20  ter->pDelete);. 
6be0: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
6bf0: 65 28 70 49 74 65 72 2d 3e 70 54 6d 70 49 6e 73  e(pIter->pTmpIns
6c00: 65 72 74 29 3b 0a 20 20 70 55 70 20 3d 20 70 49  ert);.  pUp = pI
6c10: 74 65 72 2d 3e 70 52 62 75 55 70 64 61 74 65 3b  ter->pRbuUpdate;
6c20: 0a 20 20 77 68 69 6c 65 28 20 70 55 70 20 29 7b  .  while( pUp ){
6c30: 0a 20 20 20 20 52 62 75 55 70 64 61 74 65 53 74  .    RbuUpdateSt
6c40: 6d 74 20 2a 70 54 6d 70 20 3d 20 70 55 70 2d 3e  mt *pTmp = pUp->
6c50: 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74  pNext;.    sqlit
6c60: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 55 70 2d  e3_finalize(pUp-
6c70: 3e 70 55 70 64 61 74 65 29 3b 0a 20 20 20 20 73  >pUpdate);.    s
6c80: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 55 70 29  qlite3_free(pUp)
6c90: 3b 0a 20 20 20 20 70 55 70 20 3d 20 70 54 6d 70  ;.    pUp = pTmp
6ca0: 3b 0a 20 20 7d 0a 20 20 0a 20 20 70 49 74 65 72  ;.  }.  .  pIter
6cb0: 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20  ->pSelect = 0;. 
6cc0: 20 70 49 74 65 72 2d 3e 70 49 6e 73 65 72 74 20   pIter->pInsert 
6cd0: 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e 70 44  = 0;.  pIter->pD
6ce0: 65 6c 65 74 65 20 3d 20 30 3b 0a 20 20 70 49 74  elete = 0;.  pIt
6cf0: 65 72 2d 3e 70 52 62 75 55 70 64 61 74 65 20 3d  er->pRbuUpdate =
6d00: 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e 70 54 6d   0;.  pIter->pTm
6d10: 70 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20 20 70  pInsert = 0;.  p
6d20: 49 74 65 72 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  Iter->nCol = 0;.
6d30: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  }../*.** Clean u
6d40: 70 20 61 6e 79 20 72 65 73 6f 75 72 63 65 73 20  p any resources 
6d50: 61 6c 6c 6f 63 61 74 65 64 20 61 73 20 70 61 72  allocated as par
6d60: 74 20 6f 66 20 74 68 65 20 69 74 65 72 61 74 6f  t of the iterato
6d70: 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 0a  r object passed.
6d80: 2a 2a 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ** as the only a
6d90: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
6da0: 69 63 20 76 6f 69 64 20 72 62 75 4f 62 6a 49 74  ic void rbuObjIt
6db0: 65 72 46 69 6e 61 6c 69 7a 65 28 52 62 75 4f 62  erFinalize(RbuOb
6dc0: 6a 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  jIter *pIter){. 
6dd0: 20 72 62 75 4f 62 6a 49 74 65 72 43 6c 65 61 72   rbuObjIterClear
6de0: 53 74 61 74 65 6d 65 6e 74 73 28 70 49 74 65 72  Statements(pIter
6df0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  );.  sqlite3_fin
6e00: 61 6c 69 7a 65 28 70 49 74 65 72 2d 3e 70 54 62  alize(pIter->pTb
6e10: 6c 49 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  lIter);.  sqlite
6e20: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 49 74 65 72  3_finalize(pIter
6e30: 2d 3e 70 49 64 78 49 74 65 72 29 3b 0a 20 20 72  ->pIdxIter);.  r
6e40: 62 75 4f 62 6a 49 74 65 72 46 72 65 65 43 6f 6c  buObjIterFreeCol
6e50: 73 28 70 49 74 65 72 29 3b 0a 20 20 6d 65 6d 73  s(pIter);.  mems
6e60: 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a  et(pIter, 0, siz
6e70: 65 6f 66 28 52 62 75 4f 62 6a 49 74 65 72 29 29  eof(RbuObjIter))
6e80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
6e90: 63 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ce the iterator 
6ea0: 74 6f 20 74 68 65 20 6e 65 78 74 20 70 6f 73 69  to the next posi
6eb0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  tion..**.** If n
6ec0: 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
6ed0: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
6ee0: 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 69 74  urned and the it
6ef0: 65 72 61 74 6f 72 20 69 73 20 6c 65 66 74 20 0a  erator is left .
6f00: 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ** pointing to t
6f10: 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2e 20 4f  he next entry. O
6f20: 74 68 65 72 77 69 73 65 2c 20 61 6e 20 65 72 72  therwise, an err
6f30: 6f 72 20 63 6f 64 65 20 61 6e 64 20 6d 65 73 73  or code and mess
6f40: 61 67 65 20 69 73 20 0a 2a 2a 20 6c 65 66 74 20  age is .** left 
6f50: 69 6e 20 74 68 65 20 52 42 55 20 68 61 6e 64 6c  in the RBU handl
6f60: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
6f70: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
6f80: 41 20 63 6f 70 79 20 6f 66 20 74 68 65 20 0a 2a  A copy of the .*
6f90: 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  * error code is 
6fa0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
6fb0: 74 69 63 20 69 6e 74 20 72 62 75 4f 62 6a 49 74  tic int rbuObjIt
6fc0: 65 72 4e 65 78 74 28 73 71 6c 69 74 65 33 72 62  erNext(sqlite3rb
6fd0: 75 20 2a 70 2c 20 52 62 75 4f 62 6a 49 74 65 72  u *p, RbuObjIter
6fe0: 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20   *pIter){.  int 
6ff0: 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66  rc = p->rc;.  if
7000: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
7010: 29 7b 0a 0a 20 20 20 20 2f 2a 20 46 72 65 65 20  ){..    /* Free 
7020: 61 6e 79 20 53 51 4c 69 74 65 20 73 74 61 74 65  any SQLite state
7030: 6d 65 6e 74 73 20 75 73 65 64 20 77 68 69 6c 65  ments used while
7040: 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 65 20   processing the 
7050: 70 72 65 76 69 6f 75 73 20 6f 62 6a 65 63 74 20  previous object 
7060: 2a 2f 20 0a 20 20 20 20 72 62 75 4f 62 6a 49 74  */ .    rbuObjIt
7070: 65 72 43 6c 65 61 72 53 74 61 74 65 6d 65 6e 74  erClearStatement
7080: 73 28 70 49 74 65 72 29 3b 0a 20 20 20 20 69 66  s(pIter);.    if
7090: 28 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d 30  ( pIter->zIdx==0
70a0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
70b0: 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
70c0: 62 4d 61 69 6e 2c 0a 20 20 20 20 20 20 20 20 20  bMain,.         
70d0: 20 22 44 52 4f 50 20 54 52 49 47 47 45 52 20 49   "DROP TRIGGER I
70e0: 46 20 45 58 49 53 54 53 20 74 65 6d 70 2e 72 62  F EXISTS temp.rb
70f0: 75 5f 69 6e 73 65 72 74 5f 74 72 3b 22 0a 20 20  u_insert_tr;".  
7100: 20 20 20 20 20 20 20 20 22 44 52 4f 50 20 54 52          "DROP TR
7110: 49 47 47 45 52 20 49 46 20 45 58 49 53 54 53 20  IGGER IF EXISTS 
7120: 74 65 6d 70 2e 72 62 75 5f 75 70 64 61 74 65 31  temp.rbu_update1
7130: 5f 74 72 3b 22 0a 20 20 20 20 20 20 20 20 20 20  _tr;".          
7140: 22 44 52 4f 50 20 54 52 49 47 47 45 52 20 49 46  "DROP TRIGGER IF
7150: 20 45 58 49 53 54 53 20 74 65 6d 70 2e 72 62 75   EXISTS temp.rbu
7160: 5f 75 70 64 61 74 65 32 5f 74 72 3b 22 0a 20 20  _update2_tr;".  
7170: 20 20 20 20 20 20 20 20 22 44 52 4f 50 20 54 52          "DROP TR
7180: 49 47 47 45 52 20 49 46 20 45 58 49 53 54 53 20  IGGER IF EXISTS 
7190: 74 65 6d 70 2e 72 62 75 5f 64 65 6c 65 74 65 5f  temp.rbu_delete_
71a0: 74 72 3b 22 0a 20 20 20 20 20 20 20 20 20 20 2c  tr;".          ,
71b0: 20 30 2c 20 30 2c 20 26 70 2d 3e 7a 45 72 72 6d   0, 0, &p->zErrm
71c0: 73 67 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  sg.      );.    
71d0: 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  }..    if( rc==S
71e0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
71f0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62 43 6c    if( pIter->bCl
7200: 65 61 6e 75 70 20 29 7b 0a 20 20 20 20 20 20 20  eanup ){.       
7210: 20 72 62 75 4f 62 6a 49 74 65 72 46 72 65 65 43   rbuObjIterFreeC
7220: 6f 6c 73 28 70 49 74 65 72 29 3b 0a 20 20 20 20  ols(pIter);.    
7230: 20 20 20 20 70 49 74 65 72 2d 3e 62 43 6c 65 61      pIter->bClea
7240: 6e 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nup = 0;.       
7250: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   rc = sqlite3_st
7260: 65 70 28 70 49 74 65 72 2d 3e 70 54 62 6c 49 74  ep(pIter->pTblIt
7270: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
7280: 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20   rc!=SQLITE_ROW 
7290: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
72a0: 3d 20 72 65 73 65 74 41 6e 64 43 6f 6c 6c 65 63  = resetAndCollec
72b0: 74 45 72 72 6f 72 28 70 49 74 65 72 2d 3e 70 54  tError(pIter->pT
72c0: 62 6c 49 74 65 72 2c 20 26 70 2d 3e 7a 45 72 72  blIter, &p->zErr
72d0: 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  msg);.          
72e0: 70 49 74 65 72 2d 3e 7a 54 62 6c 20 3d 20 30 3b  pIter->zTbl = 0;
72f0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
7300: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
7310: 3e 7a 54 62 6c 20 3d 20 28 63 6f 6e 73 74 20 63  >zTbl = (const c
7320: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
7330: 75 6d 6e 5f 74 65 78 74 28 70 49 74 65 72 2d 3e  umn_text(pIter->
7340: 70 54 62 6c 49 74 65 72 2c 20 30 29 3b 0a 20 20  pTblIter, 0);.  
7350: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 7a          pIter->z
7360: 44 61 74 61 54 62 6c 20 3d 20 28 63 6f 6e 73 74  DataTbl = (const
7370: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
7380: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 49 74 65 72  olumn_text(pIter
7390: 2d 3e 70 54 62 6c 49 74 65 72 2c 31 29 3b 0a 20  ->pTblIter,1);. 
73a0: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 28 70           rc = (p
73b0: 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 20 26  Iter->zDataTbl &
73c0: 26 20 70 49 74 65 72 2d 3e 7a 54 62 6c 29 20 3f  & pIter->zTbl) ?
73d0: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c   SQLITE_OK : SQL
73e0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
73f0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
7400: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  {.        if( pI
7410: 74 65 72 2d 3e 7a 49 64 78 3d 3d 30 20 29 7b 0a  ter->zIdx==0 ){.
7420: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
7430: 33 5f 73 74 6d 74 20 2a 70 49 64 78 20 3d 20 70  3_stmt *pIdx = p
7440: 49 74 65 72 2d 3e 70 49 64 78 49 74 65 72 3b 0a  Iter->pIdxIter;.
7450: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
7460: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
7470: 28 70 49 64 78 2c 20 31 2c 20 70 49 74 65 72 2d  (pIdx, 1, pIter-
7480: 3e 7a 54 62 6c 2c 20 2d 31 2c 20 53 51 4c 49 54  >zTbl, -1, SQLIT
7490: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  E_STATIC);.     
74a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
74b0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
74c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
74d0: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 49   sqlite3_step(pI
74e0: 74 65 72 2d 3e 70 49 64 78 49 74 65 72 29 3b 0a  ter->pIdxIter);.
74f0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
7500: 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  !=SQLITE_ROW ){.
7510: 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
7520: 20 72 65 73 65 74 41 6e 64 43 6f 6c 6c 65 63 74   resetAndCollect
7530: 45 72 72 6f 72 28 70 49 74 65 72 2d 3e 70 49 64  Error(pIter->pId
7540: 78 49 74 65 72 2c 20 26 70 2d 3e 7a 45 72 72 6d  xIter, &p->zErrm
7550: 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  sg);.           
7560: 20 70 49 74 65 72 2d 3e 62 43 6c 65 61 6e 75 70   pIter->bCleanup
7570: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
7580: 20 20 70 49 74 65 72 2d 3e 7a 49 64 78 20 3d 20    pIter->zIdx = 
7590: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
75a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
75b0: 70 49 74 65 72 2d 3e 7a 49 64 78 20 3d 20 28 63  pIter->zIdx = (c
75c0: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
75d0: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
75e0: 49 74 65 72 2d 3e 70 49 64 78 49 74 65 72 2c 20  Iter->pIdxIter, 
75f0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
7600: 70 49 74 65 72 2d 3e 69 54 6e 75 6d 20 3d 20 73  pIter->iTnum = s
7610: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
7620: 74 28 70 49 74 65 72 2d 3e 70 49 64 78 49 74 65  t(pIter->pIdxIte
7630: 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  r, 1);.         
7640: 20 20 20 70 49 74 65 72 2d 3e 62 55 6e 69 71 75     pIter->bUniqu
7650: 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  e = sqlite3_colu
7660: 6d 6e 5f 69 6e 74 28 70 49 74 65 72 2d 3e 70 49  mn_int(pIter->pI
7670: 64 78 49 74 65 72 2c 20 32 29 3b 0a 20 20 20 20  dxIter, 2);.    
7680: 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 49 74          rc = pIt
7690: 65 72 2d 3e 7a 49 64 78 20 3f 20 53 51 4c 49 54  er->zIdx ? SQLIT
76a0: 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 4e 4f  E_OK : SQLITE_NO
76b0: 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  MEM;.          }
76c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
76d0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
76e0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
76f0: 4b 20 29 7b 0a 20 20 20 20 72 62 75 4f 62 6a 49  K ){.    rbuObjI
7700: 74 65 72 46 69 6e 61 6c 69 7a 65 28 70 49 74 65  terFinalize(pIte
7710: 72 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20  r);.    p->rc = 
7720: 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  rc;.  }.  return
7730: 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
7740: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
7750: 6e 20 6f 66 20 74 68 65 20 72 62 75 5f 74 61 72  n of the rbu_tar
7760: 67 65 74 5f 6e 61 6d 65 28 29 20 53 51 4c 20 66  get_name() SQL f
7770: 75 6e 63 74 69 6f 6e 2e 20 54 68 69 73 20 66 75  unction. This fu
7780: 6e 63 74 69 6f 6e 0a 2a 2a 20 61 63 63 65 70 74  nction.** accept
7790: 73 20 6f 6e 65 20 6f 72 20 74 77 6f 20 61 72 67  s one or two arg
77a0: 75 6d 65 6e 74 73 2e 20 54 68 65 20 66 69 72 73  uments. The firs
77b0: 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  t argument is th
77c0: 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c  e name of a tabl
77d0: 65 20 2d 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20  e -.** the name 
77e0: 6f 66 20 61 20 74 61 62 6c 65 20 69 6e 20 74 68  of a table in th
77f0: 65 20 52 42 55 20 64 61 74 61 62 61 73 65 2e 20  e RBU database. 
7800: 20 54 68 65 20 73 65 63 6f 6e 64 2c 20 69 66 20   The second, if 
7810: 69 74 20 69 73 20 70 72 65 73 65 6e 74 2c 20 69  it is present, i
7820: 73 20 31 0a 2a 2a 20 66 6f 72 20 61 20 76 69 65  s 1.** for a vie
7830: 77 20 6f 72 20 30 20 66 6f 72 20 61 20 74 61 62  w or 0 for a tab
7840: 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61  le. .**.** For a
7850: 20 6e 6f 6e 2d 76 61 63 75 75 6d 20 52 42 55 20   non-vacuum RBU 
7860: 68 61 6e 64 6c 65 2c 20 69 66 20 74 68 65 20 74  handle, if the t
7870: 61 62 6c 65 20 6e 61 6d 65 20 6d 61 74 63 68 65  able name matche
7880: 73 20 74 68 65 20 70 61 74 74 65 72 6e 3a 0a 2a  s the pattern:.*
7890: 2a 0a 2a 2a 20 20 20 20 20 64 61 74 61 5b 30 2d  *.**     data[0-
78a0: 39 5d 5f 3c 6e 61 6d 65 3e 0a 2a 2a 0a 2a 2a 20  9]_<name>.**.** 
78b0: 77 68 65 72 65 20 3c 6e 61 6d 65 3e 20 69 73 20  where <name> is 
78c0: 61 6e 79 20 73 65 71 75 65 6e 63 65 20 6f 66 20  any sequence of 
78d0: 31 20 6f 72 20 6d 6f 72 65 20 63 68 61 72 61 63  1 or more charac
78e0: 74 65 72 73 2c 20 3c 6e 61 6d 65 3e 20 69 73 20  ters, <name> is 
78f0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68  returned..** Oth
7900: 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 6f  erwise, if the o
7910: 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 64 6f 65  nly argument doe
7920: 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
7930: 61 62 6f 76 65 20 70 61 74 74 65 72 6e 2c 20 61  above pattern, a
7940: 6e 20 53 51 4c 0a 2a 2a 20 4e 55 4c 4c 20 69 73  n SQL.** NULL is
7950: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
7960: 20 20 20 20 20 22 64 61 74 61 5f 74 31 22 20 20       "data_t1"  
7970: 20 20 20 2d 3e 20 22 74 31 22 0a 2a 2a 20 20 20     -> "t1".**   
7980: 20 20 22 64 61 74 61 30 31 32 33 5f 74 32 22 20    "data0123_t2" 
7990: 2d 3e 20 22 74 32 22 0a 2a 2a 20 20 20 20 20 22  -> "t2".**     "
79a0: 64 61 74 61 41 42 5f 74 33 22 20 20 20 2d 3e 20  dataAB_t3"   -> 
79b0: 4e 55 4c 4c 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61  NULL.**.** For a
79c0: 6e 20 72 62 75 20 76 61 63 75 75 6d 20 68 61 6e  n rbu vacuum han
79d0: 64 6c 65 2c 20 61 20 63 6f 70 79 20 6f 66 20 74  dle, a copy of t
79e0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
79f0: 74 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  t is returned if
7a00: 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64 20 61  .** the second a
7a10: 72 67 75 6d 65 6e 74 20 69 73 20 65 69 74 68 65  rgument is eithe
7a20: 72 20 6d 69 73 73 69 6e 67 20 6f 72 20 30 20 28  r missing or 0 (
7a30: 6e 6f 74 20 61 20 76 69 65 77 29 2e 0a 2a 2f 0a  not a view)..*/.
7a40: 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 54  static void rbuT
7a50: 61 72 67 65 74 4e 61 6d 65 46 75 6e 63 28 0a 20  argetNameFunc(. 
7a60: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
7a70: 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 61 72   *pCtx,.  int ar
7a80: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
7a90: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
7aa0: 73 71 6c 69 74 65 33 72 62 75 20 2a 70 20 3d 20  sqlite3rbu *p = 
7ab0: 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
7ac0: 61 28 70 43 74 78 29 3b 0a 20 20 63 6f 6e 73 74  a(pCtx);.  const
7ad0: 20 63 68 61 72 20 2a 7a 49 6e 3b 0a 20 20 61 73   char *zIn;.  as
7ae0: 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 7c 7c  sert( argc==1 ||
7af0: 20 61 72 67 63 3d 3d 32 20 29 3b 0a 0a 20 20 7a   argc==2 );..  z
7b00: 49 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  In = (const char
7b10: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
7b20: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  text(argv[0]);. 
7b30: 20 69 66 28 20 7a 49 6e 20 29 7b 0a 20 20 20 20   if( zIn ){.    
7b40: 69 66 28 20 72 62 75 49 73 56 61 63 75 75 6d 28  if( rbuIsVacuum(
7b50: 70 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  p) ){.      if( 
7b60: 61 72 67 63 3d 3d 31 20 7c 7c 20 30 3d 3d 73 71  argc==1 || 0==sq
7b70: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
7b80: 61 72 67 76 5b 31 5d 29 20 29 7b 0a 20 20 20 20  argv[1]) ){.    
7b90: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
7ba0: 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20 7a 49  lt_text(pCtx, zI
7bb0: 6e 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54  n, -1, SQLITE_ST
7bc0: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ATIC);.      }. 
7bd0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7be0: 69 66 28 20 73 74 72 6c 65 6e 28 7a 49 6e 29 3e  if( strlen(zIn)>
7bf0: 34 20 26 26 20 6d 65 6d 63 6d 70 28 22 64 61 74  4 && memcmp("dat
7c00: 61 22 2c 20 7a 49 6e 2c 20 34 29 3d 3d 30 20 29  a", zIn, 4)==0 )
7c10: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  {.        int i;
7c20: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 34  .        for(i=4
7c30: 3b 20 7a 49 6e 5b 69 5d 3e 3d 27 30 27 20 26 26  ; zIn[i]>='0' &&
7c40: 20 7a 49 6e 5b 69 5d 3c 3d 27 39 27 3b 20 69 2b   zIn[i]<='9'; i+
7c50: 2b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +);.        if( 
7c60: 7a 49 6e 5b 69 5d 3d 3d 27 5f 27 20 26 26 20 7a  zIn[i]=='_' && z
7c70: 49 6e 5b 69 2b 31 5d 20 29 7b 0a 20 20 20 20 20  In[i+1] ){.     
7c80: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
7c90: 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20 26  ult_text(pCtx, &
7ca0: 7a 49 6e 5b 69 2b 31 5d 2c 20 2d 31 2c 20 53 51  zIn[i+1], -1, SQ
7cb0: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
7cc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
7cd0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
7ce0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
7cf0: 65 20 69 74 65 72 61 74 6f 72 20 73 74 72 75 63  e iterator struc
7d00: 74 75 72 65 20 70 61 73 73 65 64 20 61 73 20 74  ture passed as t
7d10: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
7d20: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20  nt..**.** If no 
7d30: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51  error occurs, SQ
7d40: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
7d50: 6e 65 64 20 61 6e 64 20 74 68 65 20 69 74 65 72  ned and the iter
7d60: 61 74 6f 72 20 69 73 20 6c 65 66 74 20 0a 2a 2a  ator is left .**
7d70: 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
7d80: 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20 4f 74   first entry. Ot
7d90: 68 65 72 77 69 73 65 2c 20 61 6e 20 65 72 72 6f  herwise, an erro
7da0: 72 20 63 6f 64 65 20 61 6e 64 20 6d 65 73 73 61  r code and messa
7db0: 67 65 20 69 73 20 0a 2a 2a 20 6c 65 66 74 20 69  ge is .** left i
7dc0: 6e 20 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65  n the RBU handle
7dd0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
7de0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 41  irst argument. A
7df0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 0a 2a 2a   copy of the .**
7e00: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
7e10: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
7e20: 69 63 20 69 6e 74 20 72 62 75 4f 62 6a 49 74 65  ic int rbuObjIte
7e30: 72 46 69 72 73 74 28 73 71 6c 69 74 65 33 72 62  rFirst(sqlite3rb
7e40: 75 20 2a 70 2c 20 52 62 75 4f 62 6a 49 74 65 72  u *p, RbuObjIter
7e50: 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20   *pIter){.  int 
7e60: 72 63 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74  rc;.  memset(pIt
7e70: 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 52 62  er, 0, sizeof(Rb
7e80: 75 4f 62 6a 49 74 65 72 29 29 3b 0a 0a 20 20 72  uObjIter));..  r
7e90: 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41  c = prepareFreeA
7ea0: 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70  ndCollectError(p
7eb0: 2d 3e 64 62 52 62 75 2c 20 26 70 49 74 65 72 2d  ->dbRbu, &pIter-
7ec0: 3e 70 54 62 6c 49 74 65 72 2c 20 26 70 2d 3e 7a  >pTblIter, &p->z
7ed0: 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 73 71 6c  Errmsg, .    sql
7ee0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
7ef0: 20 20 20 20 22 53 45 4c 45 43 54 20 72 62 75 5f      "SELECT rbu_
7f00: 74 61 72 67 65 74 5f 6e 61 6d 65 28 6e 61 6d 65  target_name(name
7f10: 2c 20 74 79 70 65 3d 27 76 69 65 77 27 29 20 41  , type='view') A
7f20: 53 20 74 61 72 67 65 74 2c 20 6e 61 6d 65 20 22  S target, name "
7f30: 0a 20 20 20 20 20 20 22 46 52 4f 4d 20 73 71 6c  .      "FROM sql
7f40: 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20  ite_master ".   
7f50: 20 20 20 22 57 48 45 52 45 20 74 79 70 65 20 49     "WHERE type I
7f60: 4e 20 28 27 74 61 62 6c 65 27 2c 20 27 76 69 65  N ('table', 'vie
7f70: 77 27 29 20 41 4e 44 20 74 61 72 67 65 74 20 49  w') AND target I
7f80: 53 20 4e 4f 54 20 4e 55 4c 4c 20 22 0a 20 20 20  S NOT NULL ".   
7f90: 20 20 20 22 20 25 73 20 22 0a 20 20 20 20 20 20     " %s ".      
7fa0: 22 4f 52 44 45 52 20 42 59 20 6e 61 6d 65 22 0a  "ORDER BY name".
7fb0: 20 20 2c 20 72 62 75 49 73 56 61 63 75 75 6d 28    , rbuIsVacuum(
7fc0: 70 29 20 3f 20 22 41 4e 44 20 72 6f 6f 74 70 61  p) ? "AND rootpa
7fd0: 67 65 21 3d 30 20 41 4e 44 20 72 6f 6f 74 70 61  ge!=0 AND rootpa
7fe0: 67 65 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20  ge IS NOT NULL" 
7ff0: 3a 20 22 22 29 29 3b 0a 0a 20 20 69 66 28 20 72  : ""));..  if( r
8000: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
8010: 20 20 20 20 72 63 20 3d 20 70 72 65 70 61 72 65      rc = prepare
8020: 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
8030: 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 49 74 65  p->dbMain, &pIte
8040: 72 2d 3e 70 49 64 78 49 74 65 72 2c 20 26 70 2d  r->pIdxIter, &p-
8050: 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20 20 20  >zErrmsg,.      
8060: 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20    "SELECT name, 
8070: 72 6f 6f 74 70 61 67 65 2c 20 73 71 6c 20 49 53  rootpage, sql IS
8080: 20 4e 55 4c 4c 20 4f 52 20 73 75 62 73 74 72 28   NULL OR substr(
8090: 38 2c 20 36 29 3d 3d 27 55 4e 49 51 55 45 27 20  8, 6)=='UNIQUE' 
80a0: 22 0a 20 20 20 20 20 20 20 20 22 20 20 46 52 4f  ".        "  FRO
80b0: 4d 20 6d 61 69 6e 2e 73 71 6c 69 74 65 5f 6d 61  M main.sqlite_ma
80c0: 73 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22  ster ".        "
80d0: 20 20 57 48 45 52 45 20 74 79 70 65 3d 27 69 6e    WHERE type='in
80e0: 64 65 78 27 20 41 4e 44 20 74 62 6c 5f 6e 61 6d  dex' AND tbl_nam
80f0: 65 20 3d 20 3f 22 0a 20 20 20 20 29 3b 0a 20 20  e = ?".    );.  
8100: 7d 0a 0a 20 20 70 49 74 65 72 2d 3e 62 43 6c 65  }..  pIter->bCle
8110: 61 6e 75 70 20 3d 20 31 3b 0a 20 20 70 2d 3e 72  anup = 1;.  p->r
8120: 63 20 3d 20 72 63 3b 0a 20 20 72 65 74 75 72 6e  c = rc;.  return
8130: 20 72 62 75 4f 62 6a 49 74 65 72 4e 65 78 74 28   rbuObjIterNext(
8140: 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a  p, pIter);.}../*
8150: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 77 72  .** This is a wr
8160: 61 70 70 65 72 20 61 72 6f 75 6e 64 20 22 73 71  apper around "sq
8170: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 7a 46  lite3_mprintf(zF
8180: 6d 74 2c 20 2e 2e 2e 29 22 2e 20 49 66 20 61 6e  mt, ...)". If an
8190: 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 0a 2a 2a 20   OOM occurs,.** 
81a0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
81b0: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 52   stored in the R
81c0: 42 55 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64  BU handle passed
81d0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
81e0: 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  gument..**.** If
81f0: 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c   an error has al
8200: 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 28  ready occurred (
8210: 70 2d 3e 72 63 20 69 73 20 61 6c 72 65 61 64 79  p->rc is already
8220: 20 73 65 74 20 74 6f 20 73 6f 6d 65 74 68 69 6e   set to somethin
8230: 67 20 6f 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20  g other.** than 
8240: 53 51 4c 49 54 45 5f 4f 4b 29 2c 20 74 68 65 6e  SQLITE_OK), then
8250: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
8260: 65 74 75 72 6e 73 20 4e 55 4c 4c 20 77 69 74 68  eturns NULL with
8270: 6f 75 74 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  out modifying th
8280: 65 0a 2a 2a 20 73 74 6f 72 65 64 20 65 72 72 6f  e.** stored erro
8290: 72 20 63 6f 64 65 2e 20 49 6e 20 74 68 69 73 20  r code. In this 
82a0: 63 61 73 65 20 69 74 20 73 74 69 6c 6c 20 63 61  case it still ca
82b0: 6c 6c 73 20 73 71 6c 69 74 65 33 5f 66 72 65 65  lls sqlite3_free
82c0: 28 29 20 6f 6e 20 61 6e 79 20 0a 2a 2a 20 70 72  () on any .** pr
82d0: 69 6e 74 66 28 29 20 70 61 72 61 6d 65 74 65 72  intf() parameter
82e0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
82f0: 68 20 25 7a 20 63 6f 6e 76 65 72 73 69 6f 6e 73  h %z conversions
8300: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
8310: 20 2a 72 62 75 4d 50 72 69 6e 74 66 28 73 71 6c   *rbuMPrintf(sql
8320: 69 74 65 33 72 62 75 20 2a 70 2c 20 63 6f 6e 73  ite3rbu *p, cons
8330: 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e  t char *zFmt, ..
8340: 2e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  .){.  char *zSql
8350: 20 3d 20 30 3b 0a 20 20 76 61 5f 6c 69 73 74 20   = 0;.  va_list 
8360: 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  ap;.  va_start(a
8370: 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 7a 53 71 6c  p, zFmt);.  zSql
8380: 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69   = sqlite3_vmpri
8390: 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20  ntf(zFmt, ap);. 
83a0: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
83b0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
83c0: 20 7a 53 71 6c 3d 3d 30 20 29 20 70 2d 3e 72 63   zSql==0 ) p->rc
83d0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
83e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
83f0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
8400: 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 30 3b 0a  ;.    zSql = 0;.
8410: 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29    }.  va_end(ap)
8420: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 71 6c 3b  ;.  return zSql;
8430: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  .}../*.** Argume
8440: 6e 74 20 7a 46 6d 74 20 69 73 20 61 20 73 71 6c  nt zFmt is a sql
8450: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 29 20 73  ite3_mprintf() s
8460: 74 79 6c 65 20 66 6f 72 6d 61 74 20 73 74 72 69  tyle format stri
8470: 6e 67 2e 20 54 68 65 20 74 72 61 69 6c 69 6e 67  ng. The trailing
8480: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 61 72  .** arguments ar
8490: 65 20 74 68 65 20 75 73 75 61 6c 20 73 75 62 73  e the usual subs
84a0: 69 74 75 74 69 6f 6e 20 76 61 6c 75 65 73 2e 20  itution values. 
84b0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 65  This function pe
84c0: 72 66 6f 72 6d 73 0a 2a 2a 20 74 68 65 20 70 72  rforms.** the pr
84d0: 69 6e 74 66 28 29 20 73 74 79 6c 65 20 73 75 62  intf() style sub
84e0: 73 74 69 74 75 74 69 6f 6e 73 20 61 6e 64 20 65  stitutions and e
84f0: 78 65 63 75 74 65 73 20 74 68 65 20 72 65 73 75  xecutes the resu
8500: 6c 74 20 61 73 20 61 6e 20 53 51 4c 0a 2a 2a 20  lt as an SQL.** 
8510: 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 74 68 65  statement on the
8520: 20 52 42 55 20 68 61 6e 64 6c 65 73 20 64 61 74   RBU handles dat
8530: 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  abase..**.** If 
8540: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
8550: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61   an error code a
8560: 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  nd error message
8570: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68   is stored in th
8580: 65 0a 2a 2a 20 52 42 55 20 68 61 6e 64 6c 65 2e  e.** RBU handle.
8590: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
85a0: 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
85b0: 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
85c0: 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65  tion is.** calle
85d0: 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
85e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
85f0: 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63 28 73  rbuMPrintfExec(s
8600: 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 73 71  qlite3rbu *p, sq
8610: 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
8620: 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e   char *zFmt, ...
8630: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
8640: 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  .  char *zSql;. 
8650: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
8660: 6d 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71  mt);.  zSql = sq
8670: 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a  lite3_vmprintf(z
8680: 46 6d 74 2c 20 61 70 29 3b 0a 20 20 69 66 28 20  Fmt, ap);.  if( 
8690: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
86a0: 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c   ){.    if( zSql
86b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
86c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
86d0: 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
86e0: 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
86f0: 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71  te3_exec(db, zSq
8700: 6c 2c 20 30 2c 20 30 2c 20 26 70 2d 3e 7a 45 72  l, 0, 0, &p->zEr
8710: 72 6d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rmsg);.    }.  }
8720: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
8730: 7a 53 71 6c 29 3b 0a 20 20 76 61 5f 65 6e 64 28  zSql);.  va_end(
8740: 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  ap);.  return p-
8750: 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74  >rc;.}../*.** At
8760: 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74  tempt to allocat
8770: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70  e and return a p
8780: 6f 69 6e 74 65 72 20 74 6f 20 61 20 7a 65 72 6f  ointer to a zero
8790: 65 64 20 62 6c 6f 63 6b 20 6f 66 20 6e 42 79 74  ed block of nByt
87a0: 65 20 0a 2a 2a 20 62 79 74 65 73 2e 20 0a 2a 2a  e .** bytes. .**
87b0: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
87c0: 28 69 2e 65 2e 20 61 6e 20 4f 4f 4d 20 63 6f 6e  (i.e. an OOM con
87d0: 64 69 74 69 6f 6e 29 20 6f 63 63 75 72 73 2c 20  dition) occurs, 
87e0: 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20  return NULL and 
87f0: 6c 65 61 76 65 20 61 6e 20 0a 2a 2a 20 65 72 72  leave an .** err
8800: 6f 72 20 63 6f 64 65 20 69 6e 20 74 68 65 20 72  or code in the r
8810: 62 75 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64  bu handle passed
8820: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
8830: 67 75 6d 65 6e 74 2e 20 4f 72 2c 20 69 66 20 61  gument. Or, if a
8840: 6e 20 0a 2a 2a 20 65 72 72 6f 72 20 68 61 73 20  n .** error has 
8850: 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
8860: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
8870: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 72  ion is called, r
8880: 65 74 75 72 6e 20 4e 55 4c 4c 20 0a 2a 2a 20 69  eturn NULL .** i
8890: 6d 6d 65 64 69 61 74 65 6c 79 20 77 69 74 68 6f  mmediately witho
88a0: 75 74 20 61 74 74 65 6d 70 74 69 6e 67 20 74 68  ut attempting th
88b0: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 72 20  e allocation or 
88c0: 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 73 74  modifying the st
88d0: 6f 72 65 64 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  ored.** error co
88e0: 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  de..*/.static vo
88f0: 69 64 20 2a 72 62 75 4d 61 6c 6c 6f 63 28 73 71  id *rbuMalloc(sq
8900: 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 69 6e 74  lite3rbu *p, int
8910: 20 6e 42 79 74 65 29 7b 0a 20 20 76 6f 69 64 20   nByte){.  void 
8920: 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28  *pRet = 0;.  if(
8930: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
8940: 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
8950: 20 6e 42 79 74 65 3e 30 20 29 3b 0a 20 20 20 20   nByte>0 );.    
8960: 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pRet = sqlite3_m
8970: 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29 3b 0a  alloc64(nByte);.
8980: 20 20 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20      if( pRet==0 
8990: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
89a0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
89b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
89c0: 6d 65 6d 73 65 74 28 70 52 65 74 2c 20 30 2c 20  memset(pRet, 0, 
89d0: 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20  nByte);.    }.  
89e0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  }.  return pRet;
89f0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  .}.../*.** Alloc
8a00: 61 74 65 20 61 6e 64 20 7a 65 72 6f 20 74 68 65  ate and zero the
8a10: 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c   pIter->azTblCol
8a20: 5b 5d 20 61 6e 64 20 61 62 54 62 6c 50 6b 5b 5d  [] and abTblPk[]
8a30: 20 61 72 72 61 79 73 20 73 6f 20 74 68 61 74 0a   arrays so that.
8a40: 2a 2a 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d  ** there is room
8a50: 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6e 43   for at least nC
8a60: 6f 6c 20 65 6c 65 6d 65 6e 74 73 2e 20 49 66 20  ol elements. If 
8a70: 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 73  an OOM occurs, s
8a80: 74 6f 72 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  tore an.** error
8a90: 20 63 6f 64 65 20 69 6e 20 74 68 65 20 52 42 55   code in the RBU
8aa0: 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61   handle passed a
8ab0: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
8ac0: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
8ad0: 76 6f 69 64 20 72 62 75 41 6c 6c 6f 63 61 74 65  void rbuAllocate
8ae0: 49 74 65 72 41 72 72 61 79 73 28 73 71 6c 69 74  IterArrays(sqlit
8af0: 65 33 72 62 75 20 2a 70 2c 20 52 62 75 4f 62 6a  e3rbu *p, RbuObj
8b00: 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74  Iter *pIter, int
8b10: 20 6e 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 6e 42   nCol){.  int nB
8b20: 79 74 65 20 3d 20 28 32 2a 73 69 7a 65 6f 66 28  yte = (2*sizeof(
8b30: 63 68 61 72 2a 29 20 2b 20 73 69 7a 65 6f 66 28  char*) + sizeof(
8b40: 69 6e 74 29 20 2b 20 33 2a 73 69 7a 65 6f 66 28  int) + 3*sizeof(
8b50: 75 38 29 29 20 2a 20 6e 43 6f 6c 3b 0a 20 20 63  u8)) * nCol;.  c
8b60: 68 61 72 20 2a 2a 61 7a 4e 65 77 3b 0a 0a 20 20  har **azNew;..  
8b70: 61 7a 4e 65 77 20 3d 20 28 63 68 61 72 2a 2a 29  azNew = (char**)
8b80: 72 62 75 4d 61 6c 6c 6f 63 28 70 2c 20 6e 42 79  rbuMalloc(p, nBy
8b90: 74 65 29 3b 0a 20 20 69 66 28 20 61 7a 4e 65 77  te);.  if( azNew
8ba0: 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61   ){.    pIter->a
8bb0: 7a 54 62 6c 43 6f 6c 20 3d 20 61 7a 4e 65 77 3b  zTblCol = azNew;
8bc0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 7a 54 62  .    pIter->azTb
8bd0: 6c 54 79 70 65 20 3d 20 26 61 7a 4e 65 77 5b 6e  lType = &azNew[n
8be0: 43 6f 6c 5d 3b 0a 20 20 20 20 70 49 74 65 72 2d  Col];.    pIter-
8bf0: 3e 61 69 53 72 63 4f 72 64 65 72 20 3d 20 28 69  >aiSrcOrder = (i
8c00: 6e 74 2a 29 26 70 49 74 65 72 2d 3e 61 7a 54 62  nt*)&pIter->azTb
8c10: 6c 54 79 70 65 5b 6e 43 6f 6c 5d 3b 0a 20 20 20  lType[nCol];.   
8c20: 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 20   pIter->abTblPk 
8c30: 3d 20 28 75 38 2a 29 26 70 49 74 65 72 2d 3e 61  = (u8*)&pIter->a
8c40: 69 53 72 63 4f 72 64 65 72 5b 6e 43 6f 6c 5d 3b  iSrcOrder[nCol];
8c50: 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 62 4e 6f  .    pIter->abNo
8c60: 74 4e 75 6c 6c 20 3d 20 28 75 38 2a 29 26 70 49  tNull = (u8*)&pI
8c70: 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 6e 43 6f  ter->abTblPk[nCo
8c80: 6c 5d 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61  l];.    pIter->a
8c90: 62 49 6e 64 65 78 65 64 20 3d 20 28 75 38 2a 29  bIndexed = (u8*)
8ca0: 26 70 49 74 65 72 2d 3e 61 62 4e 6f 74 4e 75 6c  &pIter->abNotNul
8cb0: 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 7d 0a 7d 0a 0a  l[nCol];.  }.}..
8cc0: 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  /*.** The first 
8cd0: 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62 65  argument must be
8ce0: 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65   a nul-terminate
8cf0: 64 20 73 74 72 69 6e 67 2e 20 54 68 69 73 20 66  d string. This f
8d00: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72  unction.** retur
8d10: 6e 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ns a copy of the
8d20: 20 73 74 72 69 6e 67 20 69 6e 20 6d 65 6d 6f 72   string in memor
8d30: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
8d40: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
8d50: 2e 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72  ..** It is the r
8d60: 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
8d70: 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65   the caller to e
8d80: 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74  ventually free t
8d90: 68 69 73 20 6d 65 6d 6f 72 79 0a 2a 2a 20 75 73  his memory.** us
8da0: 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ing sqlite3_free
8db0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ()..**.** If an 
8dc0: 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  OOM condition is
8dd0: 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 65   encountered whe
8de0: 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  n attempting to 
8df0: 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 2c  allocate memory,
8e00: 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61 72 69 61  .** output varia
8e10: 62 6c 65 20 28 2a 70 52 63 29 20 69 73 20 73 65  ble (*pRc) is se
8e20: 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  t to SQLITE_NOME
8e30: 4d 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  M before returni
8e40: 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a  ng. Otherwise,.*
8e50: 2a 20 69 66 20 74 68 65 20 61 6c 6c 6f 63 61 74  * if the allocat
8e60: 69 6f 6e 20 73 75 63 63 65 65 64 73 2c 20 28 2a  ion succeeds, (*
8e70: 70 52 63 29 20 69 73 20 6c 65 66 74 20 75 6e 63  pRc) is left unc
8e80: 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  hanged..*/.stati
8e90: 63 20 63 68 61 72 20 2a 72 62 75 53 74 72 6e 64  c char *rbuStrnd
8ea0: 75 70 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  up(const char *z
8eb0: 53 74 72 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a  Str, int *pRc){.
8ec0: 20 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20 30    char *zRet = 0
8ed0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52  ;..  assert( *pR
8ee0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
8ef0: 20 20 69 66 28 20 7a 53 74 72 20 29 7b 0a 20 20    if( zStr ){.  
8f00: 20 20 73 69 7a 65 5f 74 20 6e 43 6f 70 79 20 3d    size_t nCopy =
8f10: 20 73 74 72 6c 65 6e 28 7a 53 74 72 29 20 2b 20   strlen(zStr) + 
8f20: 31 3b 0a 20 20 20 20 7a 52 65 74 20 3d 20 28 63  1;.    zRet = (c
8f30: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  har*)sqlite3_mal
8f40: 6c 6f 63 36 34 28 6e 43 6f 70 79 29 3b 0a 20 20  loc64(nCopy);.  
8f50: 20 20 69 66 28 20 7a 52 65 74 20 29 7b 0a 20 20    if( zRet ){.  
8f60: 20 20 20 20 6d 65 6d 63 70 79 28 7a 52 65 74 2c      memcpy(zRet,
8f70: 20 7a 53 74 72 2c 20 6e 43 6f 70 79 29 3b 0a 20   zStr, nCopy);. 
8f80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8f90: 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  *pRc = SQLITE_NO
8fa0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  MEM;.    }.  }..
8fb0: 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d    return zRet;.}
8fc0: 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65  ../*.** Finalize
8fd0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 70   the statement p
8fe0: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
8ff0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  ond argument..**
9000: 0a 2a 2a 20 49 66 20 74 68 65 20 73 71 6c 69 74  .** If the sqlit
9010: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 29 20 63 61  e3_finalize() ca
9020: 6c 6c 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  ll indicates tha
9030: 74 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  t an error occur
9040: 73 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20 72 62  s, and the.** rb
9050: 75 20 68 61 6e 64 6c 65 20 65 72 72 6f 72 20 63  u handle error c
9060: 6f 64 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  ode is not alrea
9070: 64 79 20 73 65 74 2c 20 73 65 74 20 74 68 65 20  dy set, set the 
9080: 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65  error code and e
9090: 72 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65 20  rror.** message 
90a0: 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a  accordingly..*/.
90b0: 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 46  static void rbuF
90c0: 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 72  inalize(sqlite3r
90d0: 62 75 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 73  bu *p, sqlite3_s
90e0: 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20 20 73  tmt *pStmt){.  s
90f0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c  qlite3 *db = sql
9100: 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c 65 28 70  ite3_db_handle(p
9110: 53 74 6d 74 29 3b 0a 20 20 69 6e 74 20 72 63 20  Stmt);.  int rc 
9120: 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
9130: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28  ze(pStmt);.  if(
9140: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
9150: 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
9160: 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  OK ){.    p->rc 
9170: 3d 20 72 63 3b 0a 20 20 20 20 70 2d 3e 7a 45 72  = rc;.    p->zEr
9180: 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rmsg = sqlite3_m
9190: 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c  printf("%s", sql
91a0: 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29  ite3_errmsg(db))
91b0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 44 65 74 65  ;.  }.}../* Dete
91c0: 72 6d 69 6e 65 20 74 68 65 20 74 79 70 65 20 6f  rmine the type o
91d0: 66 20 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  f a table..**.**
91e0: 20 20 20 70 65 54 79 70 65 20 69 73 20 6f 66 20     peType is of 
91f0: 74 79 70 65 20 28 69 6e 74 2a 29 2c 20 61 20 70  type (int*), a p
9200: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 75 74  ointer to an out
9210: 70 75 74 20 70 61 72 61 6d 65 74 65 72 20 6f 66  put parameter of
9220: 20 74 79 70 65 0a 2a 2a 20 20 20 28 69 6e 74 29   type.**   (int)
9230: 2e 20 54 68 69 73 20 63 61 6c 6c 20 73 65 74 73  . This call sets
9240: 20 74 68 65 20 6f 75 74 70 75 74 20 70 61 72 61   the output para
9250: 6d 65 74 65 72 20 61 73 20 66 6f 6c 6c 6f 77 73  meter as follows
9260: 2c 20 64 65 70 65 6e 64 69 6e 67 0a 2a 2a 20 20  , depending.**  
9270: 20 6f 6e 20 74 68 65 20 74 79 70 65 20 6f 66 20   on the type of 
9280: 74 68 65 20 74 61 62 6c 65 20 73 70 65 63 69 66  the table specif
9290: 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
92a0: 73 20 64 62 4e 61 6d 65 20 61 6e 64 20 7a 54 62  s dbName and zTb
92b0: 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 42 55  l..**.**     RBU
92c0: 5f 50 4b 5f 4e 4f 54 41 42 4c 45 3a 20 20 20 20  _PK_NOTABLE:    
92d0: 20 20 20 4e 6f 20 73 75 63 68 20 74 61 62 6c 65     No such table
92e0: 2e 0a 2a 2a 20 20 20 20 20 52 42 55 5f 50 4b 5f  ..**     RBU_PK_
92f0: 4e 4f 4e 45 3a 20 20 20 20 20 20 20 20 20 20 54  NONE:          T
9300: 61 62 6c 65 20 68 61 73 20 61 6e 20 69 6d 70 6c  able has an impl
9310: 69 63 69 74 20 72 6f 77 69 64 2e 0a 2a 2a 20 20  icit rowid..**  
9320: 20 20 20 52 42 55 5f 50 4b 5f 49 50 4b 3a 20 20     RBU_PK_IPK:  
9330: 20 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 68           Table h
9340: 61 73 20 61 6e 20 65 78 70 6c 69 63 69 74 20 49  as an explicit I
9350: 50 4b 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 20 20  PK column..**   
9360: 20 20 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41    RBU_PK_EXTERNA
9370: 4c 3a 20 20 20 20 20 20 54 61 62 6c 65 20 68 61  L:      Table ha
9380: 73 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 50 4b  s an external PK
9390: 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 20 20 52   index..**     R
93a0: 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54 5f 52 4f  BU_PK_WITHOUT_RO
93b0: 57 49 44 3a 20 54 61 62 6c 65 20 69 73 20 57 49  WID: Table is WI
93c0: 54 48 4f 55 54 20 52 4f 57 49 44 2e 0a 2a 2a 20  THOUT ROWID..** 
93d0: 20 20 20 20 52 42 55 5f 50 4b 5f 56 54 41 42 3a      RBU_PK_VTAB:
93e0: 20 20 20 20 20 20 20 20 20 20 54 61 62 6c 65 20            Table 
93f0: 69 73 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  is a virtual tab
9400: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 41 72 67 75  le..**.**   Argu
9410: 6d 65 6e 74 20 2a 70 69 50 6b 20 69 73 20 61 6c  ment *piPk is al
9420: 73 6f 20 6f 66 20 74 79 70 65 20 28 69 6e 74 2a  so of type (int*
9430: 29 2c 20 61 6e 64 20 61 6c 73 6f 20 70 6f 69 6e  ), and also poin
9440: 74 73 20 74 6f 20 61 6e 20 6f 75 74 70 75 74 0a  ts to an output.
9450: 2a 2a 20 20 20 70 61 72 61 6d 65 74 65 72 2e 20  **   parameter. 
9460: 55 6e 6c 65 73 73 20 74 68 65 20 74 61 62 6c 65  Unless the table
9470: 20 68 61 73 20 61 6e 20 65 78 74 65 72 6e 61 6c   has an external
9480: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64   primary key ind
9490: 65 78 20 0a 2a 2a 20 20 20 28 69 2e 65 2e 20 75  ex .**   (i.e. u
94a0: 6e 6c 65 73 73 20 2a 70 65 54 79 70 65 20 69 73  nless *peType is
94b0: 20 73 65 74 20 74 6f 20 33 29 2c 20 74 68 65 6e   set to 3), then
94c0: 20 2a 70 69 50 6b 20 69 73 20 73 65 74 20 74 6f   *piPk is set to
94d0: 20 7a 65 72 6f 2e 20 4f 72 2c 0a 2a 2a 20 20 20   zero. Or,.**   
94e0: 69 66 20 74 68 65 20 74 61 62 6c 65 20 64 6f 65  if the table doe
94f0: 73 20 68 61 76 65 20 61 6e 20 65 78 74 65 72 6e  s have an extern
9500: 61 6c 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  al primary key i
9510: 6e 64 65 78 2c 20 74 68 65 6e 20 2a 70 69 50 6b  ndex, then *piPk
9520: 0a 2a 2a 20 20 20 69 73 20 73 65 74 20 74 6f 20  .**   is set to 
9530: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
9540: 6d 62 65 72 20 6f 66 20 74 68 65 20 70 72 69 6d  mber of the prim
9550: 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20 62 65  ary key index be
9560: 66 6f 72 65 0a 2a 2a 20 20 20 72 65 74 75 72 6e  fore.**   return
9570: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 4c 47 4f 52  ing..**.** ALGOR
9580: 49 54 48 4d 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66  ITHM:.**.**   if
9590: 28 20 6e 6f 20 65 6e 74 72 79 20 65 78 69 73 74  ( no entry exist
95a0: 73 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74  s in sqlite_mast
95b0: 65 72 20 29 7b 0a 2a 2a 20 20 20 20 20 72 65 74  er ){.**     ret
95c0: 75 72 6e 20 52 42 55 5f 50 4b 5f 4e 4f 54 41 42  urn RBU_PK_NOTAB
95d0: 4c 45 0a 2a 2a 20 20 20 7d 65 6c 73 65 20 69 66  LE.**   }else if
95e0: 28 20 73 71 6c 20 66 6f 72 20 74 68 65 20 65 6e  ( sql for the en
95f0: 74 72 79 20 73 74 61 72 74 73 20 77 69 74 68 20  try starts with 
9600: 22 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 22  "CREATE VIRTUAL"
9610: 20 29 7b 0a 2a 2a 20 20 20 20 20 72 65 74 75 72   ){.**     retur
9620: 6e 20 52 42 55 5f 50 4b 5f 56 54 41 42 0a 2a 2a  n RBU_PK_VTAB.**
9630: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 22 50 52     }else if( "PR
9640: 41 47 4d 41 20 69 6e 64 65 78 5f 6c 69 73 74 28  AGMA index_list(
9650: 29 22 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  )" for the table
9660: 20 63 6f 6e 74 61 69 6e 73 20 61 20 22 70 6b 22   contains a "pk"
9670: 20 69 6e 64 65 78 20 29 7b 0a 2a 2a 20 20 20 20   index ){.**    
9680: 20 69 66 28 20 74 68 65 20 69 6e 64 65 78 20 74   if( the index t
9690: 68 61 74 20 69 73 20 74 68 65 20 70 6b 20 65 78  hat is the pk ex
96a0: 69 73 74 73 20 69 6e 20 73 71 6c 69 74 65 5f 6d  ists in sqlite_m
96b0: 61 73 74 65 72 20 29 7b 0a 2a 2a 20 20 20 20 20  aster ){.**     
96c0: 20 20 2a 70 69 50 4b 20 3d 20 72 6f 6f 74 70 61    *piPK = rootpa
96d0: 67 65 20 6f 66 20 74 68 61 74 20 69 6e 64 65 78  ge of that index
96e0: 2e 0a 2a 2a 20 20 20 20 20 20 20 72 65 74 75 72  ..**       retur
96f0: 6e 20 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41  n RBU_PK_EXTERNA
9700: 4c 0a 2a 2a 20 20 20 20 20 7d 65 6c 73 65 7b 0a  L.**     }else{.
9710: 2a 2a 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  **       return 
9720: 52 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54 5f 52  RBU_PK_WITHOUT_R
9730: 4f 57 49 44 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a  OWID.**     }.**
9740: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 22 50 52     }else if( "PR
9750: 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 28  AGMA table_info(
9760: 29 22 20 6c 69 73 74 73 20 6f 6e 65 20 6f 72 20  )" lists one or 
9770: 6d 6f 72 65 20 22 70 6b 22 20 63 6f 6c 75 6d 6e  more "pk" column
9780: 73 20 29 7b 0a 2a 2a 20 20 20 20 20 72 65 74 75  s ){.**     retu
9790: 72 6e 20 52 42 55 5f 50 4b 5f 49 50 4b 0a 2a 2a  rn RBU_PK_IPK.**
97a0: 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20 20     }else{.**    
97b0: 20 72 65 74 75 72 6e 20 52 42 55 5f 50 4b 5f 4e   return RBU_PK_N
97c0: 4f 4e 45 0a 2a 2a 20 20 20 7d 0a 2a 2f 0a 73 74  ONE.**   }.*/.st
97d0: 61 74 69 63 20 76 6f 69 64 20 72 62 75 54 61 62  atic void rbuTab
97e0: 6c 65 54 79 70 65 28 0a 20 20 73 71 6c 69 74 65  leType(.  sqlite
97f0: 33 72 62 75 20 2a 70 2c 0a 20 20 63 6f 6e 73 74  3rbu *p,.  const
9800: 20 63 68 61 72 20 2a 7a 54 61 62 2c 0a 20 20 69   char *zTab,.  i
9810: 6e 74 20 2a 70 65 54 79 70 65 2c 0a 20 20 69 6e  nt *peType,.  in
9820: 74 20 2a 70 69 54 6e 75 6d 2c 0a 20 20 69 6e 74  t *piTnum,.  int
9830: 20 2a 70 69 50 6b 0a 29 7b 0a 20 20 2f 2a 0a 20   *piPk.){.  /*. 
9840: 20 2a 2a 20 30 29 20 53 45 4c 45 43 54 20 63 6f   ** 0) SELECT co
9850: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 73 71 6c 69  unt(*) FROM sqli
9860: 74 65 5f 6d 61 73 74 65 72 20 77 68 65 72 65 20  te_master where 
9870: 6e 61 6d 65 3d 25 51 20 41 4e 44 20 49 73 56 69  name=%Q AND IsVi
9880: 72 74 75 61 6c 28 25 51 29 0a 20 20 2a 2a 20 31  rtual(%Q).  ** 1
9890: 29 20 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 6c  ) PRAGMA index_l
98a0: 69 73 74 20 3d 20 3f 0a 20 20 2a 2a 20 32 29 20  ist = ?.  ** 2) 
98b0: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
98c0: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
98d0: 65 72 20 77 68 65 72 65 20 6e 61 6d 65 3d 25 51  er where name=%Q
98e0: 20 0a 20 20 2a 2a 20 33 29 20 50 52 41 47 4d 41   .  ** 3) PRAGMA
98f0: 20 74 61 62 6c 65 5f 69 6e 66 6f 20 3d 20 3f 0a   table_info = ?.
9900: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73    */.  sqlite3_s
9910: 74 6d 74 20 2a 61 53 74 6d 74 5b 34 5d 20 3d 20  tmt *aStmt[4] = 
9920: 7b 30 2c 20 30 2c 20 30 2c 20 30 7d 3b 0a 0a 20  {0, 0, 0, 0};.. 
9930: 20 2a 70 65 54 79 70 65 20 3d 20 52 42 55 5f 50   *peType = RBU_P
9940: 4b 5f 4e 4f 54 41 42 4c 45 3b 0a 20 20 2a 70 69  K_NOTABLE;.  *pi
9950: 50 6b 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  Pk = 0;..  asser
9960: 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
9970: 5f 4f 4b 20 29 3b 0a 20 20 70 2d 3e 72 63 20 3d  _OK );.  p->rc =
9980: 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43   prepareFreeAndC
9990: 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64  ollectError(p->d
99a0: 62 4d 61 69 6e 2c 20 26 61 53 74 6d 74 5b 30 5d  bMain, &aStmt[0]
99b0: 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a  , &p->zErrmsg, .
99c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69      sqlite3_mpri
99d0: 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22  ntf(.          "
99e0: 53 45 4c 45 43 54 20 28 73 71 6c 20 4c 49 4b 45  SELECT (sql LIKE
99f0: 20 27 63 72 65 61 74 65 20 76 69 72 74 75 61 6c   'create virtual
9a00: 25 25 27 29 2c 20 72 6f 6f 74 70 61 67 65 22 0a  %%'), rootpage".
9a10: 20 20 20 20 20 20 20 20 20 20 22 20 20 46 52 4f            "  FRO
9a20: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  M sqlite_master"
9a30: 0a 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45  .          " WHE
9a40: 52 45 20 6e 61 6d 65 3d 25 51 22 2c 20 7a 54 61  RE name=%Q", zTa
9a50: 62 0a 20 20 29 29 3b 0a 20 20 69 66 28 20 70 2d  b.  ));.  if( p-
9a60: 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc!=SQLITE_OK |
9a70: 7c 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 61  | sqlite3_step(a
9a80: 53 74 6d 74 5b 30 5d 29 21 3d 53 51 4c 49 54 45  Stmt[0])!=SQLITE
9a90: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 2f 2a 20 45  _ROW ){.    /* E
9aa0: 69 74 68 65 72 20 61 6e 20 65 72 72 6f 72 2c 20  ither an error, 
9ab0: 6f 72 20 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  or no such table
9ac0: 2e 20 2a 2f 0a 20 20 20 20 67 6f 74 6f 20 72 62  . */.    goto rb
9ad0: 75 54 61 62 6c 65 54 79 70 65 5f 65 6e 64 3b 0a  uTableType_end;.
9ae0: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
9af0: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 61 53 74  3_column_int(aSt
9b00: 6d 74 5b 30 5d 2c 20 30 29 20 29 7b 0a 20 20 20  mt[0], 0) ){.   
9b10: 20 2a 70 65 54 79 70 65 20 3d 20 52 42 55 5f 50   *peType = RBU_P
9b20: 4b 5f 56 54 41 42 3b 20 20 20 20 20 20 20 20 20  K_VTAB;         
9b30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 76              /* v
9b40: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
9b50: 20 20 20 20 67 6f 74 6f 20 72 62 75 54 61 62 6c      goto rbuTabl
9b60: 65 54 79 70 65 5f 65 6e 64 3b 0a 20 20 7d 0a 20  eType_end;.  }. 
9b70: 20 2a 70 69 54 6e 75 6d 20 3d 20 73 71 6c 69 74   *piTnum = sqlit
9b80: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 61 53  e3_column_int(aS
9b90: 74 6d 74 5b 30 5d 2c 20 31 29 3b 0a 0a 20 20 70  tmt[0], 1);..  p
9ba0: 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46 72  ->rc = prepareFr
9bb0: 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f  eeAndCollectErro
9bc0: 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 61 53  r(p->dbMain, &aS
9bd0: 74 6d 74 5b 31 5d 2c 20 26 70 2d 3e 7a 45 72 72  tmt[1], &p->zErr
9be0: 6d 73 67 2c 20 0a 20 20 20 20 73 71 6c 69 74 65  msg, .    sqlite
9bf0: 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d  3_mprintf("PRAGM
9c00: 41 20 69 6e 64 65 78 5f 6c 69 73 74 3d 25 51 22  A index_list=%Q"
9c10: 2c 7a 54 61 62 29 0a 20 20 29 3b 0a 20 20 69 66  ,zTab).  );.  if
9c20: 28 20 70 2d 3e 72 63 20 29 20 67 6f 74 6f 20 72  ( p->rc ) goto r
9c30: 62 75 54 61 62 6c 65 54 79 70 65 5f 65 6e 64 3b  buTableType_end;
9c40: 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65  .  while( sqlite
9c50: 33 5f 73 74 65 70 28 61 53 74 6d 74 5b 31 5d 29  3_step(aStmt[1])
9c60: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
9c70: 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 4f      const u8 *zO
9c80: 72 69 67 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  rig = sqlite3_co
9c90: 6c 75 6d 6e 5f 74 65 78 74 28 61 53 74 6d 74 5b  lumn_text(aStmt[
9ca0: 31 5d 2c 20 33 29 3b 0a 20 20 20 20 63 6f 6e 73  1], 3);.    cons
9cb0: 74 20 75 38 20 2a 7a 49 64 78 20 3d 20 73 71 6c  t u8 *zIdx = sql
9cc0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
9cd0: 28 61 53 74 6d 74 5b 31 5d 2c 20 31 29 3b 0a 20  (aStmt[1], 1);. 
9ce0: 20 20 20 69 66 28 20 7a 4f 72 69 67 20 26 26 20     if( zOrig && 
9cf0: 7a 49 64 78 20 26 26 20 7a 4f 72 69 67 5b 30 5d  zIdx && zOrig[0]
9d00: 3d 3d 27 70 27 20 29 7b 0a 20 20 20 20 20 20 70  =='p' ){.      p
9d10: 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46 72  ->rc = prepareFr
9d20: 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f  eeAndCollectErro
9d30: 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 61 53  r(p->dbMain, &aS
9d40: 74 6d 74 5b 32 5d 2c 20 26 70 2d 3e 7a 45 72 72  tmt[2], &p->zErr
9d50: 6d 73 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20  msg, .          
9d60: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
9d70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45  .            "SE
9d80: 4c 45 43 54 20 72 6f 6f 74 70 61 67 65 20 46 52  LECT rootpage FR
9d90: 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
9da0: 20 57 48 45 52 45 20 6e 61 6d 65 20 3d 20 25 51   WHERE name = %Q
9db0: 22 2c 20 7a 49 64 78 0a 20 20 20 20 20 20 29 29  ", zIdx.      ))
9dc0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  ;.      if( p->r
9dd0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
9de0: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
9df0: 74 65 33 5f 73 74 65 70 28 61 53 74 6d 74 5b 32  te3_step(aStmt[2
9e00: 5d 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  ])==SQLITE_ROW )
9e10: 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 69 50  {.          *piP
9e20: 6b 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  k = sqlite3_colu
9e30: 6d 6e 5f 69 6e 74 28 61 53 74 6d 74 5b 32 5d 2c  mn_int(aStmt[2],
9e40: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a   0);.          *
9e50: 70 65 54 79 70 65 20 3d 20 52 42 55 5f 50 4b 5f  peType = RBU_PK_
9e60: 45 58 54 45 52 4e 41 4c 3b 0a 20 20 20 20 20 20  EXTERNAL;.      
9e70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9e80: 20 20 20 2a 70 65 54 79 70 65 20 3d 20 52 42 55     *peType = RBU
9e90: 5f 50 4b 5f 57 49 54 48 4f 55 54 5f 52 4f 57 49  _PK_WITHOUT_ROWI
9ea0: 44 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  D;.        }.   
9eb0: 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
9ec0: 72 62 75 54 61 62 6c 65 54 79 70 65 5f 65 6e 64  rbuTableType_end
9ed0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
9ee0: 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46 72  ->rc = prepareFr
9ef0: 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f  eeAndCollectErro
9f00: 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 61 53  r(p->dbMain, &aS
9f10: 74 6d 74 5b 33 5d 2c 20 26 70 2d 3e 7a 45 72 72  tmt[3], &p->zErr
9f20: 6d 73 67 2c 20 0a 20 20 20 20 73 71 6c 69 74 65  msg, .    sqlite
9f30: 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d  3_mprintf("PRAGM
9f40: 41 20 74 61 62 6c 65 5f 69 6e 66 6f 3d 25 51 22  A table_info=%Q"
9f50: 2c 7a 54 61 62 29 0a 20 20 29 3b 0a 20 20 69 66  ,zTab).  );.  if
9f60: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
9f70: 4f 4b 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28  OK ){.    while(
9f80: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 61 53   sqlite3_step(aS
9f90: 74 6d 74 5b 33 5d 29 3d 3d 53 51 4c 49 54 45 5f  tmt[3])==SQLITE_
9fa0: 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ROW ){.      if(
9fb0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
9fc0: 69 6e 74 28 61 53 74 6d 74 5b 33 5d 2c 35 29 3e  int(aStmt[3],5)>
9fd0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 65  0 ){.        *pe
9fe0: 54 79 70 65 20 3d 20 52 42 55 5f 50 4b 5f 49 50  Type = RBU_PK_IP
9ff0: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
a000: 20 20 2f 2a 20 65 78 70 6c 69 63 69 74 20 49 50    /* explicit IP
a010: 4b 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20  K column */.    
a020: 20 20 20 20 67 6f 74 6f 20 72 62 75 54 61 62 6c      goto rbuTabl
a030: 65 54 79 70 65 5f 65 6e 64 3b 0a 20 20 20 20 20  eType_end;.     
a040: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 65   }.    }.    *pe
a050: 54 79 70 65 20 3d 20 52 42 55 5f 50 4b 5f 4e 4f  Type = RBU_PK_NO
a060: 4e 45 3b 0a 20 20 7d 0a 0a 72 62 75 54 61 62 6c  NE;.  }..rbuTabl
a070: 65 54 79 70 65 5f 65 6e 64 3a 20 7b 0a 20 20 20  eType_end: {.   
a080: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b   unsigned int i;
a090: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
a0a0: 73 69 7a 65 6f 66 28 61 53 74 6d 74 29 2f 73 69  sizeof(aStmt)/si
a0b0: 7a 65 6f 66 28 61 53 74 6d 74 5b 30 5d 29 3b 20  zeof(aStmt[0]); 
a0c0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 62 75 46  i++){.      rbuF
a0d0: 69 6e 61 6c 69 7a 65 28 70 2c 20 61 53 74 6d 74  inalize(p, aStmt
a0e0: 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  [i]);.    }.  }.
a0f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
a100: 20 61 20 68 65 6c 70 65 72 20 66 75 6e 63 74 69   a helper functi
a110: 6f 6e 20 66 6f 72 20 72 62 75 4f 62 6a 49 74 65  on for rbuObjIte
a120: 72 43 61 63 68 65 54 61 62 6c 65 49 6e 66 6f 28  rCacheTableInfo(
a130: 29 2e 20 49 74 20 70 6f 70 75 6c 61 74 65 73 0a  ). It populates.
a140: 2a 2a 20 74 68 65 20 70 49 74 65 72 2d 3e 61 62  ** the pIter->ab
a150: 49 6e 64 65 78 65 64 5b 5d 20 61 72 72 61 79 2e  Indexed[] array.
a160: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a170: 72 62 75 4f 62 6a 49 74 65 72 43 61 63 68 65 49  rbuObjIterCacheI
a180: 6e 64 65 78 65 64 43 6f 6c 73 28 73 71 6c 69 74  ndexedCols(sqlit
a190: 65 33 72 62 75 20 2a 70 2c 20 52 62 75 4f 62 6a  e3rbu *p, RbuObj
a1a0: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
a1b0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 4c  sqlite3_stmt *pL
a1c0: 69 73 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 62  ist = 0;.  int b
a1d0: 49 6e 64 65 78 20 3d 20 30 3b 0a 0a 20 20 69 66  Index = 0;..  if
a1e0: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
a1f0: 4f 4b 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  OK ){.    memcpy
a200: 28 70 49 74 65 72 2d 3e 61 62 49 6e 64 65 78 65  (pIter->abIndexe
a210: 64 2c 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50  d, pIter->abTblP
a220: 6b 2c 20 73 69 7a 65 6f 66 28 75 38 29 2a 70 49  k, sizeof(u8)*pI
a230: 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 29 3b 0a 20  ter->nTblCol);. 
a240: 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61     p->rc = prepa
a250: 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74  reFreeAndCollect
a260: 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c  Error(p->dbMain,
a270: 20 26 70 4c 69 73 74 2c 20 26 70 2d 3e 7a 45 72   &pList, &p->zEr
a280: 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 73 71  rmsg,.        sq
a290: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50  lite3_mprintf("P
a2a0: 52 41 47 4d 41 20 6d 61 69 6e 2e 69 6e 64 65 78  RAGMA main.index
a2b0: 5f 6c 69 73 74 20 3d 20 25 51 22 2c 20 70 49 74  _list = %Q", pIt
a2c0: 65 72 2d 3e 7a 54 62 6c 29 0a 20 20 20 20 29 3b  er->zTbl).    );
a2d0: 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e 6e  .  }..  pIter->n
a2e0: 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 77 68 69  Index = 0;.  whi
a2f0: 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
a300: 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52  E_OK && SQLITE_R
a310: 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
a320: 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 63  (pList) ){.    c
a330: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 20  onst char *zIdx 
a340: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
a350: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
a360: 78 74 28 70 4c 69 73 74 2c 20 31 29 3b 0a 20 20  xt(pList, 1);.  
a370: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
a380: 70 58 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20  pXInfo = 0;.    
a390: 69 66 28 20 7a 49 64 78 3d 3d 30 20 29 20 62 72  if( zIdx==0 ) br
a3a0: 65 61 6b 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  eak;.    p->rc =
a3b0: 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43   prepareFreeAndC
a3c0: 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64  ollectError(p->d
a3d0: 62 4d 61 69 6e 2c 20 26 70 58 49 6e 66 6f 2c 20  bMain, &pXInfo, 
a3e0: 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20  &p->zErrmsg,.   
a3f0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72       sqlite3_mpr
a400: 69 6e 74 66 28 22 50 52 41 47 4d 41 20 6d 61 69  intf("PRAGMA mai
a410: 6e 2e 69 6e 64 65 78 5f 78 69 6e 66 6f 20 3d 20  n.index_xinfo = 
a420: 25 51 22 2c 20 7a 49 64 78 29 0a 20 20 20 20 29  %Q", zIdx).    )
a430: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e  ;.    while( p->
a440: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
a450: 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
a460: 69 74 65 33 5f 73 74 65 70 28 70 58 49 6e 66 6f  ite3_step(pXInfo
a470: 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
a480: 43 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Cid = sqlite3_co
a490: 6c 75 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f 2c  lumn_int(pXInfo,
a4a0: 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69   1);.      if( i
a4b0: 43 69 64 3e 3d 30 20 29 20 70 49 74 65 72 2d 3e  Cid>=0 ) pIter->
a4c0: 61 62 49 6e 64 65 78 65 64 5b 69 43 69 64 5d 20  abIndexed[iCid] 
a4d0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  = 1;.    }.    r
a4e0: 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 58  buFinalize(p, pX
a4f0: 49 6e 66 6f 29 3b 0a 20 20 20 20 62 49 6e 64 65  Info);.    bInde
a500: 78 20 3d 20 31 3b 0a 20 20 20 20 70 49 74 65 72  x = 1;.    pIter
a510: 2d 3e 6e 49 6e 64 65 78 2b 2b 3b 0a 20 20 7d 0a  ->nIndex++;.  }.
a520: 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 65 54  .  if( pIter->eT
a530: 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 57 49 54 48  ype==RBU_PK_WITH
a540: 4f 55 54 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20  OUT_ROWID ){.   
a550: 20 2f 2a 20 22 50 52 41 47 4d 41 20 69 6e 64 65   /* "PRAGMA inde
a560: 78 5f 6c 69 73 74 22 20 69 6e 63 6c 75 64 65 73  x_list" includes
a570: 20 74 68 65 20 6d 61 69 6e 20 50 4b 20 62 2d 74   the main PK b-t
a580: 72 65 65 20 2a 2f 0a 20 20 20 20 70 49 74 65 72  ree */.    pIter
a590: 2d 3e 6e 49 6e 64 65 78 2d 2d 3b 0a 20 20 7d 0a  ->nIndex--;.  }.
a5a0: 0a 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70  .  rbuFinalize(p
a5b0: 2c 20 70 4c 69 73 74 29 3b 0a 20 20 69 66 28 20  , pList);.  if( 
a5c0: 62 49 6e 64 65 78 3d 3d 30 20 29 20 70 49 74 65  bIndex==0 ) pIte
a5d0: 72 2d 3e 61 62 49 6e 64 65 78 65 64 20 3d 20 30  r->abIndexed = 0
a5e0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ;.}.../*.** If t
a5f0: 68 65 79 20 61 72 65 20 6e 6f 74 20 61 6c 72 65  hey are not alre
a600: 61 64 79 20 70 6f 70 75 6c 61 74 65 64 2c 20 70  ady populated, p
a610: 6f 70 75 6c 61 74 65 20 74 68 65 20 70 49 74 65  opulate the pIte
a620: 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 5d 2c 0a 2a  r->azTblCol[],.*
a630: 2a 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b  * pIter->abTblPk
a640: 5b 5d 2c 20 70 49 74 65 72 2d 3e 6e 54 62 6c 43  [], pIter->nTblC
a650: 6f 6c 20 61 6e 64 20 70 49 74 65 72 2d 3e 62 52  ol and pIter->bR
a660: 6f 77 69 64 20 76 61 72 69 61 62 6c 65 73 20 61  owid variables a
a670: 63 63 6f 72 64 69 6e 67 20 74 6f 0a 2a 2a 20 74  ccording to.** t
a680: 68 65 20 74 61 62 6c 65 20 28 6e 6f 74 20 69 6e  he table (not in
a690: 64 65 78 29 20 74 68 61 74 20 74 68 65 20 69 74  dex) that the it
a6a0: 65 72 61 74 6f 72 20 63 75 72 72 65 6e 74 6c 79  erator currently
a6b0: 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a   points to..**.*
a6c0: 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
a6d0: 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
a6e0: 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65  , or an SQLite e
a6f0: 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77  rror code otherw
a700: 69 73 65 2e 20 49 66 0a 2a 2a 20 61 6e 20 65 72  ise. If.** an er
a710: 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20  ror does occur, 
a720: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  an error code an
a730: 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  d error message 
a740: 61 72 65 20 61 6c 73 6f 20 6c 65 66 74 20 69 6e  are also left in
a750: 20 0a 2a 2a 20 74 68 65 20 52 42 55 20 68 61 6e   .** the RBU han
a760: 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  dle..*/.static i
a770: 6e 74 20 72 62 75 4f 62 6a 49 74 65 72 43 61 63  nt rbuObjIterCac
a780: 68 65 54 61 62 6c 65 49 6e 66 6f 28 73 71 6c 69  heTableInfo(sqli
a790: 74 65 33 72 62 75 20 2a 70 2c 20 52 62 75 4f 62  te3rbu *p, RbuOb
a7a0: 6a 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  jIter *pIter){. 
a7b0: 20 69 66 28 20 70 49 74 65 72 2d 3e 61 7a 54 62   if( pIter->azTb
a7c0: 6c 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 73  lCol==0 ){.    s
a7d0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
a7e0: 6d 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  mt = 0;.    int 
a7f0: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e  nCol = 0;.    in
a800: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
a810: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
a820: 6f 72 28 29 20 6c 6f 6f 70 20 69 74 65 72 61 74  or() loop iterat
a830: 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
a840: 20 20 20 69 6e 74 20 62 52 62 75 52 6f 77 69 64     int bRbuRowid
a850: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
a860: 20 2f 2a 20 49 66 20 69 6e 70 75 74 20 74 61 62   /* If input tab
a870: 6c 65 20 68 61 73 20 63 6f 6c 75 6d 6e 20 22 72  le has column "r
a880: 62 75 5f 72 6f 77 69 64 22 20 2a 2f 0a 20 20 20  bu_rowid" */.   
a890: 20 69 6e 74 20 69 4f 72 64 65 72 20 3d 20 30 3b   int iOrder = 0;
a8a0: 0a 20 20 20 20 69 6e 74 20 69 54 6e 75 6d 20 3d  .    int iTnum =
a8b0: 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75   0;..    /* Figu
a8c0: 72 65 20 6f 75 74 20 74 68 65 20 74 79 70 65 20  re out the type 
a8d0: 6f 66 20 74 61 62 6c 65 20 74 68 69 73 20 73 74  of table this st
a8e0: 65 70 20 77 69 6c 6c 20 64 65 61 6c 20 77 69 74  ep will deal wit
a8f0: 68 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  h. */.    assert
a900: 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  ( pIter->eType==
a910: 30 20 29 3b 0a 20 20 20 20 72 62 75 54 61 62 6c  0 );.    rbuTabl
a920: 65 54 79 70 65 28 70 2c 20 70 49 74 65 72 2d 3e  eType(p, pIter->
a930: 7a 54 62 6c 2c 20 26 70 49 74 65 72 2d 3e 65 54  zTbl, &pIter->eT
a940: 79 70 65 2c 20 26 69 54 6e 75 6d 2c 20 26 70 49  ype, &iTnum, &pI
a950: 74 65 72 2d 3e 69 50 6b 54 6e 75 6d 29 3b 0a 20  ter->iPkTnum);. 
a960: 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
a970: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49 74 65 72  LITE_OK && pIter
a980: 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
a990: 4e 4f 54 41 42 4c 45 20 29 7b 0a 20 20 20 20 20  NOTABLE ){.     
a9a0: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
a9b0: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 70 2d 3e  ERROR;.      p->
a9c0: 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65  zErrmsg = sqlite
a9d0: 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73 75  3_mprintf("no su
a9e0: 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 70  ch table: %s", p
a9f0: 49 74 65 72 2d 3e 7a 54 62 6c 29 3b 0a 20 20 20  Iter->zTbl);.   
aa00: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63   }.    if( p->rc
aa10: 20 29 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b   ) return p->rc;
aa20: 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
aa30: 7a 49 64 78 3d 3d 30 20 29 20 70 49 74 65 72 2d  zIdx==0 ) pIter-
aa40: 3e 69 54 6e 75 6d 20 3d 20 69 54 6e 75 6d 3b 0a  >iTnum = iTnum;.
aa50: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
aa60: 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
aa70: 4b 5f 4e 4f 4e 45 20 7c 7c 20 70 49 74 65 72 2d  K_NONE || pIter-
aa80: 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 49  >eType==RBU_PK_I
aa90: 50 4b 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  PK .         || 
aaa0: 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
aab0: 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 7c 7c  U_PK_EXTERNAL ||
aac0: 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52   pIter->eType==R
aad0: 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54 5f 52 4f  BU_PK_WITHOUT_RO
aae0: 57 49 44 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  WID.         || 
aaf0: 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
ab00: 55 5f 50 4b 5f 56 54 41 42 0a 20 20 20 20 29 3b  U_PK_VTAB.    );
ab10: 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74  ..    /* Populat
ab20: 65 20 74 68 65 20 61 7a 54 62 6c 43 6f 6c 5b 5d  e the azTblCol[]
ab30: 20 61 6e 64 20 6e 54 62 6c 43 6f 6c 20 76 61 72   and nTblCol var
ab40: 69 61 62 6c 65 73 20 62 61 73 65 64 20 6f 6e 20  iables based on 
ab50: 74 68 65 20 63 6f 6c 75 6d 6e 73 0a 20 20 20 20  the columns.    
ab60: 2a 2a 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  ** of the input 
ab70: 74 61 62 6c 65 2e 20 49 67 6e 6f 72 65 20 61 6e  table. Ignore an
ab80: 79 20 69 6e 70 75 74 20 74 61 62 6c 65 20 63 6f  y input table co
ab90: 6c 75 6d 6e 73 20 74 68 61 74 20 62 65 67 69 6e  lumns that begin
aba0: 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 22 72 62   with.    ** "rb
abb0: 75 5f 22 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e  u_".  */.    p->
abc0: 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65  rc = prepareFree
abd0: 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
abe0: 70 2d 3e 64 62 52 62 75 2c 20 26 70 53 74 6d 74  p->dbRbu, &pStmt
abf0: 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a  , &p->zErrmsg, .
ac00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
ac10: 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20  mprintf("SELECT 
ac20: 2a 20 46 52 4f 4d 20 27 25 71 27 22 2c 20 70 49  * FROM '%q'", pI
ac30: 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 29 0a 20  ter->zDataTbl). 
ac40: 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d     );.    if( p-
ac50: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
ac60: 7b 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 73  {.      nCol = s
ac70: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
ac80: 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  unt(pStmt);.    
ac90: 20 20 72 62 75 41 6c 6c 6f 63 61 74 65 49 74 65    rbuAllocateIte
aca0: 72 41 72 72 61 79 73 28 70 2c 20 70 49 74 65 72  rArrays(p, pIter
acb0: 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20  , nCol);.    }. 
acc0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72     for(i=0; p->r
acd0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
ace0: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
acf0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
ad00: 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63  zName = (const c
ad10: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
ad20: 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20  umn_name(pStmt, 
ad30: 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  i);.      if( sq
ad40: 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 22  lite3_strnicmp("
ad50: 72 62 75 5f 22 2c 20 7a 4e 61 6d 65 2c 20 34 29  rbu_", zName, 4)
ad60: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
ad70: 20 2a 7a 43 6f 70 79 20 3d 20 72 62 75 53 74 72   *zCopy = rbuStr
ad80: 6e 64 75 70 28 7a 4e 61 6d 65 2c 20 26 70 2d 3e  ndup(zName, &p->
ad90: 72 63 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74  rc);.        pIt
ada0: 65 72 2d 3e 61 69 53 72 63 4f 72 64 65 72 5b 70  er->aiSrcOrder[p
adb0: 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 5d 20 3d  Iter->nTblCol] =
adc0: 20 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b   pIter->nTblCol;
add0: 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
ade0: 61 7a 54 62 6c 43 6f 6c 5b 70 49 74 65 72 2d 3e  azTblCol[pIter->
adf0: 6e 54 62 6c 43 6f 6c 2b 2b 5d 20 3d 20 7a 43 6f  nTblCol++] = zCo
ae00: 70 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  py;.      }.    
ae10: 20 20 65 6c 73 65 20 69 66 28 20 30 3d 3d 73 71    else if( 0==sq
ae20: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 22 72  lite3_stricmp("r
ae30: 62 75 5f 72 6f 77 69 64 22 2c 20 7a 4e 61 6d 65  bu_rowid", zName
ae40: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 52 62  ) ){.        bRb
ae50: 75 52 6f 77 69 64 20 3d 20 31 3b 0a 20 20 20 20  uRowid = 1;.    
ae60: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
ae70: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
ae80: 53 74 6d 74 29 3b 0a 20 20 20 20 70 53 74 6d 74  Stmt);.    pStmt
ae90: 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70   = 0;..    if( p
aea0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a  ->rc==SQLITE_OK.
aeb0: 20 20 20 20 20 26 26 20 72 62 75 49 73 56 61 63       && rbuIsVac
aec0: 75 75 6d 28 70 29 3d 3d 30 0a 20 20 20 20 20 26  uum(p)==0.     &
aed0: 26 20 62 52 62 75 52 6f 77 69 64 21 3d 28 70 49  & bRbuRowid!=(pI
aee0: 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f  ter->eType==RBU_
aef0: 50 4b 5f 56 54 41 42 20 7c 7c 20 70 49 74 65 72  PK_VTAB || pIter
af00: 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
af10: 4e 4f 4e 45 29 0a 20 20 20 20 29 7b 0a 20 20 20  NONE).    ){.   
af20: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
af30: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 70  E_ERROR;.      p
af40: 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69  ->zErrmsg = sqli
af50: 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
af60: 20 20 20 20 20 20 20 22 74 61 62 6c 65 20 25 71         "table %q
af70: 20 25 73 20 72 62 75 5f 72 6f 77 69 64 20 63 6f   %s rbu_rowid co
af80: 6c 75 6d 6e 22 2c 20 70 49 74 65 72 2d 3e 7a 44  lumn", pIter->zD
af90: 61 74 61 54 62 6c 2c 0a 20 20 20 20 20 20 20 20  ataTbl,.        
afa0: 20 20 28 62 52 62 75 52 6f 77 69 64 20 3f 20 22    (bRbuRowid ? "
afb0: 6d 61 79 20 6e 6f 74 20 68 61 76 65 22 20 3a 20  may not have" : 
afc0: 22 72 65 71 75 69 72 65 73 22 29 0a 20 20 20 20  "requires").    
afd0: 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20    );.    }..    
afe0: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 61 6c  /* Check that al
aff0: 6c 20 6e 6f 6e 2d 48 49 44 44 45 4e 20 63 6f 6c  l non-HIDDEN col
b000: 75 6d 6e 73 20 69 6e 20 74 68 65 20 64 65 73 74  umns in the dest
b010: 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20 61 72  ination table ar
b020: 65 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 70 72  e also.    ** pr
b030: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 69 6e 70  esent in the inp
b040: 75 74 20 74 61 62 6c 65 2e 20 50 6f 70 75 6c 61  ut table. Popula
b050: 74 65 20 74 68 65 20 61 62 54 62 6c 50 6b 5b 5d  te the abTblPk[]
b060: 2c 20 61 7a 54 62 6c 54 79 70 65 5b 5d 20 61 6e  , azTblType[] an
b070: 64 0a 20 20 20 20 2a 2a 20 61 69 54 62 6c 4f 72  d.    ** aiTblOr
b080: 64 65 72 5b 5d 20 61 72 72 61 79 73 20 61 74 20  der[] arrays at 
b090: 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 20 20  the same time.  
b0a0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  */.    if( p->rc
b0b0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
b0c0: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65       p->rc = pre
b0d0: 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65  pareFreeAndColle
b0e0: 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69  ctError(p->dbMai
b0f0: 6e 2c 20 26 70 53 74 6d 74 2c 20 26 70 2d 3e 7a  n, &pStmt, &p->z
b100: 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20 20 20  Errmsg, .       
b110: 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e     sqlite3_mprin
b120: 74 66 28 22 50 52 41 47 4d 41 20 74 61 62 6c 65  tf("PRAGMA table
b130: 5f 69 6e 66 6f 28 25 51 29 22 2c 20 70 49 74 65  _info(%Q)", pIte
b140: 72 2d 3e 7a 54 62 6c 29 0a 20 20 20 20 20 20 29  r->zTbl).      )
b150: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  ;.    }.    whil
b160: 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
b170: 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f  _OK && SQLITE_RO
b180: 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
b190: 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20  pStmt) ){.      
b1a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
b1b0: 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  e = (const char*
b1c0: 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
b1d0: 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a  text(pStmt, 1);.
b1e0: 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d        if( zName=
b1f0: 3d 30 20 29 20 62 72 65 61 6b 3b 20 20 2f 2a 20  =0 ) break;  /* 
b200: 41 6e 20 4f 4f 4d 20 2d 20 66 69 6e 61 6c 69 7a  An OOM - finaliz
b210: 65 28 29 20 62 65 6c 6f 77 20 72 65 74 75 72 6e  e() below return
b220: 73 20 53 5f 4e 4f 4d 45 4d 20 2a 2f 0a 20 20 20  s S_NOMEM */.   
b230: 20 20 20 66 6f 72 28 69 3d 69 4f 72 64 65 72 3b     for(i=iOrder;
b240: 20 69 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f   i<pIter->nTblCo
b250: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
b260: 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a   if( 0==strcmp(z
b270: 4e 61 6d 65 2c 20 70 49 74 65 72 2d 3e 61 7a 54  Name, pIter->azT
b280: 62 6c 43 6f 6c 5b 69 5d 29 20 29 20 62 72 65 61  blCol[i]) ) brea
b290: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
b2a0: 20 69 66 28 20 69 3d 3d 70 49 74 65 72 2d 3e 6e   if( i==pIter->n
b2b0: 54 62 6c 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  TblCol ){.      
b2c0: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
b2d0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
b2e0: 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c  p->zErrmsg = sql
b2f0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 63 6f  ite3_mprintf("co
b300: 6c 75 6d 6e 20 6d 69 73 73 69 6e 67 20 66 72 6f  lumn missing fro
b310: 6d 20 25 71 3a 20 25 73 22 2c 0a 20 20 20 20 20  m %q: %s",.     
b320: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 7a 44         pIter->zD
b330: 61 74 61 54 62 6c 2c 20 7a 4e 61 6d 65 0a 20 20  ataTbl, zName.  
b340: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
b350: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
b360: 74 20 69 50 6b 20 3d 20 73 71 6c 69 74 65 33 5f  t iPk = sqlite3_
b370: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
b380: 2c 20 35 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  , 5);.        in
b390: 74 20 62 4e 6f 74 4e 75 6c 6c 20 3d 20 73 71 6c  t bNotNull = sql
b3a0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
b3b0: 70 53 74 6d 74 2c 20 33 29 3b 0a 20 20 20 20 20  pStmt, 3);.     
b3c0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
b3d0: 54 79 70 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  Type = (const ch
b3e0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
b3f0: 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 32  mn_text(pStmt, 2
b400: 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  );..        if( 
b410: 69 21 3d 69 4f 72 64 65 72 20 29 7b 0a 20 20 20  i!=iOrder ){.   
b420: 20 20 20 20 20 20 20 53 57 41 50 28 69 6e 74 2c         SWAP(int,
b430: 20 70 49 74 65 72 2d 3e 61 69 53 72 63 4f 72 64   pIter->aiSrcOrd
b440: 65 72 5b 69 5d 2c 20 70 49 74 65 72 2d 3e 61 69  er[i], pIter->ai
b450: 53 72 63 4f 72 64 65 72 5b 69 4f 72 64 65 72 5d  SrcOrder[iOrder]
b460: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 53 57 41  );.          SWA
b470: 50 28 63 68 61 72 2a 2c 20 70 49 74 65 72 2d 3e  P(char*, pIter->
b480: 61 7a 54 62 6c 43 6f 6c 5b 69 5d 2c 20 70 49 74  azTblCol[i], pIt
b490: 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 4f 72  er->azTblCol[iOr
b4a0: 64 65 72 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  der]);.        }
b4b0: 0a 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  ..        pIter-
b4c0: 3e 61 7a 54 62 6c 54 79 70 65 5b 69 4f 72 64 65  >azTblType[iOrde
b4d0: 72 5d 20 3d 20 72 62 75 53 74 72 6e 64 75 70 28  r] = rbuStrndup(
b4e0: 7a 54 79 70 65 2c 20 26 70 2d 3e 72 63 29 3b 0a  zType, &p->rc);.
b4f0: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 61          pIter->a
b500: 62 54 62 6c 50 6b 5b 69 4f 72 64 65 72 5d 20 3d  bTblPk[iOrder] =
b510: 20 28 69 50 6b 21 3d 30 29 3b 0a 20 20 20 20 20   (iPk!=0);.     
b520: 20 20 20 70 49 74 65 72 2d 3e 61 62 4e 6f 74 4e     pIter->abNotN
b530: 75 6c 6c 5b 69 4f 72 64 65 72 5d 20 3d 20 28 75  ull[iOrder] = (u
b540: 38 29 62 4e 6f 74 4e 75 6c 6c 20 7c 7c 20 28 69  8)bNotNull || (i
b550: 50 6b 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20  Pk!=0);.        
b560: 69 4f 72 64 65 72 2b 2b 3b 0a 20 20 20 20 20 20  iOrder++;.      
b570: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 62 75  }.    }..    rbu
b580: 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 53 74 6d  Finalize(p, pStm
b590: 74 29 3b 0a 20 20 20 20 72 62 75 4f 62 6a 49 74  t);.    rbuObjIt
b5a0: 65 72 43 61 63 68 65 49 6e 64 65 78 65 64 43 6f  erCacheIndexedCo
b5b0: 6c 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  ls(p, pIter);.  
b5c0: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
b5d0: 3e 65 54 79 70 65 21 3d 52 42 55 5f 50 4b 5f 56  >eType!=RBU_PK_V
b5e0: 54 41 42 20 7c 7c 20 70 49 74 65 72 2d 3e 61 62  TAB || pIter->ab
b5f0: 49 6e 64 65 78 65 64 3d 3d 30 20 29 3b 0a 20 20  Indexed==0 );.  
b600: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
b610: 3e 65 54 79 70 65 21 3d 52 42 55 5f 50 4b 5f 56  >eType!=RBU_PK_V
b620: 54 41 42 20 7c 7c 20 70 49 74 65 72 2d 3e 6e 49  TAB || pIter->nI
b630: 6e 64 65 78 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a  ndex==0 );.  }..
b640: 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a    return p->rc;.
b650: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
b660: 6e 63 74 69 6f 6e 20 63 6f 6e 73 74 72 75 63 74  nction construct
b670: 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20  s and returns a 
b680: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c  pointer to a nul
b690: 2d 74 65 72 6d 69 6e 61 74 65 64 20 0a 2a 2a 20  -terminated .** 
b6a0: 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  string containin
b6b0: 67 20 73 6f 6d 65 20 53 51 4c 20 63 6c 61 75 73  g some SQL claus
b6c0: 65 20 6f 72 20 6c 69 73 74 20 62 61 73 65 64 20  e or list based 
b6d0: 6f 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  on one or more o
b6e0: 66 20 74 68 65 20 0a 2a 2a 20 63 6f 6c 75 6d 6e  f the .** column
b6f0: 20 6e 61 6d 65 73 20 63 75 72 72 65 6e 74 6c 79   names currently
b700: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70   stored in the p
b710: 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 5d  Iter->azTblCol[]
b720: 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69   array..*/.stati
b730: 63 20 63 68 61 72 20 2a 72 62 75 4f 62 6a 49 74  c char *rbuObjIt
b740: 65 72 47 65 74 43 6f 6c 6c 69 73 74 28 0a 20 20  erGetCollist(.  
b750: 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 20  sqlite3rbu *p,  
b760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b770: 2f 2a 20 52 42 55 20 6f 62 6a 65 63 74 20 2a 2f  /* RBU object */
b780: 0a 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70  .  RbuObjIter *p
b790: 49 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20  Iter            
b7a0: 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 69 74 65     /* Object ite
b7b0: 72 61 74 6f 72 20 66 6f 72 20 63 6f 6c 75 6d 6e  rator for column
b7c0: 20 6e 61 6d 65 73 20 2a 2f 0a 29 7b 0a 20 20 63   names */.){.  c
b7d0: 68 61 72 20 2a 7a 4c 69 73 74 20 3d 20 30 3b 0a  har *zList = 0;.
b7e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
b7f0: 65 70 20 3d 20 22 22 3b 0a 20 20 69 6e 74 20 69  ep = "";.  int i
b800: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
b810: 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69  Iter->nTblCol; i
b820: 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
b830: 68 61 72 20 2a 7a 20 3d 20 70 49 74 65 72 2d 3e  har *z = pIter->
b840: 61 7a 54 62 6c 43 6f 6c 5b 69 5d 3b 0a 20 20 20  azTblCol[i];.   
b850: 20 7a 4c 69 73 74 20 3d 20 72 62 75 4d 50 72 69   zList = rbuMPri
b860: 6e 74 66 28 70 2c 20 22 25 7a 25 73 5c 22 25 77  ntf(p, "%z%s\"%w
b870: 5c 22 22 2c 20 7a 4c 69 73 74 2c 20 7a 53 65 70  \"", zList, zSep
b880: 2c 20 7a 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d  , z);.    zSep =
b890: 20 22 2c 20 22 3b 0a 20 20 7d 0a 20 20 72 65 74   ", ";.  }.  ret
b8a0: 75 72 6e 20 7a 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn zList;.}../*
b8b0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
b8c0: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63 72 65  n is used to cre
b8d0: 61 74 65 20 61 20 53 45 4c 45 43 54 20 6c 69 73  ate a SELECT lis
b8e0: 74 20 28 74 68 65 20 6c 69 73 74 20 6f 66 20 53  t (the list of S
b8f0: 51 4c 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  QL .** expressio
b900: 6e 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20  ns that follows 
b910: 61 20 53 45 4c 45 43 54 20 6b 65 79 77 6f 72 64  a SELECT keyword
b920: 29 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73  ) for a SELECT s
b930: 74 61 74 65 6d 65 6e 74 20 0a 2a 2a 20 75 73 65  tatement .** use
b940: 64 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 61  d to read from a
b950: 6e 20 64 61 74 61 5f 78 78 78 20 6f 72 20 72 62  n data_xxx or rb
b960: 75 5f 74 6d 70 5f 78 78 78 20 74 61 62 6c 65 20  u_tmp_xxx table 
b970: 77 68 69 6c 65 20 75 70 64 61 74 69 6e 67 20 74  while updating t
b980: 68 65 20 0a 2a 2a 20 69 6e 64 65 78 20 6f 62 6a  he .** index obj
b990: 65 63 74 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ect currently in
b9a0: 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20 69  dicated by the i
b9b0: 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70  terator object p
b9c0: 61 73 73 65 64 20 61 73 20 74 68 65 20 0a 2a 2a  assed as the .**
b9d0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
b9e0: 2e 20 41 20 22 50 52 41 47 4d 41 20 69 6e 64 65  . A "PRAGMA inde
b9f0: 78 5f 78 69 6e 66 6f 20 3d 20 3c 69 64 78 6e 61  x_xinfo = <idxna
ba00: 6d 65 3e 22 20 73 74 61 74 65 6d 65 6e 74 20 69  me>" statement i
ba10: 73 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20 6f 62  s used .** to ob
ba20: 74 61 69 6e 20 74 68 65 20 72 65 71 75 69 72 65  tain the require
ba30: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  d information..*
ba40: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 64 65  *.** If the inde
ba50: 78 20 69 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c  x is of the foll
ba60: 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  owing form:.**.*
ba70: 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
ba80: 20 69 31 20 4f 4e 20 74 31 28 63 2c 20 62 20 43   i1 ON t1(c, b C
ba90: 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 29 3b 0a  OLLATE nocase);.
baa0: 2a 2a 0a 2a 2a 20 61 6e 64 20 22 74 31 22 20 69  **.** and "t1" i
bab0: 73 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 61  s a table with a
bac0: 6e 20 65 78 70 6c 69 63 69 74 20 49 4e 54 45 47  n explicit INTEG
bad0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  ER PRIMARY KEY c
bae0: 6f 6c 75 6d 6e 20 0a 2a 2a 20 22 69 70 6b 22 2c  olumn .** "ipk",
baf0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
bb00: 72 69 6e 67 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ring is:.**.**  
bb10: 20 22 60 63 60 20 43 4f 4c 4c 41 54 45 20 27 42   "`c` COLLATE 'B
bb20: 49 4e 41 52 59 27 2c 20 60 62 60 20 43 4f 4c 4c  INARY', `b` COLL
bb30: 41 54 45 20 27 4e 4f 43 41 53 45 27 2c 20 60 69  ATE 'NOCASE', `i
bb40: 70 6b 60 20 43 4f 4c 4c 41 54 45 20 27 42 49 4e  pk` COLLATE 'BIN
bb50: 41 52 59 27 22 0a 2a 2a 0a 2a 2a 20 41 73 20 77  ARY'".**.** As w
bb60: 65 6c 6c 20 61 73 20 74 68 65 20 72 65 74 75 72  ell as the retur
bb70: 6e 65 64 20 73 74 72 69 6e 67 2c 20 74 68 72 65  ned string, thre
bb80: 65 20 6f 74 68 65 72 20 6d 61 6c 6c 6f 63 27 64  e other malloc'd
bb90: 20 73 74 72 69 6e 67 73 20 61 72 65 20 0a 2a 2a   strings are .**
bba0: 20 72 65 74 75 72 6e 65 64 20 76 69 61 20 6f 75   returned via ou
bbb0: 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 73 2e  tput parameters.
bbc0: 20 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   As follows:.**.
bbd0: 2a 2a 20 20 20 70 7a 49 6d 70 6f 73 74 65 72 43  **   pzImposterC
bbe0: 6f 6c 73 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 70 7a  ols: ....**   pz
bbf0: 49 6d 70 6f 73 74 65 72 50 6b 3a 20 2e 2e 2e 0a  ImposterPk: ....
bc00: 2a 2a 20 20 20 70 7a 57 68 65 72 65 3a 20 2e 2e  **   pzWhere: ..
bc10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
bc20: 20 2a 72 62 75 4f 62 6a 49 74 65 72 47 65 74 49   *rbuObjIterGetI
bc30: 6e 64 65 78 43 6f 6c 73 28 0a 20 20 73 71 6c 69  ndexCols(.  sqli
bc40: 74 65 33 72 62 75 20 2a 70 2c 20 20 20 20 20 20  te3rbu *p,      
bc50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
bc60: 42 55 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 52  BU object */.  R
bc70: 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72  buObjIter *pIter
bc80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
bc90: 2a 20 4f 62 6a 65 63 74 20 69 74 65 72 61 74 6f  * Object iterato
bca0: 72 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 6e 61 6d  r for column nam
bcb0: 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  es */.  char **p
bcc0: 7a 49 6d 70 6f 73 74 65 72 43 6f 6c 73 2c 20 20  zImposterCols,  
bcd0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
bce0: 43 6f 6c 75 6d 6e 73 20 66 6f 72 20 69 6d 70 6f  Columns for impo
bcf0: 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ster table */.  
bd00: 63 68 61 72 20 2a 2a 70 7a 49 6d 70 6f 73 74 65  char **pzImposte
bd10: 72 50 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  rPk,            
bd20: 2f 2a 20 4f 55 54 3a 20 49 6d 70 6f 73 74 65 72  /* OUT: Imposter
bd30: 20 50 4b 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   PK clause */.  
bd40: 63 68 61 72 20 2a 2a 70 7a 57 68 65 72 65 2c 20  char **pzWhere, 
bd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd60: 2f 2a 20 4f 55 54 3a 20 57 48 45 52 45 20 63 6c  /* OUT: WHERE cl
bd70: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ause */.  int *p
bd80: 6e 42 69 6e 64 20 20 20 20 20 20 20 20 20 20 20  nBind           
bd90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
bda0: 3a 20 54 72 62 75 6c 20 6e 75 6d 62 65 72 20 6f  : Trbul number o
bdb0: 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 29 7b 0a  f columns */.){.
bdc0: 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63    int rc = p->rc
bdd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bde0: 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20    /* Error code 
bdf0: 2a 2f 0a 20 20 69 6e 74 20 72 63 32 3b 20 20 20  */.  int rc2;   
be00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be10: 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
be20: 66 69 6e 61 6c 69 7a 65 28 29 20 72 65 74 75 72  finalize() retur
be30: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72  n code */.  char
be40: 20 2a 7a 52 65 74 20 3d 20 30 3b 20 20 20 20 20   *zRet = 0;     
be50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
be60: 74 72 69 6e 67 20 74 6f 20 72 65 74 75 72 6e 20  tring to return 
be70: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 49 6d 70 43  */.  char *zImpC
be80: 6f 6c 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ols = 0;        
be90: 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 74       /* String t
bea0: 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70 7a  o return via *pz
beb0: 49 6d 70 6f 73 74 65 72 43 6f 6c 73 20 2a 2f 0a  ImposterCols */.
bec0: 20 20 63 68 61 72 20 2a 7a 49 6d 70 50 4b 20 3d    char *zImpPK =
bed0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
bee0: 20 20 2f 2a 20 53 74 72 69 6e 67 20 74 6f 20 72    /* String to r
bef0: 65 74 75 72 6e 20 76 69 61 20 2a 70 7a 49 6d 70  eturn via *pzImp
bf00: 6f 73 74 65 72 50 4b 20 2a 2f 0a 20 20 63 68 61  osterPK */.  cha
bf10: 72 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b 20 20  r *zWhere = 0;  
bf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bf30: 53 74 72 69 6e 67 20 74 6f 20 72 65 74 75 72 6e  String to return
bf40: 20 76 69 61 20 2a 70 7a 57 68 65 72 65 20 2a 2f   via *pzWhere */
bf50: 0a 20 20 69 6e 74 20 6e 42 69 6e 64 20 3d 20 30  .  int nBind = 0
bf60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bf70: 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
bf80: 65 74 75 72 6e 20 76 69 61 20 2a 70 6e 42 69 6e  eturn via *pnBin
bf90: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
bfa0: 72 20 2a 7a 43 6f 6d 20 3d 20 22 22 3b 20 20 20  r *zCom = "";   
bfb0: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f         /* Set to
bfc0: 20 22 2c 20 22 20 6c 61 74 65 72 20 6f 6e 20 2a   ", " later on *
bfd0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
bfe0: 7a 41 6e 64 20 3d 20 22 22 3b 20 20 20 20 20 20  zAnd = "";      
bff0: 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 22 20      /* Set to " 
c000: 41 4e 44 20 22 20 6c 61 74 65 72 20 6f 6e 20 2a  AND " later on *
c010: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
c020: 20 2a 70 58 49 6e 66 6f 20 3d 20 30 3b 20 20 20   *pXInfo = 0;   
c030: 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 69 6e      /* PRAGMA in
c040: 64 65 78 5f 78 69 6e 66 6f 20 3d 20 3f 20 2a 2f  dex_xinfo = ? */
c050: 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
c060: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
c070: 65 72 74 28 20 70 2d 3e 7a 45 72 72 6d 73 67 3d  ert( p->zErrmsg=
c080: 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  =0 );.    rc = p
c090: 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c  repareFreeAndCol
c0a0: 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d  lectError(p->dbM
c0b0: 61 69 6e 2c 20 26 70 58 49 6e 66 6f 2c 20 26 70  ain, &pXInfo, &p
c0c0: 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20 20  ->zErrmsg,.     
c0d0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e     sqlite3_mprin
c0e0: 74 66 28 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e  tf("PRAGMA main.
c0f0: 69 6e 64 65 78 5f 78 69 6e 66 6f 20 3d 20 25 51  index_xinfo = %Q
c100: 22 2c 20 70 49 74 65 72 2d 3e 7a 49 64 78 29 0a  ", pIter->zIdx).
c110: 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 77 68      );.  }..  wh
c120: 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
c130: 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57  OK && SQLITE_ROW
c140: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
c150: 58 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 69 6e  XInfo) ){.    in
c160: 74 20 69 43 69 64 20 3d 20 73 71 6c 69 74 65 33  t iCid = sqlite3
c170: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49 6e  _column_int(pXIn
c180: 66 6f 2c 20 31 29 3b 0a 20 20 20 20 69 6e 74 20  fo, 1);.    int 
c190: 62 44 65 73 63 20 3d 20 73 71 6c 69 74 65 33 5f  bDesc = sqlite3_
c1a0: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49 6e 66  column_int(pXInf
c1b0: 6f 2c 20 33 29 3b 0a 20 20 20 20 63 6f 6e 73 74  o, 3);.    const
c1c0: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 61 74 65 20   char *zCollate 
c1d0: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
c1e0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
c1f0: 78 74 28 70 58 49 6e 66 6f 2c 20 34 29 3b 0a 20  xt(pXInfo, 4);. 
c200: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
c210: 43 6f 6c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  Col;.    const c
c220: 68 61 72 20 2a 7a 54 79 70 65 3b 0a 0a 20 20 20  har *zType;..   
c230: 20 69 66 28 20 69 43 69 64 3c 30 20 29 7b 0a 20   if( iCid<0 ){. 
c240: 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 74 65 67       /* An integ
c250: 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20  er primary key. 
c260: 49 66 20 74 68 65 20 74 61 62 6c 65 20 68 61 73  If the table has
c270: 20 61 6e 20 65 78 70 6c 69 63 69 74 20 49 50 4b   an explicit IPK
c280: 2c 20 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 69  , use.      ** i
c290: 74 73 20 6e 61 6d 65 2e 20 4f 74 68 65 72 77 69  ts name. Otherwi
c2a0: 73 65 2c 20 75 73 65 20 22 72 62 75 5f 72 6f 77  se, use "rbu_row
c2b0: 69 64 22 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  id".  */.      i
c2c0: 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  f( pIter->eType=
c2d0: 3d 52 42 55 5f 50 4b 5f 49 50 4b 20 29 7b 0a 20  =RBU_PK_IPK ){. 
c2e0: 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
c2f0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 70        for(i=0; p
c300: 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 5d  Iter->abTblPk[i]
c310: 3d 3d 30 3b 20 69 2b 2b 29 3b 0a 20 20 20 20 20  ==0; i++);.     
c320: 20 20 20 61 73 73 65 72 74 28 20 69 3c 70 49 74     assert( i<pIt
c330: 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20 29 3b 0a 20  er->nTblCol );. 
c340: 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 49         zCol = pI
c350: 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d  ter->azTblCol[i]
c360: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
c370: 28 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 29  ( rbuIsVacuum(p)
c380: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c   ){.        zCol
c390: 20 3d 20 22 5f 72 6f 77 69 64 5f 22 3b 0a 20 20   = "_rowid_";.  
c3a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c3b0: 20 20 20 7a 43 6f 6c 20 3d 20 22 72 62 75 5f 72     zCol = "rbu_r
c3c0: 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 0a 20  owid";.      }. 
c3d0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e       zType = "IN
c3e0: 54 45 47 45 52 22 3b 0a 20 20 20 20 7d 65 6c 73  TEGER";.    }els
c3f0: 65 7b 0a 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  e{.      zCol = 
c400: 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b  pIter->azTblCol[
c410: 69 43 69 64 5d 3b 0a 20 20 20 20 20 20 7a 54 79  iCid];.      zTy
c420: 70 65 20 3d 20 70 49 74 65 72 2d 3e 61 7a 54 62  pe = pIter->azTb
c430: 6c 54 79 70 65 5b 69 43 69 64 5d 3b 0a 20 20 20  lType[iCid];.   
c440: 20 7d 0a 0a 20 20 20 20 7a 52 65 74 20 3d 20 73   }..    zRet = s
c450: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
c460: 25 7a 25 73 5c 22 25 77 5c 22 20 43 4f 4c 4c 41  %z%s\"%w\" COLLA
c470: 54 45 20 25 51 22 2c 20 7a 52 65 74 2c 20 7a 43  TE %Q", zRet, zC
c480: 6f 6d 2c 20 7a 43 6f 6c 2c 20 7a 43 6f 6c 6c 61  om, zCol, zColla
c490: 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74  te);.    if( pIt
c4a0: 65 72 2d 3e 62 55 6e 69 71 75 65 3d 3d 30 20 7c  er->bUnique==0 |
c4b0: 7c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  | sqlite3_column
c4c0: 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20 35 29 20  _int(pXInfo, 5) 
c4d0: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
c4e0: 68 61 72 20 2a 7a 4f 72 64 65 72 20 3d 20 28 62  har *zOrder = (b
c4f0: 44 65 73 63 20 3f 20 22 20 44 45 53 43 22 20 3a  Desc ? " DESC" :
c500: 20 22 22 29 3b 0a 20 20 20 20 20 20 7a 49 6d 70   "");.      zImp
c510: 50 4b 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  PK = sqlite3_mpr
c520: 69 6e 74 66 28 22 25 7a 25 73 5c 22 72 62 75 5f  intf("%z%s\"rbu_
c530: 69 6d 70 5f 25 64 25 77 5c 22 25 73 22 2c 20 0a  imp_%d%w\"%s", .
c540: 20 20 20 20 20 20 20 20 20 20 7a 49 6d 70 50 4b            zImpPK
c550: 2c 20 7a 43 6f 6d 2c 20 6e 42 69 6e 64 2c 20 7a  , zCom, nBind, z
c560: 43 6f 6c 2c 20 7a 4f 72 64 65 72 0a 20 20 20 20  Col, zOrder.    
c570: 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a    );.    }.    z
c580: 49 6d 70 43 6f 6c 73 20 3d 20 73 71 6c 69 74 65  ImpCols = sqlite
c590: 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 25 73 5c  3_mprintf("%z%s\
c5a0: 22 72 62 75 5f 69 6d 70 5f 25 64 25 77 5c 22 20  "rbu_imp_%d%w\" 
c5b0: 25 73 20 43 4f 4c 4c 41 54 45 20 25 51 22 2c 20  %s COLLATE %Q", 
c5c0: 0a 20 20 20 20 20 20 20 20 7a 49 6d 70 43 6f 6c  .        zImpCol
c5d0: 73 2c 20 7a 43 6f 6d 2c 20 6e 42 69 6e 64 2c 20  s, zCom, nBind, 
c5e0: 7a 43 6f 6c 2c 20 7a 54 79 70 65 2c 20 7a 43 6f  zCol, zType, zCo
c5f0: 6c 6c 61 74 65 0a 20 20 20 20 29 3b 0a 20 20 20  llate.    );.   
c600: 20 7a 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65   zWhere = sqlite
c610: 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
c620: 20 20 20 22 25 7a 25 73 5c 22 72 62 75 5f 69 6d     "%z%s\"rbu_im
c630: 70 5f 25 64 25 77 5c 22 20 49 53 20 3f 22 2c 20  p_%d%w\" IS ?", 
c640: 7a 57 68 65 72 65 2c 20 7a 41 6e 64 2c 20 6e 42  zWhere, zAnd, nB
c650: 69 6e 64 2c 20 7a 43 6f 6c 0a 20 20 20 20 29 3b  ind, zCol.    );
c660: 0a 20 20 20 20 69 66 28 20 7a 52 65 74 3d 3d 30  .    if( zRet==0
c670: 20 7c 7c 20 7a 49 6d 70 50 4b 3d 3d 30 20 7c 7c   || zImpPK==0 ||
c680: 20 7a 49 6d 70 43 6f 6c 73 3d 3d 30 20 7c 7c 20   zImpCols==0 || 
c690: 7a 57 68 65 72 65 3d 3d 30 20 29 20 72 63 20 3d  zWhere==0 ) rc =
c6a0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
c6b0: 20 20 20 7a 43 6f 6d 20 3d 20 22 2c 20 22 3b 0a     zCom = ", ";.
c6c0: 20 20 20 20 7a 41 6e 64 20 3d 20 22 20 41 4e 44      zAnd = " AND
c6d0: 20 22 3b 0a 20 20 20 20 6e 42 69 6e 64 2b 2b 3b   ";.    nBind++;
c6e0: 0a 20 20 7d 0a 0a 20 20 72 63 32 20 3d 20 73 71  .  }..  rc2 = sq
c6f0: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
c700: 58 49 6e 66 6f 29 3b 0a 20 20 69 66 28 20 72 63  XInfo);.  if( rc
c710: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  ==SQLITE_OK ) rc
c720: 20 3d 20 72 63 32 3b 0a 0a 20 20 69 66 28 20 72   = rc2;..  if( r
c730: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
c740: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
c750: 28 7a 52 65 74 29 3b 0a 20 20 20 20 73 71 6c 69  (zRet);.    sqli
c760: 74 65 33 5f 66 72 65 65 28 7a 49 6d 70 43 6f 6c  te3_free(zImpCol
c770: 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  s);.    sqlite3_
c780: 66 72 65 65 28 7a 49 6d 70 50 4b 29 3b 0a 20 20  free(zImpPK);.  
c790: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
c7a0: 57 68 65 72 65 29 3b 0a 20 20 20 20 7a 52 65 74  Where);.    zRet
c7b0: 20 3d 20 30 3b 0a 20 20 20 20 7a 49 6d 70 43 6f   = 0;.    zImpCo
c7c0: 6c 73 20 3d 20 30 3b 0a 20 20 20 20 7a 49 6d 70  ls = 0;.    zImp
c7d0: 50 4b 20 3d 20 30 3b 0a 20 20 20 20 7a 57 68 65  PK = 0;.    zWhe
c7e0: 72 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 72  re = 0;.    p->r
c7f0: 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2a  c = rc;.  }..  *
c800: 70 7a 49 6d 70 6f 73 74 65 72 43 6f 6c 73 20 3d  pzImposterCols =
c810: 20 7a 49 6d 70 43 6f 6c 73 3b 0a 20 20 2a 70 7a   zImpCols;.  *pz
c820: 49 6d 70 6f 73 74 65 72 50 6b 20 3d 20 7a 49 6d  ImposterPk = zIm
c830: 70 50 4b 3b 0a 20 20 2a 70 7a 57 68 65 72 65 20  pPK;.  *pzWhere 
c840: 3d 20 7a 57 68 65 72 65 3b 0a 20 20 2a 70 6e 42  = zWhere;.  *pnB
c850: 69 6e 64 20 3d 20 6e 42 69 6e 64 3b 0a 20 20 72  ind = nBind;.  r
c860: 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 2f  eturn zRet;.}../
c870: 2a 0a 2a 2a 20 41 73 73 75 6d 69 6e 67 20 74 68  *.** Assuming th
c880: 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20  e current table 
c890: 63 6f 6c 75 6d 6e 73 20 61 72 65 20 22 61 22 2c  columns are "a",
c8a0: 20 22 62 22 20 61 6e 64 20 22 63 22 2c 20 61 6e   "b" and "c", an
c8b0: 64 20 74 68 65 20 7a 4f 62 6a 0a 2a 2a 20 70 61  d the zObj.** pa
c8c0: 72 61 6d 74 65 72 20 69 73 20 70 61 73 73 65 64  ramter is passed
c8d0: 20 22 6f 6c 64 22 2c 20 72 65 74 75 72 6e 20 61   "old", return a
c8e0: 20 73 74 72 69 6e 67 20 6f 66 20 74 68 65 20 66   string of the f
c8f0: 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 22  orm:.**.**     "
c900: 6f 6c 64 2e 61 2c 20 6f 6c 64 2e 62 2c 20 6f 6c  old.a, old.b, ol
c910: 64 2e 62 22 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20  d.b".**.** With 
c920: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
c930: 20 65 73 63 61 70 65 64 2e 0a 2a 2a 0a 2a 2a 20   escaped..**.** 
c940: 46 6f 72 20 74 61 62 6c 65 73 20 77 69 74 68 20  For tables with 
c950: 69 6d 70 6c 69 63 69 74 20 72 6f 77 69 64 73 20  implicit rowids 
c960: 2d 20 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41  - RBU_PK_EXTERNA
c970: 4c 20 61 6e 64 20 52 42 55 5f 50 4b 5f 4e 4f 4e  L and RBU_PK_NON
c980: 45 2c 20 61 70 70 65 6e 64 0a 2a 2a 20 74 68 65  E, append.** the
c990: 20 74 65 78 74 20 22 2c 20 6f 6c 64 2e 5f 72 6f   text ", old._ro
c9a0: 77 69 64 5f 22 20 74 6f 20 74 68 65 20 72 65 74  wid_" to the ret
c9b0: 75 72 6e 65 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a  urned value..*/.
c9c0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 62 75  static char *rbu
c9d0: 4f 62 6a 49 74 65 72 47 65 74 4f 6c 64 6c 69 73  ObjIterGetOldlis
c9e0: 74 28 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20  t(.  sqlite3rbu 
c9f0: 2a 70 2c 20 0a 20 20 52 62 75 4f 62 6a 49 74 65  *p, .  RbuObjIte
ca00: 72 20 2a 70 49 74 65 72 2c 0a 20 20 63 6f 6e 73  r *pIter,.  cons
ca10: 74 20 63 68 61 72 20 2a 7a 4f 62 6a 0a 29 7b 0a  t char *zObj.){.
ca20: 20 20 63 68 61 72 20 2a 7a 4c 69 73 74 20 3d 20    char *zList = 
ca30: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  0;.  if( p->rc==
ca40: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49 74  SQLITE_OK && pIt
ca50: 65 72 2d 3e 61 62 49 6e 64 65 78 65 64 20 29 7b  er->abIndexed ){
ca60: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
ca70: 2a 7a 53 20 3d 20 22 22 3b 0a 20 20 20 20 69 6e  *zS = "";.    in
ca80: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
ca90: 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43  ; i<pIter->nTblC
caa0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
cab0: 69 66 28 20 70 49 74 65 72 2d 3e 61 62 49 6e 64  if( pIter->abInd
cac0: 65 78 65 64 5b 69 5d 20 29 7b 0a 20 20 20 20 20  exed[i] ){.     
cad0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
cae0: 43 6f 6c 20 3d 20 70 49 74 65 72 2d 3e 61 7a 54  Col = pIter->azT
caf0: 62 6c 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  blCol[i];.      
cb00: 20 20 7a 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    zList = sqlite
cb10: 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 25 73 25  3_mprintf("%z%s%
cb20: 73 2e 5c 22 25 77 5c 22 22 2c 20 7a 4c 69 73 74  s.\"%w\"", zList
cb30: 2c 20 7a 53 2c 20 7a 4f 62 6a 2c 20 7a 43 6f 6c  , zS, zObj, zCol
cb40: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
cb50: 20 20 20 20 20 20 20 20 7a 4c 69 73 74 20 3d 20          zList = 
cb60: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
cb70: 22 25 7a 25 73 4e 55 4c 4c 22 2c 20 7a 4c 69 73  "%z%sNULL", zLis
cb80: 74 2c 20 7a 53 29 3b 0a 20 20 20 20 20 20 7d 0a  t, zS);.      }.
cb90: 20 20 20 20 20 20 7a 53 20 3d 20 22 2c 20 22 3b        zS = ", ";
cba0: 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69 73 74  .      if( zList
cbb0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
cbc0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
cbd0: 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 62 72 65  MEM;.        bre
cbe0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
cbf0: 7d 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61 20  }..    /* For a 
cc00: 74 61 62 6c 65 20 77 69 74 68 20 69 6d 70 6c 69  table with impli
cc10: 63 69 74 20 72 6f 77 69 64 73 2c 20 61 70 70 65  cit rowids, appe
cc20: 6e 64 20 22 6f 6c 64 2e 5f 72 6f 77 69 64 5f 22  nd "old._rowid_"
cc30: 20 74 6f 20 74 68 65 20 6c 69 73 74 2e 20 2a 2f   to the list. */
cc40: 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
cc50: 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45 58  eType==RBU_PK_EX
cc60: 54 45 52 4e 41 4c 20 7c 7c 20 70 49 74 65 72 2d  TERNAL || pIter-
cc70: 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e  >eType==RBU_PK_N
cc80: 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 7a 4c 69  ONE ){.      zLi
cc90: 73 74 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28  st = rbuMPrintf(
cca0: 70 2c 20 22 25 7a 2c 20 25 73 2e 5f 72 6f 77 69  p, "%z, %s._rowi
ccb0: 64 5f 22 2c 20 7a 4c 69 73 74 2c 20 7a 4f 62 6a  d_", zList, zObj
ccc0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
ccd0: 65 74 75 72 6e 20 7a 4c 69 73 74 3b 0a 7d 0a 0a  eturn zList;.}..
cce0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20  /*.** Return an 
ccf0: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
cd00: 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61  can be used in a
cd10: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
cd20: 20 6d 61 74 63 68 20 74 68 65 0a 2a 2a 20 70 72   match the.** pr
cd30: 69 6d 61 72 79 20 6b 65 79 20 6f 66 20 74 68 65  imary key of the
cd40: 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 2e 20   current table. 
cd50: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
cd60: 74 68 65 20 74 61 62 6c 65 20 69 73 3a 0a 2a 2a  the table is:.**
cd70: 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42  .**   CREATE TAB
cd80: 4c 45 20 74 31 28 61 2c 20 62 2c 20 63 2c 20 50  LE t1(a, b, c, P
cd90: 52 49 4d 41 52 59 20 4b 45 59 28 62 2c 20 63 29  RIMARY KEY(b, c)
cda0: 29 3b 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  );.**.** Return 
cdb0: 74 68 65 20 73 74 72 69 6e 67 3a 0a 2a 2a 0a 2a  the string:.**.*
cdc0: 2a 20 20 20 22 62 20 3d 20 3f 31 20 41 4e 44 20  *   "b = ?1 AND 
cdd0: 63 20 3d 20 3f 32 22 0a 2a 2f 0a 73 74 61 74 69  c = ?2".*/.stati
cde0: 63 20 63 68 61 72 20 2a 72 62 75 4f 62 6a 49 74  c char *rbuObjIt
cdf0: 65 72 47 65 74 57 68 65 72 65 28 0a 20 20 73 71  erGetWhere(.  sq
ce00: 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 0a 20 20  lite3rbu *p, .  
ce10: 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65  RbuObjIter *pIte
ce20: 72 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 69  r.){.  char *zLi
ce30: 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 49  st = 0;.  if( pI
ce40: 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f  ter->eType==RBU_
ce50: 50 4b 5f 56 54 41 42 20 7c 7c 20 70 49 74 65 72  PK_VTAB || pIter
ce60: 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
ce70: 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 7a 4c 69 73  NONE ){.    zLis
ce80: 74 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70  t = rbuMPrintf(p
ce90: 2c 20 22 5f 72 6f 77 69 64 5f 20 3d 20 3f 25 64  , "_rowid_ = ?%d
cea0: 22 2c 20 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f  ", pIter->nTblCo
ceb0: 6c 2b 31 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  l+1);.  }else if
cec0: 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  ( pIter->eType==
ced0: 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20  RBU_PK_EXTERNAL 
cee0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
cef0: 72 20 2a 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20  r *zSep = "";.  
cf00: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
cf10: 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e  (i=0; i<pIter->n
cf20: 54 62 6c 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  TblCol; i++){.  
cf30: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 61      if( pIter->a
cf40: 62 54 62 6c 50 6b 5b 69 5d 20 29 7b 0a 20 20 20  bTblPk[i] ){.   
cf50: 20 20 20 20 20 7a 4c 69 73 74 20 3d 20 72 62 75       zList = rbu
cf60: 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 25 73  MPrintf(p, "%z%s
cf70: 63 25 64 3d 3f 25 64 22 2c 20 7a 4c 69 73 74 2c  c%d=?%d", zList,
cf80: 20 7a 53 65 70 2c 20 69 2c 20 69 2b 31 29 3b 0a   zSep, i, i+1);.
cf90: 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22          zSep = "
cfa0: 20 41 4e 44 20 22 3b 0a 20 20 20 20 20 20 7d 0a   AND ";.      }.
cfb0: 20 20 20 20 7d 0a 20 20 20 20 7a 4c 69 73 74 20      }.    zList 
cfc0: 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20  = rbuMPrintf(p, 
cfd0: 0a 20 20 20 20 20 20 20 20 22 5f 72 6f 77 69 64  .        "_rowid
cfe0: 5f 20 3d 20 28 53 45 4c 45 43 54 20 69 64 20 46  _ = (SELECT id F
cff0: 52 4f 4d 20 72 62 75 5f 69 6d 70 6f 73 74 65 72  ROM rbu_imposter
d000: 32 20 57 48 45 52 45 20 25 7a 29 22 2c 20 7a 4c  2 WHERE %z)", zL
d010: 69 73 74 0a 20 20 20 20 29 3b 0a 0a 20 20 7d 65  ist.    );..  }e
d020: 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  lse{.    const c
d030: 68 61 72 20 2a 7a 53 65 70 20 3d 20 22 22 3b 0a  har *zSep = "";.
d040: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
d050: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d  or(i=0; i<pIter-
d060: 3e 6e 54 62 6c 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nTblCol; i++){.
d070: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
d080: 3e 61 62 54 62 6c 50 6b 5b 69 5d 20 29 7b 0a 20  >abTblPk[i] ){. 
d090: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
d0a0: 72 20 2a 7a 43 6f 6c 20 3d 20 70 49 74 65 72 2d  r *zCol = pIter-
d0b0: 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 3b 0a 20 20  >azTblCol[i];.  
d0c0: 20 20 20 20 20 20 7a 4c 69 73 74 20 3d 20 72 62        zList = rb
d0d0: 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 25  uMPrintf(p, "%z%
d0e0: 73 5c 22 25 77 5c 22 3d 3f 25 64 22 2c 20 7a 4c  s\"%w\"=?%d", zL
d0f0: 69 73 74 2c 20 7a 53 65 70 2c 20 7a 43 6f 6c 2c  ist, zSep, zCol,
d100: 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7a   i+1);.        z
d110: 53 65 70 20 3d 20 22 20 41 4e 44 20 22 3b 0a 20  Sep = " AND ";. 
d120: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
d130: 0a 20 20 72 65 74 75 72 6e 20 7a 4c 69 73 74 3b  .  return zList;
d140: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 53 45  .}../*.** The SE
d150: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
d160: 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68  terating through
d170: 20 74 68 65 20 6b 65 79 73 20 66 6f 72 20 74 68   the keys for th
d180: 65 20 63 75 72 72 65 6e 74 20 6f 62 6a 65 63 74  e current object
d190: 0a 2a 2a 20 28 70 2d 3e 6f 62 6a 69 74 65 72 2e  .** (p->objiter.
d1a0: 70 53 65 6c 65 63 74 29 20 63 75 72 72 65 6e 74  pSelect) current
d1b0: 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 76  ly points to a v
d1c0: 61 6c 69 64 20 72 6f 77 2e 20 48 6f 77 65 76 65  alid row. Howeve
d1d0: 72 2c 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 73  r, there.** is s
d1e0: 6f 6d 65 74 68 69 6e 67 20 77 72 6f 6e 67 20 77  omething wrong w
d1f0: 69 74 68 20 74 68 65 20 72 62 75 5f 63 6f 6e 74  ith the rbu_cont
d200: 72 6f 6c 20 76 61 6c 75 65 20 69 6e 20 74 68 65  rol value in the
d210: 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 76 61 6c   rbu_control val
d220: 75 65 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  ue.** stored in 
d230: 74 68 65 20 28 70 2d 3e 6e 43 6f 6c 2b 31 29 27  the (p->nCol+1)'
d240: 74 68 20 63 6f 6c 75 6d 6e 2e 20 53 65 74 20 74  th column. Set t
d250: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  he error code an
d260: 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  d error message.
d270: 2a 2a 20 6f 66 20 74 68 65 20 52 42 55 20 68 61  ** of the RBU ha
d280: 6e 64 6c 65 20 74 6f 20 73 6f 6d 65 74 68 69 6e  ndle to somethin
d290: 67 20 72 65 66 6c 65 63 74 69 6e 67 20 74 68 69  g reflecting thi
d2a0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
d2b0: 64 20 72 62 75 42 61 64 43 6f 6e 74 72 6f 6c 45  d rbuBadControlE
d2c0: 72 72 6f 72 28 73 71 6c 69 74 65 33 72 62 75 20  rror(sqlite3rbu 
d2d0: 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53  *p){.  p->rc = S
d2e0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 70  QLITE_ERROR;.  p
d2f0: 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69  ->zErrmsg = sqli
d300: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 69 6e 76  te3_mprintf("inv
d310: 61 6c 69 64 20 72 62 75 5f 63 6f 6e 74 72 6f 6c  alid rbu_control
d320: 20 76 61 6c 75 65 22 29 3b 0a 7d 0a 0a 0a 2f 2a   value");.}.../*
d330: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6e 75 6c  .** Return a nul
d340: 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
d350: 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ng containing th
d360: 65 20 63 6f 6d 6d 61 20 73 65 70 61 72 61 74 65  e comma separate
d370: 64 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 61 73 73  d list of.** ass
d380: 69 67 6e 6d 65 6e 74 73 20 74 68 61 74 20 73 68  ignments that sh
d390: 6f 75 6c 64 20 62 65 20 69 6e 63 6c 75 64 65 64  ould be included
d3a0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 22   following the "
d3b0: 53 45 54 22 20 6b 65 79 77 6f 72 64 20 6f 66 0a  SET" keyword of.
d3c0: 2a 2a 20 61 6e 20 55 50 44 41 54 45 20 73 74 61  ** an UPDATE sta
d3d0: 74 65 6d 65 6e 74 20 75 73 65 64 20 74 6f 20 75  tement used to u
d3e0: 70 64 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  pdate the table 
d3f0: 6f 62 6a 65 63 74 20 74 68 61 74 20 74 68 65 20  object that the 
d400: 69 74 65 72 61 74 6f 72 0a 2a 2a 20 70 61 73 73  iterator.** pass
d410: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
d420: 20 61 72 67 75 6d 65 6e 74 20 63 75 72 72 65 6e   argument curren
d430: 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 69 66  tly points to if
d440: 20 74 68 65 20 72 62 75 5f 63 6f 6e 74 72 6f 6c   the rbu_control
d450: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  .** column of th
d460: 65 20 64 61 74 61 5f 78 78 78 20 74 61 62 6c 65  e data_xxx table
d470: 20 65 6e 74 72 79 20 69 73 20 73 65 74 20 74 6f   entry is set to
d480: 20 7a 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68   zMask..**.** Th
d490: 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65  e memory for the
d4a0: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
d4b0: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
d4c0: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
d4d0: 28 29 2e 0a 2a 2a 20 49 74 20 69 73 20 74 68 65  ()..** It is the
d4e0: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
d4f0: 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
d500: 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
d510: 20 69 74 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c   it using.** sql
d520: 69 74 65 33 5f 66 72 65 65 28 29 2e 20 0a 2a 2a  ite3_free(). .**
d530: 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72  .** If an OOM er
d540: 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
d550: 65 64 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74 69  ed when allocati
d560: 6e 67 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  ng space for the
d570: 20 6e 65 77 0a 2a 2a 20 73 74 72 69 6e 67 2c 20   new.** string, 
d580: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
d590: 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72 62 75   left in the rbu
d5a0: 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61   handle passed a
d5b0: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61  s the first.** a
d5c0: 72 67 75 6d 65 6e 74 20 61 6e 64 20 4e 55 4c 4c  rgument and NULL
d5d0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72   is returned. Or
d5e0: 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 68 61  , if an error ha
d5f0: 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
d600: 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20  ed.** when this 
d610: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
d620: 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  ed, NULL is retu
d630: 72 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  rned immediately
d640: 2c 20 77 69 74 68 6f 75 74 0a 2a 2a 20 61 74 74  , without.** att
d650: 65 6d 70 74 69 6e 67 20 74 68 65 20 61 6c 6c 6f  empting the allo
d660: 63 61 74 69 6f 6e 20 6f 72 20 6d 6f 64 69 66 79  cation or modify
d670: 69 6e 67 20 74 68 65 20 73 74 6f 72 65 64 20 65  ing the stored e
d680: 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
d690: 61 74 69 63 20 63 68 61 72 20 2a 72 62 75 4f 62  atic char *rbuOb
d6a0: 6a 49 74 65 72 47 65 74 53 65 74 6c 69 73 74 28  jIterGetSetlist(
d6b0: 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70  .  sqlite3rbu *p
d6c0: 2c 0a 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a  ,.  RbuObjIter *
d6d0: 70 49 74 65 72 2c 0a 20 20 63 6f 6e 73 74 20 63  pIter,.  const c
d6e0: 68 61 72 20 2a 7a 4d 61 73 6b 0a 29 7b 0a 20 20  har *zMask.){.  
d6f0: 63 68 61 72 20 2a 7a 4c 69 73 74 20 3d 20 30 3b  char *zList = 0;
d700: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
d710: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
d720: 6e 74 20 69 3b 0a 0a 20 20 20 20 69 66 28 20 28  nt i;..    if( (
d730: 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4d 61 73 6b  int)strlen(zMask
d740: 29 21 3d 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f  )!=pIter->nTblCo
d750: 6c 20 29 7b 0a 20 20 20 20 20 20 72 62 75 42 61  l ){.      rbuBa
d760: 64 43 6f 6e 74 72 6f 6c 45 72 72 6f 72 28 70 29  dControlError(p)
d770: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
d780: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
d790: 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 20 20  Sep = "";.      
d7a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72  for(i=0; i<pIter
d7b0: 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69 2b 2b 29 7b  ->nTblCol; i++){
d7c0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63 20  .        char c 
d7d0: 3d 20 7a 4d 61 73 6b 5b 70 49 74 65 72 2d 3e 61  = zMask[pIter->a
d7e0: 69 53 72 63 4f 72 64 65 72 5b 69 5d 5d 3b 0a 20  iSrcOrder[i]];. 
d7f0: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 78         if( c=='x
d800: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ' ){.          z
d810: 4c 69 73 74 20 3d 20 72 62 75 4d 50 72 69 6e 74  List = rbuMPrint
d820: 66 28 70 2c 20 22 25 7a 25 73 5c 22 25 77 5c 22  f(p, "%z%s\"%w\"
d830: 3d 3f 25 64 22 2c 20 0a 20 20 20 20 20 20 20 20  =?%d", .        
d840: 20 20 20 20 20 20 7a 4c 69 73 74 2c 20 7a 53 65        zList, zSe
d850: 70 2c 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43  p, pIter->azTblC
d860: 6f 6c 5b 69 5d 2c 20 69 2b 31 0a 20 20 20 20 20  ol[i], i+1.     
d870: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
d880: 20 20 7a 53 65 70 20 3d 20 22 2c 20 22 3b 0a 20    zSep = ", ";. 
d890: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d8a0: 20 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 64 27   else if( c=='d'
d8b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4c   ){.          zL
d8c0: 69 73 74 20 3d 20 72 62 75 4d 50 72 69 6e 74 66  ist = rbuMPrintf
d8d0: 28 70 2c 20 22 25 7a 25 73 5c 22 25 77 5c 22 3d  (p, "%z%s\"%w\"=
d8e0: 72 62 75 5f 64 65 6c 74 61 28 5c 22 25 77 5c 22  rbu_delta(\"%w\"
d8f0: 2c 20 3f 25 64 29 22 2c 20 0a 20 20 20 20 20 20  , ?%d)", .      
d900: 20 20 20 20 20 20 20 20 7a 4c 69 73 74 2c 20 7a          zList, z
d910: 53 65 70 2c 20 70 49 74 65 72 2d 3e 61 7a 54 62  Sep, pIter->azTb
d920: 6c 43 6f 6c 5b 69 5d 2c 20 70 49 74 65 72 2d 3e  lCol[i], pIter->
d930: 61 7a 54 62 6c 43 6f 6c 5b 69 5d 2c 20 69 2b 31  azTblCol[i], i+1
d940: 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
d950: 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22          zSep = "
d960: 2c 20 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  , ";.        }. 
d970: 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20         else if( 
d980: 63 3d 3d 27 66 27 20 29 7b 0a 20 20 20 20 20 20  c=='f' ){.      
d990: 20 20 20 20 7a 4c 69 73 74 20 3d 20 72 62 75 4d      zList = rbuM
d9a0: 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 25 73 5c  Printf(p, "%z%s\
d9b0: 22 25 77 5c 22 3d 72 62 75 5f 66 6f 73 73 69 6c  "%w\"=rbu_fossil
d9c0: 5f 64 65 6c 74 61 28 5c 22 25 77 5c 22 2c 20 3f  _delta(\"%w\", ?
d9d0: 25 64 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20  %d)", .         
d9e0: 20 20 20 20 20 7a 4c 69 73 74 2c 20 7a 53 65 70       zList, zSep
d9f0: 2c 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f  , pIter->azTblCo
da00: 6c 5b 69 5d 2c 20 70 49 74 65 72 2d 3e 61 7a 54  l[i], pIter->azT
da10: 62 6c 43 6f 6c 5b 69 5d 2c 20 69 2b 31 0a 20 20  blCol[i], i+1.  
da20: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
da30: 20 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 20 22       zSep = ", "
da40: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
da50: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
da60: 72 65 74 75 72 6e 20 7a 4c 69 73 74 3b 0a 7d 0a  return zList;.}.
da70: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
da80: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73  nul-terminated s
da90: 74 72 69 6e 67 20 63 6f 6e 73 69 73 74 69 6e 67  tring consisting
daa0: 20 6f 66 20 6e 42 79 74 65 20 63 6f 6d 6d 61 20   of nByte comma 
dab0: 73 65 70 61 72 61 74 65 64 0a 2a 2a 20 22 3f 22  separated.** "?"
dac0: 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 46 6f   expressions. Fo
dad0: 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 6e 42  r example, if nB
dae0: 79 74 65 20 69 73 20 33 2c 20 72 65 74 75 72 6e  yte is 3, return
daf0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a   a pointer to.**
db00: 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
db10: 6e 69 6e 67 20 74 68 65 20 73 74 72 69 6e 67 20  ning the string 
db20: 22 3f 2c 3f 2c 3f 22 2e 0a 2a 2a 0a 2a 2a 20 54  "?,?,?"..**.** T
db30: 68 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68  he memory for th
db40: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
db50: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  g is obtained fr
db60: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
db70: 63 28 29 2e 0a 2a 2a 20 49 74 20 69 73 20 74 68  c()..** It is th
db80: 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
db90: 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
dba0: 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  o eventually fre
dbb0: 65 20 69 74 20 75 73 69 6e 67 0a 2a 2a 20 73 71  e it using.** sq
dbc0: 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 20 0a 2a  lite3_free(). .*
dbd0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65  *.** If an OOM e
dbe0: 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
dbf0: 72 65 64 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74  red when allocat
dc00: 69 6e 67 20 73 70 61 63 65 20 66 6f 72 20 74 68  ing space for th
dc10: 65 20 6e 65 77 0a 2a 2a 20 73 74 72 69 6e 67 2c  e new.** string,
dc20: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
dc30: 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72 62  s left in the rb
dc40: 75 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20  u handle passed 
dc50: 61 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  as the first.** 
dc60: 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 4e 55 4c  argument and NUL
dc70: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  L is returned. O
dc80: 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 68  r, if an error h
dc90: 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
dca0: 72 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73  red.** when this
dcb0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
dcc0: 6c 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  led, NULL is ret
dcd0: 75 72 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  urned immediatel
dce0: 79 2c 20 77 69 74 68 6f 75 74 0a 2a 2a 20 61 74  y, without.** at
dcf0: 74 65 6d 70 74 69 6e 67 20 74 68 65 20 61 6c 6c  tempting the all
dd00: 6f 63 61 74 69 6f 6e 20 6f 72 20 6d 6f 64 69 66  ocation or modif
dd10: 79 69 6e 67 20 74 68 65 20 73 74 6f 72 65 64 20  ying the stored 
dd20: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
dd30: 74 61 74 69 63 20 63 68 61 72 20 2a 72 62 75 4f  tatic char *rbuO
dd40: 62 6a 49 74 65 72 47 65 74 42 69 6e 64 6c 69 73  bjIterGetBindlis
dd50: 74 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c  t(sqlite3rbu *p,
dd60: 20 69 6e 74 20 6e 42 69 6e 64 29 7b 0a 20 20 63   int nBind){.  c
dd70: 68 61 72 20 2a 7a 52 65 74 20 3d 20 30 3b 0a 20  har *zRet = 0;. 
dd80: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 6e 42 69   int nByte = nBi
dd90: 6e 64 2a 32 20 2b 20 31 3b 0a 0a 20 20 7a 52 65  nd*2 + 1;..  zRe
dda0: 74 20 3d 20 28 63 68 61 72 2a 29 72 62 75 4d 61  t = (char*)rbuMa
ddb0: 6c 6c 6f 63 28 70 2c 20 6e 42 79 74 65 29 3b 0a  lloc(p, nByte);.
ddc0: 20 20 69 66 28 20 7a 52 65 74 20 29 7b 0a 20 20    if( zRet ){.  
ddd0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
dde0: 28 69 3d 30 3b 20 69 3c 6e 42 69 6e 64 3b 20 69  (i=0; i<nBind; i
ddf0: 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 52 65 74 5b  ++){.      zRet[
de00: 69 2a 32 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20  i*2] = '?';.    
de10: 20 20 7a 52 65 74 5b 69 2a 32 2b 31 5d 20 3d 20    zRet[i*2+1] = 
de20: 28 69 2b 31 3d 3d 6e 42 69 6e 64 29 20 3f 20 27  (i+1==nBind) ? '
de30: 5c 30 27 20 3a 20 27 2c 27 3b 0a 20 20 20 20 7d  \0' : ',';.    }
de40: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52  .  }.  return zR
de50: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  et;.}../*.** The
de60: 20 69 74 65 72 61 74 6f 72 20 63 75 72 72 65 6e   iterator curren
de70: 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  tly points to a 
de80: 74 61 62 6c 65 20 28 6e 6f 74 20 69 6e 64 65 78  table (not index
de90: 29 20 6f 66 20 74 79 70 65 20 0a 2a 2a 20 52 42  ) of type .** RB
dea0: 55 5f 50 4b 5f 57 49 54 48 4f 55 54 5f 52 4f 57  U_PK_WITHOUT_ROW
deb0: 49 44 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ID. This functio
dec0: 6e 20 63 72 65 61 74 65 73 20 74 68 65 20 50 52  n creates the PR
ded0: 49 4d 41 52 59 20 4b 45 59 20 0a 2a 2a 20 64 65  IMARY KEY .** de
dee0: 63 6c 61 72 61 74 69 6f 6e 20 66 6f 72 20 74 68  claration for th
def0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
df00: 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 2e 20  imposter table. 
df10: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20  For example,.** 
df20: 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  if the iterator 
df30: 70 6f 69 6e 74 73 20 74 6f 20 61 20 74 61 62 6c  points to a tabl
df40: 65 20 63 72 65 61 74 65 64 20 61 73 3a 0a 2a 2a  e created as:.**
df50: 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42  .**   CREATE TAB
df60: 4c 45 20 74 31 28 61 2c 20 62 2c 20 63 2c 20 50  LE t1(a, b, c, P
df70: 52 49 4d 41 52 59 20 4b 45 59 28 62 2c 20 61 20  RIMARY KEY(b, a 
df80: 44 45 53 43 29 29 20 57 49 54 48 4f 55 54 20 52  DESC)) WITHOUT R
df90: 4f 57 49 44 0a 2a 2a 0a 2a 2a 20 74 68 69 73 20  OWID.**.** this 
dfa0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
dfb0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 52 49 4d 41 52  :.**.**   PRIMAR
dfc0: 59 20 4b 45 59 28 22 62 22 2c 20 22 61 22 20 44  Y KEY("b", "a" D
dfd0: 45 53 43 29 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ESC).*/.static c
dfe0: 68 61 72 20 2a 72 62 75 57 69 74 68 6f 75 74 52  har *rbuWithoutR
dff0: 6f 77 69 64 50 4b 28 73 71 6c 69 74 65 33 72 62  owidPK(sqlite3rb
e000: 75 20 2a 70 2c 20 52 62 75 4f 62 6a 49 74 65 72  u *p, RbuObjIter
e010: 20 2a 70 49 74 65 72 29 7b 0a 20 20 63 68 61 72   *pIter){.  char
e020: 20 2a 7a 20 3d 20 30 3b 0a 20 20 61 73 73 65 72   *z = 0;.  asser
e030: 74 28 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d  t( pIter->zIdx==
e040: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  0 );.  if( p->rc
e050: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
e060: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
e070: 53 65 70 20 3d 20 22 50 52 49 4d 41 52 59 20 4b  Sep = "PRIMARY K
e080: 45 59 28 22 3b 0a 20 20 20 20 73 71 6c 69 74 65  EY(";.    sqlite
e090: 33 5f 73 74 6d 74 20 2a 70 58 4c 69 73 74 20 3d  3_stmt *pXList =
e0a0: 20 30 3b 20 20 20 20 20 2f 2a 20 50 52 41 47 4d   0;     /* PRAGM
e0b0: 41 20 69 6e 64 65 78 5f 6c 69 73 74 20 3d 20 28  A index_list = (
e0c0: 70 49 74 65 72 2d 3e 7a 54 62 6c 29 20 2a 2f 0a  pIter->zTbl) */.
e0d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
e0e0: 20 2a 70 58 49 6e 66 6f 20 3d 20 30 3b 20 20 20   *pXInfo = 0;   
e0f0: 20 20 2f 2a 20 50 52 41 47 4d 41 20 69 6e 64 65    /* PRAGMA inde
e100: 78 5f 78 69 6e 66 6f 20 3d 20 3c 70 6b 2d 69 6e  x_xinfo = <pk-in
e110: 64 65 78 3e 20 2a 2f 0a 20 20 20 0a 20 20 20 20  dex> */.   .    
e120: 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46  p->rc = prepareF
e130: 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  reeAndCollectErr
e140: 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70  or(p->dbMain, &p
e150: 58 4c 69 73 74 2c 20 26 70 2d 3e 7a 45 72 72 6d  XList, &p->zErrm
e160: 73 67 2c 0a 20 20 20 20 20 20 20 20 73 71 6c 69  sg,.        sqli
e170: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41  te3_mprintf("PRA
e180: 47 4d 41 20 6d 61 69 6e 2e 69 6e 64 65 78 5f 6c  GMA main.index_l
e190: 69 73 74 20 3d 20 25 51 22 2c 20 70 49 74 65 72  ist = %Q", pIter
e1a0: 2d 3e 7a 54 62 6c 29 0a 20 20 20 20 29 3b 0a 20  ->zTbl).    );. 
e1b0: 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d     while( p->rc=
e1c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51  =SQLITE_OK && SQ
e1d0: 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
e1e0: 33 5f 73 74 65 70 28 70 58 4c 69 73 74 29 20 29  3_step(pXList) )
e1f0: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
e200: 61 72 20 2a 7a 4f 72 69 67 20 3d 20 28 63 6f 6e  ar *zOrig = (con
e210: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
e220: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 58 4c  _column_text(pXL
e230: 69 73 74 2c 33 29 3b 0a 20 20 20 20 20 20 69 66  ist,3);.      if
e240: 28 20 7a 4f 72 69 67 20 26 26 20 73 74 72 63 6d  ( zOrig && strcm
e250: 70 28 7a 4f 72 69 67 2c 20 22 70 6b 22 29 3d 3d  p(zOrig, "pk")==
e260: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  0 ){.        con
e270: 73 74 20 63 68 61 72 20 2a 7a 49 64 78 20 3d 20  st char *zIdx = 
e280: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
e290: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
e2a0: 28 70 58 4c 69 73 74 2c 31 29 3b 0a 20 20 20 20  (pXList,1);.    
e2b0: 20 20 20 20 69 66 28 20 7a 49 64 78 20 29 7b 0a      if( zIdx ){.
e2c0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
e2d0: 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64  = prepareFreeAnd
e2e0: 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e  CollectError(p->
e2f0: 64 62 4d 61 69 6e 2c 20 26 70 58 49 6e 66 6f 2c  dbMain, &pXInfo,
e300: 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20   &p->zErrmsg,.  
e310: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
e320: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41  te3_mprintf("PRA
e330: 47 4d 41 20 6d 61 69 6e 2e 69 6e 64 65 78 5f 78  GMA main.index_x
e340: 69 6e 66 6f 20 3d 20 25 51 22 2c 20 7a 49 64 78  info = %Q", zIdx
e350: 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  ).          );. 
e360: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e370: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
e380: 20 20 20 20 7d 0a 20 20 20 20 72 62 75 46 69 6e      }.    rbuFin
e390: 61 6c 69 7a 65 28 70 2c 20 70 58 4c 69 73 74 29  alize(p, pXList)
e3a0: 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d  ;..    while( p-
e3b0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
e3c0: 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  & SQLITE_ROW==sq
e3d0: 6c 69 74 65 33 5f 73 74 65 70 28 70 58 49 6e 66  lite3_step(pXInf
e3e0: 6f 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  o) ){.      if( 
e3f0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
e400: 6e 74 28 70 58 49 6e 66 6f 2c 20 35 29 20 29 7b  nt(pXInfo, 5) ){
e410: 0a 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 74 20  .        /* int 
e420: 69 43 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63  iCid = sqlite3_c
e430: 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f  olumn_int(pXInfo
e440: 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20  , 0); */.       
e450: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
e460: 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  l = (const char*
e470: 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
e480: 74 65 78 74 28 70 58 49 6e 66 6f 2c 20 32 29 3b  text(pXInfo, 2);
e490: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
e4a0: 68 61 72 20 2a 7a 44 65 73 63 20 3d 20 73 71 6c  har *zDesc = sql
e4b0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
e4c0: 70 58 49 6e 66 6f 2c 20 33 29 20 3f 20 22 20 44  pXInfo, 3) ? " D
e4d0: 45 53 43 22 20 3a 20 22 22 3b 0a 20 20 20 20 20  ESC" : "";.     
e4e0: 20 20 20 7a 20 3d 20 72 62 75 4d 50 72 69 6e 74     z = rbuMPrint
e4f0: 66 28 70 2c 20 22 25 7a 25 73 5c 22 25 77 5c 22  f(p, "%z%s\"%w\"
e500: 25 73 22 2c 20 7a 2c 20 7a 53 65 70 2c 20 7a 43  %s", z, zSep, zC
e510: 6f 6c 2c 20 7a 44 65 73 63 29 3b 0a 20 20 20 20  ol, zDesc);.    
e520: 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 20 22 3b      zSep = ", ";
e530: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e540: 20 20 20 7a 20 3d 20 72 62 75 4d 50 72 69 6e 74     z = rbuMPrint
e550: 66 28 70 2c 20 22 25 7a 29 22 2c 20 7a 29 3b 0a  f(p, "%z)", z);.
e560: 20 20 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28      rbuFinalize(
e570: 70 2c 20 70 58 49 6e 66 6f 29 3b 0a 20 20 7d 0a  p, pXInfo);.  }.
e580: 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f    return z;.}../
e590: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
e5a0: 6f 6e 20 63 72 65 61 74 65 73 20 74 68 65 20 73  on creates the s
e5b0: 65 63 6f 6e 64 20 69 6d 70 6f 73 74 65 72 20 74  econd imposter t
e5c0: 61 62 6c 65 20 75 73 65 64 20 77 68 65 6e 20 77  able used when w
e5d0: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 61 20 74  riting to.** a t
e5e0: 61 62 6c 65 20 62 2d 74 72 65 65 20 77 68 65 72  able b-tree wher
e5f0: 65 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20  e the table has 
e600: 61 6e 20 65 78 74 65 72 6e 61 6c 20 70 72 69 6d  an external prim
e610: 61 72 79 20 6b 65 79 2e 20 49 66 20 74 68 65 0a  ary key. If the.
e620: 2a 2a 20 69 74 65 72 61 74 6f 72 20 70 61 73 73  ** iterator pass
e630: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
e640: 20 61 72 67 75 6d 65 6e 74 20 64 6f 65 73 20 6e   argument does n
e650: 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  ot currently poi
e660: 6e 74 20 74 6f 0a 2a 2a 20 61 20 74 61 62 6c 65  nt to.** a table
e670: 20 28 6e 6f 74 20 69 6e 64 65 78 29 20 77 69 74   (not index) wit
e680: 68 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 70 72  h an external pr
e690: 69 6d 61 72 79 20 6b 65 79 2c 20 74 68 69 73 20  imary key, this 
e6a0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 0a 2a 2a  function is a.**
e6b0: 20 6e 6f 2d 6f 70 2e 20 0a 2a 2a 0a 2a 2a 20 41   no-op. .**.** A
e6c0: 73 73 75 6d 69 6e 67 20 74 68 65 20 69 74 65 72  ssuming the iter
e6d0: 61 74 6f 72 20 64 6f 65 73 20 70 6f 69 6e 74 20  ator does point 
e6e0: 74 6f 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  to a table with 
e6f0: 61 6e 20 65 78 74 65 72 6e 61 6c 20 50 4b 2c 20  an external PK, 
e700: 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
e710: 20 63 72 65 61 74 65 73 20 61 20 57 49 54 48 4f   creates a WITHO
e720: 55 54 20 52 4f 57 49 44 20 69 6d 70 6f 73 74 65  UT ROWID imposte
e730: 72 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 22 72  r table named "r
e740: 62 75 5f 69 6d 70 6f 73 74 65 72 32 22 0a 2a 2a  bu_imposter2".**
e750: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
e760: 74 68 61 74 20 50 4b 20 69 6e 64 65 78 2e 20 46  that PK index. F
e770: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  or example, if t
e780: 68 65 20 74 61 72 67 65 74 20 74 61 62 6c 65 20  he target table 
e790: 69 73 0a 2a 2a 20 64 65 63 6c 61 72 65 64 20 61  is.** declared a
e7a0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
e7b0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
e7c0: 74 31 28 61 2c 20 62 20 54 45 58 54 2c 20 63 20  t1(a, b TEXT, c 
e7d0: 52 45 41 4c 2c 20 50 52 49 4d 41 52 59 20 4b 45  REAL, PRIMARY KE
e7e0: 59 28 62 2c 20 63 29 29 3b 0a 2a 2a 0a 2a 2a 20  Y(b, c));.**.** 
e7f0: 74 68 65 6e 20 74 68 65 20 69 6d 70 6f 73 74 65  then the imposte
e800: 72 20 74 61 62 6c 65 20 73 63 68 65 6d 61 20 69  r table schema i
e810: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54  s:.**.**   CREAT
e820: 45 20 54 41 42 4c 45 20 72 62 75 5f 69 6d 70 6f  E TABLE rbu_impo
e830: 73 74 65 72 32 28 63 31 20 54 45 58 54 2c 20 63  ster2(c1 TEXT, c
e840: 32 20 52 45 41 4c 2c 20 69 64 20 49 4e 54 45 47  2 REAL, id INTEG
e850: 45 52 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49  ER) WITHOUT ROWI
e860: 44 3b 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  D;.**.*/.static 
e870: 76 6f 69 64 20 72 62 75 43 72 65 61 74 65 49 6d  void rbuCreateIm
e880: 70 6f 73 74 65 72 54 61 62 6c 65 32 28 73 71 6c  posterTable2(sql
e890: 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62 75 4f  ite3rbu *p, RbuO
e8a0: 62 6a 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  bjIter *pIter){.
e8b0: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
e8c0: 49 54 45 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d  ITE_OK && pIter-
e8d0: 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45  >eType==RBU_PK_E
e8e0: 58 54 45 52 4e 41 4c 20 29 7b 0a 20 20 20 20 69  XTERNAL ){.    i
e8f0: 6e 74 20 74 6e 75 6d 20 3d 20 70 49 74 65 72 2d  nt tnum = pIter-
e900: 3e 69 50 6b 54 6e 75 6d 3b 20 20 20 20 2f 2a 20  >iPkTnum;    /* 
e910: 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 50 4b 20  Root page of PK 
e920: 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 73 71 6c  index */.    sql
e930: 69 74 65 33 5f 73 74 6d 74 20 2a 70 51 75 65 72  ite3_stmt *pQuer
e940: 79 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 53 45  y = 0;     /* SE
e950: 4c 45 43 54 20 6e 61 6d 65 20 2e 2e 2e 20 57 48  LECT name ... WH
e960: 45 52 45 20 72 6f 6f 74 70 61 67 65 20 3d 20 24  ERE rootpage = $
e970: 74 6e 75 6d 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  tnum */.    cons
e980: 74 20 63 68 61 72 20 2a 7a 49 64 78 20 3d 20 30  t char *zIdx = 0
e990: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  ;         /* Nam
e9a0: 65 20 6f 66 20 50 4b 20 69 6e 64 65 78 20 2a 2f  e of PK index */
e9b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
e9c0: 74 20 2a 70 58 49 6e 66 6f 20 3d 20 30 3b 20 20  t *pXInfo = 0;  
e9d0: 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 6d 61 69     /* PRAGMA mai
e9e0: 6e 2e 69 6e 64 65 78 5f 78 69 6e 66 6f 20 3d 20  n.index_xinfo = 
e9f0: 24 7a 49 64 78 20 2a 2f 0a 20 20 20 20 63 6f 6e  $zIdx */.    con
ea00: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 61 20  st char *zComma 
ea10: 3d 20 22 22 3b 0a 20 20 20 20 63 68 61 72 20 2a  = "";.    char *
ea20: 7a 43 6f 6c 73 20 3d 20 30 3b 20 20 20 20 20 20  zCols = 0;      
ea30: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
ea40: 74 6f 20 62 75 69 6c 64 20 75 70 20 6c 69 73 74  to build up list
ea50: 20 6f 66 20 74 61 62 6c 65 20 63 6f 6c 73 20 2a   of table cols *
ea60: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 50 6b 20  /.    char *zPk 
ea70: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
ea80: 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 62      /* Used to b
ea90: 75 69 6c 64 20 75 70 20 74 61 62 6c 65 20 50 4b  uild up table PK
eaa0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a   declaration */.
eab0: 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  .    /* Figure o
eac0: 75 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ut the name of t
ead0: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  he primary key i
eae0: 6e 64 65 78 20 66 6f 72 20 74 68 65 20 63 75 72  ndex for the cur
eaf0: 72 65 6e 74 20 74 61 62 6c 65 2e 0a 20 20 20 20  rent table..    
eb00: 2a 2a 20 54 68 69 73 20 69 73 20 6e 65 65 64 65  ** This is neede
eb10: 64 20 66 6f 72 20 74 68 65 20 61 72 67 75 6d 65  d for the argume
eb20: 6e 74 20 74 6f 20 22 50 52 41 47 4d 41 20 69 6e  nt to "PRAGMA in
eb30: 64 65 78 5f 78 69 6e 66 6f 22 2e 20 53 65 74 0a  dex_xinfo". Set.
eb40: 20 20 20 20 2a 2a 20 7a 49 64 78 20 74 6f 20 70      ** zIdx to p
eb50: 6f 69 6e 74 20 74 6f 20 61 20 6e 75 6c 2d 74 65  oint to a nul-te
eb60: 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20  rminated string 
eb70: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20  containing this 
eb80: 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 70 2d 3e  name. */.    p->
eb90: 72 63 20 3d 20 70 72 65 70 61 72 65 41 6e 64 43  rc = prepareAndC
eba0: 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64  ollectError(p->d
ebb0: 62 4d 61 69 6e 2c 20 26 70 51 75 65 72 79 2c 20  bMain, &pQuery, 
ebc0: 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20  &p->zErrmsg, .  
ebd0: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61        "SELECT na
ebe0: 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  me FROM sqlite_m
ebf0: 61 73 74 65 72 20 57 48 45 52 45 20 72 6f 6f 74  aster WHERE root
ec00: 70 61 67 65 20 3d 20 3f 22 0a 20 20 20 20 29 3b  page = ?".    );
ec10: 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  .    if( p->rc==
ec20: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
ec30: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
ec40: 69 6e 74 28 70 51 75 65 72 79 2c 20 31 2c 20 74  int(pQuery, 1, t
ec50: 6e 75 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  num);.      if( 
ec60: 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
ec70: 74 65 33 5f 73 74 65 70 28 70 51 75 65 72 79 29  te3_step(pQuery)
ec80: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 49 64 78   ){.        zIdx
ec90: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
eca0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
ecb0: 65 78 74 28 70 51 75 65 72 79 2c 20 30 29 3b 0a  ext(pQuery, 0);.
ecc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ecd0: 20 20 69 66 28 20 7a 49 64 78 20 29 7b 0a 20 20    if( zIdx ){.  
ece0: 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70      p->rc = prep
ecf0: 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63  areFreeAndCollec
ed00: 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e  tError(p->dbMain
ed10: 2c 20 26 70 58 49 6e 66 6f 2c 20 26 70 2d 3e 7a  , &pXInfo, &p->z
ed20: 45 72 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20  Errmsg,.        
ed30: 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
ed40: 66 28 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 69  f("PRAGMA main.i
ed50: 6e 64 65 78 5f 78 69 6e 66 6f 20 3d 20 25 51 22  ndex_xinfo = %Q"
ed60: 2c 20 7a 49 64 78 29 0a 20 20 20 20 20 20 29 3b  , zIdx).      );
ed70: 0a 20 20 20 20 7d 0a 20 20 20 20 72 62 75 46 69  .    }.    rbuFi
ed80: 6e 61 6c 69 7a 65 28 70 2c 20 70 51 75 65 72 79  nalize(p, pQuery
ed90: 29 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 70  );..    while( p
eda0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
edb0: 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  && SQLITE_ROW==s
edc0: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 58 49 6e  qlite3_step(pXIn
edd0: 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  fo) ){.      int
ede0: 20 62 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 5f   bKey = sqlite3_
edf0: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49 6e 66  column_int(pXInf
ee00: 6f 2c 20 35 29 3b 0a 20 20 20 20 20 20 69 66 28  o, 5);.      if(
ee10: 20 62 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20   bKey ){.       
ee20: 20 69 6e 74 20 69 43 69 64 20 3d 20 73 71 6c 69   int iCid = sqli
ee30: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
ee40: 58 49 6e 66 6f 2c 20 31 29 3b 0a 20 20 20 20 20  XInfo, 1);.     
ee50: 20 20 20 69 6e 74 20 62 44 65 73 63 20 3d 20 73     int bDesc = s
ee60: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
ee70: 74 28 70 58 49 6e 66 6f 2c 20 33 29 3b 0a 20 20  t(pXInfo, 3);.  
ee80: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
ee90: 20 2a 7a 43 6f 6c 6c 61 74 65 20 3d 20 28 63 6f   *zCollate = (co
eea0: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
eeb0: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 58  3_column_text(pX
eec0: 49 6e 66 6f 2c 20 34 29 3b 0a 20 20 20 20 20 20  Info, 4);.      
eed0: 20 20 7a 43 6f 6c 73 20 3d 20 72 62 75 4d 50 72    zCols = rbuMPr
eee0: 69 6e 74 66 28 70 2c 20 22 25 7a 25 73 63 25 64  intf(p, "%z%sc%d
eef0: 20 25 73 20 43 4f 4c 4c 41 54 45 20 25 51 22 2c   %s COLLATE %Q",
ef00: 20 7a 43 6f 6c 73 2c 20 7a 43 6f 6d 6d 61 2c 20   zCols, zComma, 
ef10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 43 69  .            iCi
ef20: 64 2c 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 54  d, pIter->azTblT
ef30: 79 70 65 5b 69 43 69 64 5d 2c 20 7a 43 6f 6c 6c  ype[iCid], zColl
ef40: 61 74 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  ate.        );. 
ef50: 20 20 20 20 20 20 20 7a 50 6b 20 3d 20 72 62 75         zPk = rbu
ef60: 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 25 73  MPrintf(p, "%z%s
ef70: 63 25 64 25 73 22 2c 20 7a 50 6b 2c 20 7a 43 6f  c%d%s", zPk, zCo
ef80: 6d 6d 61 2c 20 69 43 69 64 2c 20 62 44 65 73 63  mma, iCid, bDesc
ef90: 3f 22 20 44 45 53 43 22 3a 22 22 29 3b 0a 20 20  ?" DESC":"");.  
efa0: 20 20 20 20 20 20 7a 43 6f 6d 6d 61 20 3d 20 22        zComma = "
efb0: 2c 20 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  , ";.      }.   
efc0: 20 7d 0a 20 20 20 20 7a 43 6f 6c 73 20 3d 20 72   }.    zCols = r
efd0: 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a  buMPrintf(p, "%z
efe0: 2c 20 69 64 20 49 4e 54 45 47 45 52 22 2c 20 7a  , id INTEGER", z
eff0: 43 6f 6c 73 29 3b 0a 20 20 20 20 72 62 75 46 69  Cols);.    rbuFi
f000: 6e 61 6c 69 7a 65 28 70 2c 20 70 58 49 6e 66 6f  nalize(p, pXInfo
f010: 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  );..    sqlite3_
f020: 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
f030: 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50  ITE_TESTCTRL_IMP
f040: 4f 53 54 45 52 2c 20 70 2d 3e 64 62 4d 61 69 6e  OSTER, p->dbMain
f050: 2c 20 22 6d 61 69 6e 22 2c 20 31 2c 20 74 6e 75  , "main", 1, tnu
f060: 6d 29 3b 0a 20 20 20 20 72 62 75 4d 50 72 69 6e  m);.    rbuMPrin
f070: 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64 62 4d  tfExec(p, p->dbM
f080: 61 69 6e 2c 0a 20 20 20 20 20 20 20 20 22 43 52  ain,.        "CR
f090: 45 41 54 45 20 54 41 42 4c 45 20 72 62 75 5f 69  EATE TABLE rbu_i
f0a0: 6d 70 6f 73 74 65 72 32 28 25 7a 2c 20 50 52 49  mposter2(%z, PRI
f0b0: 4d 41 52 59 20 4b 45 59 28 25 7a 29 29 20 57 49  MARY KEY(%z)) WI
f0c0: 54 48 4f 55 54 20 52 4f 57 49 44 22 2c 20 0a 20  THOUT ROWID", . 
f0d0: 20 20 20 20 20 20 20 7a 43 6f 6c 73 2c 20 7a 50         zCols, zP
f0e0: 6b 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  k.    );.    sql
f0f0: 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
f100: 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
f110: 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64  L_IMPOSTER, p->d
f120: 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c 20 30  bMain, "main", 0
f130: 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 0);.  }.}../*.
f140: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68  ** If an error h
f150: 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
f160: 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  red when this fu
f170: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
f180: 2c 20 69 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61  , it .** immedia
f190: 74 65 6c 79 20 72 65 74 75 72 6e 73 20 7a 65 72  tely returns zer
f1a0: 6f 20 28 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  o (without doing
f1b0: 20 61 6e 79 20 77 6f 72 6b 29 2e 20 4f 72 2c 20   any work). Or, 
f1c0: 69 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f  if an error.** o
f1d0: 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
f1e0: 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68   execution of th
f1f0: 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 69 74 20  is function, it 
f200: 73 65 74 73 20 74 68 65 20 65 72 72 6f 72 20 63  sets the error c
f210: 6f 64 65 0a 2a 2a 20 69 6e 20 74 68 65 20 73 71  ode.** in the sq
f220: 6c 69 74 65 33 72 62 75 20 6f 62 6a 65 63 74 20  lite3rbu object 
f230: 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65  indicated by the
f240: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
f250: 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a 2a 20 7a  and returns.** z
f260: 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ero..**.** The i
f270: 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61  terator passed a
f280: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
f290: 75 6d 65 6e 74 20 69 73 20 67 75 61 72 61 6e 74  ument is guarant
f2a0: 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a  eed to point to.
f2b0: 2a 2a 20 61 20 74 61 62 6c 65 20 28 6e 6f 74 20  ** a table (not 
f2c0: 61 6e 20 69 6e 64 65 78 29 20 77 68 65 6e 20 74  an index) when t
f2d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
f2e0: 63 61 6c 6c 65 64 2e 20 54 68 69 73 20 66 75 6e  called. This fun
f2f0: 63 74 69 6f 6e 0a 2a 2a 20 61 74 74 65 6d 70 74  ction.** attempt
f300: 73 20 74 6f 20 63 72 65 61 74 65 20 61 6e 79 20  s to create any 
f310: 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20 72  imposter table r
f320: 65 71 75 69 72 65 64 20 74 6f 20 77 72 69 74 65  equired to write
f330: 20 74 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20   to the main.** 
f340: 74 61 62 6c 65 20 62 2d 74 72 65 65 20 6f 66 20  table b-tree of 
f350: 74 68 65 20 74 61 62 6c 65 20 62 65 66 6f 72 65  the table before
f360: 20 72 65 74 75 72 6e 69 6e 67 2e 20 4e 6f 6e 2d   returning. Non-
f370: 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64  zero is returned
f380: 20 69 66 0a 2a 2a 20 61 6e 20 69 6d 70 6f 73 74   if.** an impost
f390: 65 72 20 74 61 62 6c 65 20 61 72 65 20 63 72 65  er table are cre
f3a0: 61 74 65 64 2c 20 6f 72 20 7a 65 72 6f 20 6f 74  ated, or zero ot
f3b0: 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 41  herwise..**.** A
f3c0: 6e 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65  n imposter table
f3d0: 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20   is required in 
f3e0: 61 6c 6c 20 63 61 73 65 73 20 65 78 63 65 70 74  all cases except
f3f0: 20 52 42 55 5f 50 4b 5f 56 54 41 42 2e 20 4f 6e   RBU_PK_VTAB. On
f400: 6c 79 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 61  ly.** virtual ta
f410: 62 6c 65 73 20 61 72 65 20 77 72 69 74 74 65 6e  bles are written
f420: 20 74 6f 20 64 69 72 65 63 74 6c 79 2e 20 54 68   to directly. Th
f430: 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65  e imposter table
f440: 20 68 61 73 20 74 68 65 20 0a 2a 2a 20 73 61 6d   has the .** sam
f450: 65 20 73 63 68 65 6d 61 20 61 73 20 74 68 65 20  e schema as the 
f460: 61 63 74 75 61 6c 20 74 61 72 67 65 74 20 74 61  actual target ta
f470: 62 6c 65 20 28 6c 65 73 73 20 61 6e 79 20 55 4e  ble (less any UN
f480: 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 73  IQUE constraints
f490: 29 2e 20 0a 2a 2a 20 4d 6f 72 65 20 70 72 65 63  ). .** More prec
f4a0: 69 73 65 6c 79 2c 20 74 68 65 20 22 73 61 6d 65  isely, the "same
f4b0: 20 73 63 68 65 6d 61 22 20 6d 65 61 6e 73 20 74   schema" means t
f4c0: 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 73 2c  he same columns,
f4d0: 20 74 79 70 65 73 2c 20 0a 2a 2a 20 63 6f 6c 6c   types, .** coll
f4e0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 2e  ation sequences.
f4f0: 20 46 6f 72 20 74 61 62 6c 65 73 20 74 68 61 74   For tables that
f500: 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 61 6e 20   do not have an 
f510: 65 78 74 65 72 6e 61 6c 20 50 52 49 4d 41 52 59  external PRIMARY
f520: 0a 2a 2a 20 4b 45 59 2c 20 69 74 20 61 6c 73 6f  .** KEY, it also
f530: 20 6d 65 61 6e 73 20 74 68 65 20 73 61 6d 65 20   means the same 
f540: 50 52 49 4d 41 52 59 20 4b 45 59 20 64 65 63 6c  PRIMARY KEY decl
f550: 61 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  aration..*/.stat
f560: 69 63 20 76 6f 69 64 20 72 62 75 43 72 65 61 74  ic void rbuCreat
f570: 65 49 6d 70 6f 73 74 65 72 54 61 62 6c 65 28 73  eImposterTable(s
f580: 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62  qlite3rbu *p, Rb
f590: 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 29  uObjIter *pIter)
f5a0: 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
f5b0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49 74 65  QLITE_OK && pIte
f5c0: 72 2d 3e 65 54 79 70 65 21 3d 52 42 55 5f 50 4b  r->eType!=RBU_PK
f5d0: 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 69 6e 74  _VTAB ){.    int
f5e0: 20 74 6e 75 6d 20 3d 20 70 49 74 65 72 2d 3e 69   tnum = pIter->i
f5f0: 54 6e 75 6d 3b 0a 20 20 20 20 63 6f 6e 73 74 20  Tnum;.    const 
f600: 63 68 61 72 20 2a 7a 43 6f 6d 6d 61 20 3d 20 22  char *zComma = "
f610: 22 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71  ";.    char *zSq
f620: 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  l = 0;.    int i
f630: 43 6f 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Col;.    sqlite3
f640: 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
f650: 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d  LITE_TESTCTRL_IM
f660: 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 4d 61 69  POSTER, p->dbMai
f670: 6e 2c 20 22 6d 61 69 6e 22 2c 20 30 2c 20 31 29  n, "main", 0, 1)
f680: 3b 0a 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d  ;..    for(iCol=
f690: 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  0; p->rc==SQLITE
f6a0: 5f 4f 4b 20 26 26 20 69 43 6f 6c 3c 70 49 74 65  _OK && iCol<pIte
f6b0: 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69 43 6f 6c  r->nTblCol; iCol
f6c0: 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ++){.      const
f6d0: 20 63 68 61 72 20 2a 7a 50 6b 20 3d 20 22 22 3b   char *zPk = "";
f6e0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
f6f0: 72 20 2a 7a 43 6f 6c 20 3d 20 70 49 74 65 72 2d  r *zCol = pIter-
f700: 3e 61 7a 54 62 6c 43 6f 6c 5b 69 43 6f 6c 5d 3b  >azTblCol[iCol];
f710: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
f720: 72 20 2a 7a 43 6f 6c 6c 20 3d 20 30 3b 0a 0a 20  r *zColl = 0;.. 
f730: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c       p->rc = sql
f740: 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d  ite3_table_colum
f750: 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20 20 20  n_metadata(.    
f760: 20 20 20 20 20 20 70 2d 3e 64 62 4d 61 69 6e 2c        p->dbMain,
f770: 20 22 6d 61 69 6e 22 2c 20 70 49 74 65 72 2d 3e   "main", pIter->
f780: 7a 54 62 6c 2c 20 7a 43 6f 6c 2c 20 30 2c 20 26  zTbl, zCol, 0, &
f790: 7a 43 6f 6c 6c 2c 20 30 2c 20 30 2c 20 30 0a 20  zColl, 0, 0, 0. 
f7a0: 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20 20 69       );..      i
f7b0: 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  f( pIter->eType=
f7c0: 3d 52 42 55 5f 50 4b 5f 49 50 4b 20 26 26 20 70  =RBU_PK_IPK && p
f7d0: 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 43  Iter->abTblPk[iC
f7e0: 6f 6c 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ol] ){.        /
f7f0: 2a 20 49 66 20 74 68 65 20 74 61 72 67 65 74 20  * If the target 
f800: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 69 73 20  table column is 
f810: 61 6e 20 22 49 4e 54 45 47 45 52 20 50 52 49 4d  an "INTEGER PRIM
f820: 41 52 59 20 4b 45 59 22 2c 20 61 64 64 0a 20 20  ARY KEY", add.  
f830: 20 20 20 20 20 20 2a 2a 20 22 50 52 49 4d 41 52        ** "PRIMAR
f840: 59 20 4b 45 59 22 20 74 6f 20 74 68 65 20 69 6d  Y KEY" to the im
f850: 70 6f 73 74 65 72 20 74 61 62 6c 65 20 63 6f 6c  poster table col
f860: 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 2e  umn declaration.
f870: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 50 6b 20   */.        zPk 
f880: 3d 20 22 50 52 49 4d 41 52 59 20 4b 45 59 20 22  = "PRIMARY KEY "
f890: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f8a0: 7a 53 71 6c 20 3d 20 72 62 75 4d 50 72 69 6e 74  zSql = rbuMPrint
f8b0: 66 28 70 2c 20 22 25 7a 25 73 5c 22 25 77 5c 22  f(p, "%z%s\"%w\"
f8c0: 20 25 73 20 25 73 43 4f 4c 4c 41 54 45 20 25 51   %s %sCOLLATE %Q
f8d0: 25 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  %s", .          
f8e0: 7a 53 71 6c 2c 20 7a 43 6f 6d 6d 61 2c 20 7a 43  zSql, zComma, zC
f8f0: 6f 6c 2c 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c  ol, pIter->azTbl
f900: 54 79 70 65 5b 69 43 6f 6c 5d 2c 20 7a 50 6b 2c  Type[iCol], zPk,
f910: 20 7a 43 6f 6c 6c 2c 0a 20 20 20 20 20 20 20 20   zColl,.        
f920: 20 20 28 70 49 74 65 72 2d 3e 61 62 4e 6f 74 4e    (pIter->abNotN
f930: 75 6c 6c 5b 69 43 6f 6c 5d 20 3f 20 22 20 4e 4f  ull[iCol] ? " NO
f940: 54 20 4e 55 4c 4c 22 20 3a 20 22 22 29 0a 20 20  T NULL" : "").  
f950: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7a 43 6f      );.      zCo
f960: 6d 6d 61 20 3d 20 22 2c 20 22 3b 0a 20 20 20 20  mma = ", ";.    
f970: 7d 0a 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  }..    if( pIter
f980: 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
f990: 57 49 54 48 4f 55 54 5f 52 4f 57 49 44 20 29 7b  WITHOUT_ROWID ){
f9a0: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50 6b  .      char *zPk
f9b0: 20 3d 20 72 62 75 57 69 74 68 6f 75 74 52 6f 77   = rbuWithoutRow
f9c0: 69 64 50 4b 28 70 2c 20 70 49 74 65 72 29 3b 0a  idPK(p, pIter);.
f9d0: 20 20 20 20 20 20 69 66 28 20 7a 50 6b 20 29 7b        if( zPk ){
f9e0: 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20  .        zSql = 
f9f0: 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25  rbuMPrintf(p, "%
fa00: 7a 2c 20 25 7a 22 2c 20 7a 53 71 6c 2c 20 7a 50  z, %z", zSql, zP
fa10: 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  k);.      }.    
fa20: 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74  }..    sqlite3_t
fa30: 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
fa40: 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f  TE_TESTCTRL_IMPO
fa50: 53 54 45 52 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c  STER, p->dbMain,
fa60: 20 22 6d 61 69 6e 22 2c 20 31 2c 20 74 6e 75 6d   "main", 1, tnum
fa70: 29 3b 0a 20 20 20 20 72 62 75 4d 50 72 69 6e 74  );.    rbuMPrint
fa80: 66 45 78 65 63 28 70 2c 20 70 2d 3e 64 62 4d 61  fExec(p, p->dbMa
fa90: 69 6e 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c  in, "CREATE TABL
faa0: 45 20 5c 22 72 62 75 5f 69 6d 70 5f 25 77 5c 22  E \"rbu_imp_%w\"
fab0: 28 25 7a 29 25 73 22 2c 20 0a 20 20 20 20 20 20  (%z)%s", .      
fac0: 20 20 70 49 74 65 72 2d 3e 7a 54 62 6c 2c 20 7a    pIter->zTbl, z
fad0: 53 71 6c 2c 20 0a 20 20 20 20 20 20 20 20 28 70  Sql, .        (p
fae0: 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55  Iter->eType==RBU
faf0: 5f 50 4b 5f 57 49 54 48 4f 55 54 5f 52 4f 57 49  _PK_WITHOUT_ROWI
fb00: 44 20 3f 20 22 20 57 49 54 48 4f 55 54 20 52 4f  D ? " WITHOUT RO
fb10: 57 49 44 22 20 3a 20 22 22 29 0a 20 20 20 20 29  WID" : "").    )
fb20: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65  ;.    sqlite3_te
fb30: 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
fb40: 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53  E_TESTCTRL_IMPOS
fb50: 54 45 52 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20  TER, p->dbMain, 
fb60: 22 6d 61 69 6e 22 2c 20 30 2c 20 30 29 3b 0a 20  "main", 0, 0);. 
fb70: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70   }.}../*.** Prep
fb80: 61 72 65 20 61 20 73 74 61 74 65 6d 65 6e 74 20  are a statement 
fb90: 75 73 65 64 20 74 6f 20 69 6e 73 65 72 74 20 72  used to insert r
fba0: 6f 77 73 20 69 6e 74 6f 20 74 68 65 20 22 72 62  ows into the "rb
fbb0: 75 5f 74 6d 70 5f 78 78 78 22 20 74 61 62 6c 65  u_tmp_xxx" table
fbc0: 2e 0a 2a 2a 20 53 70 65 63 69 66 69 63 61 6c 6c  ..** Specificall
fbd0: 79 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 66  y a statement of
fbe0: 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
fbf0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
fc00: 20 72 62 75 5f 74 6d 70 5f 78 78 78 20 56 41 4c   rbu_tmp_xxx VAL
fc10: 55 45 53 28 3f 2c 20 3f 2c 20 3f 20 2e 2e 2e 29  UES(?, ?, ? ...)
fc20: 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62  ;.**.** The numb
fc30: 65 72 20 6f 66 20 62 6f 75 6e 64 20 76 61 72 69  er of bound vari
fc40: 61 62 6c 65 73 20 69 73 20 65 71 75 61 6c 20 74  ables is equal t
fc50: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
fc60: 63 6f 6c 75 6d 6e 73 20 69 6e 0a 2a 2a 20 74 68  columns in.** th
fc70: 65 20 74 61 72 67 65 74 20 74 61 62 6c 65 2c 20  e target table, 
fc80: 70 6c 75 73 20 6f 6e 65 20 28 66 6f 72 20 74 68  plus one (for th
fc90: 65 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 63 6f  e rbu_control co
fca0: 6c 75 6d 6e 29 2c 20 70 6c 75 73 20 6f 6e 65 20  lumn), plus one 
fcb0: 6d 6f 72 65 20 0a 2a 2a 20 28 66 6f 72 20 74 68  more .** (for th
fcc0: 65 20 72 62 75 5f 72 6f 77 69 64 20 63 6f 6c 75  e rbu_rowid colu
fcd0: 6d 6e 29 20 69 66 20 74 68 65 20 74 61 72 67 65  mn) if the targe
fce0: 74 20 74 61 62 6c 65 20 69 73 20 61 6e 20 69 6d  t table is an im
fcf0: 70 6c 69 63 69 74 20 49 50 4b 20 6f 72 20 0a 2a  plicit IPK or .*
fd00: 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  * virtual table.
fd10: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
fd20: 72 62 75 4f 62 6a 49 74 65 72 50 72 65 70 61 72  rbuObjIterPrepar
fd30: 65 54 6d 70 49 6e 73 65 72 74 28 0a 20 20 73 71  eTmpInsert(.  sq
fd40: 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 0a 20 20  lite3rbu *p, .  
fd50: 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65  RbuObjIter *pIte
fd60: 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  r,.  const char 
fd70: 2a 7a 43 6f 6c 6c 69 73 74 2c 0a 20 20 63 6f 6e  *zCollist,.  con
fd80: 73 74 20 63 68 61 72 20 2a 7a 52 62 75 52 6f 77  st char *zRbuRow
fd90: 69 64 0a 29 7b 0a 20 20 69 6e 74 20 62 52 62 75  id.){.  int bRbu
fda0: 52 6f 77 69 64 20 3d 20 28 70 49 74 65 72 2d 3e  Rowid = (pIter->
fdb0: 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45 58  eType==RBU_PK_EX
fdc0: 54 45 52 4e 41 4c 20 7c 7c 20 70 49 74 65 72 2d  TERNAL || pIter-
fdd0: 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e  >eType==RBU_PK_N
fde0: 4f 4e 45 29 3b 0a 20 20 63 68 61 72 20 2a 7a 42  ONE);.  char *zB
fdf0: 69 6e 64 20 3d 20 72 62 75 4f 62 6a 49 74 65 72  ind = rbuObjIter
fe00: 47 65 74 42 69 6e 64 6c 69 73 74 28 70 2c 20 70  GetBindlist(p, p
fe10: 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20 2b 20  Iter->nTblCol + 
fe20: 31 20 2b 20 62 52 62 75 52 6f 77 69 64 29 3b 0a  1 + bRbuRowid);.
fe30: 20 20 69 66 28 20 7a 42 69 6e 64 20 29 7b 0a 20    if( zBind ){. 
fe40: 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72     assert( pIter
fe50: 2d 3e 70 54 6d 70 49 6e 73 65 72 74 3d 3d 30 20  ->pTmpInsert==0 
fe60: 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 70  );.    p->rc = p
fe70: 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c  repareFreeAndCol
fe80: 6c 65 63 74 45 72 72 6f 72 28 0a 20 20 20 20 20  lectError(.     
fe90: 20 20 20 70 2d 3e 64 62 52 62 75 2c 20 26 70 49     p->dbRbu, &pI
fea0: 74 65 72 2d 3e 70 54 6d 70 49 6e 73 65 72 74 2c  ter->pTmpInsert,
feb0: 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 73 71   &p->zErrmsg, sq
fec0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
fed0: 20 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54           "INSERT
fee0: 20 49 4e 54 4f 20 25 73 2e 27 72 62 75 5f 74 6d   INTO %s.'rbu_tm
fef0: 70 5f 25 71 27 28 72 62 75 5f 63 6f 6e 74 72 6f  p_%q'(rbu_contro
ff00: 6c 2c 25 73 25 73 29 20 56 41 4c 55 45 53 28 25  l,%s%s) VALUES(%
ff10: 7a 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  z)", .          
ff20: 70 2d 3e 7a 53 74 61 74 65 44 62 2c 20 70 49 74  p->zStateDb, pIt
ff30: 65 72 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 7a 43  er->zDataTbl, zC
ff40: 6f 6c 6c 69 73 74 2c 20 7a 52 62 75 52 6f 77 69  ollist, zRbuRowi
ff50: 64 2c 20 7a 42 69 6e 64 0a 20 20 20 20 29 29 3b  d, zBind.    ));
ff60: 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
ff70: 6f 69 64 20 72 62 75 54 6d 70 49 6e 73 65 72 74  oid rbuTmpInsert
ff80: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
ff90: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
ffa0: 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20 73 71    int nVal,.  sq
ffb0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
ffc0: 56 61 6c 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  Val.){.  sqlite3
ffd0: 72 62 75 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  rbu *p = sqlite3
ffe0: 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74 78 29  _user_data(pCtx)
fff0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
10000 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b  ITE_OK;.  int i;
10010 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
10020 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70  te3_value_int(ap
10030 56 61 6c 5b 30 5d 29 21 3d 30 0a 20 20 20 20 20  Val[0])!=0.     
10040 20 7c 7c 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 65   || p->objiter.e
10050 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54  Type==RBU_PK_EXT
10060 45 52 4e 41 4c 20 0a 20 20 20 20 20 20 7c 7c 20  ERNAL .      || 
10070 70 2d 3e 6f 62 6a 69 74 65 72 2e 65 54 79 70 65  p->objiter.eType
10080 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 0a 20  ==RBU_PK_NONE . 
10090 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   );.  if( sqlite
100a0 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61  3_value_int(apVa
100b0 6c 5b 30 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20  l[0])!=0 ){.    
100c0 70 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70  p->nPhaseOneStep
100d0 20 2b 3d 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 6e   += p->objiter.n
100e0 49 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 66 6f  Index;.  }..  fo
100f0 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
10100 45 5f 4f 4b 20 26 26 20 69 3c 6e 56 61 6c 3b 20  E_OK && i<nVal; 
10110 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  i++){.    rc = s
10120 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75  qlite3_bind_valu
10130 65 28 70 2d 3e 6f 62 6a 69 74 65 72 2e 70 54 6d  e(p->objiter.pTm
10140 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20 61 70  pInsert, i+1, ap
10150 56 61 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 69  Val[i]);.  }.  i
10160 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
10170 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
10180 73 74 65 70 28 70 2d 3e 6f 62 6a 69 74 65 72 2e  step(p->objiter.
10190 70 54 6d 70 49 6e 73 65 72 74 29 3b 0a 20 20 20  pTmpInsert);.   
101a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
101b0 73 65 74 28 70 2d 3e 6f 62 6a 69 74 65 72 2e 70  set(p->objiter.p
101c0 54 6d 70 49 6e 73 65 72 74 29 3b 0a 20 20 7d 0a  TmpInsert);.  }.
101d0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
101e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
101f0 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
10200 5f 63 6f 64 65 28 70 43 74 78 2c 20 72 63 29 3b  _code(pCtx, rc);
10210 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e  .  }.}../*.** En
10220 73 75 72 65 20 74 68 61 74 20 74 68 65 20 53 51  sure that the SQ
10230 4c 69 74 65 20 73 74 61 74 65 6d 65 6e 74 20 68  Lite statement h
10240 61 6e 64 6c 65 73 20 72 65 71 75 69 72 65 64 20  andles required 
10250 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 0a 2a  to update the .*
10260 2a 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73  * target databas
10270 65 20 6f 62 6a 65 63 74 20 63 75 72 72 65 6e 74  e object current
10280 6c 79 20 69 6e 64 69 63 61 74 65 64 20 62 79 20  ly indicated by 
10290 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73  the iterator pas
102a0 73 65 64 20 0a 2a 2a 20 61 73 20 74 68 65 20 73  sed .** as the s
102b0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 61  econd argument a
102c0 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f  re available..*/
102d0 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 4f  .static int rbuO
102e0 62 6a 49 74 65 72 50 72 65 70 61 72 65 41 6c 6c  bjIterPrepareAll
102f0 28 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a  (.  sqlite3rbu *
10300 70 2c 20 0a 20 20 52 62 75 4f 62 6a 49 74 65 72  p, .  RbuObjIter
10310 20 2a 70 49 74 65 72 2c 0a 20 20 69 6e 74 20 6e   *pIter,.  int n
10320 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20 20  Offset          
10330 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
10340 64 20 22 4c 49 4d 49 54 20 2d 31 20 4f 46 46 53  d "LIMIT -1 OFFS
10350 45 54 20 24 6e 4f 66 66 73 65 74 22 20 74 6f 20  ET $nOffset" to 
10360 53 45 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20 20 61  SELECT */.){.  a
10370 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 62 43  ssert( pIter->bC
10380 6c 65 61 6e 75 70 3d 3d 30 20 29 3b 0a 20 20 69  leanup==0 );.  i
10390 66 28 20 70 49 74 65 72 2d 3e 70 53 65 6c 65 63  f( pIter->pSelec
103a0 74 3d 3d 30 20 26 26 20 72 62 75 4f 62 6a 49 74  t==0 && rbuObjIt
103b0 65 72 43 61 63 68 65 54 61 62 6c 65 49 6e 66 6f  erCacheTableInfo
103c0 28 70 2c 20 70 49 74 65 72 29 3d 3d 53 51 4c 49  (p, pIter)==SQLI
103d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e  TE_OK ){.    con
103e0 73 74 20 69 6e 74 20 74 6e 75 6d 20 3d 20 70 49  st int tnum = pI
103f0 74 65 72 2d 3e 69 54 6e 75 6d 3b 0a 20 20 20 20  ter->iTnum;.    
10400 63 68 61 72 20 2a 7a 43 6f 6c 6c 69 73 74 20 3d  char *zCollist =
10410 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
10420 20 4c 69 73 74 20 6f 66 20 69 6e 64 65 78 65 64   List of indexed
10430 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20   columns */.    
10440 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70 2d 3e  char **pz = &p->
10450 7a 45 72 72 6d 73 67 3b 0a 20 20 20 20 63 6f 6e  zErrmsg;.    con
10460 73 74 20 63 68 61 72 20 2a 7a 49 64 78 20 3d 20  st char *zIdx = 
10470 70 49 74 65 72 2d 3e 7a 49 64 78 3b 0a 20 20 20  pIter->zIdx;.   
10480 20 63 68 61 72 20 2a 7a 4c 69 6d 69 74 20 3d 20   char *zLimit = 
10490 30 3b 0a 0a 20 20 20 20 69 66 28 20 6e 4f 66 66  0;..    if( nOff
104a0 73 65 74 20 29 7b 0a 20 20 20 20 20 20 7a 4c 69  set ){.      zLi
104b0 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  mit = sqlite3_mp
104c0 72 69 6e 74 66 28 22 20 4c 49 4d 49 54 20 2d 31  rintf(" LIMIT -1
104d0 20 4f 46 46 53 45 54 20 25 64 22 2c 20 6e 4f 66   OFFSET %d", nOf
104e0 66 73 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28  fset);.      if(
104f0 20 21 7a 4c 69 6d 69 74 20 29 20 70 2d 3e 72 63   !zLimit ) p->rc
10500 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
10510 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
10520 7a 49 64 78 20 29 7b 0a 20 20 20 20 20 20 63 6f  zIdx ){.      co
10530 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c 20 3d  nst char *zTbl =
10540 20 70 49 74 65 72 2d 3e 7a 54 62 6c 3b 0a 20 20   pIter->zTbl;.  
10550 20 20 20 20 63 68 61 72 20 2a 7a 49 6d 70 6f 73      char *zImpos
10560 74 65 72 43 6f 6c 73 20 3d 20 30 3b 20 20 20 20  terCols = 0;    
10570 2f 2a 20 43 6f 6c 75 6d 6e 73 20 66 6f 72 20 69  /* Columns for i
10580 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20 2a 2f  mposter table */
10590 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 49 6d  .      char *zIm
105a0 70 6f 73 74 65 72 50 4b 20 3d 20 30 3b 20 20 20  posterPK = 0;   
105b0 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 6b 65     /* Primary ke
105c0 79 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 66 6f  y declaration fo
105d0 72 20 69 6d 70 6f 73 74 65 72 20 2a 2f 0a 20 20  r imposter */.  
105e0 20 20 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65      char *zWhere
105f0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
10600 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
10610 6f 6e 20 50 4b 20 63 6f 6c 75 6d 6e 73 20 2a 2f  on PK columns */
10620 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42 69  .      char *zBi
10630 6e 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  nd = 0;.      in
10640 74 20 6e 42 69 6e 64 20 3d 20 30 3b 0a 0a 20 20  t nBind = 0;..  
10650 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
10660 72 2d 3e 65 54 79 70 65 21 3d 52 42 55 5f 50 4b  r->eType!=RBU_PK
10670 5f 56 54 41 42 20 29 3b 0a 20 20 20 20 20 20 7a  _VTAB );.      z
10680 43 6f 6c 6c 69 73 74 20 3d 20 72 62 75 4f 62 6a  Collist = rbuObj
10690 49 74 65 72 47 65 74 49 6e 64 65 78 43 6f 6c 73  IterGetIndexCols
106a0 28 0a 20 20 20 20 20 20 20 20 20 20 70 2c 20 70  (.          p, p
106b0 49 74 65 72 2c 20 26 7a 49 6d 70 6f 73 74 65 72  Iter, &zImposter
106c0 43 6f 6c 73 2c 20 26 7a 49 6d 70 6f 73 74 65 72  Cols, &zImposter
106d0 50 4b 2c 20 26 7a 57 68 65 72 65 2c 20 26 6e 42  PK, &zWhere, &nB
106e0 69 6e 64 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ind.      );.   
106f0 20 20 20 7a 42 69 6e 64 20 3d 20 72 62 75 4f 62     zBind = rbuOb
10700 6a 49 74 65 72 47 65 74 42 69 6e 64 6c 69 73 74  jIterGetBindlist
10710 28 70 2c 20 6e 42 69 6e 64 29 3b 0a 0a 20 20 20  (p, nBind);..   
10720 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65     /* Create the
10730 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20   imposter table 
10740 75 73 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f  used to write to
10750 20 74 68 69 73 20 69 6e 64 65 78 2e 20 2a 2f 0a   this index. */.
10760 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65        sqlite3_te
10770 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
10780 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53  E_TESTCTRL_IMPOS
10790 54 45 52 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20  TER, p->dbMain, 
107a0 22 6d 61 69 6e 22 2c 20 30 2c 20 31 29 3b 0a 20  "main", 0, 1);. 
107b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73       sqlite3_tes
107c0 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
107d0 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54  _TESTCTRL_IMPOST
107e0 45 52 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22  ER, p->dbMain, "
107f0 6d 61 69 6e 22 2c 20 31 2c 74 6e 75 6d 29 3b 0a  main", 1,tnum);.
10800 20 20 20 20 20 20 72 62 75 4d 50 72 69 6e 74 66        rbuMPrintf
10810 45 78 65 63 28 70 2c 20 70 2d 3e 64 62 4d 61 69  Exec(p, p->dbMai
10820 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 22 43 52  n,.          "CR
10830 45 41 54 45 20 54 41 42 4c 45 20 5c 22 72 62 75  EATE TABLE \"rbu
10840 5f 69 6d 70 5f 25 77 5c 22 28 20 25 73 2c 20 50  _imp_%w\"( %s, P
10850 52 49 4d 41 52 59 20 4b 45 59 28 20 25 73 20 29  RIMARY KEY( %s )
10860 20 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44   ) WITHOUT ROWID
10870 22 2c 0a 20 20 20 20 20 20 20 20 20 20 7a 54 62  ",.          zTb
10880 6c 2c 20 7a 49 6d 70 6f 73 74 65 72 43 6f 6c 73  l, zImposterCols
10890 2c 20 7a 49 6d 70 6f 73 74 65 72 50 4b 0a 20 20  , zImposterPK.  
108a0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c      );.      sql
108b0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
108c0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
108d0 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64  L_IMPOSTER, p->d
108e0 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c 20 30  bMain, "main", 0
108f0 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  , 0);..      /* 
10900 43 72 65 61 74 65 20 74 68 65 20 73 74 61 74 65  Create the state
10910 6d 65 6e 74 20 74 6f 20 69 6e 73 65 72 74 20 69  ment to insert i
10920 6e 64 65 78 20 65 6e 74 72 69 65 73 20 2a 2f 0a  ndex entries */.
10930 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 43 6f        pIter->nCo
10940 6c 20 3d 20 6e 42 69 6e 64 3b 0a 20 20 20 20 20  l = nBind;.     
10950 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
10960 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
10970 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65   p->rc = prepare
10980 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  FreeAndCollectEr
10990 72 6f 72 28 0a 20 20 20 20 20 20 20 20 20 20 20  ror(.           
109a0 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 49 74   p->dbMain, &pIt
109b0 65 72 2d 3e 70 49 6e 73 65 72 74 2c 20 26 70 2d  er->pInsert, &p-
109c0 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20 20 20  >zErrmsg,.      
109d0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69      sqlite3_mpri
109e0 6e 74 66 28 22 49 4e 53 45 52 54 20 49 4e 54 4f  ntf("INSERT INTO
109f0 20 5c 22 72 62 75 5f 69 6d 70 5f 25 77 5c 22 20   \"rbu_imp_%w\" 
10a00 56 41 4c 55 45 53 28 25 73 29 22 2c 20 7a 54 62  VALUES(%s)", zTb
10a10 6c 2c 20 7a 42 69 6e 64 29 0a 20 20 20 20 20 20  l, zBind).      
10a20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20    );.      }..  
10a30 20 20 20 20 2f 2a 20 41 6e 64 20 74 6f 20 64 65      /* And to de
10a40 6c 65 74 65 20 69 6e 64 65 78 20 65 6e 74 72 69  lete index entri
10a50 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  es */.      if( 
10a60 72 62 75 49 73 56 61 63 75 75 6d 28 70 29 3d 3d  rbuIsVacuum(p)==
10a70 30 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  0 && p->rc==SQLI
10a80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
10a90 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65   p->rc = prepare
10aa0 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  FreeAndCollectEr
10ab0 72 6f 72 28 0a 20 20 20 20 20 20 20 20 20 20 20  ror(.           
10ac0 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 49 74   p->dbMain, &pIt
10ad0 65 72 2d 3e 70 44 65 6c 65 74 65 2c 20 26 70 2d  er->pDelete, &p-
10ae0 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20 20 20  >zErrmsg,.      
10af0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69      sqlite3_mpri
10b00 6e 74 66 28 22 44 45 4c 45 54 45 20 46 52 4f 4d  ntf("DELETE FROM
10b10 20 5c 22 72 62 75 5f 69 6d 70 5f 25 77 5c 22 20   \"rbu_imp_%w\" 
10b20 57 48 45 52 45 20 25 73 22 2c 20 7a 54 62 6c 2c  WHERE %s", zTbl,
10b30 20 7a 57 68 65 72 65 29 0a 20 20 20 20 20 20 20   zWhere).       
10b40 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   );.      }..   
10b50 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65     /* Create the
10b60 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
10b70 74 20 74 6f 20 72 65 61 64 20 6b 65 79 73 20 69  t to read keys i
10b80 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 20 2a  n sorted order *
10b90 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  /.      if( p->r
10ba0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
10bb0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53          char *zS
10bc0 71 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ql;.        if( 
10bd0 72 62 75 49 73 56 61 63 75 75 6d 28 70 29 20 29  rbuIsVacuum(p) )
10be0 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 53 71 6c  {.          zSql
10bf0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
10c00 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  tf(.            
10c10 20 20 22 53 45 4c 45 43 54 20 25 73 2c 20 30 20    "SELECT %s, 0 
10c20 41 53 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 46  AS rbu_control F
10c30 52 4f 4d 20 27 25 71 27 20 4f 52 44 45 52 20 42  ROM '%q' ORDER B
10c40 59 20 25 73 25 73 22 2c 0a 20 20 20 20 20 20 20  Y %s%s",.       
10c50 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74 2c         zCollist,
10c60 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
10c70 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 2c  pIter->zDataTbl,
10c80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  .              z
10c90 43 6f 6c 6c 69 73 74 2c 20 7a 4c 69 6d 69 74 0a  Collist, zLimit.
10ca0 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
10cb0 20 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20       }else..    
10cc0 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 65      if( pIter->e
10cd0 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54  Type==RBU_PK_EXT
10ce0 45 52 4e 41 4c 20 7c 7c 20 70 49 74 65 72 2d 3e  ERNAL || pIter->
10cf0 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f  eType==RBU_PK_NO
10d00 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NE ){.          
10d10 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
10d20 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
10d30 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 25 73        "SELECT %s
10d40 2c 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 46 52  , rbu_control FR
10d50 4f 4d 20 25 73 2e 27 72 62 75 5f 74 6d 70 5f 25  OM %s.'rbu_tmp_%
10d60 71 27 20 4f 52 44 45 52 20 42 59 20 25 73 25 73  q' ORDER BY %s%s
10d70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
10d80 20 7a 43 6f 6c 6c 69 73 74 2c 20 70 2d 3e 7a 53   zCollist, p->zS
10d90 74 61 74 65 44 62 2c 20 70 49 74 65 72 2d 3e 7a  tateDb, pIter->z
10da0 44 61 74 61 54 62 6c 2c 0a 20 20 20 20 20 20 20  DataTbl,.       
10db0 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74 2c         zCollist,
10dc0 20 7a 4c 69 6d 69 74 0a 20 20 20 20 20 20 20 20   zLimit.        
10dd0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c    );.        }el
10de0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 53  se{.          zS
10df0 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
10e00 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
10e10 20 20 20 20 22 53 45 4c 45 43 54 20 25 73 2c 20      "SELECT %s, 
10e20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 46 52 4f 4d  rbu_control FROM
10e30 20 25 73 2e 27 72 62 75 5f 74 6d 70 5f 25 71 27   %s.'rbu_tmp_%q'
10e40 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
10e50 20 22 55 4e 49 4f 4e 20 41 4c 4c 20 22 0a 20 20   "UNION ALL ".  
10e60 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c              "SEL
10e70 45 43 54 20 25 73 2c 20 72 62 75 5f 63 6f 6e 74  ECT %s, rbu_cont
10e80 72 6f 6c 20 46 52 4f 4d 20 27 25 71 27 20 22 0a  rol FROM '%q' ".
10e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 57                "W
10ea0 48 45 52 45 20 74 79 70 65 6f 66 28 72 62 75 5f  HERE typeof(rbu_
10eb0 63 6f 6e 74 72 6f 6c 29 3d 27 69 6e 74 65 67 65  control)='intege
10ec0 72 27 20 41 4e 44 20 72 62 75 5f 63 6f 6e 74 72  r' AND rbu_contr
10ed0 6f 6c 21 3d 31 20 22 0a 20 20 20 20 20 20 20 20  ol!=1 ".        
10ee0 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20        "ORDER BY 
10ef0 25 73 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  %s%s",.         
10f00 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74 2c 20 70       zCollist, p
10f10 2d 3e 7a 53 74 61 74 65 44 62 2c 20 70 49 74 65  ->zStateDb, pIte
10f20 72 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 0a 20 20  r->zDataTbl, .  
10f30 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
10f40 6c 69 73 74 2c 20 70 49 74 65 72 2d 3e 7a 44 61  list, pIter->zDa
10f50 74 61 54 62 6c 2c 20 0a 20 20 20 20 20 20 20 20  taTbl, .        
10f60 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74 2c 20        zCollist, 
10f70 7a 4c 69 6d 69 74 0a 20 20 20 20 20 20 20 20 20  zLimit.         
10f80 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
10f90 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72        p->rc = pr
10fa0 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c  epareFreeAndColl
10fb0 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 52 62  ectError(p->dbRb
10fc0 75 2c 20 26 70 49 74 65 72 2d 3e 70 53 65 6c 65  u, &pIter->pSele
10fd0 63 74 2c 20 70 7a 2c 20 7a 53 71 6c 29 3b 0a 20  ct, pz, zSql);. 
10fe0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 71       }..      sq
10ff0 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6d 70 6f  lite3_free(zImpo
11000 73 74 65 72 43 6f 6c 73 29 3b 0a 20 20 20 20 20  sterCols);.     
11010 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 49   sqlite3_free(zI
11020 6d 70 6f 73 74 65 72 50 4b 29 3b 0a 20 20 20 20  mposterPK);.    
11030 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
11040 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 73 71  Where);.      sq
11050 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 69 6e 64  lite3_free(zBind
11060 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
11070 20 20 20 20 69 6e 74 20 62 52 62 75 52 6f 77 69      int bRbuRowi
11080 64 20 3d 20 28 70 49 74 65 72 2d 3e 65 54 79 70  d = (pIter->eTyp
11090 65 3d 3d 52 42 55 5f 50 4b 5f 56 54 41 42 29 0a  e==RBU_PK_VTAB).
110a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110b0 20 20 20 20 7c 7c 28 70 49 74 65 72 2d 3e 65 54      ||(pIter->eT
110c0 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45  ype==RBU_PK_NONE
110d0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
110e0 20 20 20 20 20 20 7c 7c 28 70 49 74 65 72 2d 3e        ||(pIter->
110f0 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45 58  eType==RBU_PK_EX
11100 54 45 52 4e 41 4c 20 26 26 20 72 62 75 49 73 56  TERNAL && rbuIsV
11110 61 63 75 75 6d 28 70 29 29 3b 0a 20 20 20 20 20  acuum(p));.     
11120 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62   const char *zTb
11130 6c 20 3d 20 70 49 74 65 72 2d 3e 7a 54 62 6c 3b  l = pIter->zTbl;
11140 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
11150 74 68 69 73 20 73 74 65 70 20 61 70 70 6c 69 65  this step applie
11160 73 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 63 6f  s to */.      co
11170 6e 73 74 20 63 68 61 72 20 2a 7a 57 72 69 74 65  nst char *zWrite
11180 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11190 20 20 20 20 2f 2a 20 49 6d 70 6f 73 74 65 72 20      /* Imposter 
111a0 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20  table name */.. 
111b0 20 20 20 20 20 63 68 61 72 20 2a 7a 42 69 6e 64       char *zBind
111c0 69 6e 67 73 20 3d 20 72 62 75 4f 62 6a 49 74 65  ings = rbuObjIte
111d0 72 47 65 74 42 69 6e 64 6c 69 73 74 28 70 2c 20  rGetBindlist(p, 
111e0 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20 2b  pIter->nTblCol +
111f0 20 62 52 62 75 52 6f 77 69 64 29 3b 0a 20 20 20   bRbuRowid);.   
11200 20 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20     char *zWhere 
11210 3d 20 72 62 75 4f 62 6a 49 74 65 72 47 65 74 57  = rbuObjIterGetW
11220 68 65 72 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  here(p, pIter);.
11230 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4f 6c 64        char *zOld
11240 6c 69 73 74 20 3d 20 72 62 75 4f 62 6a 49 74 65  list = rbuObjIte
11250 72 47 65 74 4f 6c 64 6c 69 73 74 28 70 2c 20 70  rGetOldlist(p, p
11260 49 74 65 72 2c 20 22 6f 6c 64 22 29 3b 0a 20 20  Iter, "old");.  
11270 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 6c 69      char *zNewli
11280 73 74 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 47  st = rbuObjIterG
11290 65 74 4f 6c 64 6c 69 73 74 28 70 2c 20 70 49 74  etOldlist(p, pIt
112a0 65 72 2c 20 22 6e 65 77 22 29 3b 0a 0a 20 20 20  er, "new");..   
112b0 20 20 20 7a 43 6f 6c 6c 69 73 74 20 3d 20 72 62     zCollist = rb
112c0 75 4f 62 6a 49 74 65 72 47 65 74 43 6f 6c 6c 69  uObjIterGetColli
112d0 73 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  st(p, pIter);.  
112e0 20 20 20 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 20      pIter->nCol 
112f0 3d 20 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c  = pIter->nTblCol
11300 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61  ;..      /* Crea
11310 74 65 20 74 68 65 20 69 6d 70 6f 73 74 65 72 20  te the imposter 
11320 74 61 62 6c 65 20 6f 72 20 74 61 62 6c 65 73 20  table or tables 
11330 28 69 66 20 72 65 71 75 69 72 65 64 29 2e 20 2a  (if required). *
11340 2f 0a 20 20 20 20 20 20 72 62 75 43 72 65 61 74  /.      rbuCreat
11350 65 49 6d 70 6f 73 74 65 72 54 61 62 6c 65 28 70  eImposterTable(p
11360 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
11370 72 62 75 43 72 65 61 74 65 49 6d 70 6f 73 74 65  rbuCreateImposte
11380 72 54 61 62 6c 65 32 28 70 2c 20 70 49 74 65 72  rTable2(p, pIter
11390 29 3b 0a 20 20 20 20 20 20 7a 57 72 69 74 65 20  );.      zWrite 
113a0 3d 20 28 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  = (pIter->eType=
113b0 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20 3f 20 22  =RBU_PK_VTAB ? "
113c0 22 20 3a 20 22 72 62 75 5f 69 6d 70 5f 22 29 3b  " : "rbu_imp_");
113d0 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74  ..      /* Creat
113e0 65 20 74 68 65 20 49 4e 53 45 52 54 20 73 74 61  e the INSERT sta
113f0 74 65 6d 65 6e 74 20 74 6f 20 77 72 69 74 65 20  tement to write 
11400 74 6f 20 74 68 65 20 74 61 72 67 65 74 20 50 4b  to the target PK
11410 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 20   b-tree */.     
11420 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
11430 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
11440 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65   p->rc = prepare
11450 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  FreeAndCollectEr
11460 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26  ror(p->dbMain, &
11470 70 49 74 65 72 2d 3e 70 49 6e 73 65 72 74 2c 20  pIter->pInsert, 
11480 70 7a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pz,.            
11490 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
114a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
114b0 49 4e 53 45 52 54 20 49 4e 54 4f 20 5c 22 25 73  INSERT INTO \"%s
114c0 25 77 5c 22 28 25 73 25 73 29 20 56 41 4c 55 45  %w\"(%s%s) VALUE
114d0 53 28 25 73 29 22 2c 20 0a 20 20 20 20 20 20 20  S(%s)", .       
114e0 20 20 20 20 20 20 20 7a 57 72 69 74 65 2c 20 7a         zWrite, z
114f0 54 62 6c 2c 20 7a 43 6f 6c 6c 69 73 74 2c 20 28  Tbl, zCollist, (
11500 62 52 62 75 52 6f 77 69 64 20 3f 20 22 2c 20 5f  bRbuRowid ? ", _
11510 72 6f 77 69 64 5f 22 20 3a 20 22 22 29 2c 20 7a  rowid_" : ""), z
11520 42 69 6e 64 69 6e 67 73 0a 20 20 20 20 20 20 20  Bindings.       
11530 20 20 20 20 20 29 0a 20 20 20 20 20 20 20 20 29       ).        )
11540 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
11550 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 44   /* Create the D
11560 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20  ELETE statement 
11570 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
11580 74 61 72 67 65 74 20 50 4b 20 62 2d 74 72 65 65  target PK b-tree
11590 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75  ..      ** Becau
115a0 73 65 20 69 74 20 6f 6e 6c 79 20 70 65 72 66 6f  se it only perfo
115b0 72 6d 73 20 49 4e 53 45 52 54 20 6f 70 65 72 61  rms INSERT opera
115c0 74 69 6f 6e 73 2c 20 74 68 69 73 20 69 73 20 6e  tions, this is n
115d0 6f 74 20 72 65 71 75 69 72 65 64 20 66 6f 72 0a  ot required for.
115e0 20 20 20 20 20 20 2a 2a 20 61 6e 20 72 62 75 20        ** an rbu 
115f0 76 61 63 75 75 6d 20 68 61 6e 64 6c 65 2e 20 20  vacuum handle.  
11600 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72 62 75  */.      if( rbu
11610 49 73 56 61 63 75 75 6d 28 70 29 3d 3d 30 20 26  IsVacuum(p)==0 &
11620 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  & p->rc==SQLITE_
11630 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  OK ){.        p-
11640 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65  >rc = prepareFre
11650 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72  eAndCollectError
11660 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 49 74  (p->dbMain, &pIt
11670 65 72 2d 3e 70 44 65 6c 65 74 65 2c 20 70 7a 2c  er->pDelete, pz,
11680 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
11690 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
116a0 20 20 20 20 20 20 20 20 20 20 20 20 22 44 45 4c              "DEL
116b0 45 54 45 20 46 52 4f 4d 20 5c 22 25 73 25 77 5c  ETE FROM \"%s%w\
116c0 22 20 57 48 45 52 45 20 25 73 22 2c 20 7a 57 72  " WHERE %s", zWr
116d0 69 74 65 2c 20 7a 54 62 6c 2c 20 7a 57 68 65 72  ite, zTbl, zWher
116e0 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 0a  e.            ).
116f0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
11700 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 62   }..      if( rb
11710 75 49 73 56 61 63 75 75 6d 28 70 29 3d 3d 30 20  uIsVacuum(p)==0 
11720 26 26 20 70 49 74 65 72 2d 3e 61 62 49 6e 64 65  && pIter->abInde
11730 78 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 63  xed ){.        c
11740 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 62 75 52  onst char *zRbuR
11750 6f 77 69 64 20 3d 20 22 22 3b 0a 20 20 20 20 20  owid = "";.     
11760 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 65 54     if( pIter->eT
11770 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45  ype==RBU_PK_EXTE
11780 52 4e 41 4c 20 7c 7c 20 70 49 74 65 72 2d 3e 65  RNAL || pIter->e
11790 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e  Type==RBU_PK_NON
117a0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  E ){.          z
117b0 52 62 75 52 6f 77 69 64 20 3d 20 22 2c 20 72 62  RbuRowid = ", rb
117c0 75 5f 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20  u_rowid";.      
117d0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
117e0 43 72 65 61 74 65 20 74 68 65 20 72 62 75 5f 74  Create the rbu_t
117f0 6d 70 5f 78 78 78 20 74 61 62 6c 65 20 61 6e 64  mp_xxx table and
11800 20 74 68 65 20 74 72 69 67 67 65 72 73 20 74 6f   the triggers to
11810 20 70 6f 70 75 6c 61 74 65 20 69 74 2e 20 2a 2f   populate it. */
11820 0a 20 20 20 20 20 20 20 20 72 62 75 4d 50 72 69  .        rbuMPri
11830 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64 62  ntfExec(p, p->db
11840 52 62 75 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Rbu,.           
11850 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49   "CREATE TABLE I
11860 46 20 4e 4f 54 20 45 58 49 53 54 53 20 25 73 2e  F NOT EXISTS %s.
11870 27 72 62 75 5f 74 6d 70 5f 25 71 27 20 41 53 20  'rbu_tmp_%q' AS 
11880 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 53  ".            "S
11890 45 4c 45 43 54 20 2a 25 73 20 46 52 4f 4d 20 27  ELECT *%s FROM '
118a0 25 71 27 20 57 48 45 52 45 20 30 3b 22 0a 20 20  %q' WHERE 0;".  
118b0 20 20 20 20 20 20 20 20 20 20 2c 20 70 2d 3e 7a            , p->z
118c0 53 74 61 74 65 44 62 2c 20 70 49 74 65 72 2d 3e  StateDb, pIter->
118d0 7a 44 61 74 61 54 62 6c 0a 20 20 20 20 20 20 20  zDataTbl.       
118e0 20 20 20 20 20 2c 20 28 70 49 74 65 72 2d 3e 65       , (pIter->e
118f0 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54  Type==RBU_PK_EXT
11900 45 52 4e 41 4c 20 3f 20 22 2c 20 30 20 41 53 20  ERNAL ? ", 0 AS 
11910 72 62 75 5f 72 6f 77 69 64 22 20 3a 20 22 22 29  rbu_rowid" : "")
11920 0a 20 20 20 20 20 20 20 20 20 20 20 20 2c 20 70  .            , p
11930 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 0a 20  Iter->zDataTbl. 
11940 20 20 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20         );..     
11950 20 20 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65     rbuMPrintfExe
11960 63 28 70 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 0a  c(p, p->dbMain,.
11970 20 20 20 20 20 20 20 20 20 20 20 20 22 43 52 45              "CRE
11980 41 54 45 20 54 45 4d 50 20 54 52 49 47 47 45 52  ATE TEMP TRIGGER
11990 20 72 62 75 5f 64 65 6c 65 74 65 5f 74 72 20 42   rbu_delete_tr B
119a0 45 46 4f 52 45 20 44 45 4c 45 54 45 20 4f 4e 20  EFORE DELETE ON 
119b0 5c 22 25 73 25 77 5c 22 20 22 0a 20 20 20 20 20  \"%s%w\" ".     
119c0 20 20 20 20 20 20 20 22 42 45 47 49 4e 20 22 0a         "BEGIN ".
119d0 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 53              "  S
119e0 45 4c 45 43 54 20 72 62 75 5f 74 6d 70 5f 69 6e  ELECT rbu_tmp_in
119f0 73 65 72 74 28 33 2c 20 25 73 29 3b 22 0a 20 20  sert(3, %s);".  
11a00 20 20 20 20 20 20 20 20 20 20 22 45 4e 44 3b 22            "END;"
11a10 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43  ..            "C
11a20 52 45 41 54 45 20 54 45 4d 50 20 54 52 49 47 47  REATE TEMP TRIGG
11a30 45 52 20 72 62 75 5f 75 70 64 61 74 65 31 5f 74  ER rbu_update1_t
11a40 72 20 42 45 46 4f 52 45 20 55 50 44 41 54 45 20  r BEFORE UPDATE 
11a50 4f 4e 20 5c 22 25 73 25 77 5c 22 20 22 0a 20 20  ON \"%s%w\" ".  
11a60 20 20 20 20 20 20 20 20 20 20 22 42 45 47 49 4e            "BEGIN
11a70 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22   ".            "
11a80 20 20 53 45 4c 45 43 54 20 72 62 75 5f 74 6d 70    SELECT rbu_tmp
11a90 5f 69 6e 73 65 72 74 28 33 2c 20 25 73 29 3b 22  _insert(3, %s);"
11aa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 45 4e  .            "EN
11ab0 44 3b 22 0a 0a 20 20 20 20 20 20 20 20 20 20 20  D;"..           
11ac0 20 22 43 52 45 41 54 45 20 54 45 4d 50 20 54 52   "CREATE TEMP TR
11ad0 49 47 47 45 52 20 72 62 75 5f 75 70 64 61 74 65  IGGER rbu_update
11ae0 32 5f 74 72 20 41 46 54 45 52 20 55 50 44 41 54  2_tr AFTER UPDAT
11af0 45 20 4f 4e 20 5c 22 25 73 25 77 5c 22 20 22 0a  E ON \"%s%w\" ".
11b00 20 20 20 20 20 20 20 20 20 20 20 20 22 42 45 47              "BEG
11b10 49 4e 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  IN ".           
11b20 20 22 20 20 53 45 4c 45 43 54 20 72 62 75 5f 74   "  SELECT rbu_t
11b30 6d 70 5f 69 6e 73 65 72 74 28 34 2c 20 25 73 29  mp_insert(4, %s)
11b40 3b 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  ;".            "
11b50 45 4e 44 3b 22 2c 0a 20 20 20 20 20 20 20 20 20  END;",.         
11b60 20 20 20 7a 57 72 69 74 65 2c 20 7a 54 62 6c 2c     zWrite, zTbl,
11b70 20 7a 4f 6c 64 6c 69 73 74 2c 0a 20 20 20 20 20   zOldlist,.     
11b80 20 20 20 20 20 20 20 7a 57 72 69 74 65 2c 20 7a         zWrite, z
11b90 54 62 6c 2c 20 7a 4f 6c 64 6c 69 73 74 2c 0a 20  Tbl, zOldlist,. 
11ba0 20 20 20 20 20 20 20 20 20 20 20 7a 57 72 69 74             zWrit
11bb0 65 2c 20 7a 54 62 6c 2c 20 7a 4e 65 77 6c 69 73  e, zTbl, zNewlis
11bc0 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 0a 20 20  t.        );..  
11bd0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
11be0 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45  >eType==RBU_PK_E
11bf0 58 54 45 52 4e 41 4c 20 7c 7c 20 70 49 74 65 72  XTERNAL || pIter
11c00 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
11c10 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  NONE ){.        
11c20 20 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63    rbuMPrintfExec
11c30 28 70 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 0a 20  (p, p->dbMain,. 
11c40 20 20 20 20 20 20 20 20 20 20 20 20 20 22 43 52               "CR
11c50 45 41 54 45 20 54 45 4d 50 20 54 52 49 47 47 45  EATE TEMP TRIGGE
11c60 52 20 72 62 75 5f 69 6e 73 65 72 74 5f 74 72 20  R rbu_insert_tr 
11c70 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f 4e 20  AFTER INSERT ON 
11c80 5c 22 25 73 25 77 5c 22 20 22 0a 20 20 20 20 20  \"%s%w\" ".     
11c90 20 20 20 20 20 20 20 20 20 22 42 45 47 49 4e 20           "BEGIN 
11ca0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
11cb0 22 20 20 53 45 4c 45 43 54 20 72 62 75 5f 74 6d  "  SELECT rbu_tm
11cc0 70 5f 69 6e 73 65 72 74 28 30 2c 20 25 73 29 3b  p_insert(0, %s);
11cd0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
11ce0 22 45 4e 44 3b 22 2c 0a 20 20 20 20 20 20 20 20  "END;",.        
11cf0 20 20 20 20 20 20 7a 57 72 69 74 65 2c 20 7a 54        zWrite, zT
11d00 62 6c 2c 20 7a 4e 65 77 6c 69 73 74 0a 20 20 20  bl, zNewlist.   
11d10 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
11d20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 62 75    }..        rbu
11d30 4f 62 6a 49 74 65 72 50 72 65 70 61 72 65 54 6d  ObjIterPrepareTm
11d40 70 49 6e 73 65 72 74 28 70 2c 20 70 49 74 65 72  pInsert(p, pIter
11d50 2c 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a 52 62 75  , zCollist, zRbu
11d60 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 7d 0a  Rowid);.      }.
11d70 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65  .      /* Create
11d80 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
11d90 65 6d 65 6e 74 20 74 6f 20 72 65 61 64 20 6b 65  ement to read ke
11da0 79 73 20 66 72 6f 6d 20 64 61 74 61 5f 78 78 78  ys from data_xxx
11db0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d   */.      if( p-
11dc0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
11dd0 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
11de0 63 68 61 72 20 2a 7a 52 62 75 52 6f 77 69 64 20  char *zRbuRowid 
11df0 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20 69 66  = "";.        if
11e00 28 20 62 52 62 75 52 6f 77 69 64 20 29 7b 0a 20  ( bRbuRowid ){. 
11e10 20 20 20 20 20 20 20 20 20 7a 52 62 75 52 6f 77           zRbuRow
11e20 69 64 20 3d 20 72 62 75 49 73 56 61 63 75 75 6d  id = rbuIsVacuum
11e30 28 70 29 20 3f 20 22 2c 5f 72 6f 77 69 64 5f 20  (p) ? ",_rowid_ 
11e40 22 20 3a 20 22 2c 72 62 75 5f 72 6f 77 69 64 22  " : ",rbu_rowid"
11e50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11e60 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70      p->rc = prep
11e70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63  areFreeAndCollec
11e80 74 45 72 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c  tError(p->dbRbu,
11e90 20 26 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74   &pIter->pSelect
11ea0 2c 20 70 7a 2c 0a 20 20 20 20 20 20 20 20 20 20  , pz,.          
11eb0 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
11ec0 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  f(.             
11ed0 20 22 53 45 4c 45 43 54 20 25 73 2c 25 73 20 72   "SELECT %s,%s r
11ee0 62 75 5f 63 6f 6e 74 72 6f 6c 25 73 20 46 52 4f  bu_control%s FRO
11ef0 4d 20 27 25 71 27 25 73 22 2c 20 0a 20 20 20 20  M '%q'%s", .    
11f00 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69            zColli
11f10 73 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  st, .           
11f20 20 20 20 28 72 62 75 49 73 56 61 63 75 75 6d 28     (rbuIsVacuum(
11f30 70 29 20 3f 20 22 30 20 41 53 20 22 20 3a 20 22  p) ? "0 AS " : "
11f40 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  "),.            
11f50 20 20 7a 52 62 75 52 6f 77 69 64 2c 0a 20 20 20    zRbuRowid,.   
11f60 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72             pIter
11f70 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 7a 4c 69 6d  ->zDataTbl, zLim
11f80 69 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  it.            )
11f90 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
11fa0 20 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69 74    }..      sqlit
11fb0 65 33 5f 66 72 65 65 28 7a 57 68 65 72 65 29 3b  e3_free(zWhere);
11fc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
11fd0 72 65 65 28 7a 4f 6c 64 6c 69 73 74 29 3b 0a 20  ree(zOldlist);. 
11fe0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
11ff0 65 28 7a 4e 65 77 6c 69 73 74 29 3b 0a 20 20 20  e(zNewlist);.   
12000 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
12010 7a 42 69 6e 64 69 6e 67 73 29 3b 0a 20 20 20 20  zBindings);.    
12020 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
12030 65 65 28 7a 43 6f 6c 6c 69 73 74 29 3b 0a 20 20  ee(zCollist);.  
12040 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
12050 4c 69 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 0a 20  Limit);.  }.  . 
12060 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d   return p->rc;.}
12070 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f 75 74 70  ../*.** Set outp
12080 75 74 20 76 61 72 69 61 62 6c 65 20 2a 70 70 53  ut variable *ppS
12090 74 6d 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  tmt to point to 
120a0 61 6e 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  an UPDATE statem
120b0 65 6e 74 20 74 68 61 74 20 6d 61 79 0a 2a 2a 20  ent that may.** 
120c0 62 65 20 75 73 65 64 20 74 6f 20 75 70 64 61 74  be used to updat
120d0 65 20 74 68 65 20 69 6d 70 6f 73 74 65 72 20 74  e the imposter t
120e0 61 62 6c 65 20 66 6f 72 20 74 68 65 20 6d 61 69  able for the mai
120f0 6e 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 6f  n table b-tree o
12100 66 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 6f  f the.** table o
12110 62 6a 65 63 74 20 74 68 61 74 20 70 49 74 65 72  bject that pIter
12120 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
12130 73 20 74 6f 2c 20 61 73 73 75 6d 69 6e 67 20 74  s to, assuming t
12140 68 61 74 20 74 68 65 20 0a 2a 2a 20 72 62 75 5f  hat the .** rbu_
12150 63 6f 6e 74 72 6f 6c 20 63 6f 6c 75 6d 6e 20 6f  control column o
12160 66 20 74 68 65 20 64 61 74 61 5f 78 79 7a 20 74  f the data_xyz t
12170 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 7a 4d  able contains zM
12180 61 73 6b 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74  ask..** .** If t
12190 68 65 20 7a 4d 61 73 6b 20 73 74 72 69 6e 67 20  he zMask string 
121a0 64 6f 65 73 20 6e 6f 74 20 73 70 65 63 69 66 79  does not specify
121b0 20 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 74 6f 20   any columns to 
121c0 75 70 64 61 74 65 2c 20 74 68 65 6e 20 74 68 69  update, then thi
121d0 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20 65  s.** is not an e
121e0 72 72 6f 72 2e 20 4f 75 74 70 75 74 20 76 61 72  rror. Output var
121f0 69 61 62 6c 65 20 2a 70 70 53 74 6d 74 20 69 73  iable *ppStmt is
12200 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 6e 20   set to NULL in 
12210 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74  this case..*/.st
12220 61 74 69 63 20 69 6e 74 20 72 62 75 47 65 74 55  atic int rbuGetU
12230 70 64 61 74 65 53 74 6d 74 28 0a 20 20 73 71 6c  pdateStmt(.  sql
12240 69 74 65 33 72 62 75 20 2a 70 2c 20 20 20 20 20  ite3rbu *p,     
12250 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12260 52 42 55 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  RBU handle */.  
12270 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65  RbuObjIter *pIte
12280 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
12290 2f 2a 20 4f 62 6a 65 63 74 20 69 74 65 72 61 74  /* Object iterat
122a0 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  or */.  const ch
122b0 61 72 20 2a 7a 4d 61 73 6b 2c 20 20 20 20 20 20  ar *zMask,      
122c0 20 20 20 20 20 20 20 20 2f 2a 20 72 62 75 5f 63          /* rbu_c
122d0 6f 6e 74 72 6f 6c 20 76 61 6c 75 65 20 28 27 78  ontrol value ('x
122e0 2e 78 2e 27 29 20 2a 2f 0a 20 20 73 71 6c 69 74  .x.') */.  sqlit
122f0 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74  e3_stmt **ppStmt
12300 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
12310 54 3a 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  T: UPDATE statem
12320 65 6e 74 20 68 61 6e 64 6c 65 20 2a 2f 0a 29 7b  ent handle */.){
12330 0a 20 20 52 62 75 55 70 64 61 74 65 53 74 6d 74  .  RbuUpdateStmt
12340 20 2a 2a 70 70 3b 0a 20 20 52 62 75 55 70 64 61   **pp;.  RbuUpda
12350 74 65 53 74 6d 74 20 2a 70 55 70 20 3d 20 30 3b  teStmt *pUp = 0;
12360 0a 20 20 69 6e 74 20 6e 55 70 20 3d 20 30 3b 0a  .  int nUp = 0;.
12370 0a 20 20 2f 2a 20 49 6e 20 63 61 73 65 20 61 6e  .  /* In case an
12380 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 2a 2f   error occurs */
12390 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20 30 3b 0a  .  *ppStmt = 0;.
123a0 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72  .  /* Search for
123b0 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 74 61   an existing sta
123c0 74 65 6d 65 6e 74 2e 20 49 66 20 6f 6e 65 20 69  tement. If one i
123d0 73 20 66 6f 75 6e 64 2c 20 73 68 69 66 74 20 69  s found, shift i
123e0 74 20 74 6f 20 74 68 65 20 66 72 6f 6e 74 0a 20  t to the front. 
123f0 20 2a 2a 20 6f 66 20 74 68 65 20 4c 52 55 20 71   ** of the LRU q
12400 75 65 75 65 20 61 6e 64 20 72 65 74 75 72 6e 20  ueue and return 
12410 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 4f 74 68  immediately. Oth
12420 65 72 77 69 73 65 2c 20 6c 65 61 76 65 20 6e 55  erwise, leave nU
12430 70 20 70 6f 69 6e 74 69 6e 67 0a 20 20 2a 2a 20  p pointing.  ** 
12440 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
12450 20 73 74 61 74 65 6d 65 6e 74 73 20 63 75 72 72   statements curr
12460 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 63 61 63  ently in the cac
12470 68 65 20 61 6e 64 20 70 55 70 20 74 6f 20 74 68  he and pUp to th
12480 65 0a 20 20 2a 2a 20 6c 61 73 74 20 6f 62 6a 65  e.  ** last obje
12490 63 74 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 20  ct in the list. 
124a0 20 2a 2f 0a 20 20 66 6f 72 28 70 70 3d 26 70 49   */.  for(pp=&pI
124b0 74 65 72 2d 3e 70 52 62 75 55 70 64 61 74 65 3b  ter->pRbuUpdate;
124c0 20 2a 70 70 3b 20 70 70 3d 26 28 28 2a 70 70 29   *pp; pp=&((*pp)
124d0 2d 3e 70 4e 65 78 74 29 29 7b 0a 20 20 20 20 70  ->pNext)){.    p
124e0 55 70 20 3d 20 2a 70 70 3b 0a 20 20 20 20 69 66  Up = *pp;.    if
124f0 28 20 73 74 72 63 6d 70 28 70 55 70 2d 3e 7a 4d  ( strcmp(pUp->zM
12500 61 73 6b 2c 20 7a 4d 61 73 6b 29 3d 3d 30 20 29  ask, zMask)==0 )
12510 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 55  {.      *pp = pU
12520 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  p->pNext;.      
12530 70 55 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 74  pUp->pNext = pIt
12540 65 72 2d 3e 70 52 62 75 55 70 64 61 74 65 3b 0a  er->pRbuUpdate;.
12550 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 52 62        pIter->pRb
12560 75 55 70 64 61 74 65 20 3d 20 70 55 70 3b 0a 20  uUpdate = pUp;. 
12570 20 20 20 20 20 2a 70 70 53 74 6d 74 20 3d 20 70       *ppStmt = p
12580 55 70 2d 3e 70 55 70 64 61 74 65 3b 20 0a 20 20  Up->pUpdate; .  
12590 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
125a0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
125b0 6e 55 70 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73  nUp++;.  }.  ass
125c0 65 72 74 28 20 70 55 70 3d 3d 30 20 7c 7c 20 70  ert( pUp==0 || p
125d0 55 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 3b 0a  Up->pNext==0 );.
125e0 0a 20 20 69 66 28 20 6e 55 70 3e 3d 53 51 4c 49  .  if( nUp>=SQLI
125f0 54 45 5f 52 42 55 5f 55 50 44 41 54 45 5f 43 41  TE_RBU_UPDATE_CA
12600 43 48 45 53 49 5a 45 20 29 7b 0a 20 20 20 20 66  CHESIZE ){.    f
12610 6f 72 28 70 70 3d 26 70 49 74 65 72 2d 3e 70 52  or(pp=&pIter->pR
12620 62 75 55 70 64 61 74 65 3b 20 2a 70 70 21 3d 70  buUpdate; *pp!=p
12630 55 70 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e  Up; pp=&((*pp)->
12640 70 4e 65 78 74 29 29 3b 0a 20 20 20 20 2a 70 70  pNext));.    *pp
12650 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
12660 33 5f 66 69 6e 61 6c 69 7a 65 28 70 55 70 2d 3e  3_finalize(pUp->
12670 70 55 70 64 61 74 65 29 3b 0a 20 20 20 20 70 55  pUpdate);.    pU
12680 70 2d 3e 70 55 70 64 61 74 65 20 3d 20 30 3b 0a  p->pUpdate = 0;.
12690 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 55 70    }else{.    pUp
126a0 20 3d 20 28 52 62 75 55 70 64 61 74 65 53 74 6d   = (RbuUpdateStm
126b0 74 2a 29 72 62 75 4d 61 6c 6c 6f 63 28 70 2c 20  t*)rbuMalloc(p, 
126c0 73 69 7a 65 6f 66 28 52 62 75 55 70 64 61 74 65  sizeof(RbuUpdate
126d0 53 74 6d 74 29 2b 70 49 74 65 72 2d 3e 6e 54 62  Stmt)+pIter->nTb
126e0 6c 43 6f 6c 2b 31 29 3b 0a 20 20 7d 0a 0a 20 20  lCol+1);.  }..  
126f0 69 66 28 20 70 55 70 20 29 7b 0a 20 20 20 20 63  if( pUp ){.    c
12700 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 72 62  har *zWhere = rb
12710 75 4f 62 6a 49 74 65 72 47 65 74 57 68 65 72 65  uObjIterGetWhere
12720 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
12730 63 68 61 72 20 2a 7a 53 65 74 20 3d 20 72 62 75  char *zSet = rbu
12740 4f 62 6a 49 74 65 72 47 65 74 53 65 74 6c 69 73  ObjIterGetSetlis
12750 74 28 70 2c 20 70 49 74 65 72 2c 20 7a 4d 61 73  t(p, pIter, zMas
12760 6b 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 55  k);.    char *zU
12770 70 64 61 74 65 20 3d 20 30 3b 0a 0a 20 20 20 20  pdate = 0;..    
12780 70 55 70 2d 3e 7a 4d 61 73 6b 20 3d 20 28 63 68  pUp->zMask = (ch
12790 61 72 2a 29 26 70 55 70 5b 31 5d 3b 0a 20 20 20  ar*)&pUp[1];.   
127a0 20 6d 65 6d 63 70 79 28 70 55 70 2d 3e 7a 4d 61   memcpy(pUp->zMa
127b0 73 6b 2c 20 7a 4d 61 73 6b 2c 20 70 49 74 65 72  sk, zMask, pIter
127c0 2d 3e 6e 54 62 6c 43 6f 6c 29 3b 0a 20 20 20 20  ->nTblCol);.    
127d0 70 55 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 74  pUp->pNext = pIt
127e0 65 72 2d 3e 70 52 62 75 55 70 64 61 74 65 3b 0a  er->pRbuUpdate;.
127f0 20 20 20 20 70 49 74 65 72 2d 3e 70 52 62 75 55      pIter->pRbuU
12800 70 64 61 74 65 20 3d 20 70 55 70 3b 0a 0a 20 20  pdate = pUp;..  
12810 20 20 69 66 28 20 7a 53 65 74 20 29 7b 0a 20 20    if( zSet ){.  
12820 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
12830 7a 50 72 65 66 69 78 20 3d 20 22 22 3b 0a 0a 20  zPrefix = "";.. 
12840 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
12850 65 54 79 70 65 21 3d 52 42 55 5f 50 4b 5f 56 54  eType!=RBU_PK_VT
12860 41 42 20 29 20 7a 50 72 65 66 69 78 20 3d 20 22  AB ) zPrefix = "
12870 72 62 75 5f 69 6d 70 5f 22 3b 0a 20 20 20 20 20  rbu_imp_";.     
12880 20 7a 55 70 64 61 74 65 20 3d 20 73 71 6c 69 74   zUpdate = sqlit
12890 65 33 5f 6d 70 72 69 6e 74 66 28 22 55 50 44 41  e3_mprintf("UPDA
128a0 54 45 20 5c 22 25 73 25 77 5c 22 20 53 45 54 20  TE \"%s%w\" SET 
128b0 25 73 20 57 48 45 52 45 20 25 73 22 2c 20 0a 20  %s WHERE %s", . 
128c0 20 20 20 20 20 20 20 20 20 7a 50 72 65 66 69 78           zPrefix
128d0 2c 20 70 49 74 65 72 2d 3e 7a 54 62 6c 2c 20 7a  , pIter->zTbl, z
128e0 53 65 74 2c 20 7a 57 68 65 72 65 0a 20 20 20 20  Set, zWhere.    
128f0 20 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 72 63    );.      p->rc
12900 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e   = prepareFreeAn
12910 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 0a 20  dCollectError(. 
12920 20 20 20 20 20 20 20 20 20 70 2d 3e 64 62 4d 61           p->dbMa
12930 69 6e 2c 20 26 70 55 70 2d 3e 70 55 70 64 61 74  in, &pUp->pUpdat
12940 65 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20  e, &p->zErrmsg, 
12950 7a 55 70 64 61 74 65 0a 20 20 20 20 20 20 29 3b  zUpdate.      );
12960 0a 20 20 20 20 20 20 2a 70 70 53 74 6d 74 20 3d  .      *ppStmt =
12970 20 70 55 70 2d 3e 70 55 70 64 61 74 65 3b 0a 20   pUp->pUpdate;. 
12980 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
12990 5f 66 72 65 65 28 7a 57 68 65 72 65 29 3b 0a 20  _free(zWhere);. 
129a0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
129b0 7a 53 65 74 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  zSet);.  }..  re
129c0 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 73  turn p->rc;.}..s
129d0 74 61 74 69 63 20 73 71 6c 69 74 65 33 20 2a 72  tatic sqlite3 *r
129e0 62 75 4f 70 65 6e 44 62 68 61 6e 64 6c 65 28 0a  buOpenDbhandle(.
129f0 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c    sqlite3rbu *p,
12a00 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
12a10 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 62 55  zName, .  int bU
12a20 73 65 56 66 73 0a 29 7b 0a 20 20 73 71 6c 69 74  seVfs.){.  sqlit
12a30 65 33 20 2a 64 62 20 3d 20 30 3b 0a 20 20 69 66  e3 *db = 0;.  if
12a40 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
12a50 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  OK ){.    const 
12a60 69 6e 74 20 66 6c 61 67 73 20 3d 20 53 51 4c 49  int flags = SQLI
12a70 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
12a80 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
12a90 45 41 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  EATE|SQLITE_OPEN
12aa0 5f 55 52 49 3b 0a 20 20 20 20 70 2d 3e 72 63 20  _URI;.    p->rc 
12ab0 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  = sqlite3_open_v
12ac0 32 28 7a 4e 61 6d 65 2c 20 26 64 62 2c 20 66 6c  2(zName, &db, fl
12ad0 61 67 73 2c 20 62 55 73 65 56 66 73 20 3f 20 70  ags, bUseVfs ? p
12ae0 2d 3e 7a 56 66 73 4e 61 6d 65 20 3a 20 30 29 3b  ->zVfsName : 0);
12af0 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29  .    if( p->rc )
12b00 7b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 6d  {.      p->zErrm
12b10 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
12b20 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74  intf("%s", sqlit
12b30 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a  e3_errmsg(db));.
12b40 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c        sqlite3_cl
12b50 6f 73 65 28 64 62 29 3b 0a 20 20 20 20 20 20 64  ose(db);.      d
12b60 62 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  b = 0;.    }.  }
12b70 0a 20 20 72 65 74 75 72 6e 20 64 62 3b 0a 7d 0a  .  return db;.}.
12b80 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 20 52  ./*.** Free an R
12b90 62 75 53 74 61 74 65 20 6f 62 6a 65 63 74 20 61  buState object a
12ba0 6c 6c 6f 63 61 74 65 64 20 62 79 20 72 62 75 4c  llocated by rbuL
12bb0 6f 61 64 53 74 61 74 65 28 29 2e 0a 2a 2f 0a 73  oadState()..*/.s
12bc0 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 46 72  tatic void rbuFr
12bd0 65 65 53 74 61 74 65 28 52 62 75 53 74 61 74 65  eeState(RbuState
12be0 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b   *p){.  if( p ){
12bf0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
12c00 65 28 70 2d 3e 7a 54 62 6c 29 3b 0a 20 20 20 20  e(p->zTbl);.    
12c10 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
12c20 7a 49 64 78 29 3b 0a 20 20 20 20 73 71 6c 69 74  zIdx);.    sqlit
12c30 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a  e3_free(p);.  }.
12c40 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
12c50 65 20 61 6e 20 52 62 75 53 74 61 74 65 20 6f 62  e an RbuState ob
12c60 6a 65 63 74 20 61 6e 64 20 6c 6f 61 64 20 74 68  ject and load th
12c70 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
12c80 65 20 72 62 75 5f 73 74 61 74 65 20 0a 2a 2a 20  e rbu_state .** 
12c90 74 61 62 6c 65 20 69 6e 74 6f 20 69 74 2e 20 52  table into it. R
12ca0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
12cb0 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63  to the new objec
12cc0 74 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a  t. It is the .**
12cd0 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
12ce0 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
12cf0 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
12d00 20 74 68 65 20 6f 62 6a 65 63 74 20 75 73 69 6e   the object usin
12d10 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 72 65  g.** sqlite3_fre
12d20 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  e()..**.** If an
12d30 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c   error occurs, l
12d40 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  eave an error co
12d50 64 65 20 61 6e 64 20 6d 65 73 73 61 67 65 20 69  de and message i
12d60 6e 20 74 68 65 20 72 62 75 20 68 61 6e 64 6c 65  n the rbu handle
12d70 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  .** and return N
12d80 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 52  ULL..*/.static R
12d90 62 75 53 74 61 74 65 20 2a 72 62 75 4c 6f 61 64  buState *rbuLoad
12da0 53 74 61 74 65 28 73 71 6c 69 74 65 33 72 62 75  State(sqlite3rbu
12db0 20 2a 70 29 7b 0a 20 20 52 62 75 53 74 61 74 65   *p){.  RbuState
12dc0 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 73 71   *pRet = 0;.  sq
12dd0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
12de0 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  t = 0;.  int rc;
12df0 0a 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 70  .  int rc2;..  p
12e00 52 65 74 20 3d 20 28 52 62 75 53 74 61 74 65 2a  Ret = (RbuState*
12e10 29 72 62 75 4d 61 6c 6c 6f 63 28 70 2c 20 73 69  )rbuMalloc(p, si
12e20 7a 65 6f 66 28 52 62 75 53 74 61 74 65 29 29 3b  zeof(RbuState));
12e30 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 29  .  if( pRet==0 )
12e40 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72 63   return 0;..  rc
12e50 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e   = prepareFreeAn
12e60 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d  dCollectError(p-
12e70 3e 64 62 52 62 75 2c 20 26 70 53 74 6d 74 2c 20  >dbRbu, &pStmt, 
12e80 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20  &p->zErrmsg, .  
12e90 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69      sqlite3_mpri
12ea0 6e 74 66 28 22 53 45 4c 45 43 54 20 6b 2c 20 76  ntf("SELECT k, v
12eb0 20 46 52 4f 4d 20 25 73 2e 72 62 75 5f 73 74 61   FROM %s.rbu_sta
12ec0 74 65 22 2c 20 70 2d 3e 7a 53 74 61 74 65 44 62  te", p->zStateDb
12ed0 29 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  ).  );.  while( 
12ee0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
12ef0 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
12f00 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
12f10 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20   ){.    switch( 
12f20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
12f30 6e 74 28 70 53 74 6d 74 2c 20 30 29 20 29 7b 0a  nt(pStmt, 0) ){.
12f40 20 20 20 20 20 20 63 61 73 65 20 52 42 55 5f 53        case RBU_S
12f50 54 41 54 45 5f 53 54 41 47 45 3a 0a 20 20 20 20  TATE_STAGE:.    
12f60 20 20 20 20 70 52 65 74 2d 3e 65 53 74 61 67 65      pRet->eStage
12f70 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
12f80 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31 29 3b  n_int(pStmt, 1);
12f90 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 52 65  .        if( pRe
12fa0 74 2d 3e 65 53 74 61 67 65 21 3d 52 42 55 5f 53  t->eStage!=RBU_S
12fb0 54 41 47 45 5f 4f 41 4c 0a 20 20 20 20 20 20 20  TAGE_OAL.       
12fc0 20 20 26 26 20 70 52 65 74 2d 3e 65 53 74 61 67    && pRet->eStag
12fd0 65 21 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56  e!=RBU_STAGE_MOV
12fe0 45 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 52  E.         && pR
12ff0 65 74 2d 3e 65 53 74 61 67 65 21 3d 52 42 55 5f  et->eStage!=RBU_
13000 53 54 41 47 45 5f 43 4b 50 54 0a 20 20 20 20 20  STAGE_CKPT.     
13010 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
13020 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43  p->rc = SQLITE_C
13030 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20  ORRUPT;.        
13040 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
13050 0a 0a 20 20 20 20 20 20 63 61 73 65 20 52 42 55  ..      case RBU
13060 5f 53 54 41 54 45 5f 54 42 4c 3a 0a 20 20 20 20  _STATE_TBL:.    
13070 20 20 20 20 70 52 65 74 2d 3e 7a 54 62 6c 20 3d      pRet->zTbl =
13080 20 72 62 75 53 74 72 6e 64 75 70 28 28 63 68 61   rbuStrndup((cha
13090 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
130a0 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29  n_text(pStmt, 1)
130b0 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20  , &rc);.        
130c0 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61  break;..      ca
130d0 73 65 20 52 42 55 5f 53 54 41 54 45 5f 49 44 58  se RBU_STATE_IDX
130e0 3a 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  :.        pRet->
130f0 7a 49 64 78 20 3d 20 72 62 75 53 74 72 6e 64 75  zIdx = rbuStrndu
13100 70 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  p((char*)sqlite3
13110 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
13120 6d 74 2c 20 31 29 2c 20 26 72 63 29 3b 0a 20 20  mt, 1), &rc);.  
13130 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
13140 20 20 20 20 63 61 73 65 20 52 42 55 5f 53 54 41      case RBU_STA
13150 54 45 5f 52 4f 57 3a 0a 20 20 20 20 20 20 20 20  TE_ROW:.        
13160 70 52 65 74 2d 3e 6e 52 6f 77 20 3d 20 73 71 6c  pRet->nRow = sql
13170 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
13180 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20  pStmt, 1);.     
13190 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20     break;..     
131a0 20 63 61 73 65 20 52 42 55 5f 53 54 41 54 45 5f   case RBU_STATE_
131b0 50 52 4f 47 52 45 53 53 3a 0a 20 20 20 20 20 20  PROGRESS:.      
131c0 20 20 70 52 65 74 2d 3e 6e 50 72 6f 67 72 65 73    pRet->nProgres
131d0 73 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  s = sqlite3_colu
131e0 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  mn_int64(pStmt, 
131f0 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  1);.        brea
13200 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 52  k;..      case R
13210 42 55 5f 53 54 41 54 45 5f 43 4b 50 54 3a 0a 20  BU_STATE_CKPT:. 
13220 20 20 20 20 20 20 20 70 52 65 74 2d 3e 69 57 61         pRet->iWa
13230 6c 43 6b 73 75 6d 20 3d 20 73 71 6c 69 74 65 33  lCksum = sqlite3
13240 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53  _column_int64(pS
13250 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  tmt, 1);.       
13260 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63   break;..      c
13270 61 73 65 20 52 42 55 5f 53 54 41 54 45 5f 43 4f  ase RBU_STATE_CO
13280 4f 4b 49 45 3a 0a 20 20 20 20 20 20 20 20 70 52  OKIE:.        pR
13290 65 74 2d 3e 69 43 6f 6f 6b 69 65 20 3d 20 28 75  et->iCookie = (u
132a0 33 32 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  32)sqlite3_colum
132b0 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31  n_int64(pStmt, 1
132c0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
132d0 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 52 42  ;..      case RB
132e0 55 5f 53 54 41 54 45 5f 4f 41 4c 53 5a 3a 0a 20  U_STATE_OALSZ:. 
132f0 20 20 20 20 20 20 20 70 52 65 74 2d 3e 69 4f 61         pRet->iOa
13300 6c 53 7a 20 3d 20 28 75 33 32 29 73 71 6c 69 74  lSz = (u32)sqlit
13310 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  e3_column_int64(
13320 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20  pStmt, 1);.     
13330 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20     break;..     
13340 20 63 61 73 65 20 52 42 55 5f 53 54 41 54 45 5f   case RBU_STATE_
13350 50 48 41 53 45 4f 4e 45 53 54 45 50 3a 0a 20 20  PHASEONESTEP:.  
13360 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 50 68 61        pRet->nPha
13370 73 65 4f 6e 65 53 74 65 70 20 3d 20 73 71 6c 69  seOneStep = sqli
13380 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
13390 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20  (pStmt, 1);.    
133a0 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
133b0 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
133c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
133d0 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20  ORRUPT;.        
133e0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
133f0 0a 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33  .  rc2 = sqlite3
13400 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
13410 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
13420 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32  TE_OK ) rc = rc2
13430 3b 0a 0a 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b  ;..  p->rc = rc;
13440 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
13450 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74  }.../*.** Open t
13460 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
13470 6c 65 20 61 6e 64 20 61 74 74 61 63 68 20 74 68  le and attach th
13480 65 20 52 42 55 20 64 61 74 61 62 61 73 65 20 61  e RBU database a
13490 73 20 22 72 62 75 22 2e 20 49 66 20 61 6e 0a 2a  s "rbu". If an.*
134a0 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  * error occurs, 
134b0 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 63  leave an error c
134c0 6f 64 65 20 61 6e 64 20 6d 65 73 73 61 67 65 20  ode and message 
134d0 69 6e 20 74 68 65 20 52 42 55 20 68 61 6e 64 6c  in the RBU handl
134e0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
134f0 64 20 72 62 75 4f 70 65 6e 44 61 74 61 62 61 73  d rbuOpenDatabas
13500 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c  e(sqlite3rbu *p,
13510 20 69 6e 74 20 2a 70 62 52 65 74 72 79 29 7b 0a   int *pbRetry){.
13520 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 20    assert( p->rc 
13530 7c 7c 20 28 70 2d 3e 64 62 4d 61 69 6e 3d 3d 30  || (p->dbMain==0
13540 20 26 26 20 70 2d 3e 64 62 52 62 75 3d 3d 30 29   && p->dbRbu==0)
13550 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
13560 3e 72 63 20 7c 7c 20 72 62 75 49 73 56 61 63 75  >rc || rbuIsVacu
13570 75 6d 28 70 29 20 7c 7c 20 70 2d 3e 7a 54 61 72  um(p) || p->zTar
13580 67 65 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  get!=0 );..  /* 
13590 4f 70 65 6e 20 74 68 65 20 52 42 55 20 64 61 74  Open the RBU dat
135a0 61 62 61 73 65 20 2a 2f 0a 20 20 70 2d 3e 64 62  abase */.  p->db
135b0 52 62 75 20 3d 20 72 62 75 4f 70 65 6e 44 62 68  Rbu = rbuOpenDbh
135c0 61 6e 64 6c 65 28 70 2c 20 70 2d 3e 7a 52 62 75  andle(p, p->zRbu
135d0 2c 20 31 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  , 1);..  if( p->
135e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
135f0 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 29 20   rbuIsVacuum(p) 
13600 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
13610 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64  ile_control(p->d
13620 62 52 62 75 2c 20 22 6d 61 69 6e 22 2c 20 53 51  bRbu, "main", SQ
13630 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 42 55 43 4e  LITE_FCNTL_RBUCN
13640 54 2c 20 28 76 6f 69 64 2a 29 70 29 3b 0a 20 20  T, (void*)p);.  
13650 20 20 69 66 28 20 70 2d 3e 7a 53 74 61 74 65 3d    if( p->zState=
13660 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  =0 ){.      cons
13670 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20  t char *zFile = 
13680 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e  sqlite3_db_filen
13690 61 6d 65 28 70 2d 3e 64 62 52 62 75 2c 20 22 6d  ame(p->dbRbu, "m
136a0 61 69 6e 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ain");.      p->
136b0 7a 53 74 61 74 65 20 3d 20 72 62 75 4d 50 72 69  zState = rbuMPri
136c0 6e 74 66 28 70 2c 20 22 66 69 6c 65 3a 2f 2f 25  ntf(p, "file://%
136d0 73 2d 76 61 63 75 75 6d 3f 6d 6f 64 65 6f 66 3d  s-vacuum?modeof=
136e0 25 73 22 2c 20 7a 46 69 6c 65 2c 20 7a 46 69 6c  %s", zFile, zFil
136f0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
13700 20 2f 2a 20 49 66 20 75 73 69 6e 67 20 73 65 70   /* If using sep
13710 61 72 61 74 65 20 52 42 55 20 61 6e 64 20 73 74  arate RBU and st
13720 61 74 65 20 64 61 74 61 62 61 73 65 73 2c 20 61  ate databases, a
13730 74 74 61 63 68 20 74 68 65 20 73 74 61 74 65 20  ttach the state 
13740 64 61 74 61 62 61 73 65 20 74 6f 0a 20 20 2a 2a  database to.  **
13750 20 74 68 65 20 52 42 55 20 64 62 20 68 61 6e 64   the RBU db hand
13760 6c 65 20 6e 6f 77 2e 20 20 2a 2f 0a 20 20 69 66  le now.  */.  if
13770 28 20 70 2d 3e 7a 53 74 61 74 65 20 29 7b 0a 20  ( p->zState ){. 
13780 20 20 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65     rbuMPrintfExe
13790 63 28 70 2c 20 70 2d 3e 64 62 52 62 75 2c 20 22  c(p, p->dbRbu, "
137a0 41 54 54 41 43 48 20 25 51 20 41 53 20 73 74 61  ATTACH %Q AS sta
137b0 74 22 2c 20 70 2d 3e 7a 53 74 61 74 65 29 3b 0a  t", p->zState);.
137c0 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 7a 53      memcpy(p->zS
137d0 74 61 74 65 44 62 2c 20 22 73 74 61 74 22 2c 20  tateDb, "stat", 
137e0 34 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  4);.  }else{.   
137f0 20 6d 65 6d 63 70 79 28 70 2d 3e 7a 53 74 61 74   memcpy(p->zStat
13800 65 44 62 2c 20 22 6d 61 69 6e 22 2c 20 34 29 3b  eDb, "main", 4);
13810 0a 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20 69 66  .  }..#if 0.  if
13820 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
13830 4f 4b 20 26 26 20 72 62 75 49 73 56 61 63 75 75  OK && rbuIsVacuu
13840 6d 28 70 29 20 29 7b 0a 20 20 20 20 70 2d 3e 72  m(p) ){.    p->r
13850 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
13860 28 70 2d 3e 64 62 52 62 75 2c 20 22 42 45 47 49  (p->dbRbu, "BEGI
13870 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  N", 0, 0, 0);.  
13880 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
13890 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c 72  f it has not alr
138a0 65 61 64 79 20 62 65 65 6e 20 63 72 65 61 74 65  eady been create
138b0 64 2c 20 63 72 65 61 74 65 20 74 68 65 20 72 62  d, create the rb
138c0 75 5f 73 74 61 74 65 20 74 61 62 6c 65 20 2a 2f  u_state table */
138d0 0a 20 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65  .  rbuMPrintfExe
138e0 63 28 70 2c 20 70 2d 3e 64 62 52 62 75 2c 20 52  c(p, p->dbRbu, R
138f0 42 55 5f 43 52 45 41 54 45 5f 53 54 41 54 45 2c  BU_CREATE_STATE,
13900 20 70 2d 3e 7a 53 74 61 74 65 44 62 29 3b 0a 0a   p->zStateDb);..
13910 23 69 66 20 30 0a 20 20 69 66 28 20 72 62 75 49  #if 0.  if( rbuI
13920 73 56 61 63 75 75 6d 28 70 29 20 29 7b 0a 20 20  sVacuum(p) ){.  
13930 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
13940 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
13950 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 20 20 69  int rc2;.      i
13960 6e 74 20 62 4f 6b 20 3d 20 30 3b 0a 20 20 20 20  nt bOk = 0;.    
13970 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
13980 70 43 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  pCnt = 0;.      
13990 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 41  p->rc = prepareA
139a0 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70  ndCollectError(p
139b0 2d 3e 64 62 52 62 75 2c 20 26 70 43 6e 74 2c 20  ->dbRbu, &pCnt, 
139c0 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20  &p->zErrmsg,.   
139d0 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 63         "SELECT c
139e0 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 73 74 61  ount(*) FROM sta
139f0 74 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  t.sqlite_master"
13a00 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
13a10 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
13a20 45 5f 4f 4b 20 0a 20 20 20 20 20 20 20 26 26 20  E_OK .       && 
13a30 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 43 6e  sqlite3_step(pCn
13a40 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 0a 20  t)==SQLITE_ROW. 
13a50 20 20 20 20 20 20 26 26 20 31 3d 3d 73 71 6c 69        && 1==sqli
13a60 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
13a70 43 6e 74 2c 20 30 29 0a 20 20 20 20 20 20 29 7b  Cnt, 0).      ){
13a80 0a 20 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 31  .        bOk = 1
13a90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13aa0 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69  rc2 = sqlite3_fi
13ab0 6e 61 6c 69 7a 65 28 70 43 6e 74 29 3b 0a 20 20  nalize(pCnt);.  
13ac0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
13ad0 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63  QLITE_OK ) p->rc
13ae0 20 3d 20 72 63 32 3b 0a 0a 20 20 20 20 20 20 69   = rc2;..      i
13af0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
13b00 5f 4f 4b 20 26 26 20 62 4f 6b 3d 3d 30 20 29 7b  _OK && bOk==0 ){
13b10 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
13b20 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
13b30 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73         p->zErrms
13b40 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
13b50 6e 74 66 28 22 69 6e 76 61 6c 69 64 20 73 74 61  ntf("invalid sta
13b60 74 65 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20  te database");. 
13b70 20 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20       }.    .    
13b80 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
13b90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
13ba0 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
13bb0 33 5f 65 78 65 63 28 70 2d 3e 64 62 52 62 75 2c  3_exec(p->dbRbu,
13bc0 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c   "COMMIT", 0, 0,
13bd0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
13be0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
13bf0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
13c00 54 45 5f 4f 4b 20 26 26 20 72 62 75 49 73 56 61  TE_OK && rbuIsVa
13c10 63 75 75 6d 28 70 29 20 29 7b 0a 20 20 20 20 69  cuum(p) ){.    i
13c20 6e 74 20 62 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  nt bOpen = 0;.  
13c30 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 70 2d    int rc;.    p-
13c40 3e 6e 52 62 75 20 3d 20 30 3b 0a 20 20 20 20 70  >nRbu = 0;.    p
13c50 2d 3e 70 52 62 75 46 64 20 3d 20 30 3b 0a 20 20  ->pRbuFd = 0;.  
13c60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
13c70 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64  ile_control(p->d
13c80 62 52 62 75 2c 20 22 6d 61 69 6e 22 2c 20 53 51  bRbu, "main", SQ
13c90 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 42 55 43 4e  LITE_FCNTL_RBUCN
13ca0 54 2c 20 28 76 6f 69 64 2a 29 70 29 3b 0a 20 20  T, (void*)p);.  
13cb0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
13cc0 5f 4e 4f 54 46 4f 55 4e 44 20 29 20 70 2d 3e 72  _NOTFOUND ) p->r
13cd0 63 20 3d 20 72 63 3b 0a 20 20 20 20 69 66 28 20  c = rc;.    if( 
13ce0 70 2d 3e 65 53 74 61 67 65 3e 3d 52 42 55 5f 53  p->eStage>=RBU_S
13cf0 54 41 47 45 5f 4d 4f 56 45 20 29 7b 0a 20 20 20  TAGE_MOVE ){.   
13d00 20 20 20 62 4f 70 65 6e 20 3d 20 31 3b 0a 20 20     bOpen = 1;.  
13d10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 52    }else{.      R
13d20 62 75 53 74 61 74 65 20 2a 70 53 74 61 74 65 20  buState *pState 
13d30 3d 20 72 62 75 4c 6f 61 64 53 74 61 74 65 28 70  = rbuLoadState(p
13d40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 74  );.      if( pSt
13d50 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 62  ate ){.        b
13d60 4f 70 65 6e 20 3d 20 28 70 53 74 61 74 65 2d 3e  Open = (pState->
13d70 65 53 74 61 67 65 3e 3d 52 42 55 5f 53 54 41 47  eStage>=RBU_STAG
13d80 45 5f 4d 4f 56 45 29 3b 0a 20 20 20 20 20 20 20  E_MOVE);.       
13d90 20 72 62 75 46 72 65 65 53 74 61 74 65 28 70 53   rbuFreeState(pS
13da0 74 61 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  tate);.      }. 
13db0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62 4f 70     }.    if( bOp
13dc0 65 6e 20 29 20 70 2d 3e 64 62 4d 61 69 6e 20 3d  en ) p->dbMain =
13dd0 20 72 62 75 4f 70 65 6e 44 62 68 61 6e 64 6c 65   rbuOpenDbhandle
13de0 28 70 2c 20 70 2d 3e 7a 52 62 75 2c 20 70 2d 3e  (p, p->zRbu, p->
13df0 6e 52 62 75 3c 3d 31 29 3b 0a 20 20 7d 0a 0a 20  nRbu<=1);.  }.. 
13e00 20 70 2d 3e 65 53 74 61 67 65 20 3d 20 30 3b 0a   p->eStage = 0;.
13e10 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
13e20 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 64 62 4d  ITE_OK && p->dbM
13e30 61 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  ain==0 ){.    if
13e40 28 20 21 72 62 75 49 73 56 61 63 75 75 6d 28 70  ( !rbuIsVacuum(p
13e50 29 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 64 62  ) ){.      p->db
13e60 4d 61 69 6e 20 3d 20 72 62 75 4f 70 65 6e 44 62  Main = rbuOpenDb
13e70 68 61 6e 64 6c 65 28 70 2c 20 70 2d 3e 7a 54 61  handle(p, p->zTa
13e80 72 67 65 74 2c 20 31 29 3b 0a 20 20 20 20 7d 65  rget, 1);.    }e
13e90 6c 73 65 20 69 66 28 20 70 2d 3e 70 52 62 75 46  lse if( p->pRbuF
13ea0 64 2d 3e 70 57 61 6c 46 64 20 29 7b 0a 20 20 20  d->pWalFd ){.   
13eb0 20 20 20 69 66 28 20 70 62 52 65 74 72 79 20 29     if( pbRetry )
13ec0 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 52 62  {.        p->pRb
13ed0 75 46 64 2d 3e 62 4e 6f 6c 6f 63 6b 20 3d 20 30  uFd->bNolock = 0
13ee0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
13ef0 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 52 62 75  3_close(p->dbRbu
13f00 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
13f10 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 4d 61  e3_close(p->dbMa
13f20 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  in);.        p->
13f30 64 62 4d 61 69 6e 20 3d 20 30 3b 0a 20 20 20 20  dbMain = 0;.    
13f40 20 20 20 20 70 2d 3e 64 62 52 62 75 20 3d 20 30      p->dbRbu = 0
13f50 3b 0a 20 20 20 20 20 20 20 20 2a 70 62 52 65 74  ;.        *pbRet
13f60 72 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ry = 1;.        
13f70 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
13f80 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
13f90 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
13fa0 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73    p->zErrmsg = s
13fb0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
13fc0 63 61 6e 6e 6f 74 20 76 61 63 75 75 6d 20 77 61  cannot vacuum wa
13fd0 6c 20 6d 6f 64 65 20 64 61 74 61 62 61 73 65 22  l mode database"
13fe0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
13ff0 20 20 20 20 63 68 61 72 20 2a 7a 54 61 72 67 65      char *zTarge
14000 74 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  t;.      char *z
14010 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 20 20 20  Extra = 0;.     
14020 20 69 66 28 20 73 74 72 6c 65 6e 28 70 2d 3e 7a   if( strlen(p->z
14030 52 62 75 29 3e 3d 35 20 26 26 20 30 3d 3d 6d 65  Rbu)>=5 && 0==me
14040 6d 63 6d 70 28 22 66 69 6c 65 3a 22 2c 20 70 2d  mcmp("file:", p-
14050 3e 7a 52 62 75 2c 20 35 29 20 29 7b 0a 20 20 20  >zRbu, 5) ){.   
14060 20 20 20 20 20 7a 45 78 74 72 61 20 3d 20 26 70       zExtra = &p
14070 2d 3e 7a 52 62 75 5b 35 5d 3b 0a 20 20 20 20 20  ->zRbu[5];.     
14080 20 20 20 77 68 69 6c 65 28 20 2a 7a 45 78 74 72     while( *zExtr
14090 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  a ){.          i
140a0 66 28 20 2a 7a 45 78 74 72 61 2b 2b 3d 3d 27 3f  f( *zExtra++=='?
140b0 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ' ) break;.     
140c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
140d0 20 2a 7a 45 78 74 72 61 3d 3d 27 5c 30 27 20 29   *zExtra=='\0' )
140e0 20 7a 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 20   zExtra = 0;.   
140f0 20 20 20 7d 0a 0a 20 20 20 20 20 20 7a 54 61 72     }..      zTar
14100 67 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  get = sqlite3_mp
14110 72 69 6e 74 66 28 22 66 69 6c 65 3a 25 73 2d 76  rintf("file:%s-v
14120 61 63 75 75 6d 3f 72 62 75 5f 6d 65 6d 6f 72 79  acuum?rbu_memory
14130 3d 31 25 73 25 73 22 2c 20 0a 20 20 20 20 20 20  =1%s%s", .      
14140 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 66      sqlite3_db_f
14150 69 6c 65 6e 61 6d 65 28 70 2d 3e 64 62 52 62 75  ilename(p->dbRbu
14160 2c 20 22 6d 61 69 6e 22 29 2c 0a 20 20 20 20 20  , "main"),.     
14170 20 20 20 20 20 28 7a 45 78 74 72 61 3d 3d 30 20       (zExtra==0 
14180 3f 20 22 22 20 3a 20 22 26 22 29 2c 20 28 7a 45  ? "" : "&"), (zE
14190 78 74 72 61 3d 3d 30 20 3f 20 22 22 20 3a 20 7a  xtra==0 ? "" : z
141a0 45 78 74 72 61 29 0a 20 20 20 20 20 20 29 3b 0a  Extra).      );.
141b0 0a 20 20 20 20 20 20 69 66 28 20 7a 54 61 72 67  .      if( zTarg
141c0 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  et==0 ){.       
141d0 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
141e0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 72  NOMEM;.        r
141f0 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
14200 20 20 20 20 20 70 2d 3e 64 62 4d 61 69 6e 20 3d       p->dbMain =
14210 20 72 62 75 4f 70 65 6e 44 62 68 61 6e 64 6c 65   rbuOpenDbhandle
14220 28 70 2c 20 7a 54 61 72 67 65 74 2c 20 70 2d 3e  (p, zTarget, p->
14230 6e 52 62 75 3c 3d 31 29 3b 0a 20 20 20 20 20 20  nRbu<=1);.      
14240 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 61  sqlite3_free(zTa
14250 72 67 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rget);.    }.  }
14260 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
14270 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14280 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
14290 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
142a0 70 2d 3e 64 62 4d 61 69 6e 2c 20 0a 20 20 20 20  p->dbMain, .    
142b0 20 20 20 20 22 72 62 75 5f 74 6d 70 5f 69 6e 73      "rbu_tmp_ins
142c0 65 72 74 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45  ert", -1, SQLITE
142d0 5f 55 54 46 38 2c 20 28 76 6f 69 64 2a 29 70 2c  _UTF8, (void*)p,
142e0 20 72 62 75 54 6d 70 49 6e 73 65 72 74 46 75 6e   rbuTmpInsertFun
142f0 63 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20  c, 0, 0.    );. 
14300 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   }..  if( p->rc=
14310 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14320 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
14330 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
14340 6e 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 0a 20 20  n(p->dbMain, .  
14350 20 20 20 20 20 20 22 72 62 75 5f 66 6f 73 73 69        "rbu_fossi
14360 6c 5f 64 65 6c 74 61 22 2c 20 32 2c 20 53 51 4c  l_delta", 2, SQL
14370 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 72 62 75  ITE_UTF8, 0, rbu
14380 46 6f 73 73 69 6c 44 65 6c 74 61 46 75 6e 63 2c  FossilDeltaFunc,
14390 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d   0, 0.    );.  }
143a0 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
143b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
143c0 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
143d0 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
143e0 70 2d 3e 64 62 52 62 75 2c 20 0a 20 20 20 20 20  p->dbRbu, .     
143f0 20 20 20 22 72 62 75 5f 74 61 72 67 65 74 5f 6e     "rbu_target_n
14400 61 6d 65 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45  ame", -1, SQLITE
14410 5f 55 54 46 38 2c 20 28 76 6f 69 64 2a 29 70 2c  _UTF8, (void*)p,
14420 20 72 62 75 54 61 72 67 65 74 4e 61 6d 65 46 75   rbuTargetNameFu
14430 6e 63 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a  nc, 0, 0.    );.
14440 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63    }..  if( p->rc
14450 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
14460 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
14470 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
14480 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e  p->dbMain, "main
14490 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ", SQLITE_FCNTL_
144a0 52 42 55 2c 20 28 76 6f 69 64 2a 29 70 29 3b 0a  RBU, (void*)p);.
144b0 20 20 7d 0a 20 20 72 62 75 4d 50 72 69 6e 74 66    }.  rbuMPrintf
144c0 45 78 65 63 28 70 2c 20 70 2d 3e 64 62 4d 61 69  Exec(p, p->dbMai
144d0 6e 2c 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  n, "SELECT * FRO
144e0 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  M sqlite_master"
144f0 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68  );..  /* Mark th
14500 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
14510 6a 75 73 74 20 6f 70 65 6e 65 64 20 61 73 20 61  just opened as a
14520 6e 20 52 42 55 20 74 61 72 67 65 74 20 64 61 74  n RBU target dat
14530 61 62 61 73 65 2e 20 49 66 20 0a 20 20 2a 2a 20  abase. If .  ** 
14540 74 68 69 73 20 63 61 6c 6c 20 72 65 74 75 72 6e  this call return
14550 73 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  s SQLITE_NOTFOUN
14560 44 2c 20 74 68 65 6e 20 74 68 65 20 52 42 55 20  D, then the RBU 
14570 76 66 73 20 69 73 20 6e 6f 74 20 69 6e 20 75 73  vfs is not in us
14580 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20  e..  ** This is 
14590 61 6e 20 65 72 72 6f 72 2e 20 20 2a 2f 0a 20 20  an error.  */.  
145a0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
145b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72  E_OK ){.    p->r
145c0 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
145d0 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62 4d 61  _control(p->dbMa
145e0 69 6e 2c 20 22 6d 61 69 6e 22 2c 20 53 51 4c 49  in, "main", SQLI
145f0 54 45 5f 46 43 4e 54 4c 5f 52 42 55 2c 20 28 76  TE_FCNTL_RBU, (v
14600 6f 69 64 2a 29 70 29 3b 0a 20 20 7d 0a 0a 20 20  oid*)p);.  }..  
14610 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
14620 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20  E_NOTFOUND ){.  
14630 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
14640 5f 45 52 52 4f 52 3b 0a 20 20 20 20 70 2d 3e 7a  _ERROR;.    p->z
14650 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33  Errmsg = sqlite3
14660 5f 6d 70 72 69 6e 74 66 28 22 72 62 75 20 76 66  _mprintf("rbu vf
14670 73 20 6e 6f 74 20 66 6f 75 6e 64 22 29 3b 0a 20  s not found");. 
14680 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
14690 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 63 6f   routine is a co
146a0 70 79 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  py of the sqlite
146b0 33 46 69 6c 65 53 75 66 66 69 78 33 28 29 20 72  3FileSuffix3() r
146c0 6f 75 74 69 6e 65 20 66 72 6f 6d 20 74 68 65 20  outine from the 
146d0 63 6f 72 65 2e 0a 2a 2a 20 49 74 20 69 73 20 61  core..** It is a
146e0 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 53 51   no-op unless SQ
146f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f  LITE_ENABLE_8_3_
14700 4e 41 4d 45 53 20 69 73 20 64 65 66 69 6e 65 64  NAMES is defined
14710 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
14720 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d  E_ENABLE_8_3_NAM
14730 45 53 20 69 73 20 73 65 74 20 61 74 20 63 6f 6d  ES is set at com
14740 70 69 6c 65 2d 74 69 6d 65 20 61 6e 64 20 69 66  pile-time and if
14750 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
14760 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 7a 42 61   filename in zBa
14770 73 65 46 69 6c 65 6e 61 6d 65 20 69 73 20 61 20  seFilename is a 
14780 55 52 49 20 77 69 74 68 20 74 68 65 20 22 38 5f  URI with the "8_
14790 33 5f 6e 61 6d 65 73 3d 31 22 20 70 61 72 61 6d  3_names=1" param
147a0 65 74 65 72 20 61 6e 64 0a 2a 2a 20 69 66 20 66  eter and.** if f
147b0 69 6c 65 6e 61 6d 65 20 69 6e 20 7a 5b 5d 20 68  ilename in z[] h
147c0 61 73 20 61 20 73 75 66 66 69 78 20 28 61 2e 6b  as a suffix (a.k
147d0 2e 61 2e 20 22 65 78 74 65 6e 73 69 6f 6e 22 29  .a. "extension")
147e0 20 74 68 61 74 20 69 73 20 6c 6f 6e 67 65 72 20   that is longer 
147f0 74 68 61 6e 0a 2a 2a 20 74 68 72 65 65 20 63 68  than.** three ch
14800 61 72 61 63 74 65 72 73 2c 20 74 68 65 6e 20 73  aracters, then s
14810 68 6f 72 74 65 6e 20 74 68 65 20 73 75 66 66 69  horten the suffi
14820 78 20 6f 6e 20 7a 5b 5d 20 74 6f 20 62 65 20 74  x on z[] to be t
14830 68 65 20 6c 61 73 74 20 74 68 72 65 65 0a 2a 2a  he last three.**
14840 20 63 68 61 72 61 63 74 65 72 73 20 6f 66 20 74   characters of t
14850 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 75 66 66  he original suff
14860 69 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  ix..**.** If SQL
14870 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e  ITE_ENABLE_8_3_N
14880 41 4d 45 53 20 69 73 20 73 65 74 20 74 6f 20 32  AMES is set to 2
14890 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
148a0 2c 20 74 68 65 6e 20 61 6c 77 61 79 73 0a 2a 2a  , then always.**
148b0 20 64 6f 20 74 68 65 20 73 75 66 66 69 78 20 73   do the suffix s
148c0 68 6f 72 74 65 6e 69 6e 67 20 72 65 67 61 72 64  hortening regard
148d0 6c 65 73 73 20 6f 66 20 55 52 49 20 70 61 72 61  less of URI para
148e0 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  meter..**.** Exa
148f0 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  mples:.**.**    
14900 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
14910 20 20 20 20 3d 3e 20 20 20 74 65 73 74 2e 6e 61      =>   test.na
14920 6c 0a 2a 2a 20 20 20 20 20 74 65 73 74 2e 64 62  l.**     test.db
14930 2d 77 61 6c 20 20 20 20 20 20 20 20 3d 3e 20 20  -wal        =>  
14940 20 74 65 73 74 2e 77 61 6c 0a 2a 2a 20 20 20 20   test.wal.**    
14950 20 74 65 73 74 2e 64 62 2d 73 68 6d 20 20 20 20   test.db-shm    
14960 20 20 20 20 3d 3e 20 20 20 74 65 73 74 2e 73 68      =>   test.sh
14970 6d 0a 2a 2a 20 20 20 20 20 74 65 73 74 2e 64 62  m.**     test.db
14980 2d 6d 6a 37 66 33 33 31 39 66 61 20 3d 3e 20 20  -mj7f3319fa =>  
14990 20 74 65 73 74 2e 39 66 61 0a 2a 2f 0a 73 74 61   test.9fa.*/.sta
149a0 74 69 63 20 76 6f 69 64 20 72 62 75 46 69 6c 65  tic void rbuFile
149b0 53 75 66 66 69 78 33 28 63 6f 6e 73 74 20 63 68  Suffix3(const ch
149c0 61 72 20 2a 7a 42 61 73 65 2c 20 63 68 61 72 20  ar *zBase, char 
149d0 2a 7a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  *z){.#ifdef SQLI
149e0 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41  TE_ENABLE_8_3_NA
149f0 4d 45 53 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  MES.#if SQLITE_E
14a00 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 3c  NABLE_8_3_NAMES<
14a10 32 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  2.  if( sqlite3_
14a20 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 42 61 73  uri_boolean(zBas
14a30 65 2c 20 22 38 5f 33 5f 6e 61 6d 65 73 22 2c 20  e, "8_3_names", 
14a40 30 29 20 29 0a 23 65 6e 64 69 66 0a 20 20 7b 0a  0) ).#endif.  {.
14a50 20 20 20 20 69 6e 74 20 69 2c 20 73 7a 3b 0a 20      int i, sz;. 
14a60 20 20 20 73 7a 20 3d 20 28 69 6e 74 29 73 74 72     sz = (int)str
14a70 6c 65 6e 28 7a 29 26 30 78 66 66 66 66 66 66 3b  len(z)&0xffffff;
14a80 0a 20 20 20 20 66 6f 72 28 69 3d 73 7a 2d 31 3b  .    for(i=sz-1;
14a90 20 69 3e 30 20 26 26 20 7a 5b 69 5d 21 3d 27 2f   i>0 && z[i]!='/
14aa0 27 20 26 26 20 7a 5b 69 5d 21 3d 27 2e 27 3b 20  ' && z[i]!='.'; 
14ab0 69 2d 2d 29 7b 7d 0a 20 20 20 20 69 66 28 20 7a  i--){}.    if( z
14ac0 5b 69 5d 3d 3d 27 2e 27 20 26 26 20 73 7a 3e 69  [i]=='.' && sz>i
14ad0 2b 34 20 29 20 6d 65 6d 6d 6f 76 65 28 26 7a 5b  +4 ) memmove(&z[
14ae0 69 2b 31 5d 2c 20 26 7a 5b 73 7a 2d 33 5d 2c 20  i+1], &z[sz-3], 
14af0 34 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  4);.  }.#endif.}
14b00 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
14b10 68 65 20 63 75 72 72 65 6e 74 20 77 61 6c 2d 69  he current wal-i
14b20 6e 64 65 78 20 68 65 61 64 65 72 20 63 68 65 63  ndex header chec
14b30 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 74 61 72  ksum for the tar
14b40 67 65 74 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  get database .**
14b50 20 61 73 20 61 20 36 34 2d 62 69 74 20 69 6e 74   as a 64-bit int
14b60 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  eger..**.** The 
14b70 63 68 65 63 6b 73 75 6d 20 69 73 20 73 74 6f 72  checksum is stor
14b80 65 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 70  e in the first p
14b90 61 67 65 20 6f 66 20 78 53 68 6d 4d 61 70 20 6d  age of xShmMap m
14ba0 65 6d 6f 72 79 20 61 73 20 61 6e 20 38 2d 62 79  emory as an 8-by
14bb0 74 65 20 0a 2a 2a 20 62 6c 6f 62 20 73 74 61 72  te .** blob star
14bc0 74 69 6e 67 20 61 74 20 62 79 74 65 20 6f 66 66  ting at byte off
14bd0 73 65 74 20 34 30 2e 0a 2a 2f 0a 73 74 61 74 69  set 40..*/.stati
14be0 63 20 69 36 34 20 72 62 75 53 68 6d 43 68 65 63  c i64 rbuShmChec
14bf0 6b 73 75 6d 28 73 71 6c 69 74 65 33 72 62 75 20  ksum(sqlite3rbu 
14c00 2a 70 29 7b 0a 20 20 69 36 34 20 69 52 65 74 20  *p){.  i64 iRet 
14c10 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  = 0;.  if( p->rc
14c20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
14c30 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
14c40 2a 70 44 62 20 3d 20 70 2d 3e 70 54 61 72 67 65  *pDb = p->pTarge
14c50 74 46 64 2d 3e 70 52 65 61 6c 3b 0a 20 20 20 20  tFd->pReal;.    
14c60 75 33 32 20 76 6f 6c 61 74 69 6c 65 20 2a 70 74  u32 volatile *pt
14c70 72 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 70  r;.    p->rc = p
14c80 44 62 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53  Db->pMethods->xS
14c90 68 6d 4d 61 70 28 70 44 62 2c 20 30 2c 20 33 32  hmMap(pDb, 0, 32
14ca0 2a 31 30 32 34 2c 20 30 2c 20 28 76 6f 69 64 20  *1024, 0, (void 
14cb0 76 6f 6c 61 74 69 6c 65 2a 2a 29 26 70 74 72 29  volatile**)&ptr)
14cc0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  ;.    if( p->rc=
14cd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14ce0 20 20 20 20 69 52 65 74 20 3d 20 28 28 69 36 34      iRet = ((i64
14cf0 29 70 74 72 5b 31 30 5d 20 3c 3c 20 33 32 29 20  )ptr[10] << 32) 
14d00 2b 20 70 74 72 5b 31 31 5d 3b 0a 20 20 20 20 7d  + ptr[11];.    }
14d10 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52  .  }.  return iR
14d20 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  et;.}../*.** Thi
14d30 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
14d40 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  lled as part of 
14d50 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 6f 72 20  initializing or 
14d60 72 65 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61  reinitializing a
14d70 6e 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 61 6c  n.** incremental
14d80 20 63 68 65 63 6b 70 6f 69 6e 74 2e 20 0a 2a 2a   checkpoint. .**
14d90 0a 2a 2a 20 49 74 20 70 6f 70 75 6c 61 74 65 73  .** It populates
14da0 20 74 68 65 20 73 71 6c 69 74 65 33 72 62 75 2e   the sqlite3rbu.
14db0 61 46 72 61 6d 65 5b 5d 20 61 72 72 61 79 20 77  aFrame[] array w
14dc0 69 74 68 20 74 68 65 20 73 65 74 20 6f 66 20 0a  ith the set of .
14dd0 2a 2a 20 28 77 61 6c 20 66 72 61 6d 65 20 2d 3e  ** (wal frame ->
14de0 20 64 62 20 70 61 67 65 29 20 63 6f 70 79 20 6f   db page) copy o
14df0 70 65 72 61 74 69 6f 6e 73 20 72 65 71 75 69 72  perations requir
14e00 65 64 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74  ed to checkpoint
14e10 20 74 68 65 20 0a 2a 2a 20 63 75 72 72 65 6e 74   the .** current
14e20 20 77 61 6c 20 66 69 6c 65 2c 20 61 6e 64 20 6f   wal file, and o
14e30 62 74 61 69 6e 73 20 74 68 65 20 73 65 74 20 6f  btains the set o
14e40 66 20 73 68 6d 20 6c 6f 63 6b 73 20 72 65 71 75  f shm locks requ
14e50 69 72 65 64 20 74 6f 20 73 61 66 65 6c 79 20 0a  ired to safely .
14e60 2a 2a 20 70 65 72 66 6f 72 6d 20 74 68 65 20 63  ** perform the c
14e70 6f 70 79 20 6f 70 65 72 61 74 69 6f 6e 73 20 64  opy operations d
14e80 69 72 65 63 74 6c 79 20 6f 6e 20 74 68 65 20 66  irectly on the f
14e90 69 6c 65 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a  ile-system..**.*
14ea0 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 70 53  * If argument pS
14eb0 74 61 74 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  tate is not NULL
14ec0 2c 20 74 68 65 6e 20 74 68 65 20 69 6e 63 72 65  , then the incre
14ed0 6d 65 6e 74 61 6c 20 63 68 65 63 6b 70 6f 69 6e  mental checkpoin
14ee0 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20 72 65  t is.** being re
14ef0 73 75 6d 65 64 2e 20 49 6e 20 74 68 69 73 20 63  sumed. In this c
14f00 61 73 65 2c 20 69 66 20 74 68 65 20 63 68 65 63  ase, if the chec
14f10 6b 73 75 6d 20 6f 66 20 74 68 65 20 77 61 6c 2d  ksum of the wal-
14f20 69 6e 64 65 78 2d 68 65 61 64 65 72 0a 2a 2a 20  index-header.** 
14f30 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65  following recove
14f40 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20 73 61  ry is not the sa
14f50 6d 65 20 61 73 20 74 68 65 20 63 68 65 63 6b 73  me as the checks
14f60 75 6d 20 73 61 76 65 64 20 69 6e 20 74 68 65 20  um saved in the 
14f70 52 62 75 53 74 61 74 65 0a 2a 2a 20 6f 62 6a 65  RbuState.** obje
14f80 63 74 2c 20 74 68 65 6e 20 74 68 65 20 72 62 75  ct, then the rbu
14f90 20 68 61 6e 64 6c 65 20 69 73 20 73 65 74 20 74   handle is set t
14fa0 6f 20 44 4f 4e 45 20 73 74 61 74 65 2e 20 54 68  o DONE state. Th
14fb0 69 73 20 6f 63 63 75 72 73 20 69 66 20 73 6f 6d  is occurs if som
14fc0 65 0a 2a 2a 20 6f 74 68 65 72 20 63 6c 69 65 6e  e.** other clien
14fd0 74 20 61 70 70 65 6e 64 73 20 61 20 74 72 61 6e  t appends a tran
14fe0 73 61 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 77  saction to the w
14ff0 61 6c 20 66 69 6c 65 20 69 6e 20 74 68 65 20 6d  al file in the m
15000 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 61 6e 20 69  iddle of.** an i
15010 6e 63 72 65 6d 65 6e 74 61 6c 20 63 68 65 63 6b  ncremental check
15020 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  point..*/.static
15030 20 76 6f 69 64 20 72 62 75 53 65 74 75 70 43 68   void rbuSetupCh
15040 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33  eckpoint(sqlite3
15050 72 62 75 20 2a 70 2c 20 52 62 75 53 74 61 74 65  rbu *p, RbuState
15060 20 2a 70 53 74 61 74 65 29 7b 0a 0a 20 20 2f 2a   *pState){..  /*
15070 20 49 66 20 70 53 74 61 74 65 20 69 73 20 4e 55   If pState is NU
15080 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 77 61 6c  LL, then the wal
15090 20 66 69 6c 65 20 6d 61 79 20 6e 6f 74 20 68 61   file may not ha
150a0 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 61  ve been opened a
150b0 6e 64 0a 20 20 2a 2a 20 72 65 63 6f 76 65 72 65  nd.  ** recovere
150c0 64 2e 20 52 75 6e 6e 69 6e 67 20 61 20 72 65 61  d. Running a rea
150d0 64 2d 73 74 61 74 65 6d 65 6e 74 20 68 65 72 65  d-statement here
150e0 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
150f0 64 6f 69 6e 67 20 73 6f 0a 20 20 2a 2a 20 64 6f  doing so.  ** do
15100 65 73 20 6e 6f 74 20 69 6e 74 65 72 66 65 72 65  es not interfere
15110 20 77 69 74 68 20 74 68 65 20 22 63 61 70 74 75   with the "captu
15120 72 65 22 20 70 72 6f 63 65 73 73 20 62 65 6c 6f  re" process belo
15130 77 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 74  w.  */.  if( pSt
15140 61 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d  ate==0 ){.    p-
15150 3e 65 53 74 61 67 65 20 3d 20 30 3b 0a 20 20 20  >eStage = 0;.   
15160 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
15170 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
15180 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65  ->rc = sqlite3_e
15190 78 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22  xec(p->dbMain, "
151a0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71  SELECT * FROM sq
151b0 6c 69 74 65 5f 6d 61 73 74 65 72 22 2c 20 30 2c  lite_master", 0,
151c0 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
151d0 7d 0a 0a 20 20 2f 2a 20 41 73 73 75 6d 69 6e 67  }..  /* Assuming
151e0 20 6e 6f 20 65 72 72 6f 72 20 68 61 73 20 6f 63   no error has oc
151f0 63 75 72 72 65 64 2c 20 72 75 6e 20 61 20 22 72  curred, run a "r
15200 65 73 74 61 72 74 22 20 63 68 65 63 6b 70 6f 69  estart" checkpoi
15210 6e 74 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a  nt with the.  **
15220 20 73 71 6c 69 74 65 33 72 62 75 2e 65 53 74 61   sqlite3rbu.eSta
15230 67 65 20 76 61 72 69 61 62 6c 65 20 73 65 74 20  ge variable set 
15240 74 6f 20 43 41 50 54 55 52 45 2e 20 54 68 69 73  to CAPTURE. This
15250 20 74 75 72 6e 73 20 6f 6e 20 74 68 65 20 66 6f   turns on the fo
15260 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 73 70 65  llowing.  ** spe
15270 63 69 61 6c 20 62 65 68 61 76 69 6f 75 72 20 69  cial behaviour i
15280 6e 20 74 68 65 20 72 62 75 20 56 46 53 3a 0a 20  n the rbu VFS:. 
15290 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 49 66 20   **.  **   * If 
152a0 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 73 68  the exclusive sh
152b0 6d 20 57 52 49 54 45 52 20 6f 72 20 52 45 41 44  m WRITER or READ
152c0 30 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65  0 lock cannot be
152d0 20 6f 62 74 61 69 6e 65 64 2c 0a 20 20 2a 2a 20   obtained,.  ** 
152e0 20 20 20 20 74 68 65 20 63 68 65 63 6b 70 6f 69      the checkpoi
152f0 6e 74 20 66 61 69 6c 73 20 77 69 74 68 20 53 51  nt fails with SQ
15300 4c 49 54 45 5f 42 55 53 59 20 28 6e 6f 72 6d 61  LITE_BUSY (norma
15310 6c 6c 79 20 53 51 4c 69 74 65 20 77 6f 75 6c 64  lly SQLite would
15320 0a 20 20 2a 2a 20 20 20 20 20 70 72 6f 63 65 65  .  **     procee
15330 64 20 77 69 74 68 20 72 75 6e 6e 69 6e 67 20 61  d with running a
15340 20 70 61 73 73 69 76 65 20 63 68 65 63 6b 70 6f   passive checkpo
15350 69 6e 74 20 69 6e 73 74 65 61 64 20 6f 66 20 66  int instead of f
15360 61 69 6c 69 6e 67 29 2e 0a 20 20 2a 2a 0a 20 20  ailing)..  **.  
15370 2a 2a 20 20 20 2a 20 41 74 74 65 6d 70 74 73 20  **   * Attempts 
15380 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  to read from the
15390 20 2a 2d 77 61 6c 20 66 69 6c 65 20 6f 72 20 77   *-wal file or w
153a0 72 69 74 65 20 74 6f 20 74 68 65 20 64 61 74 61  rite to the data
153b0 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 20  base file.  **  
153c0 20 20 20 64 6f 20 6e 6f 74 20 70 65 72 66 6f 72     do not perfor
153d0 6d 20 61 6e 79 20 49 4f 2e 20 49 6e 73 74 65 61  m any IO. Instea
153e0 64 2c 20 74 68 65 20 66 72 61 6d 65 2f 70 61 67  d, the frame/pag
153f0 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 74  e combinations t
15400 68 61 74 0a 20 20 2a 2a 20 20 20 20 20 77 6f 75  hat.  **     wou
15410 6c 64 20 62 65 20 72 65 61 64 2f 77 72 69 74 74  ld be read/writt
15420 65 6e 20 61 72 65 20 72 65 63 6f 72 64 65 64 20  en are recorded 
15430 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33 72 62  in the sqlite3rb
15440 75 2e 61 46 72 61 6d 65 5b 5d 0a 20 20 2a 2a 20  u.aFrame[].  ** 
15450 20 20 20 20 61 72 72 61 79 2e 0a 20 20 2a 2a 0a      array..  **.
15460 20 20 2a 2a 20 20 20 2a 20 43 61 6c 6c 73 20 74    **   * Calls t
15470 6f 20 78 53 68 6d 4c 6f 63 6b 28 55 4e 4c 4f 43  o xShmLock(UNLOC
15480 4b 29 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68  K) to release th
15490 65 20 65 78 63 6c 75 73 69 76 65 20 73 68 6d 20  e exclusive shm 
154a0 57 52 49 54 45 52 2c 20 0a 20 20 2a 2a 20 20 20  WRITER, .  **   
154b0 20 20 52 45 41 44 30 20 61 6e 64 20 43 48 45 43    READ0 and CHEC
154c0 4b 50 4f 49 4e 54 20 6c 6f 63 6b 73 20 74 61 6b  KPOINT locks tak
154d0 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  en as part of th
154e0 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 72 65  e checkpoint are
154f0 0a 20 20 2a 2a 20 20 20 20 20 6e 6f 2d 6f 70 73  .  **     no-ops
15500 2e 20 54 68 65 73 65 20 6c 6f 63 6b 73 20 77 69  . These locks wi
15510 6c 6c 20 6e 6f 74 20 62 65 20 72 65 6c 65 61 73  ll not be releas
15520 65 64 20 75 6e 74 69 6c 20 74 68 65 20 63 6f 6e  ed until the con
15530 6e 65 63 74 69 6f 6e 0a 20 20 2a 2a 20 20 20 20  nection.  **    
15540 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20 20 2a 2a   is closed..  **
15550 0a 20 20 2a 2a 20 20 20 2a 20 41 74 74 65 6d 70  .  **   * Attemp
15560 74 69 6e 67 20 74 6f 20 78 53 79 6e 63 28 29 20  ting to xSync() 
15570 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15580 65 20 63 61 75 73 65 73 20 61 6e 20 53 51 4c 49  e causes an SQLI
15590 54 45 5f 49 4e 54 45 52 4e 41 4c 20 0a 20 20 2a  TE_INTERNAL .  *
155a0 2a 20 20 20 20 20 65 72 72 6f 72 2e 0a 20 20 2a  *     error..  *
155b0 2a 0a 20 20 2a 2a 20 41 73 20 61 20 72 65 73 75  *.  ** As a resu
155c0 6c 74 2c 20 75 6e 6c 65 73 73 20 61 6e 20 65 72  lt, unless an er
155d0 72 6f 72 20 28 69 2e 65 2e 20 4f 4f 4d 20 6f 72  ror (i.e. OOM or
155e0 20 53 51 4c 49 54 45 5f 42 55 53 59 29 20 6f 63   SQLITE_BUSY) oc
155f0 63 75 72 73 2c 20 74 68 65 0a 20 20 2a 2a 20 63  curs, the.  ** c
15600 68 65 63 6b 70 6f 69 6e 74 20 62 65 6c 6f 77 20  heckpoint below 
15610 66 61 69 6c 73 20 77 69 74 68 20 53 51 4c 49 54  fails with SQLIT
15620 45 5f 49 4e 54 45 52 4e 41 4c 2c 20 61 6e 64 20  E_INTERNAL, and 
15630 6c 65 61 76 65 73 20 74 68 65 20 61 46 72 61 6d  leaves the aFram
15640 65 5b 5d 0a 20 20 2a 2a 20 61 72 72 61 79 20 70  e[].  ** array p
15650 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 61 20  opulated with a 
15660 73 65 74 20 6f 66 20 28 66 72 61 6d 65 20 2d 3e  set of (frame ->
15670 20 70 61 67 65 29 20 6d 61 70 70 69 6e 67 73 2e   page) mappings.
15680 20 42 65 63 61 75 73 65 20 74 68 65 20 0a 20 20   Because the .  
15690 2a 2a 20 57 52 49 54 45 52 2c 20 43 48 45 43 4b  ** WRITER, CHECK
156a0 50 4f 49 4e 54 20 61 6e 64 20 52 45 41 44 30 20  POINT and READ0 
156b0 6c 6f 63 6b 73 20 61 72 65 20 73 74 69 6c 6c 20  locks are still 
156c0 68 65 6c 64 2c 20 69 74 20 69 73 20 73 61 66 65  held, it is safe
156d0 20 74 6f 20 63 6f 70 79 20 0a 20 20 2a 2a 20 64   to copy .  ** d
156e0 61 74 61 20 66 72 6f 6d 20 74 68 65 20 77 61 6c  ata from the wal
156f0 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 20 64   file into the d
15700 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 63 63  atabase file acc
15710 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 0a 20  ording to the . 
15720 20 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20   ** contents of 
15730 61 46 72 61 6d 65 5b 5d 2e 0a 20 20 2a 2f 0a 20  aFrame[]..  */. 
15740 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
15750 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
15760 20 72 63 32 3b 0a 20 20 20 20 70 2d 3e 65 53 74   rc2;.    p->eSt
15770 61 67 65 20 3d 20 52 42 55 5f 53 54 41 47 45 5f  age = RBU_STAGE_
15780 43 41 50 54 55 52 45 3b 0a 20 20 20 20 72 63 32  CAPTURE;.    rc2
15790 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
157a0 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 50 52 41 47  p->dbMain, "PRAG
157b0 4d 41 20 6d 61 69 6e 2e 77 61 6c 5f 63 68 65 63  MA main.wal_chec
157c0 6b 70 6f 69 6e 74 3d 72 65 73 74 61 72 74 22 2c  kpoint=restart",
157d0 20 30 2c 20 30 2c 30 29 3b 0a 20 20 20 20 69 66   0, 0,0);.    if
157e0 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 49 4e  ( rc2!=SQLITE_IN
157f0 54 45 52 4e 41 4c 20 29 20 70 2d 3e 72 63 20 3d  TERNAL ) p->rc =
15800 20 72 63 32 3b 0a 20 20 7d 0a 0a 20 20 69 66 28   rc2;.  }..  if(
15810 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
15820 4b 20 26 26 20 70 2d 3e 6e 46 72 61 6d 65 3e 30  K && p->nFrame>0
15830 20 29 7b 0a 20 20 20 20 70 2d 3e 65 53 74 61 67   ){.    p->eStag
15840 65 20 3d 20 52 42 55 5f 53 54 41 47 45 5f 43 4b  e = RBU_STAGE_CK
15850 50 54 3b 0a 20 20 20 20 70 2d 3e 6e 53 74 65 70  PT;.    p->nStep
15860 20 3d 20 28 70 53 74 61 74 65 20 3f 20 70 53 74   = (pState ? pSt
15870 61 74 65 2d 3e 6e 52 6f 77 20 3a 20 30 29 3b 0a  ate->nRow : 0);.
15880 20 20 20 20 70 2d 3e 61 42 75 66 20 3d 20 72 62      p->aBuf = rb
15890 75 4d 61 6c 6c 6f 63 28 70 2c 20 70 2d 3e 70 67  uMalloc(p, p->pg
158a0 73 7a 29 3b 0a 20 20 20 20 70 2d 3e 69 57 61 6c  sz);.    p->iWal
158b0 43 6b 73 75 6d 20 3d 20 72 62 75 53 68 6d 43 68  Cksum = rbuShmCh
158c0 65 63 6b 73 75 6d 28 70 29 3b 0a 20 20 7d 0a 0a  ecksum(p);.  }..
158d0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
158e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
158f0 28 20 70 2d 3e 6e 46 72 61 6d 65 3d 3d 30 20 7c  ( p->nFrame==0 |
15900 7c 20 28 70 53 74 61 74 65 20 26 26 20 70 53 74  | (pState && pSt
15910 61 74 65 2d 3e 69 57 61 6c 43 6b 73 75 6d 21 3d  ate->iWalCksum!=
15920 70 2d 3e 69 57 61 6c 43 6b 73 75 6d 29 20 29 7b  p->iWalCksum) ){
15930 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  .      p->rc = S
15940 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
15950 20 20 70 2d 3e 65 53 74 61 67 65 20 3d 20 52 42    p->eStage = RB
15960 55 5f 53 54 41 47 45 5f 44 4f 4e 45 3b 0a 20 20  U_STAGE_DONE;.  
15970 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
15980 6e 74 20 6e 53 65 63 74 6f 72 53 69 7a 65 3b 0a  nt nSectorSize;.
15990 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
159a0 6c 65 20 2a 70 44 62 20 3d 20 70 2d 3e 70 54 61  le *pDb = p->pTa
159b0 72 67 65 74 46 64 2d 3e 70 52 65 61 6c 3b 0a 20  rgetFd->pReal;. 
159c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c       sqlite3_fil
159d0 65 20 2a 70 57 61 6c 20 3d 20 70 2d 3e 70 54 61  e *pWal = p->pTa
159e0 72 67 65 74 46 64 2d 3e 70 57 61 6c 46 64 2d 3e  rgetFd->pWalFd->
159f0 70 52 65 61 6c 3b 0a 20 20 20 20 20 20 61 73 73  pReal;.      ass
15a00 65 72 74 28 20 70 2d 3e 6e 50 61 67 65 50 65 72  ert( p->nPagePer
15a10 53 65 63 74 6f 72 3d 3d 30 20 29 3b 0a 20 20 20  Sector==0 );.   
15a20 20 20 20 6e 53 65 63 74 6f 72 53 69 7a 65 20 3d     nSectorSize =
15a30 20 70 44 62 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e   pDb->pMethods->
15a40 78 53 65 63 74 6f 72 53 69 7a 65 28 70 44 62 29  xSectorSize(pDb)
15a50 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 53 65 63  ;.      if( nSec
15a60 74 6f 72 53 69 7a 65 3e 70 2d 3e 70 67 73 7a 20  torSize>p->pgsz 
15a70 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 50  ){.        p->nP
15a80 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20 6e  agePerSector = n
15a90 53 65 63 74 6f 72 53 69 7a 65 20 2f 20 70 2d 3e  SectorSize / p->
15aa0 70 67 73 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pgsz;.      }els
15ab0 65 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 50  e{.        p->nP
15ac0 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20 31  agePerSector = 1
15ad0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
15ae0 20 2f 2a 20 43 61 6c 6c 20 78 53 79 6e 63 28 29   /* Call xSync()
15af0 20 6f 6e 20 74 68 65 20 77 61 6c 20 66 69 6c 65   on the wal file
15b00 2e 20 54 68 69 73 20 63 61 75 73 65 73 20 53 51  . This causes SQ
15b10 4c 69 74 65 20 74 6f 20 73 79 6e 63 20 74 68 65  Lite to sync the
15b20 20 0a 20 20 20 20 20 20 2a 2a 20 64 69 72 65 63   .      ** direc
15b30 74 6f 72 79 20 69 6e 20 77 68 69 63 68 20 74 68  tory in which th
15b40 65 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73  e target databas
15b50 65 20 61 6e 64 20 74 68 65 20 77 61 6c 20 66 69  e and the wal fi
15b60 6c 65 20 72 65 73 69 64 65 2c 20 69 6e 20 0a 20  le reside, in . 
15b70 20 20 20 20 20 2a 2a 20 63 61 73 65 20 69 74 20       ** case it 
15b80 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e  has not been syn
15b90 63 65 64 20 73 69 6e 63 65 20 74 68 65 20 72 65  ced since the re
15ba0 6e 61 6d 65 28 29 20 63 61 6c 6c 20 69 6e 20 0a  name() call in .
15bb0 20 20 20 20 20 20 2a 2a 20 72 62 75 4d 6f 76 65        ** rbuMove
15bc0 4f 61 6c 46 69 6c 65 28 29 2e 20 2a 2f 0a 20 20  OalFile(). */.  
15bd0 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 57 61 6c      p->rc = pWal
15be0 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 79 6e  ->pMethods->xSyn
15bf0 63 28 70 57 61 6c 2c 20 53 51 4c 49 54 45 5f 53  c(pWal, SQLITE_S
15c00 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 20  YNC_NORMAL);.   
15c10 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
15c20 43 61 6c 6c 65 64 20 77 68 65 6e 20 69 41 6d 74  Called when iAmt
15c30 20 62 79 74 65 73 20 61 72 65 20 72 65 61 64 20   bytes are read 
15c40 66 72 6f 6d 20 6f 66 66 73 65 74 20 69 4f 66 66  from offset iOff
15c50 20 6f 66 20 74 68 65 20 77 61 6c 20 66 69 6c 65   of the wal file
15c60 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 72 62   while.** the rb
15c70 75 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 20 63  u object is in c
15c80 61 70 74 75 72 65 20 6d 6f 64 65 2e 20 52 65 63  apture mode. Rec
15c90 6f 72 64 20 74 68 65 20 66 72 61 6d 65 20 6e 75  ord the frame nu
15ca0 6d 62 65 72 20 6f 66 20 74 68 65 20 66 72 61 6d  mber of the fram
15cb0 65 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20  e.** being read 
15cc0 69 6e 20 74 68 65 20 61 46 72 61 6d 65 5b 5d 20  in the aFrame[] 
15cd0 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  array..*/.static
15ce0 20 69 6e 74 20 72 62 75 43 61 70 74 75 72 65 57   int rbuCaptureW
15cf0 61 6c 52 65 61 64 28 73 71 6c 69 74 65 33 72 62  alRead(sqlite3rb
15d00 75 20 2a 70 52 62 75 2c 20 69 36 34 20 69 4f 66  u *pRbu, i64 iOf
15d10 66 2c 20 69 6e 74 20 69 41 6d 74 29 7b 0a 20 20  f, int iAmt){.  
15d20 63 6f 6e 73 74 20 75 33 32 20 6d 52 65 71 20 3d  const u32 mReq =
15d30 20 28 31 3c 3c 57 41 4c 5f 4c 4f 43 4b 5f 57 52   (1<<WAL_LOCK_WR
15d40 49 54 45 29 7c 28 31 3c 3c 57 41 4c 5f 4c 4f 43  ITE)|(1<<WAL_LOC
15d50 4b 5f 43 4b 50 54 29 7c 28 31 3c 3c 57 41 4c 5f  K_CKPT)|(1<<WAL_
15d60 4c 4f 43 4b 5f 52 45 41 44 30 29 3b 0a 20 20 75  LOCK_READ0);.  u
15d70 33 32 20 69 46 72 61 6d 65 3b 0a 0a 20 20 69 66  32 iFrame;..  if
15d80 28 20 70 52 62 75 2d 3e 6d 4c 6f 63 6b 21 3d 6d  ( pRbu->mLock!=m
15d90 52 65 71 20 29 7b 0a 20 20 20 20 70 52 62 75 2d  Req ){.    pRbu-
15da0 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53  >rc = SQLITE_BUS
15db0 59 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  Y;.    return SQ
15dc0 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20  LITE_INTERNAL;. 
15dd0 20 7d 0a 0a 20 20 70 52 62 75 2d 3e 70 67 73 7a   }..  pRbu->pgsz
15de0 20 3d 20 69 41 6d 74 3b 0a 20 20 69 66 28 20 70   = iAmt;.  if( p
15df0 52 62 75 2d 3e 6e 46 72 61 6d 65 3d 3d 70 52 62  Rbu->nFrame==pRb
15e00 75 2d 3e 6e 46 72 61 6d 65 41 6c 6c 6f 63 20 29  u->nFrameAlloc )
15e10 7b 0a 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d  {.    int nNew =
15e20 20 28 70 52 62 75 2d 3e 6e 46 72 61 6d 65 41 6c   (pRbu->nFrameAl
15e30 6c 6f 63 20 3f 20 70 52 62 75 2d 3e 6e 46 72 61  loc ? pRbu->nFra
15e40 6d 65 41 6c 6c 6f 63 20 3a 20 36 34 29 20 2a 20  meAlloc : 64) * 
15e50 32 3b 0a 20 20 20 20 52 62 75 46 72 61 6d 65 20  2;.    RbuFrame 
15e60 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20  *aNew;.    aNew 
15e70 3d 20 28 52 62 75 46 72 61 6d 65 2a 29 73 71 6c  = (RbuFrame*)sql
15e80 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70  ite3_realloc64(p
15e90 52 62 75 2d 3e 61 46 72 61 6d 65 2c 20 6e 4e 65  Rbu->aFrame, nNe
15ea0 77 20 2a 20 73 69 7a 65 6f 66 28 52 62 75 46 72  w * sizeof(RbuFr
15eb0 61 6d 65 29 29 3b 0a 20 20 20 20 69 66 28 20 61  ame));.    if( a
15ec0 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
15ed0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
15ee0 20 20 70 52 62 75 2d 3e 61 46 72 61 6d 65 20 3d    pRbu->aFrame =
15ef0 20 61 4e 65 77 3b 0a 20 20 20 20 70 52 62 75 2d   aNew;.    pRbu-
15f00 3e 6e 46 72 61 6d 65 41 6c 6c 6f 63 20 3d 20 6e  >nFrameAlloc = n
15f10 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20 69 46 72 61  New;.  }..  iFra
15f20 6d 65 20 3d 20 28 75 33 32 29 28 28 69 4f 66 66  me = (u32)((iOff
15f30 2d 33 32 29 20 2f 20 28 69 36 34 29 28 69 41 6d  -32) / (i64)(iAm
15f40 74 2b 32 34 29 29 20 2b 20 31 3b 0a 20 20 69 66  t+24)) + 1;.  if
15f50 28 20 70 52 62 75 2d 3e 69 4d 61 78 46 72 61 6d  ( pRbu->iMaxFram
15f60 65 3c 69 46 72 61 6d 65 20 29 20 70 52 62 75 2d  e<iFrame ) pRbu-
15f70 3e 69 4d 61 78 46 72 61 6d 65 20 3d 20 69 46 72  >iMaxFrame = iFr
15f80 61 6d 65 3b 0a 20 20 70 52 62 75 2d 3e 61 46 72  ame;.  pRbu->aFr
15f90 61 6d 65 5b 70 52 62 75 2d 3e 6e 46 72 61 6d 65  ame[pRbu->nFrame
15fa0 5d 2e 69 57 61 6c 46 72 61 6d 65 20 3d 20 69 46  ].iWalFrame = iF
15fb0 72 61 6d 65 3b 0a 20 20 70 52 62 75 2d 3e 61 46  rame;.  pRbu->aF
15fc0 72 61 6d 65 5b 70 52 62 75 2d 3e 6e 46 72 61 6d  rame[pRbu->nFram
15fd0 65 5d 2e 69 44 62 50 61 67 65 20 3d 20 30 3b 0a  e].iDbPage = 0;.
15fe0 20 20 70 52 62 75 2d 3e 6e 46 72 61 6d 65 2b 2b    pRbu->nFrame++
15ff0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
16000 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
16010 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 70 61 67  alled when a pag
16020 65 20 6f 66 20 64 61 74 61 20 69 73 20 77 72 69  e of data is wri
16030 74 74 65 6e 20 74 6f 20 6f 66 66 73 65 74 20 69  tten to offset i
16040 4f 66 66 20 6f 66 20 74 68 65 20 64 61 74 61 62  Off of the datab
16050 61 73 65 0a 2a 2a 20 66 69 6c 65 20 77 68 69 6c  ase.** file whil
16060 65 20 74 68 65 20 72 62 75 20 68 61 6e 64 6c 65  e the rbu handle
16070 20 69 73 20 69 6e 20 63 61 70 74 75 72 65 20 6d   is in capture m
16080 6f 64 65 2e 20 52 65 63 6f 72 64 20 74 68 65 20  ode. Record the 
16090 70 61 67 65 20 6e 75 6d 62 65 72 20 0a 2a 2a 20  page number .** 
160a0 6f 66 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  of the page bein
160b0 67 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65  g written in the
160c0 20 61 46 72 61 6d 65 5b 5d 20 61 72 72 61 79 2e   aFrame[] array.
160d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
160e0 62 75 43 61 70 74 75 72 65 44 62 57 72 69 74 65  buCaptureDbWrite
160f0 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 52 62  (sqlite3rbu *pRb
16100 75 2c 20 69 36 34 20 69 4f 66 66 29 7b 0a 20 20  u, i64 iOff){.  
16110 70 52 62 75 2d 3e 61 46 72 61 6d 65 5b 70 52 62  pRbu->aFrame[pRb
16120 75 2d 3e 6e 46 72 61 6d 65 2d 31 5d 2e 69 44 62  u->nFrame-1].iDb
16130 50 61 67 65 20 3d 20 28 75 33 32 29 28 69 4f 66  Page = (u32)(iOf
16140 66 20 2f 20 70 52 62 75 2d 3e 70 67 73 7a 29 20  f / pRbu->pgsz) 
16150 2b 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  + 1;.  return SQ
16160 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
16170 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64  * This is called
16180 20 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 69   as part of an i
16190 6e 63 72 65 6d 65 6e 74 61 6c 20 63 68 65 63 6b  ncremental check
161a0 70 6f 69 6e 74 20 6f 70 65 72 61 74 69 6f 6e 2e  point operation.
161b0 20 43 6f 70 79 0a 2a 2a 20 61 20 73 69 6e 67 6c   Copy.** a singl
161c0 65 20 66 72 61 6d 65 20 6f 66 20 64 61 74 61 20  e frame of data 
161d0 66 72 6f 6d 20 74 68 65 20 77 61 6c 20 66 69 6c  from the wal fil
161e0 65 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  e into the datab
161f0 61 73 65 20 66 69 6c 65 2c 20 61 73 0a 2a 2a 20  ase file, as.** 
16200 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65  indicated by the
16210 20 52 62 75 46 72 61 6d 65 20 6f 62 6a 65 63 74   RbuFrame object
16220 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
16230 20 72 62 75 43 68 65 63 6b 70 6f 69 6e 74 46 72   rbuCheckpointFr
16240 61 6d 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a  ame(sqlite3rbu *
16250 70 2c 20 52 62 75 46 72 61 6d 65 20 2a 70 46 72  p, RbuFrame *pFr
16260 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ame){.  sqlite3_
16270 66 69 6c 65 20 2a 70 57 61 6c 20 3d 20 70 2d 3e  file *pWal = p->
16280 70 54 61 72 67 65 74 46 64 2d 3e 70 57 61 6c 46  pTargetFd->pWalF
16290 64 2d 3e 70 52 65 61 6c 3b 0a 20 20 73 71 6c 69  d->pReal;.  sqli
162a0 74 65 33 5f 66 69 6c 65 20 2a 70 44 62 20 3d 20  te3_file *pDb = 
162b0 70 2d 3e 70 54 61 72 67 65 74 46 64 2d 3e 70 52  p->pTargetFd->pR
162c0 65 61 6c 3b 0a 20 20 69 36 34 20 69 4f 66 66 3b  eal;.  i64 iOff;
162d0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ..  assert( p->r
162e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
162f0 20 20 69 4f 66 66 20 3d 20 28 69 36 34 29 28 70    iOff = (i64)(p
16300 46 72 61 6d 65 2d 3e 69 57 61 6c 46 72 61 6d 65  Frame->iWalFrame
16310 2d 31 29 20 2a 20 28 70 2d 3e 70 67 73 7a 20 2b  -1) * (p->pgsz +
16320 20 32 34 29 20 2b 20 33 32 20 2b 20 32 34 3b 0a   24) + 32 + 24;.
16330 20 20 70 2d 3e 72 63 20 3d 20 70 57 61 6c 2d 3e    p->rc = pWal->
16340 70 4d 65 74 68 6f 64 73 2d 3e 78 52 65 61 64 28  pMethods->xRead(
16350 70 57 61 6c 2c 20 70 2d 3e 61 42 75 66 2c 20 70  pWal, p->aBuf, p
16360 2d 3e 70 67 73 7a 2c 20 69 4f 66 66 29 3b 0a 20  ->pgsz, iOff);. 
16370 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74   if( p->rc ) ret
16380 75 72 6e 3b 0a 0a 20 20 69 4f 66 66 20 3d 20 28  urn;..  iOff = (
16390 69 36 34 29 28 70 46 72 61 6d 65 2d 3e 69 44 62  i64)(pFrame->iDb
163a0 50 61 67 65 2d 31 29 20 2a 20 70 2d 3e 70 67 73  Page-1) * p->pgs
163b0 7a 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 70 44 62  z;.  p->rc = pDb
163c0 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 57 72 69  ->pMethods->xWri
163d0 74 65 28 70 44 62 2c 20 70 2d 3e 61 42 75 66 2c  te(pDb, p->aBuf,
163e0 20 70 2d 3e 70 67 73 7a 2c 20 69 4f 66 66 29 3b   p->pgsz, iOff);
163f0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 61 6b 65 20  .}.../*.** Take 
16400 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
16410 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
16420 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  e file..*/.stati
16430 63 20 76 6f 69 64 20 72 62 75 4c 6f 63 6b 44 61  c void rbuLockDa
16440 74 61 62 61 73 65 28 73 71 6c 69 74 65 33 72 62  tabase(sqlite3rb
16450 75 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  u *p){.  sqlite3
16460 5f 66 69 6c 65 20 2a 70 52 65 61 6c 20 3d 20 70  _file *pReal = p
16470 2d 3e 70 54 61 72 67 65 74 46 64 2d 3e 70 52 65  ->pTargetFd->pRe
16480 61 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  al;.  assert( p-
16490 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
164a0 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 70 52 65 61  ;.  p->rc = pRea
164b0 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 4c 6f  l->pMethods->xLo
164c0 63 6b 28 70 52 65 61 6c 2c 20 53 51 4c 49 54 45  ck(pReal, SQLITE
164d0 5f 4c 4f 43 4b 5f 53 48 41 52 45 44 29 3b 0a 20  _LOCK_SHARED);. 
164e0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
164f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e  TE_OK ){.    p->
16500 72 63 20 3d 20 70 52 65 61 6c 2d 3e 70 4d 65 74  rc = pReal->pMet
16510 68 6f 64 73 2d 3e 78 4c 6f 63 6b 28 70 52 65 61  hods->xLock(pRea
16520 6c 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 45  l, SQLITE_LOCK_E
16530 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 7d 0a 7d  XCLUSIVE);.  }.}
16540 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57  ..#if defined(_W
16550 49 4e 33 32 5f 57 43 45 29 0a 73 74 61 74 69 63  IN32_WCE).static
16560 20 4c 50 57 53 54 52 20 72 62 75 57 69 6e 55 74   LPWSTR rbuWinUt
16570 66 38 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73  f8ToUnicode(cons
16580 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
16590 65 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72 3b  e){.  int nChar;
165a0 0a 20 20 4c 50 57 53 54 52 20 7a 57 69 64 65 46  .  LPWSTR zWideF
165b0 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e 43 68 61  ilename;..  nCha
165c0 72 20 3d 20 4d 75 6c 74 69 42 79 74 65 54 6f 57  r = MultiByteToW
165d0 69 64 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c  ideChar(CP_UTF8,
165e0 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d   0, zFilename, -
165f0 31 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 69  1, NULL, 0);.  i
16600 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20  f( nChar==0 ){. 
16610 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
16620 0a 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  .  zWideFilename
16630 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
16640 63 36 34 28 20 6e 43 68 61 72 2a 73 69 7a 65 6f  c64( nChar*sizeo
16650 66 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 5b  f(zWideFilename[
16660 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 57 69  0]) );.  if( zWi
16670 64 65 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b  deFilename==0 ){
16680 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
16690 20 7d 0a 20 20 6d 65 6d 73 65 74 28 7a 57 69 64   }.  memset(zWid
166a0 65 46 69 6c 65 6e 61 6d 65 2c 20 30 2c 20 6e 43  eFilename, 0, nC
166b0 68 61 72 2a 73 69 7a 65 6f 66 28 7a 57 69 64 65  har*sizeof(zWide
166c0 46 69 6c 65 6e 61 6d 65 5b 30 5d 29 29 3b 0a 20  Filename[0]));. 
166d0 20 6e 43 68 61 72 20 3d 20 4d 75 6c 74 69 42 79   nChar = MultiBy
166e0 74 65 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f  teToWideChar(CP_
166f0 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61  UTF8, 0, zFilena
16700 6d 65 2c 20 2d 31 2c 20 7a 57 69 64 65 46 69 6c  me, -1, zWideFil
16710 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  ename,.         
16720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16730 20 20 20 20 20 20 20 6e 43 68 61 72 29 3b 0a 20         nChar);. 
16740 20 69 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b   if( nChar==0 ){
16750 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
16760 65 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29  e(zWideFilename)
16770 3b 0a 20 20 20 20 7a 57 69 64 65 46 69 6c 65 6e  ;.    zWideFilen
16780 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ame = 0;.  }.  r
16790 65 74 75 72 6e 20 7a 57 69 64 65 46 69 6c 65 6e  eturn zWideFilen
167a0 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ame;.}.#endif../
167b0 2a 0a 2a 2a 20 54 68 65 20 52 42 55 20 68 61 6e  *.** The RBU han
167c0 64 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  dle is currently
167d0 20 69 6e 20 52 42 55 5f 53 54 41 47 45 5f 4f 41   in RBU_STAGE_OA
167e0 4c 20 73 74 61 74 65 2c 20 77 69 74 68 20 61 20  L state, with a 
167f0 53 48 41 52 45 44 20 6c 6f 63 6b 0a 2a 2a 20 6f  SHARED lock.** o
16800 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
16810 69 6c 65 2e 20 54 68 69 73 20 70 72 6f 63 20 6d  ile. This proc m
16820 6f 76 65 73 20 74 68 65 20 2a 2d 6f 61 6c 20 66  oves the *-oal f
16830 69 6c 65 20 74 6f 20 74 68 65 20 2a 2d 77 61 6c  ile to the *-wal
16840 20 70 61 74 68 2c 0a 2a 2a 20 74 68 65 6e 20 72   path,.** then r
16850 65 6f 70 65 6e 73 20 74 68 65 20 64 61 74 61 62  eopens the datab
16860 61 73 65 20 66 69 6c 65 20 28 74 68 69 73 20 74  ase file (this t
16870 69 6d 65 20 69 6e 20 76 61 6e 69 6c 6c 61 2c 20  ime in vanilla, 
16880 6e 6f 6e 2d 6f 61 6c 2c 20 57 41 4c 20 6d 6f 64  non-oal, WAL mod
16890 65 29 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  e)..** If an err
168a0 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65  or occurs, leave
168b0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61   an error code a
168c0 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  nd error message
168d0 20 69 6e 20 74 68 65 20 72 62 75 20 0a 2a 2a 20   in the rbu .** 
168e0 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  handle..*/.stati
168f0 63 20 76 6f 69 64 20 72 62 75 4d 6f 76 65 4f 61  c void rbuMoveOa
16900 6c 46 69 6c 65 28 73 71 6c 69 74 65 33 72 62 75  lFile(sqlite3rbu
16910 20 2a 70 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68   *p){.  const ch
16920 61 72 20 2a 7a 42 61 73 65 20 3d 20 73 71 6c 69  ar *zBase = sqli
16930 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28  te3_db_filename(
16940 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e  p->dbMain, "main
16950 22 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ");.  const char
16960 20 2a 7a 4d 6f 76 65 20 3d 20 7a 42 61 73 65 3b   *zMove = zBase;
16970 0a 20 20 63 68 61 72 20 2a 7a 4f 61 6c 3b 0a 20  .  char *zOal;. 
16980 20 63 68 61 72 20 2a 7a 57 61 6c 3b 0a 0a 20 20   char *zWal;..  
16990 69 66 28 20 72 62 75 49 73 56 61 63 75 75 6d 28  if( rbuIsVacuum(
169a0 70 29 20 29 7b 0a 20 20 20 20 7a 4d 6f 76 65 20  p) ){.    zMove 
169b0 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c  = sqlite3_db_fil
169c0 65 6e 61 6d 65 28 70 2d 3e 64 62 52 62 75 2c 20  ename(p->dbRbu, 
169d0 22 6d 61 69 6e 22 29 3b 0a 20 20 7d 0a 20 20 7a  "main");.  }.  z
169e0 4f 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Oal = sqlite3_mp
169f0 72 69 6e 74 66 28 22 25 73 2d 6f 61 6c 22 2c 20  rintf("%s-oal", 
16a00 7a 4d 6f 76 65 29 3b 0a 20 20 7a 57 61 6c 20 3d  zMove);.  zWal =
16a10 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
16a20 28 22 25 73 2d 77 61 6c 22 2c 20 7a 4d 6f 76 65  ("%s-wal", zMove
16a30 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  );..  assert( p-
16a40 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41  >eStage==RBU_STA
16a50 47 45 5f 4d 4f 56 45 20 29 3b 0a 20 20 61 73 73  GE_MOVE );.  ass
16a60 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
16a70 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 7a 45 72 72  TE_OK && p->zErr
16a80 6d 73 67 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  msg==0 );.  if( 
16a90 7a 57 61 6c 3d 3d 30 20 7c 7c 20 7a 4f 61 6c 3d  zWal==0 || zOal=
16aa0 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  =0 ){.    p->rc 
16ab0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
16ac0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
16ad0 4d 6f 76 65 20 74 68 65 20 2a 2d 6f 61 6c 20 66  Move the *-oal f
16ae0 69 6c 65 20 74 6f 20 2a 2d 77 61 6c 2e 20 41 74  ile to *-wal. At
16af0 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6f 6e 6e   this point conn
16b00 65 63 74 69 6f 6e 20 70 2d 3e 64 62 20 69 73 0a  ection p->db is.
16b10 20 20 20 20 2a 2a 20 68 6f 6c 64 69 6e 67 20 61      ** holding a
16b20 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20   SHARED lock on 
16b30 74 68 65 20 74 61 72 67 65 74 20 64 61 74 61 62  the target datab
16b40 61 73 65 20 66 69 6c 65 20 28 62 65 63 61 75 73  ase file (becaus
16b50 65 20 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 69  e it is.    ** i
16b60 6e 20 57 41 4c 20 6d 6f 64 65 29 2e 20 53 6f 20  n WAL mode). So 
16b70 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  no other connect
16b80 69 6f 6e 20 6d 61 79 20 62 65 20 77 72 69 74 69  ion may be writi
16b90 6e 67 20 74 68 65 20 64 62 2e 20 0a 20 20 20 20  ng the db. .    
16ba0 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 6f 72 64  **.    ** In ord
16bb0 65 72 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  er to ensure tha
16bc0 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64  t there are no d
16bd0 61 74 61 62 61 73 65 20 72 65 61 64 65 72 73 2c  atabase readers,
16be0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 0a 20 20   an EXCLUSIVE.  
16bf0 20 20 2a 2a 20 6c 6f 63 6b 20 69 73 20 6f 62 74    ** lock is obt
16c00 61 69 6e 65 64 20 68 65 72 65 20 62 65 66 6f 72  ained here befor
16c10 65 20 74 68 65 20 2a 2d 6f 61 6c 20 69 73 20 6d  e the *-oal is m
16c20 6f 76 65 64 20 74 6f 20 2a 2d 77 61 6c 2e 0a 20  oved to *-wal.. 
16c30 20 20 20 2a 2f 0a 20 20 20 20 72 62 75 4c 6f 63     */.    rbuLoc
16c40 6b 44 61 74 61 62 61 73 65 28 70 29 3b 0a 20 20  kDatabase(p);.  
16c50 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
16c60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16c70 72 62 75 46 69 6c 65 53 75 66 66 69 78 33 28 7a  rbuFileSuffix3(z
16c80 42 61 73 65 2c 20 7a 57 61 6c 29 3b 0a 20 20 20  Base, zWal);.   
16c90 20 20 20 72 62 75 46 69 6c 65 53 75 66 66 69 78     rbuFileSuffix
16ca0 33 28 7a 42 61 73 65 2c 20 7a 4f 61 6c 29 3b 0a  3(zBase, zOal);.
16cb0 0a 20 20 20 20 20 20 2f 2a 20 52 65 2d 6f 70 65  .      /* Re-ope
16cc0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 73 2e  n the databases.
16cd0 20 2a 2f 0a 20 20 20 20 20 20 72 62 75 4f 62 6a   */.      rbuObj
16ce0 49 74 65 72 46 69 6e 61 6c 69 7a 65 28 26 70 2d  IterFinalize(&p-
16cf0 3e 6f 62 6a 69 74 65 72 29 3b 0a 20 20 20 20 20  >objiter);.     
16d00 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70   sqlite3_close(p
16d10 2d 3e 64 62 52 62 75 29 3b 0a 20 20 20 20 20 20  ->dbRbu);.      
16d20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d  sqlite3_close(p-
16d30 3e 64 62 4d 61 69 6e 29 3b 0a 20 20 20 20 20 20  >dbMain);.      
16d40 70 2d 3e 64 62 4d 61 69 6e 20 3d 20 30 3b 0a 20  p->dbMain = 0;. 
16d50 20 20 20 20 20 70 2d 3e 64 62 52 62 75 20 3d 20       p->dbRbu = 
16d60 30 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  0;..#if defined(
16d70 5f 57 49 4e 33 32 5f 57 43 45 29 0a 20 20 20 20  _WIN32_WCE).    
16d80 20 20 7b 0a 20 20 20 20 20 20 20 20 4c 50 57 53    {.        LPWS
16d90 54 52 20 7a 57 69 64 65 4f 61 6c 3b 0a 20 20 20  TR zWideOal;.   
16da0 20 20 20 20 20 4c 50 57 53 54 52 20 7a 57 69 64       LPWSTR zWid
16db0 65 57 61 6c 3b 0a 0a 20 20 20 20 20 20 20 20 7a  eWal;..        z
16dc0 57 69 64 65 4f 61 6c 20 3d 20 72 62 75 57 69 6e  WideOal = rbuWin
16dd0 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 4f  Utf8ToUnicode(zO
16de0 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  al);.        if(
16df0 20 7a 57 69 64 65 4f 61 6c 20 29 7b 0a 20 20 20   zWideOal ){.   
16e00 20 20 20 20 20 20 20 7a 57 69 64 65 57 61 6c 20         zWideWal 
16e10 3d 20 72 62 75 57 69 6e 55 74 66 38 54 6f 55 6e  = rbuWinUtf8ToUn
16e20 69 63 6f 64 65 28 7a 57 61 6c 29 3b 0a 20 20 20  icode(zWal);.   
16e30 20 20 20 20 20 20 20 69 66 28 20 7a 57 69 64 65         if( zWide
16e40 57 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Wal ){.         
16e50 20 20 20 69 66 28 20 4d 6f 76 65 46 69 6c 65 57     if( MoveFileW
16e60 28 7a 57 69 64 65 4f 61 6c 2c 20 7a 57 69 64 65  (zWideOal, zWide
16e70 57 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Wal) ){.        
16e80 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
16e90 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
16ea0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16eb0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
16ec0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  = SQLITE_IOERR;.
16ed0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
16ee0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
16ef0 33 5f 66 72 65 65 28 7a 57 69 64 65 57 61 6c 29  3_free(zWideWal)
16f00 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
16f10 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
16f20 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f  ->rc = SQLITE_IO
16f30 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ERR_NOMEM;.     
16f40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
16f50 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57   sqlite3_free(zW
16f60 69 64 65 4f 61 6c 29 3b 0a 20 20 20 20 20 20 20  ideOal);.       
16f70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16f80 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
16f90 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
16fa0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
16fb0 23 65 6c 73 65 0a 20 20 20 20 20 20 70 2d 3e 72  #else.      p->r
16fc0 63 20 3d 20 72 65 6e 61 6d 65 28 7a 4f 61 6c 2c  c = rename(zOal,
16fd0 20 7a 57 61 6c 29 20 3f 20 53 51 4c 49 54 45 5f   zWal) ? SQLITE_
16fe0 49 4f 45 52 52 20 3a 20 53 51 4c 49 54 45 5f 4f  IOERR : SQLITE_O
16ff0 4b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20  K;.#endif..     
17000 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
17010 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
17020 20 72 62 75 4f 70 65 6e 44 61 74 61 62 61 73 65   rbuOpenDatabase
17030 28 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  (p, 0);.        
17040 72 62 75 53 65 74 75 70 43 68 65 63 6b 70 6f 69  rbuSetupCheckpoi
17050 6e 74 28 70 2c 20 30 29 3b 0a 20 20 20 20 20 20  nt(p, 0);.      
17060 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  }.    }.  }..  s
17070 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 61 6c  qlite3_free(zWal
17080 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
17090 65 28 7a 4f 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  e(zOal);.}../*.*
170a0 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
170b0 74 65 6d 65 6e 74 20 69 74 65 72 61 74 69 6e 67  tement iterating
170c0 20 74 68 72 6f 75 67 68 20 74 68 65 20 6b 65 79   through the key
170d0 73 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  s for the curren
170e0 74 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 70 2d 3e  t object.** (p->
170f0 6f 62 6a 69 74 65 72 2e 70 53 65 6c 65 63 74 29  objiter.pSelect)
17100 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
17110 73 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77  s to a valid row
17120 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  . This function.
17130 2a 2a 20 64 65 74 65 72 6d 69 6e 65 73 20 74 68  ** determines th
17140 65 20 74 79 70 65 20 6f 66 20 6f 70 65 72 61 74  e type of operat
17150 69 6f 6e 20 72 65 71 75 65 73 74 65 64 20 62 79  ion requested by
17160 20 74 68 69 73 20 72 6f 77 20 61 6e 64 20 72 65   this row and re
17170 74 75 72 6e 73 0a 2a 2a 20 6f 6e 65 20 6f 66 20  turns.** one of 
17180 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  the following va
17190 6c 75 65 73 20 74 6f 20 69 6e 64 69 63 61 74 65  lues to indicate
171a0 20 74 68 65 20 72 65 73 75 6c 74 3a 0a 2a 2a 0a   the result:.**.
171b0 2a 2a 20 20 20 20 20 2a 20 52 42 55 5f 49 4e 53  **     * RBU_INS
171c0 45 52 54 0a 2a 2a 20 20 20 20 20 2a 20 52 42 55  ERT.**     * RBU
171d0 5f 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20 2a  _DELETE.**     *
171e0 20 52 42 55 5f 49 44 58 5f 44 45 4c 45 54 45 0a   RBU_IDX_DELETE.
171f0 2a 2a 20 20 20 20 20 2a 20 52 42 55 5f 55 50 44  **     * RBU_UPD
17200 41 54 45 0a 2a 2a 0a 2a 2a 20 49 66 20 52 42 55  ATE.**.** If RBU
17210 5f 55 50 44 41 54 45 20 69 73 20 72 65 74 75 72  _UPDATE is retur
17220 6e 65 64 2c 20 74 68 65 6e 20 6f 75 74 70 75 74  ned, then output
17230 20 76 61 72 69 61 62 6c 65 20 2a 70 7a 4d 61 73   variable *pzMas
17240 6b 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 70  k is set to.** p
17250 6f 69 6e 74 20 74 6f 20 74 68 65 20 74 65 78 74  oint to the text
17260 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 69 6e   value indicatin
17270 67 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 74 6f  g the columns to
17280 20 75 70 64 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49   update..**.** I
17290 66 20 74 68 65 20 72 62 75 5f 63 6f 6e 74 72 6f  f the rbu_contro
172a0 6c 20 66 69 65 6c 64 20 63 6f 6e 74 61 69 6e 73  l field contains
172b0 20 61 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c 75   an invalid valu
172c0 65 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  e, an error code
172d0 20 61 6e 64 0a 2a 2a 20 6d 65 73 73 61 67 65 20   and.** message 
172e0 61 72 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20  are left in the 
172f0 52 42 55 20 68 61 6e 64 6c 65 20 61 6e 64 20 7a  RBU handle and z
17300 65 72 6f 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  ero returned..*/
17310 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 53  .static int rbuS
17320 74 65 70 54 79 70 65 28 73 71 6c 69 74 65 33 72  tepType(sqlite3r
17330 62 75 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  bu *p, const cha
17340 72 20 2a 2a 70 7a 4d 61 73 6b 29 7b 0a 20 20 69  r **pzMask){.  i
17350 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6f 62 6a  nt iCol = p->obj
17360 69 74 65 72 2e 6e 43 6f 6c 3b 20 20 20 20 20 2f  iter.nCol;     /
17370 2a 20 49 6e 64 65 78 20 6f 66 20 72 62 75 5f 63  * Index of rbu_c
17380 6f 6e 74 72 6f 6c 20 63 6f 6c 75 6d 6e 20 2a 2f  ontrol column */
17390 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 20  .  int res = 0; 
173a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173b0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
173c0 75 65 20 2a 2f 0a 0a 20 20 73 77 69 74 63 68 28  ue */..  switch(
173d0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
173e0 74 79 70 65 28 70 2d 3e 6f 62 6a 69 74 65 72 2e  type(p->objiter.
173f0 70 53 65 6c 65 63 74 2c 20 69 43 6f 6c 29 20 29  pSelect, iCol) )
17400 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
17410 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  E_INTEGER: {.   
17420 20 20 20 69 6e 74 20 69 56 61 6c 20 3d 20 73 71     int iVal = sq
17430 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
17440 28 70 2d 3e 6f 62 6a 69 74 65 72 2e 70 53 65 6c  (p->objiter.pSel
17450 65 63 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20  ect, iCol);.    
17460 20 20 73 77 69 74 63 68 28 20 69 56 61 6c 20 29    switch( iVal )
17470 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 30  {.        case 0
17480 3a 20 72 65 73 20 3d 20 52 42 55 5f 49 4e 53 45  : res = RBU_INSE
17490 52 54 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  RT;     break;. 
174a0 20 20 20 20 20 20 20 63 61 73 65 20 31 3a 20 72         case 1: r
174b0 65 73 20 3d 20 52 42 55 5f 44 45 4c 45 54 45 3b  es = RBU_DELETE;
174c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
174d0 20 20 20 20 63 61 73 65 20 32 3a 20 72 65 73 20      case 2: res 
174e0 3d 20 52 42 55 5f 52 45 50 4c 41 43 45 3b 20 20  = RBU_REPLACE;  
174f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
17500 20 63 61 73 65 20 33 3a 20 72 65 73 20 3d 20 52   case 3: res = R
17510 42 55 5f 49 44 58 5f 44 45 4c 45 54 45 3b 20 62  BU_IDX_DELETE; b
17520 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
17530 73 65 20 34 3a 20 72 65 73 20 3d 20 52 42 55 5f  se 4: res = RBU_
17540 49 44 58 5f 49 4e 53 45 52 54 3b 20 62 72 65 61  IDX_INSERT; brea
17550 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
17560 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
17570 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
17580 45 58 54 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e  EXT: {.      con
17590 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
175a0 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f   *z = sqlite3_co
175b0 6c 75 6d 6e 5f 74 65 78 74 28 70 2d 3e 6f 62 6a  lumn_text(p->obj
175c0 69 74 65 72 2e 70 53 65 6c 65 63 74 2c 20 69 43  iter.pSelect, iC
175d0 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  ol);.      if( z
175e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
175f0 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
17600 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  MEM;.      }else
17610 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 4d 61 73  {.        *pzMas
17620 6b 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  k = (const char*
17630 29 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  )z;.      }.    
17640 20 20 72 65 73 20 3d 20 52 42 55 5f 55 50 44 41    res = RBU_UPDA
17650 54 45 3b 0a 0a 20 20 20 20 20 20 62 72 65 61 6b  TE;..      break
17660 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 65 66  ;.    }..    def
17670 61 75 6c 74 3a 0a 20 20 20 20 20 20 62 72 65 61  ault:.      brea
17680 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 65  k;.  }..  if( re
17690 73 3d 3d 30 20 29 7b 0a 20 20 20 20 72 62 75 42  s==0 ){.    rbuB
176a0 61 64 43 6f 6e 74 72 6f 6c 45 72 72 6f 72 28 70  adControlError(p
176b0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
176c0 72 65 73 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  res;.}..#ifdef S
176d0 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
176e0 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 63 6f  * Assert that co
176f0 6c 75 6d 6e 20 69 43 6f 6c 20 6f 66 20 73 74 61  lumn iCol of sta
17700 74 65 6d 65 6e 74 20 70 53 74 6d 74 20 69 73 20  tement pStmt is 
17710 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a  named zName..*/.
17720 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
17730 72 74 43 6f 6c 75 6d 6e 4e 61 6d 65 28 73 71 6c  rtColumnName(sql
17740 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
17750 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 63 6f 6e 73  , int iCol, cons
17760 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
17770 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
17780 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ol = sqlite3_col
17790 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20  umn_name(pStmt, 
177a0 69 43 6f 6c 29 3b 0a 20 20 61 73 73 65 72 74 28  iCol);.  assert(
177b0 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69   0==sqlite3_stri
177c0 63 6d 70 28 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29  cmp(zName, zCol)
177d0 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65   );.}.#else.# de
177e0 66 69 6e 65 20 61 73 73 65 72 74 43 6f 6c 75 6d  fine assertColum
177f0 6e 4e 61 6d 65 28 78 2c 79 2c 7a 29 0a 23 65 6e  nName(x,y,z).#en
17800 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  dif../*.** Argum
17810 65 6e 74 20 65 54 79 70 65 20 6d 75 73 74 20 62  ent eType must b
17820 65 20 6f 6e 65 20 6f 66 20 52 42 55 5f 49 4e 53  e one of RBU_INS
17830 45 52 54 2c 20 52 42 55 5f 44 45 4c 45 54 45 2c  ERT, RBU_DELETE,
17840 20 52 42 55 5f 49 44 58 5f 49 4e 53 45 52 54 20   RBU_IDX_INSERT 
17850 6f 72 0a 2a 2a 20 52 42 55 5f 49 44 58 5f 44 45  or.** RBU_IDX_DE
17860 4c 45 54 45 2e 20 54 68 69 73 20 66 75 6e 63 74  LETE. This funct
17870 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 68 65  ion performs the
17880 20 77 6f 72 6b 20 6f 66 20 61 20 73 69 6e 67 6c   work of a singl
17890 65 0a 2a 2a 20 73 71 6c 69 74 65 33 72 62 75 5f  e.** sqlite3rbu_
178a0 73 74 65 70 28 29 20 63 61 6c 6c 20 66 6f 72 20  step() call for 
178b0 74 68 65 20 74 79 70 65 20 6f 66 20 6f 70 65 72  the type of oper
178c0 61 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20  ation specified 
178d0 62 79 20 65 54 79 70 65 2e 0a 2a 2f 0a 73 74 61  by eType..*/.sta
178e0 74 69 63 20 76 6f 69 64 20 72 62 75 53 74 65 70  tic void rbuStep
178f0 4f 6e 65 4f 70 28 73 71 6c 69 74 65 33 72 62 75  OneOp(sqlite3rbu
17900 20 2a 70 2c 20 69 6e 74 20 65 54 79 70 65 29 7b   *p, int eType){
17910 0a 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70  .  RbuObjIter *p
17920 49 74 65 72 20 3d 20 26 70 2d 3e 6f 62 6a 69 74  Iter = &p->objit
17930 65 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  er;.  sqlite3_va
17940 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 73 71 6c  lue *pVal;.  sql
17950 69 74 65 33 5f 73 74 6d 74 20 2a 70 57 72 69 74  ite3_stmt *pWrit
17960 65 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  er;.  int i;..  
17970 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
17980 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73  QLITE_OK );.  as
17990 73 65 72 74 28 20 65 54 79 70 65 21 3d 52 42 55  sert( eType!=RBU
179a0 5f 44 45 4c 45 54 45 20 7c 7c 20 70 49 74 65 72  _DELETE || pIter
179b0 2d 3e 7a 49 64 78 3d 3d 30 20 29 3b 0a 20 20 61  ->zIdx==0 );.  a
179c0 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 52 42  ssert( eType==RB
179d0 55 5f 44 45 4c 45 54 45 20 7c 7c 20 65 54 79 70  U_DELETE || eTyp
179e0 65 3d 3d 52 42 55 5f 49 44 58 5f 44 45 4c 45 54  e==RBU_IDX_DELET
179f0 45 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70  E.       || eTyp
17a00 65 3d 3d 52 42 55 5f 49 4e 53 45 52 54 20 7c 7c  e==RBU_INSERT ||
17a10 20 65 54 79 70 65 3d 3d 52 42 55 5f 49 44 58 5f   eType==RBU_IDX_
17a20 49 4e 53 45 52 54 0a 20 20 29 3b 0a 0a 20 20 2f  INSERT.  );..  /
17a30 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 64  * If this is a d
17a40 65 6c 65 74 65 2c 20 64 65 63 72 65 6d 65 6e 74  elete, decrement
17a50 20 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20 62   nPhaseOneStep b
17a60 79 20 6e 49 6e 64 65 78 2e 20 49 66 20 74 68 65  y nIndex. If the
17a70 20 44 45 4c 45 54 45 0a 20 20 2a 2a 20 73 74 61   DELETE.  ** sta
17a80 74 65 6d 65 6e 74 20 62 65 6c 6f 77 20 64 6f 65  tement below doe
17a90 73 20 61 63 74 75 61 6c 6c 79 20 64 65 6c 65 74  s actually delet
17aa0 65 20 61 20 72 6f 77 2c 20 6e 50 68 61 73 65 4f  e a row, nPhaseO
17ab0 6e 65 53 74 65 70 20 77 69 6c 6c 20 62 65 0a 20  neStep will be. 
17ac0 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   ** incremented 
17ad0 62 79 20 74 68 65 20 73 61 6d 65 20 61 6d 6f 75  by the same amou
17ae0 6e 74 20 77 68 65 6e 20 53 51 4c 20 66 75 6e 63  nt when SQL func
17af0 74 69 6f 6e 20 72 62 75 5f 74 6d 70 5f 69 6e 73  tion rbu_tmp_ins
17b00 65 72 74 28 29 0a 20 20 2a 2a 20 69 73 20 69 6e  ert().  ** is in
17b10 76 6f 6b 65 64 20 62 79 20 74 68 65 20 74 72 69  voked by the tri
17b20 67 67 65 72 2e 20 20 2a 2f 0a 20 20 69 66 28 20  gger.  */.  if( 
17b30 65 54 79 70 65 3d 3d 52 42 55 5f 44 45 4c 45 54  eType==RBU_DELET
17b40 45 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 50 68 61  E ){.    p->nPha
17b50 73 65 4f 6e 65 53 74 65 70 20 2d 3d 20 70 2d 3e  seOneStep -= p->
17b60 6f 62 6a 69 74 65 72 2e 6e 49 6e 64 65 78 3b 0a  objiter.nIndex;.
17b70 20 20 7d 0a 0a 20 20 69 66 28 20 65 54 79 70 65    }..  if( eType
17b80 3d 3d 52 42 55 5f 49 44 58 5f 44 45 4c 45 54 45  ==RBU_IDX_DELETE
17b90 20 7c 7c 20 65 54 79 70 65 3d 3d 52 42 55 5f 44   || eType==RBU_D
17ba0 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 70 57 72  ELETE ){.    pWr
17bb0 69 74 65 72 20 3d 20 70 49 74 65 72 2d 3e 70 44  iter = pIter->pD
17bc0 65 6c 65 74 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  elete;.  }else{.
17bd0 20 20 20 20 70 57 72 69 74 65 72 20 3d 20 70 49      pWriter = pI
17be0 74 65 72 2d 3e 70 49 6e 73 65 72 74 3b 0a 20 20  ter->pInsert;.  
17bf0 7d 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  }..  for(i=0; i<
17c00 70 49 74 65 72 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  pIter->nCol; i++
17c10 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ){.    /* If thi
17c20 73 20 69 73 20 61 6e 20 49 4e 53 45 52 54 20 69  s is an INSERT i
17c30 6e 74 6f 20 61 20 74 61 62 6c 65 20 62 2d 74 72  nto a table b-tr
17c40 65 65 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65  ee and the table
17c50 20 68 61 73 20 61 6e 0a 20 20 20 20 2a 2a 20 65   has an.    ** e
17c60 78 70 6c 69 63 69 74 20 49 4e 54 45 47 45 52 20  xplicit INTEGER 
17c70 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 68 65  PRIMARY KEY, che
17c80 63 6b 20 74 68 61 74 20 74 68 69 73 20 69 73 20  ck that this is 
17c90 6e 6f 74 20 61 6e 20 61 74 74 65 6d 70 74 0a 20  not an attempt. 
17ca0 20 20 20 2a 2a 20 74 6f 20 77 72 69 74 65 20 61     ** to write a
17cb0 20 4e 55 4c 4c 20 69 6e 74 6f 20 74 68 65 20 49   NULL into the I
17cc0 50 4b 20 63 6f 6c 75 6d 6e 2e 20 54 68 61 74 20  PK column. That 
17cd0 69 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64  is not permitted
17ce0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 54  .  */.    if( eT
17cf0 79 70 65 3d 3d 52 42 55 5f 49 4e 53 45 52 54 20  ype==RBU_INSERT 
17d00 0a 20 20 20 20 20 26 26 20 70 49 74 65 72 2d 3e  .     && pIter->
17d10 7a 49 64 78 3d 3d 30 20 26 26 20 70 49 74 65 72  zIdx==0 && pIter
17d20 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
17d30 49 50 4b 20 26 26 20 70 49 74 65 72 2d 3e 61 62  IPK && pIter->ab
17d40 54 62 6c 50 6b 5b 69 5d 20 0a 20 20 20 20 20 26  TblPk[i] .     &
17d50 26 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  & sqlite3_column
17d60 5f 74 79 70 65 28 70 49 74 65 72 2d 3e 70 53 65  _type(pIter->pSe
17d70 6c 65 63 74 2c 20 69 29 3d 3d 53 51 4c 49 54 45  lect, i)==SQLITE
17d80 5f 4e 55 4c 4c 0a 20 20 20 20 29 7b 0a 20 20 20  _NULL.    ){.   
17d90 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
17da0 45 5f 4d 49 53 4d 41 54 43 48 3b 0a 20 20 20 20  E_MISMATCH;.    
17db0 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73    p->zErrmsg = s
17dc0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
17dd0 64 61 74 61 74 79 70 65 20 6d 69 73 6d 61 74 63  datatype mismatc
17de0 68 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  h");.      retur
17df0 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  n;.    }..    if
17e00 28 20 65 54 79 70 65 3d 3d 52 42 55 5f 44 45 4c  ( eType==RBU_DEL
17e10 45 54 45 20 26 26 20 70 49 74 65 72 2d 3e 61 62  ETE && pIter->ab
17e20 54 62 6c 50 6b 5b 69 5d 3d 3d 30 20 29 7b 0a 20  TblPk[i]==0 ){. 
17e30 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
17e40 20 20 20 7d 0a 0a 20 20 20 20 70 56 61 6c 20 3d     }..    pVal =
17e50 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
17e60 76 61 6c 75 65 28 70 49 74 65 72 2d 3e 70 53 65  value(pIter->pSe
17e70 6c 65 63 74 2c 20 69 29 3b 0a 20 20 20 20 70 2d  lect, i);.    p-
17e80 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69  >rc = sqlite3_bi
17e90 6e 64 5f 76 61 6c 75 65 28 70 57 72 69 74 65 72  nd_value(pWriter
17ea0 2c 20 69 2b 31 2c 20 70 56 61 6c 29 3b 0a 20 20  , i+1, pVal);.  
17eb0 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65    if( p->rc ) re
17ec0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
17ed0 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d 30 20 29  pIter->zIdx==0 )
17ee0 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  {.    if( pIter-
17ef0 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 56  >eType==RBU_PK_V
17f00 54 41 42 20 0a 20 20 20 20 20 7c 7c 20 70 49 74  TAB .     || pIt
17f10 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
17f20 4b 5f 4e 4f 4e 45 20 0a 20 20 20 20 20 7c 7c 20  K_NONE .     || 
17f30 28 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52  (pIter->eType==R
17f40 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 26  BU_PK_EXTERNAL &
17f50 26 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 29  & rbuIsVacuum(p)
17f60 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ) .    ){.      
17f70 2f 2a 20 46 6f 72 20 61 20 76 69 72 74 75 61 6c  /* For a virtual
17f80 20 74 61 62 6c 65 2c 20 6f 72 20 61 20 74 61 62   table, or a tab
17f90 6c 65 20 77 69 74 68 20 6e 6f 20 70 72 69 6d 61  le with no prima
17fa0 72 79 20 6b 65 79 2c 20 74 68 65 20 0a 20 20 20  ry key, the .   
17fb0 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61     ** SELECT sta
17fc0 74 65 6d 65 6e 74 20 69 73 3a 0a 20 20 20 20 20  tement is:.     
17fd0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 53   **.      **   S
17fe0 45 4c 45 43 54 20 3c 63 6f 6c 73 3e 2c 20 72 62  ELECT <cols>, rb
17ff0 75 5f 63 6f 6e 74 72 6f 6c 2c 20 72 62 75 5f 72  u_control, rbu_r
18000 6f 77 69 64 20 46 52 4f 4d 20 2e 2e 2e 2e 0a 20  owid FROM ..... 
18010 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
18020 20 48 65 6e 63 65 20 63 6f 6c 75 6d 6e 5f 76 61   Hence column_va
18030 6c 75 65 28 70 49 74 65 72 2d 3e 6e 43 6f 6c 2b  lue(pIter->nCol+
18040 31 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  1)..      */.   
18050 20 20 20 61 73 73 65 72 74 43 6f 6c 75 6d 6e 4e     assertColumnN
18060 61 6d 65 28 70 49 74 65 72 2d 3e 70 53 65 6c 65  ame(pIter->pSele
18070 63 74 2c 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 2b  ct, pIter->nCol+
18080 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20 72 62  1, .          rb
18090 75 49 73 56 61 63 75 75 6d 28 70 29 20 3f 20 22  uIsVacuum(p) ? "
180a0 72 6f 77 69 64 22 20 3a 20 22 72 62 75 5f 72 6f  rowid" : "rbu_ro
180b0 77 69 64 22 0a 20 20 20 20 20 20 29 3b 0a 20 20  wid".      );.  
180c0 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74      pVal = sqlit
180d0 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28  e3_column_value(
180e0 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 2c 20  pIter->pSelect, 
180f0 70 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31 29 3b 0a  pIter->nCol+1);.
18100 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71        p->rc = sq
18110 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65  lite3_bind_value
18120 28 70 57 72 69 74 65 72 2c 20 70 49 74 65 72 2d  (pWriter, pIter-
18130 3e 6e 43 6f 6c 2b 31 2c 20 70 56 61 6c 29 3b 0a  >nCol+1, pVal);.
18140 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
18150 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
18160 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
18170 73 74 65 70 28 70 57 72 69 74 65 72 29 3b 0a 20  step(pWriter);. 
18180 20 20 20 70 2d 3e 72 63 20 3d 20 72 65 73 65 74     p->rc = reset
18190 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
181a0 70 57 72 69 74 65 72 2c 20 26 70 2d 3e 7a 45 72  pWriter, &p->zEr
181b0 72 6d 73 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  rmsg);.  }.}../*
181c0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
181d0 6e 20 64 6f 65 73 20 74 68 65 20 77 6f 72 6b 20  n does the work 
181e0 66 6f 72 20 61 6e 20 73 71 6c 69 74 65 33 72 62  for an sqlite3rb
181f0 75 5f 73 74 65 70 28 29 20 63 61 6c 6c 2e 0a 2a  u_step() call..*
18200 2a 0a 2a 2a 20 54 68 65 20 6f 62 6a 65 63 74 2d  *.** The object-
18210 69 74 65 72 61 74 6f 72 20 28 70 2d 3e 6f 62 6a  iterator (p->obj
18220 69 74 65 72 29 20 63 75 72 72 65 6e 74 6c 79 20  iter) currently 
18230 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 69  points to a vali
18240 64 20 6f 62 6a 65 63 74 2c 0a 2a 2a 20 61 6e 64  d object,.** and
18250 20 74 68 65 20 69 6e 70 75 74 20 63 75 72 73 6f   the input curso
18260 72 20 28 70 2d 3e 6f 62 6a 69 74 65 72 2e 70 53  r (p->objiter.pS
18270 65 6c 65 63 74 29 20 63 75 72 72 65 6e 74 6c 79  elect) currently
18280 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c   points to a val
18290 69 64 0a 2a 2a 20 69 6e 70 75 74 20 72 6f 77 2e  id.** input row.
182a0 20 50 65 72 66 6f 72 6d 20 77 68 61 74 65 76 65   Perform whateve
182b0 72 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20  r processing is 
182c0 72 65 71 75 69 72 65 64 20 61 6e 64 20 72 65 74  required and ret
182d0 75 72 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  urn..**.** If no
182e0 20 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20    error occurs, 
182f0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
18300 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
18310 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a  , an error code.
18320 2a 2a 20 61 6e 64 20 6d 65 73 73 61 67 65 20 69  ** and message i
18330 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 52 42  s left in the RB
18340 55 20 68 61 6e 64 6c 65 20 61 6e 64 20 61 20 63  U handle and a c
18350 6f 70 79 20 6f 66 20 74 68 65 20 65 72 72 6f 72  opy of the error
18360 20 63 6f 64 65 0a 2a 2a 20 72 65 74 75 72 6e 65   code.** returne
18370 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
18380 20 72 62 75 53 74 65 70 28 73 71 6c 69 74 65 33   rbuStep(sqlite3
18390 72 62 75 20 2a 70 29 7b 0a 20 20 52 62 75 4f 62  rbu *p){.  RbuOb
183a0 6a 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 26  jIter *pIter = &
183b0 70 2d 3e 6f 62 6a 69 74 65 72 3b 0a 20 20 63 6f  p->objiter;.  co
183c0 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 6b 20  nst char *zMask 
183d0 3d 20 30 3b 0a 20 20 69 6e 74 20 65 54 79 70 65  = 0;.  int eType
183e0 20 3d 20 72 62 75 53 74 65 70 54 79 70 65 28 70   = rbuStepType(p
183f0 2c 20 26 7a 4d 61 73 6b 29 3b 0a 0a 20 20 69 66  , &zMask);..  if
18400 28 20 65 54 79 70 65 20 29 7b 0a 20 20 20 20 61  ( eType ){.    a
18410 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 52 42  ssert( eType==RB
18420 55 5f 49 4e 53 45 52 54 20 20 20 20 20 7c 7c 20  U_INSERT     || 
18430 65 54 79 70 65 3d 3d 52 42 55 5f 44 45 4c 45 54  eType==RBU_DELET
18440 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 65 54  E.         || eT
18450 79 70 65 3d 3d 52 42 55 5f 52 45 50 4c 41 43 45  ype==RBU_REPLACE
18460 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 52 42      || eType==RB
18470 55 5f 49 44 58 5f 44 45 4c 45 54 45 0a 20 20 20  U_IDX_DELETE.   
18480 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
18490 52 42 55 5f 49 44 58 5f 49 4e 53 45 52 54 20 7c  RBU_IDX_INSERT |
184a0 7c 20 65 54 79 70 65 3d 3d 52 42 55 5f 55 50 44  | eType==RBU_UPD
184b0 41 54 45 0a 20 20 20 20 29 3b 0a 20 20 20 20 61  ATE.    );.    a
184c0 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 52 42  ssert( eType!=RB
184d0 55 5f 55 50 44 41 54 45 20 7c 7c 20 70 49 74 65  U_UPDATE || pIte
184e0 72 2d 3e 7a 49 64 78 3d 3d 30 20 29 3b 0a 0a 20  r->zIdx==0 );.. 
184f0 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 7a 49     if( pIter->zI
18500 64 78 3d 3d 30 20 26 26 20 28 65 54 79 70 65 3d  dx==0 && (eType=
18510 3d 52 42 55 5f 49 44 58 5f 44 45 4c 45 54 45 20  =RBU_IDX_DELETE 
18520 7c 7c 20 65 54 79 70 65 3d 3d 52 42 55 5f 49 44  || eType==RBU_ID
18530 58 5f 49 4e 53 45 52 54 29 20 29 7b 0a 20 20 20  X_INSERT) ){.   
18540 20 20 20 72 62 75 42 61 64 43 6f 6e 74 72 6f 6c     rbuBadControl
18550 45 72 72 6f 72 28 70 29 3b 0a 20 20 20 20 7d 0a  Error(p);.    }.
18560 20 20 20 20 65 6c 73 65 20 69 66 28 20 65 54 79      else if( eTy
18570 70 65 3d 3d 52 42 55 5f 52 45 50 4c 41 43 45 20  pe==RBU_REPLACE 
18580 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ){.      if( pIt
18590 65 72 2d 3e 7a 49 64 78 3d 3d 30 20 29 7b 0a 20  er->zIdx==0 ){. 
185a0 20 20 20 20 20 20 20 70 2d 3e 6e 50 68 61 73 65         p->nPhase
185b0 4f 6e 65 53 74 65 70 20 2b 3d 20 70 2d 3e 6f 62  OneStep += p->ob
185c0 6a 69 74 65 72 2e 6e 49 6e 64 65 78 3b 0a 20 20  jiter.nIndex;.  
185d0 20 20 20 20 20 20 72 62 75 53 74 65 70 4f 6e 65        rbuStepOne
185e0 4f 70 28 70 2c 20 52 42 55 5f 44 45 4c 45 54 45  Op(p, RBU_DELETE
185f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
18600 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
18610 54 45 5f 4f 4b 20 29 20 72 62 75 53 74 65 70 4f  TE_OK ) rbuStepO
18620 6e 65 4f 70 28 70 2c 20 52 42 55 5f 49 4e 53 45  neOp(p, RBU_INSE
18630 52 54 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65  RT);.    }.    e
18640 6c 73 65 20 69 66 28 20 65 54 79 70 65 21 3d 52  lse if( eType!=R
18650 42 55 5f 55 50 44 41 54 45 20 29 7b 0a 20 20 20  BU_UPDATE ){.   
18660 20 20 20 72 62 75 53 74 65 70 4f 6e 65 4f 70 28     rbuStepOneOp(
18670 70 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 7d  p, eType);.    }
18680 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
18690 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
186a0 70 56 61 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69  pVal;.      sqli
186b0 74 65 33 5f 73 74 6d 74 20 2a 70 55 70 64 61 74  te3_stmt *pUpdat
186c0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73  e = 0;.      ass
186d0 65 72 74 28 20 65 54 79 70 65 3d 3d 52 42 55 5f  ert( eType==RBU_
186e0 55 50 44 41 54 45 20 29 3b 0a 20 20 20 20 20 20  UPDATE );.      
186f0 70 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70  p->nPhaseOneStep
18700 20 2d 3d 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 6e   -= p->objiter.n
18710 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 72 62 75  Index;.      rbu
18720 47 65 74 55 70 64 61 74 65 53 74 6d 74 28 70 2c  GetUpdateStmt(p,
18730 20 70 49 74 65 72 2c 20 7a 4d 61 73 6b 2c 20 26   pIter, zMask, &
18740 70 55 70 64 61 74 65 29 3b 0a 20 20 20 20 20 20  pUpdate);.      
18750 69 66 28 20 70 55 70 64 61 74 65 20 29 7b 0a 20  if( pUpdate ){. 
18760 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
18770 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 70        for(i=0; p
18780 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
18790 26 26 20 69 3c 70 49 74 65 72 2d 3e 6e 43 6f 6c  && i<pIter->nCol
187a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
187b0 20 20 63 68 61 72 20 63 20 3d 20 7a 4d 61 73 6b    char c = zMask
187c0 5b 70 49 74 65 72 2d 3e 61 69 53 72 63 4f 72 64  [pIter->aiSrcOrd
187d0 65 72 5b 69 5d 5d 3b 0a 20 20 20 20 20 20 20 20  er[i]];.        
187e0 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    pVal = sqlite3
187f0 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 49  _column_value(pI
18800 74 65 72 2d 3e 70 53 65 6c 65 63 74 2c 20 69 29  ter->pSelect, i)
18810 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
18820 70 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 69  pIter->abTblPk[i
18830 5d 20 7c 7c 20 63 21 3d 27 2e 27 20 29 7b 0a 20  ] || c!='.' ){. 
18840 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63             p->rc
18850 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
18860 76 61 6c 75 65 28 70 55 70 64 61 74 65 2c 20 69  value(pUpdate, i
18870 2b 31 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20 20  +1, pVal);.     
18880 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
18890 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
188a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20  rc==SQLITE_OK . 
188b0 20 20 20 20 20 20 20 20 26 26 20 28 70 49 74 65          && (pIte
188c0 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
188d0 5f 56 54 41 42 20 7c 7c 20 70 49 74 65 72 2d 3e  _VTAB || pIter->
188e0 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f  eType==RBU_PK_NO
188f0 4e 45 29 20 0a 20 20 20 20 20 20 20 20 29 7b 0a  NE) .        ){.
18900 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 6e            /* Bin
18910 64 20 74 68 65 20 72 62 75 5f 72 6f 77 69 64 20  d the rbu_rowid 
18920 76 61 6c 75 65 20 74 6f 20 63 6f 6c 75 6d 6e 20  value to column 
18930 5f 72 6f 77 69 64 5f 20 2a 2f 0a 20 20 20 20 20  _rowid_ */.     
18940 20 20 20 20 20 61 73 73 65 72 74 43 6f 6c 75 6d       assertColum
18950 6e 4e 61 6d 65 28 70 49 74 65 72 2d 3e 70 53 65  nName(pIter->pSe
18960 6c 65 63 74 2c 20 70 49 74 65 72 2d 3e 6e 43 6f  lect, pIter->nCo
18970 6c 2b 31 2c 20 22 72 62 75 5f 72 6f 77 69 64 22  l+1, "rbu_rowid"
18980 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56 61  );.          pVa
18990 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
189a0 6d 6e 5f 76 61 6c 75 65 28 70 49 74 65 72 2d 3e  mn_value(pIter->
189b0 70 53 65 6c 65 63 74 2c 20 70 49 74 65 72 2d 3e  pSelect, pIter->
189c0 6e 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 20 20 20  nCol+1);.       
189d0 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
189e0 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70 55  e3_bind_value(pU
189f0 70 64 61 74 65 2c 20 70 49 74 65 72 2d 3e 6e 43  pdate, pIter->nC
18a00 6f 6c 2b 31 2c 20 70 56 61 6c 29 3b 0a 20 20 20  ol+1, pVal);.   
18a10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
18a20 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
18a30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
18a40 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 55   sqlite3_step(pU
18a50 70 64 61 74 65 29 3b 0a 20 20 20 20 20 20 20 20  pdate);.        
18a60 20 20 70 2d 3e 72 63 20 3d 20 72 65 73 65 74 41    p->rc = resetA
18a70 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70  ndCollectError(p
18a80 55 70 64 61 74 65 2c 20 26 70 2d 3e 7a 45 72 72  Update, &p->zErr
18a90 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  msg);.        }.
18aa0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18ab0 7d 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63  }.  return p->rc
18ac0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65  ;.}../*.** Incre
18ad0 6d 65 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20  ment the schema 
18ae0 63 6f 6f 6b 69 65 20 6f 66 20 74 68 65 20 6d 61  cookie of the ma
18af0 69 6e 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e  in database open
18b00 65 64 20 62 79 20 70 2d 3e 64 62 4d 61 69 6e 2e  ed by p->dbMain.
18b10 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68  .**.** Or, if th
18b20 69 73 20 69 73 20 61 6e 20 52 42 55 20 76 61 63  is is an RBU vac
18b30 75 75 6d 2c 20 73 65 74 20 74 68 65 20 73 63 68  uum, set the sch
18b40 65 6d 61 20 63 6f 6f 6b 69 65 20 6f 66 20 74 68  ema cookie of th
18b50 65 20 6d 61 69 6e 20 64 62 0a 2a 2a 20 6f 70 65  e main db.** ope
18b60 6e 65 64 20 62 79 20 70 2d 3e 64 62 4d 61 69 6e  ned by p->dbMain
18b70 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61   to one more tha
18b80 6e 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  n the schema coo
18b90 6b 69 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 0a  kie of the main.
18ba0 2a 2a 20 64 62 20 6f 70 65 6e 65 64 20 62 79 20  ** db opened by 
18bb0 70 2d 3e 64 62 52 62 75 2e 0a 2a 2f 0a 73 74 61  p->dbRbu..*/.sta
18bc0 74 69 63 20 76 6f 69 64 20 72 62 75 49 6e 63 72  tic void rbuIncr
18bd0 53 63 68 65 6d 61 43 6f 6f 6b 69 65 28 73 71 6c  SchemaCookie(sql
18be0 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 69  ite3rbu *p){.  i
18bf0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
18c00 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
18c10 65 33 20 2a 64 62 72 65 61 64 20 3d 20 28 72 62  e3 *dbread = (rb
18c20 75 49 73 56 61 63 75 75 6d 28 70 29 20 3f 20 70  uIsVacuum(p) ? p
18c30 2d 3e 64 62 52 62 75 20 3a 20 70 2d 3e 64 62 4d  ->dbRbu : p->dbM
18c40 61 69 6e 29 3b 0a 20 20 20 20 69 6e 74 20 69 43  ain);.    int iC
18c50 6f 6f 6b 69 65 20 3d 20 31 30 30 30 30 30 30 3b  ookie = 1000000;
18c60 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
18c70 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 20 20 70  t *pStmt;..    p
18c80 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 41 6e  ->rc = prepareAn
18c90 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 64 62  dCollectError(db
18ca0 72 65 61 64 2c 20 26 70 53 74 6d 74 2c 20 26 70  read, &pStmt, &p
18cb0 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20  ->zErrmsg, .    
18cc0 20 20 20 20 22 50 52 41 47 4d 41 20 73 63 68 65      "PRAGMA sche
18cd0 6d 61 5f 76 65 72 73 69 6f 6e 22 0a 20 20 20 20  ma_version".    
18ce0 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
18cf0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18d00 20 20 20 20 20 2f 2a 20 43 6f 76 65 72 61 67 65       /* Coverage
18d10 3a 20 69 74 20 6d 61 79 20 62 65 20 74 68 61 74  : it may be that
18d20 20 74 68 69 73 20 73 71 6c 69 74 65 33 5f 73 74   this sqlite3_st
18d30 65 70 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c  ep() cannot fail
18d40 2e 20 54 68 65 72 65 0a 20 20 20 20 20 20 2a 2a  . There.      **
18d50 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 74 72   is already a tr
18d60 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20  ansaction open, 
18d70 73 6f 20 74 68 65 20 70 72 65 70 61 72 65 64 20  so the prepared 
18d80 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 6e 6f 74  statement cannot
18d90 0a 20 20 20 20 20 20 2a 2a 20 74 68 72 6f 77 20  .      ** throw 
18da0 61 6e 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41  an SQLITE_SCHEMA
18db0 20 65 78 63 65 70 74 69 6f 6e 2e 20 54 68 65 20   exception. The 
18dc0 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 70 61  only database pa
18dd0 67 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  ge the.      ** 
18de0 73 74 61 74 65 6d 65 6e 74 20 72 65 61 64 73 20  statement reads 
18df0 69 73 20 70 61 67 65 20 31 2c 20 77 68 69 63 68  is page 1, which
18e00 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
18e10 6f 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68  o be in the cach
18e20 65 2e 0a 20 20 20 20 20 20 2a 2a 20 41 6e 64 20  e..      ** And 
18e30 6e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  no memory alloca
18e40 74 69 6f 6e 73 20 61 72 65 20 72 65 71 75 69 72  tions are requir
18e50 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66  ed.  */.      if
18e60 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ( SQLITE_ROW==sq
18e70 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
18e80 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43 6f  ) ){.        iCo
18e90 6f 6b 69 65 20 3d 20 73 71 6c 69 74 65 33 5f 63  okie = sqlite3_c
18ea0 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
18eb0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
18ec0 20 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70     rbuFinalize(p
18ed0 2c 20 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a  , pStmt);.    }.
18ee0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
18ef0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18f00 20 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63    rbuMPrintfExec
18f10 28 70 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22  (p, p->dbMain, "
18f20 50 52 41 47 4d 41 20 73 63 68 65 6d 61 5f 76 65  PRAGMA schema_ve
18f30 72 73 69 6f 6e 20 3d 20 25 64 22 2c 20 69 43 6f  rsion = %d", iCo
18f40 6f 6b 69 65 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  okie+1);.    }. 
18f50 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61   }.}../*.** Upda
18f60 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  te the contents 
18f70 6f 66 20 74 68 65 20 72 62 75 5f 73 74 61 74 65  of the rbu_state
18f80 20 74 61 62 6c 65 20 77 69 74 68 69 6e 20 74 68   table within th
18f90 65 20 72 62 75 20 64 61 74 61 62 61 73 65 2e 20  e rbu database. 
18fa0 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 73 74 6f  The.** value sto
18fb0 72 65 64 20 69 6e 20 74 68 65 20 52 42 55 5f 53  red in the RBU_S
18fc0 54 41 54 45 5f 53 54 41 47 45 20 63 6f 6c 75 6d  TATE_STAGE colum
18fd0 6e 20 69 73 20 65 53 74 61 67 65 2e 20 41 6c 6c  n is eStage. All
18fe0 20 6f 74 68 65 72 20 76 61 6c 75 65 73 0a 2a 2a   other values.**
18ff0 20 61 72 65 20 64 65 74 65 72 6d 69 6e 65 64 20   are determined 
19000 62 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68  by inspecting th
19010 65 20 72 62 75 20 68 61 6e 64 6c 65 20 70 61 73  e rbu handle pas
19020 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
19030 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
19040 61 74 69 63 20 76 6f 69 64 20 72 62 75 53 61 76  atic void rbuSav
19050 65 53 74 61 74 65 28 73 71 6c 69 74 65 33 72 62  eState(sqlite3rb
19060 75 20 2a 70 2c 20 69 6e 74 20 65 53 74 61 67 65  u *p, int eStage
19070 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ){.  if( p->rc==
19080 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e  SQLITE_OK || p->
19090 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
190a0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
190b0 74 6d 74 20 2a 70 49 6e 73 65 72 74 20 3d 20 30  tmt *pInsert = 0
190c0 3b 0a 20 20 20 20 72 62 75 5f 66 69 6c 65 20 2a  ;.    rbu_file *
190d0 70 46 64 20 3d 20 28 72 62 75 49 73 56 61 63 75  pFd = (rbuIsVacu
190e0 75 6d 28 70 29 20 3f 20 70 2d 3e 70 52 62 75 46  um(p) ? p->pRbuF
190f0 64 20 3a 20 70 2d 3e 70 54 61 72 67 65 74 46 64  d : p->pTargetFd
19100 29 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a  );.    int rc;..
19110 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a      assert( p->z
19120 45 72 72 6d 73 67 3d 3d 30 20 29 3b 0a 20 20 20  Errmsg==0 );.   
19130 20 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65   rc = prepareFre
19140 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72  eAndCollectError
19150 28 70 2d 3e 64 62 52 62 75 2c 20 26 70 49 6e 73  (p->dbRbu, &pIns
19160 65 72 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  ert, &p->zErrmsg
19170 2c 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  , .        sqlit
19180 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
19190 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 4f 52        "INSERT OR
191a0 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 25 73   REPLACE INTO %s
191b0 2e 72 62 75 5f 73 74 61 74 65 28 6b 2c 20 76 29  .rbu_state(k, v)
191c0 20 56 41 4c 55 45 53 20 22 0a 20 20 20 20 20 20   VALUES ".      
191d0 20 20 20 20 22 28 25 64 2c 20 25 64 29 2c 20 22      "(%d, %d), "
191e0 0a 20 20 20 20 20 20 20 20 20 20 22 28 25 64 2c  .          "(%d,
191f0 20 25 51 29 2c 20 22 0a 20 20 20 20 20 20 20 20   %Q), ".        
19200 20 20 22 28 25 64 2c 20 25 51 29 2c 20 22 0a 20    "(%d, %Q), ". 
19210 20 20 20 20 20 20 20 20 20 22 28 25 64 2c 20 25           "(%d, %
19220 64 29 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  d), ".          
19230 22 28 25 64 2c 20 25 64 29 2c 20 22 0a 20 20 20  "(%d, %d), ".   
19240 20 20 20 20 20 20 20 22 28 25 64 2c 20 25 6c 6c         "(%d, %ll
19250 64 29 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  d), ".          
19260 22 28 25 64 2c 20 25 6c 6c 64 29 2c 20 22 0a 20  "(%d, %lld), ". 
19270 20 20 20 20 20 20 20 20 20 22 28 25 64 2c 20 25           "(%d, %
19280 6c 6c 64 29 2c 20 22 0a 20 20 20 20 20 20 20 20  lld), ".        
19290 20 20 22 28 25 64 2c 20 25 6c 6c 64 29 20 22 2c    "(%d, %lld) ",
192a0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 53  .          p->zS
192b0 74 61 74 65 44 62 2c 0a 20 20 20 20 20 20 20 20  tateDb,.        
192c0 20 20 52 42 55 5f 53 54 41 54 45 5f 53 54 41 47    RBU_STATE_STAG
192d0 45 2c 20 65 53 74 61 67 65 2c 0a 20 20 20 20 20  E, eStage,.     
192e0 20 20 20 20 20 52 42 55 5f 53 54 41 54 45 5f 54       RBU_STATE_T
192f0 42 4c 2c 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 7a  BL, p->objiter.z
19300 54 62 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20  Tbl, .          
19310 52 42 55 5f 53 54 41 54 45 5f 49 44 58 2c 20 70  RBU_STATE_IDX, p
19320 2d 3e 6f 62 6a 69 74 65 72 2e 7a 49 64 78 2c 20  ->objiter.zIdx, 
19330 0a 20 20 20 20 20 20 20 20 20 20 52 42 55 5f 53  .          RBU_S
19340 54 41 54 45 5f 52 4f 57 2c 20 70 2d 3e 6e 53 74  TATE_ROW, p->nSt
19350 65 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 52  ep, .          R
19360 42 55 5f 53 54 41 54 45 5f 50 52 4f 47 52 45 53  BU_STATE_PROGRES
19370 53 2c 20 70 2d 3e 6e 50 72 6f 67 72 65 73 73 2c  S, p->nProgress,
19380 0a 20 20 20 20 20 20 20 20 20 20 52 42 55 5f 53  .          RBU_S
19390 54 41 54 45 5f 43 4b 50 54 2c 20 70 2d 3e 69 57  TATE_CKPT, p->iW
193a0 61 6c 43 6b 73 75 6d 2c 0a 20 20 20 20 20 20 20  alCksum,.       
193b0 20 20 20 52 42 55 5f 53 54 41 54 45 5f 43 4f 4f     RBU_STATE_COO
193c0 4b 49 45 2c 20 28 69 36 34 29 70 46 64 2d 3e 69  KIE, (i64)pFd->i
193d0 43 6f 6f 6b 69 65 2c 0a 20 20 20 20 20 20 20 20  Cookie,.        
193e0 20 20 52 42 55 5f 53 54 41 54 45 5f 4f 41 4c 53    RBU_STATE_OALS
193f0 5a 2c 20 70 2d 3e 69 4f 61 6c 53 7a 2c 0a 20 20  Z, p->iOalSz,.  
19400 20 20 20 20 20 20 20 20 52 42 55 5f 53 54 41 54          RBU_STAT
19410 45 5f 50 48 41 53 45 4f 4e 45 53 54 45 50 2c 20  E_PHASEONESTEP, 
19420 70 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70  p->nPhaseOneStep
19430 0a 20 20 20 20 20 20 29 0a 20 20 20 20 29 3b 0a  .      ).    );.
19440 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 73      assert( pIns
19450 65 72 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  ert==0 || rc==SQ
19460 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20  LITE_OK );..    
19470 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19480 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
19490 65 33 5f 73 74 65 70 28 70 49 6e 73 65 72 74 29  e3_step(pInsert)
194a0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
194b0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 49  ite3_finalize(pI
194c0 6e 73 65 72 74 29 3b 0a 20 20 20 20 7d 0a 20 20  nsert);.    }.  
194d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
194e0 5f 4f 4b 20 29 20 70 2d 3e 72 63 20 3d 20 72 63  _OK ) p->rc = rc
194f0 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
19500 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
19510 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  ent passed to th
19520 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74  is function is t
19530 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 50 52 41  he name of a PRA
19540 47 4d 41 20 0a 2a 2a 20 73 65 74 74 69 6e 67 20  GMA .** setting 
19550 2d 20 22 70 61 67 65 5f 73 69 7a 65 22 2c 20 22  - "page_size", "
19560 61 75 74 6f 5f 76 61 63 75 75 6d 22 2c 20 22 75  auto_vacuum", "u
19570 73 65 72 5f 76 65 72 73 69 6f 6e 22 20 6f 72 20  ser_version" or 
19580 22 61 70 70 6c 69 63 61 74 69 6f 6e 5f 69 64 22  "application_id"
19590 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  ..** This functi
195a0 6f 6e 20 65 78 65 63 75 74 65 73 20 74 68 65 20  on executes the 
195b0 66 6f 6c 6c 6f 77 69 6e 67 20 6f 6e 20 73 71 6c  following on sql
195c0 69 74 65 33 72 62 75 2e 64 62 52 62 75 3a 0a 2a  ite3rbu.dbRbu:.*
195d0 2a 0a 2a 2a 20 20 20 22 50 52 41 47 4d 41 20 6d  *.**   "PRAGMA m
195e0 61 69 6e 2e 24 7a 50 72 61 67 6d 61 22 0a 2a 2a  ain.$zPragma".**
195f0 0a 2a 2a 20 77 68 65 72 65 20 24 7a 50 72 61 67  .** where $zPrag
19600 6d 61 20 69 73 20 74 68 65 20 73 74 72 69 6e 67  ma is the string
19610 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
19620 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20  econd argument, 
19630 74 68 65 6e 0a 2a 2a 20 6f 6e 20 73 71 6c 69 74  then.** on sqlit
19640 65 33 72 62 75 2e 64 62 4d 61 69 6e 3a 0a 2a 2a  e3rbu.dbMain:.**
19650 0a 2a 2a 20 20 20 22 50 52 41 47 4d 41 20 6d 61  .**   "PRAGMA ma
19660 69 6e 2e 24 7a 50 72 61 67 6d 61 20 3d 20 24 76  in.$zPragma = $v
19670 61 6c 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  al".**.** where 
19680 24 76 61 6c 20 69 73 20 74 68 65 20 76 61 6c 75  $val is the valu
19690 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
196a0 65 20 66 69 72 73 74 20 50 52 41 47 4d 41 20 69  e first PRAGMA i
196b0 6e 76 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  nvocation..**.**
196c0 20 49 6e 20 73 68 6f 72 74 2c 20 69 74 20 63 6f   In short, it co
196d0 70 69 65 73 20 74 68 65 20 76 61 6c 75 65 20 20  pies the value  
196e0 6f 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64  of the specified
196f0 20 50 52 41 47 4d 41 20 73 65 74 74 69 6e 67 20   PRAGMA setting 
19700 66 72 6f 6d 0a 2a 2a 20 64 62 52 62 75 20 74 6f  from.** dbRbu to
19710 20 64 62 4d 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74   dbMain..*/.stat
19720 69 63 20 76 6f 69 64 20 72 62 75 43 6f 70 79 50  ic void rbuCopyP
19730 72 61 67 6d 61 28 73 71 6c 69 74 65 33 72 62 75  ragma(sqlite3rbu
19740 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
19750 2a 7a 50 72 61 67 6d 61 29 7b 0a 20 20 69 66 28  *zPragma){.  if(
19760 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
19770 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
19780 5f 73 74 6d 74 20 2a 70 50 72 61 67 6d 61 20 3d  _stmt *pPragma =
19790 20 30 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   0;.    p->rc = 
197a0 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f  prepareFreeAndCo
197b0 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62  llectError(p->db
197c0 52 62 75 2c 20 26 70 50 72 61 67 6d 61 2c 20 26  Rbu, &pPragma, &
197d0 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20  p->zErrmsg, .   
197e0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72       sqlite3_mpr
197f0 69 6e 74 66 28 22 50 52 41 47 4d 41 20 6d 61 69  intf("PRAGMA mai
19800 6e 2e 25 73 22 2c 20 7a 50 72 61 67 6d 61 29 0a  n.%s", zPragma).
19810 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70      );.    if( p
19820 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
19830 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  && SQLITE_ROW==s
19840 71 6c 69 74 65 33 5f 73 74 65 70 28 70 50 72 61  qlite3_step(pPra
19850 67 6d 61 29 20 29 7b 0a 20 20 20 20 20 20 70 2d  gma) ){.      p-
19860 3e 72 63 20 3d 20 72 62 75 4d 50 72 69 6e 74 66  >rc = rbuMPrintf
19870 45 78 65 63 28 70 2c 20 70 2d 3e 64 62 4d 61 69  Exec(p, p->dbMai
19880 6e 2c 20 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e  n, "PRAGMA main.
19890 25 73 20 3d 20 25 64 22 2c 0a 20 20 20 20 20 20  %s = %d",.      
198a0 20 20 20 20 7a 50 72 61 67 6d 61 2c 20 73 71 6c      zPragma, sql
198b0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
198c0 70 50 72 61 67 6d 61 2c 20 30 29 0a 20 20 20 20  pPragma, 0).    
198d0 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72    );.    }.    r
198e0 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 50  buFinalize(p, pP
198f0 72 61 67 6d 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ragma);.  }.}../
19900 2a 0a 2a 2a 20 54 68 65 20 52 42 55 20 68 61 6e  *.** The RBU han
19910 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dle passed as th
19920 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20  e only argument 
19930 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 6f 70  has just been op
19940 65 6e 65 64 20 61 6e 64 20 0a 2a 2a 20 74 68 65  ened and .** the
19950 20 73 74 61 74 65 20 64 61 74 61 62 61 73 65 20   state database 
19960 69 73 20 65 6d 70 74 79 2e 20 49 66 20 74 68 69  is empty. If thi
19970 73 20 52 42 55 20 68 61 6e 64 6c 65 20 77 61 73  s RBU handle was
19980 20 6f 70 65 6e 65 64 20 66 6f 72 20 61 6e 0a 2a   opened for an.*
19990 2a 20 52 42 55 20 76 61 63 75 75 6d 20 6f 70 65  * RBU vacuum ope
199a0 72 61 74 69 6f 6e 2c 20 63 72 65 61 74 65 20 74  ration, create t
199b0 68 65 20 73 63 68 65 6d 61 20 69 6e 20 74 68 65  he schema in the
199c0 20 74 61 72 67 65 74 20 64 62 2e 0a 2a 2f 0a 73   target db..*/.s
199d0 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 43 72  tatic void rbuCr
199e0 65 61 74 65 54 61 72 67 65 74 53 63 68 65 6d 61  eateTargetSchema
199f0 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b  (sqlite3rbu *p){
19a00 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
19a10 2a 70 53 71 6c 20 3d 20 30 3b 0a 20 20 73 71 6c  *pSql = 0;.  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 0a 20 20 61 73 73 65 72  rt = 0;..  asser
19a40 74 28 20 72 62 75 49 73 56 61 63 75 75 6d 28 70  t( rbuIsVacuum(p
19a50 29 20 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 73  ) );.  p->rc = s
19a60 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
19a70 62 4d 61 69 6e 2c 20 22 50 52 41 47 4d 41 20 77  bMain, "PRAGMA w
19a80 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 31  ritable_schema=1
19a90 22 2c 20 30 2c 30 2c 20 26 70 2d 3e 7a 45 72 72  ", 0,0, &p->zErr
19aa0 6d 73 67 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72  msg);.  if( p->r
19ab0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
19ac0 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70      p->rc = prep
19ad0 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  areAndCollectErr
19ae0 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20 26 70 53  or(p->dbRbu, &pS
19af0 71 6c 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c  ql, &p->zErrmsg,
19b00 20 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20   .      "SELECT 
19b10 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  sql FROM sqlite_
19b20 6d 61 73 74 65 72 20 57 48 45 52 45 20 73 71 6c  master WHERE sql
19b30 21 3d 27 27 20 41 4e 44 20 72 6f 6f 74 70 61 67  !='' AND rootpag
19b40 65 21 3d 30 22 0a 20 20 20 20 20 20 22 20 41 4e  e!=0".      " AN
19b50 44 20 6e 61 6d 65 21 3d 27 73 71 6c 69 74 65 5f  D name!='sqlite_
19b60 73 65 71 75 65 6e 63 65 27 20 22 0a 20 20 20 20  sequence' ".    
19b70 20 20 22 20 4f 52 44 45 52 20 42 59 20 74 79 70    " ORDER BY typ
19b80 65 20 44 45 53 43 22 0a 20 20 20 20 29 3b 0a 20  e DESC".    );. 
19b90 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e   }..  while( p->
19ba0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
19bb0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
19bc0 71 6c 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  ql)==SQLITE_ROW 
19bd0 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
19be0 72 20 2a 7a 53 71 6c 20 3d 20 28 63 6f 6e 73 74  r *zSql = (const
19bf0 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
19c00 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c  olumn_text(pSql,
19c10 20 30 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d   0);.    p->rc =
19c20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
19c30 3e 64 62 4d 61 69 6e 2c 20 7a 53 71 6c 2c 20 30  >dbMain, zSql, 0
19c40 2c 20 30 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  , 0, &p->zErrmsg
19c50 29 3b 0a 20 20 7d 0a 20 20 72 62 75 46 69 6e 61  );.  }.  rbuFina
19c60 6c 69 7a 65 28 70 2c 20 70 53 71 6c 29 3b 0a 20  lize(p, pSql);. 
19c70 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49   if( p->rc!=SQLI
19c80 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 3b 0a  TE_OK ) return;.
19c90 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
19ca0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
19cb0 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 41 6e  ->rc = prepareAn
19cc0 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d  dCollectError(p-
19cd0 3e 64 62 52 62 75 2c 20 26 70 53 71 6c 2c 20 26  >dbRbu, &pSql, &
19ce0 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20  p->zErrmsg, .   
19cf0 20 20 20 20 20 22 53 45 4c 45 43 54 20 2a 20 46       "SELECT * F
19d00 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
19d10 72 20 57 48 45 52 45 20 72 6f 6f 74 70 61 67 65  r WHERE rootpage
19d20 3d 30 20 4f 52 20 72 6f 6f 74 70 61 67 65 20 49  =0 OR rootpage I
19d30 53 20 4e 55 4c 4c 22 20 0a 20 20 20 20 29 3b 0a  S NULL" .    );.
19d40 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63    }..  if( p->rc
19d50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
19d60 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61     p->rc = prepa
19d70 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f  reAndCollectErro
19d80 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 49  r(p->dbMain, &pI
19d90 6e 73 65 72 74 2c 20 26 70 2d 3e 7a 45 72 72 6d  nsert, &p->zErrm
19da0 73 67 2c 20 0a 20 20 20 20 20 20 20 20 22 49 4e  sg, .        "IN
19db0 53 45 52 54 20 49 4e 54 4f 20 73 71 6c 69 74 65  SERT INTO sqlite
19dc0 5f 6d 61 73 74 65 72 20 56 41 4c 55 45 53 28 3f  _master VALUES(?
19dd0 2c 3f 2c 3f 2c 3f 2c 3f 29 22 0a 20 20 20 20 29  ,?,?,?,?)".    )
19de0 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  ;.  }..  while( 
19df0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
19e00 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 65 70   && sqlite3_step
19e10 28 70 53 71 6c 29 3d 3d 53 51 4c 49 54 45 5f 52  (pSql)==SQLITE_R
19e20 4f 57 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  OW ){.    int i;
19e30 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
19e40 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  5; i++){.      s
19e50 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75  qlite3_bind_valu
19e60 65 28 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20  e(pInsert, i+1, 
19e70 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76  sqlite3_column_v
19e80 61 6c 75 65 28 70 53 71 6c 2c 20 69 29 29 3b 0a  alue(pSql, i));.
19e90 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
19ea0 33 5f 73 74 65 70 28 70 49 6e 73 65 72 74 29 3b  3_step(pInsert);
19eb0 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c  .    p->rc = sql
19ec0 69 74 65 33 5f 72 65 73 65 74 28 70 49 6e 73 65  ite3_reset(pInse
19ed0 72 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  rt);.  }.  if( p
19ee0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
19ef0 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  ){.    p->rc = s
19f00 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
19f10 62 4d 61 69 6e 2c 20 22 50 52 41 47 4d 41 20 77  bMain, "PRAGMA w
19f20 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 30  ritable_schema=0
19f30 22 2c 30 2c 30 2c 26 70 2d 3e 7a 45 72 72 6d 73  ",0,0,&p->zErrms
19f40 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 62 75 46 69  g);.  }..  rbuFi
19f50 6e 61 6c 69 7a 65 28 70 2c 20 70 53 71 6c 29 3b  nalize(p, pSql);
19f60 0a 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70  .  rbuFinalize(p
19f70 2c 20 70 49 6e 73 65 72 74 29 3b 0a 7d 0a 0a 2f  , pInsert);.}../
19f80 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 52 42  *.** Step the RB
19f90 55 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 69 6e 74  U object..*/.int
19fa0 20 73 71 6c 69 74 65 33 72 62 75 5f 73 74 65 70   sqlite3rbu_step
19fb0 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b  (sqlite3rbu *p){
19fc0 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
19fd0 73 77 69 74 63 68 28 20 70 2d 3e 65 53 74 61 67  switch( p->eStag
19fe0 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
19ff0 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 3a 20 7b  RBU_STAGE_OAL: {
1a000 0a 20 20 20 20 20 20 20 20 52 62 75 4f 62 6a 49  .        RbuObjI
1a010 74 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70 2d  ter *pIter = &p-
1a020 3e 6f 62 6a 69 74 65 72 3b 0a 0a 20 20 20 20 20  >objiter;..     
1a030 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
1a040 20 61 6e 20 52 42 55 20 76 61 63 75 75 6d 20 6f   an RBU vacuum o
1a050 70 65 72 61 74 69 6f 6e 20 61 6e 64 20 74 68 65  peration and the
1a060 20 73 74 61 74 65 20 74 61 62 6c 65 20 77 61 73   state table was
1a070 20 65 6d 70 74 79 0a 20 20 20 20 20 20 20 20 2a   empty.        *
1a080 2a 20 77 68 65 6e 20 74 68 69 73 20 68 61 6e 64  * when this hand
1a090 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 2c 20 63  le was opened, c
1a0a0 72 65 61 74 65 20 74 68 65 20 74 61 72 67 65 74  reate the target
1a0b0 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
1a0c0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
1a0d0 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 29 20   rbuIsVacuum(p) 
1a0e0 26 26 20 70 2d 3e 6e 50 72 6f 67 72 65 73 73 3d  && p->nProgress=
1a0f0 3d 30 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c  =0 && p->rc==SQL
1a100 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a110 20 20 20 20 72 62 75 43 72 65 61 74 65 54 61 72      rbuCreateTar
1a120 67 65 74 53 63 68 65 6d 61 28 70 29 3b 0a 20 20  getSchema(p);.  
1a130 20 20 20 20 20 20 20 20 72 62 75 43 6f 70 79 50          rbuCopyP
1a140 72 61 67 6d 61 28 70 2c 20 22 75 73 65 72 5f 76  ragma(p, "user_v
1a150 65 72 73 69 6f 6e 22 29 3b 0a 20 20 20 20 20 20  ersion");.      
1a160 20 20 20 20 72 62 75 43 6f 70 79 50 72 61 67 6d      rbuCopyPragm
1a170 61 28 70 2c 20 22 61 70 70 6c 69 63 61 74 69 6f  a(p, "applicatio
1a180 6e 5f 69 64 22 29 3b 0a 20 20 20 20 20 20 20 20  n_id");.        
1a190 7d 0a 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  }..        while
1a1a0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1a1b0 4f 4b 20 26 26 20 70 49 74 65 72 2d 3e 7a 54 62  OK && pIter->zTb
1a1c0 6c 20 29 7b 0a 0a 20 20 20 20 20 20 20 20 20 20  l ){..          
1a1d0 69 66 28 20 70 49 74 65 72 2d 3e 62 43 6c 65 61  if( pIter->bClea
1a1e0 6e 75 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nup ){.         
1a1f0 20 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 74     /* Clean up t
1a200 68 65 20 72 62 75 5f 74 6d 70 5f 78 78 78 20 74  he rbu_tmp_xxx t
1a210 61 62 6c 65 20 66 6f 72 20 74 68 65 20 70 72 65  able for the pre
1a220 76 69 6f 75 73 20 74 61 62 6c 65 2e 20 49 74 20  vious table. It 
1a230 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1a240 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65  cannot be droppe
1a250 64 20 61 73 20 74 68 65 72 65 20 61 72 65 20 63  d as there are c
1a260 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20  urrently active 
1a270 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  SQL statements..
1a280 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 42              ** B
1a290 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ut the contents 
1a2a0 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e 20  can be deleted. 
1a2b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1a2c0 69 66 28 20 72 62 75 49 73 56 61 63 75 75 6d 28  if( rbuIsVacuum(
1a2d0 70 29 3d 3d 30 20 26 26 20 70 49 74 65 72 2d 3e  p)==0 && pIter->
1a2e0 61 62 49 6e 64 65 78 65 64 20 29 7b 0a 20 20 20  abIndexed ){.   
1a2f0 20 20 20 20 20 20 20 20 20 20 20 72 62 75 4d 50             rbuMP
1a300 72 69 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e  rintfExec(p, p->
1a310 64 62 52 62 75 2c 20 0a 20 20 20 20 20 20 20 20  dbRbu, .        
1a320 20 20 20 20 20 20 20 20 20 20 22 44 45 4c 45 54            "DELET
1a330 45 20 46 52 4f 4d 20 25 73 2e 27 72 62 75 5f 74  E FROM %s.'rbu_t
1a340 6d 70 5f 25 71 27 22 2c 20 70 2d 3e 7a 53 74 61  mp_%q'", p->zSta
1a350 74 65 44 62 2c 20 70 49 74 65 72 2d 3e 7a 44 61  teDb, pIter->zDa
1a360 74 61 54 62 6c 0a 20 20 20 20 20 20 20 20 20 20  taTbl.          
1a370 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20      );.         
1a380 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
1a390 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1a3a0 20 20 72 62 75 4f 62 6a 49 74 65 72 50 72 65 70    rbuObjIterPrep
1a3b0 61 72 65 41 6c 6c 28 70 2c 20 70 49 74 65 72 2c  areAll(p, pIter,
1a3c0 20 30 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20   0);..          
1a3d0 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 74 6f 20    /* Advance to 
1a3e0 74 68 65 20 6e 65 78 74 20 72 6f 77 20 74 6f 20  the next row to 
1a3f0 70 72 6f 63 65 73 73 2e 20 2a 2f 0a 20 20 20 20  process. */.    
1a400 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
1a410 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1a420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
1a430 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73  t rc = sqlite3_s
1a440 74 65 70 28 70 49 74 65 72 2d 3e 70 53 65 6c 65  tep(pIter->pSele
1a450 63 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ct);.           
1a460 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1a470 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20  E_ROW ){.       
1a480 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 50 72 6f           p->nPro
1a490 67 72 65 73 73 2b 2b 3b 0a 20 20 20 20 20 20 20  gress++;.       
1a4a0 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 74 65           p->nSte
1a4b0 70 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  p++;.           
1a4c0 20 20 20 20 20 72 65 74 75 72 6e 20 72 62 75 53       return rbuS
1a4d0 74 65 70 28 70 29 3b 0a 20 20 20 20 20 20 20 20  tep(p);.        
1a4e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1a4f0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71        p->rc = sq
1a500 6c 69 74 65 33 5f 72 65 73 65 74 28 70 49 74 65  lite3_reset(pIte
1a510 72 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  r->pSelect);.   
1a520 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 53             p->nS
1a530 74 65 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tep = 0;.       
1a540 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1a550 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 72 62   }..          rb
1a560 75 4f 62 6a 49 74 65 72 4e 65 78 74 28 70 2c 20  uObjIterNext(p, 
1a570 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  pIter);.        
1a580 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  }..        if( p
1a590 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1a5a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
1a5b0 65 72 74 28 20 70 49 74 65 72 2d 3e 7a 54 62 6c  ert( pIter->zTbl
1a5c0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
1a5d0 20 72 62 75 53 61 76 65 53 74 61 74 65 28 70 2c   rbuSaveState(p,
1a5e0 20 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 29   RBU_STAGE_MOVE)
1a5f0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 62 75 49  ;.          rbuI
1a600 6e 63 72 53 63 68 65 6d 61 43 6f 6f 6b 69 65 28  ncrSchemaCookie(
1a610 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  p);.          if
1a620 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1a630 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1a640 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
1a650 33 5f 65 78 65 63 28 70 2d 3e 64 62 4d 61 69 6e  3_exec(p->dbMain
1a660 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30  , "COMMIT", 0, 0
1a670 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a  , &p->zErrmsg);.
1a680 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1a690 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
1a6a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a6b0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
1a6c0 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  = sqlite3_exec(p
1a6d0 2d 3e 64 62 52 62 75 2c 20 22 43 4f 4d 4d 49 54  ->dbRbu, "COMMIT
1a6e0 22 2c 20 30 2c 20 30 2c 20 26 70 2d 3e 7a 45 72  ", 0, 0, &p->zEr
1a6f0 72 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20  rmsg);.         
1a700 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
1a710 65 53 74 61 67 65 20 3d 20 52 42 55 5f 53 54 41  eStage = RBU_STA
1a720 47 45 5f 4d 4f 56 45 3b 0a 20 20 20 20 20 20 20  GE_MOVE;.       
1a730 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
1a740 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1a750 20 63 61 73 65 20 52 42 55 5f 53 54 41 47 45 5f   case RBU_STAGE_
1a760 4d 4f 56 45 3a 20 7b 0a 20 20 20 20 20 20 20 20  MOVE: {.        
1a770 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1a780 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1a790 20 20 72 62 75 4d 6f 76 65 4f 61 6c 46 69 6c 65    rbuMoveOalFile
1a7a0 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  (p);.          p
1a7b0 2d 3e 6e 50 72 6f 67 72 65 73 73 2b 2b 3b 0a 20  ->nProgress++;. 
1a7c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1a7d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1a7e0 0a 20 20 20 20 20 20 63 61 73 65 20 52 42 55 5f  .      case RBU_
1a7f0 53 54 41 47 45 5f 43 4b 50 54 3a 20 7b 0a 20 20  STAGE_CKPT: {.  
1a800 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
1a810 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a820 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e          if( p->n
1a830 53 74 65 70 3e 3d 70 2d 3e 6e 46 72 61 6d 65 20  Step>=p->nFrame 
1a840 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
1a850 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 44 62  qlite3_file *pDb
1a860 20 3d 20 70 2d 3e 70 54 61 72 67 65 74 46 64 2d   = p->pTargetFd-
1a870 3e 70 52 65 61 6c 3b 0a 20 20 0a 20 20 20 20 20  >pReal;.  .     
1a880 20 20 20 20 20 20 20 2f 2a 20 53 79 6e 63 20 74         /* Sync t
1a890 68 65 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20  he db file */.  
1a8a0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
1a8b0 3d 20 70 44 62 2d 3e 70 4d 65 74 68 6f 64 73 2d  = pDb->pMethods-
1a8c0 3e 78 53 79 6e 63 28 70 44 62 2c 20 53 51 4c 49  >xSync(pDb, SQLI
1a8d0 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b  TE_SYNC_NORMAL);
1a8e0 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  .  .            
1a8f0 2f 2a 20 55 70 64 61 74 65 20 6e 42 61 63 6b 66  /* Update nBackf
1a900 69 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ill */.         
1a910 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
1a920 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a930 20 20 20 20 20 20 20 20 20 76 6f 69 64 20 76 6f           void vo
1a940 6c 61 74 69 6c 65 20 2a 70 74 72 3b 0a 20 20 20  latile *ptr;.   
1a950 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63             p->rc
1a960 20 3d 20 70 44 62 2d 3e 70 4d 65 74 68 6f 64 73   = pDb->pMethods
1a970 2d 3e 78 53 68 6d 4d 61 70 28 70 44 62 2c 20 30  ->xShmMap(pDb, 0
1a980 2c 20 33 32 2a 31 30 32 34 2c 20 30 2c 20 26 70  , 32*1024, 0, &p
1a990 74 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  tr);.           
1a9a0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
1a9b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a9c0 20 20 20 20 20 20 20 20 20 20 20 28 28 75 33 32             ((u32
1a9d0 20 76 6f 6c 61 74 69 6c 65 2a 29 70 74 72 29 5b   volatile*)ptr)[
1a9e0 32 34 5d 20 3d 20 70 2d 3e 69 4d 61 78 46 72 61  24] = p->iMaxFra
1a9f0 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
1aa00 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1aa10 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  }.  .           
1aa20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1aa30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1aa40 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 67 65         p->eStage
1aa50 20 3d 20 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e   = RBU_STAGE_DON
1aa60 45 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  E;.             
1aa70 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
1aa80 44 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 20 20  DONE;.          
1aa90 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
1aaa0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1aab0 20 2f 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74   /* At one point
1aac0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   the following b
1aad0 6c 6f 63 6b 20 63 6f 70 69 65 64 20 61 20 73 69  lock copied a si
1aae0 6e 67 6c 65 20 66 72 61 6d 65 20 66 72 6f 6d 20  ngle frame from 
1aaf0 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
1ab00 2a 2a 20 77 61 6c 20 66 69 6c 65 20 74 6f 20 74  ** wal file to t
1ab10 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1ab20 2e 20 53 6f 20 74 68 61 74 20 6f 6e 65 20 63 61  . So that one ca
1ab30 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 72 62 75  ll to sqlite3rbu
1ab40 5f 73 74 65 70 28 29 0a 20 20 20 20 20 20 20 20  _step().        
1ab50 20 20 20 20 2a 2a 20 63 68 65 63 6b 70 6f 69 6e      ** checkpoin
1ab60 74 65 64 20 61 20 73 69 6e 67 6c 65 20 66 72 61  ted a single fra
1ab70 6d 65 2e 20 0a 20 20 20 20 20 20 20 20 20 20 20  me. .           
1ab80 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20   **.            
1ab90 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74  ** However, if t
1aba0 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69  he sector-size i
1abb0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
1abc0 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 61 6e 64  e page-size, and
1abd0 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
1abe0 20 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20   ** application 
1abf0 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 72 62 75  calls sqlite3rbu
1ac00 5f 73 61 76 65 73 74 61 74 65 28 29 20 6f 72 20  _savestate() or 
1ac10 63 6c 6f 73 65 28 29 20 69 6d 6d 65 64 69 61 74  close() immediat
1ac20 65 6c 79 0a 20 20 20 20 20 20 20 20 20 20 20 20  ely.            
1ac30 2a 2a 20 61 66 74 65 72 20 74 68 69 73 20 73 74  ** after this st
1ac40 65 70 2c 20 74 68 65 6e 20 72 62 75 5f 73 74 65  ep, then rbu_ste
1ac50 70 28 29 20 61 67 61 69 6e 2c 20 74 68 65 6e 20  p() again, then 
1ac60 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
1ac70 6f 63 63 75 72 73 2c 0a 20 20 20 20 20 20 20 20  occurs,.        
1ac80 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20      ** then the 
1ac90 64 61 74 61 62 61 73 65 20 70 61 67 65 20 77 72  database page wr
1aca0 69 74 74 65 6e 20 68 65 72 65 20 6d 61 79 20 62  itten here may b
1acb0 65 20 64 61 6d 61 67 65 64 2e 20 57 6f 72 6b 20  e damaged. Work 
1acc0 61 72 6f 75 6e 64 0a 20 20 20 20 20 20 20 20 20  around.         
1acd0 20 20 20 2a 2a 20 74 68 69 73 20 62 79 20 63 68     ** this by ch
1ace0 65 63 6b 70 6f 69 6e 74 69 6e 67 20 66 72 61 6d  eckpointing fram
1acf0 65 73 20 75 6e 74 69 6c 20 74 68 65 20 6e 65 78  es until the nex
1ad00 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 61 46  t page in the aF
1ad10 72 61 6d 65 5b 5d 0a 20 20 20 20 20 20 20 20 20  rame[].         
1ad20 20 20 20 2a 2a 20 6c 69 65 73 20 6f 6e 20 61 20     ** lies on a 
1ad30 64 69 66 66 65 72 65 6e 74 20 64 69 73 6b 20 73  different disk s
1ad40 65 63 74 6f 72 20 74 6f 20 74 68 65 20 63 75 72  ector to the cur
1ad50 72 65 6e 74 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20  rent one. */.   
1ad60 20 20 20 20 20 20 20 20 20 75 33 32 20 69 53 65           u32 iSe
1ad70 63 74 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  ctor;.          
1ad80 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20    do{.          
1ad90 20 20 20 20 52 62 75 46 72 61 6d 65 20 2a 70 46      RbuFrame *pF
1ada0 72 61 6d 65 20 3d 20 26 70 2d 3e 61 46 72 61 6d  rame = &p->aFram
1adb0 65 5b 70 2d 3e 6e 53 74 65 70 5d 3b 0a 20 20 20  e[p->nStep];.   
1adc0 20 20 20 20 20 20 20 20 20 20 20 69 53 65 63 74             iSect
1add0 6f 72 20 3d 20 28 70 46 72 61 6d 65 2d 3e 69 44  or = (pFrame->iD
1ade0 62 50 61 67 65 2d 31 29 20 2f 20 70 2d 3e 6e 50  bPage-1) / p->nP
1adf0 61 67 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20  agePerSector;.  
1ae00 20 20 20 20 20 20 20 20 20 20 20 20 72 62 75 43              rbuC
1ae10 68 65 63 6b 70 6f 69 6e 74 46 72 61 6d 65 28 70  heckpointFrame(p
1ae20 2c 20 70 46 72 61 6d 65 29 3b 0a 20 20 20 20 20  , pFrame);.     
1ae30 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 74 65           p->nSte
1ae40 70 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  p++;.           
1ae50 20 7d 77 68 69 6c 65 28 20 70 2d 3e 6e 53 74 65   }while( p->nSte
1ae60 70 3c 70 2d 3e 6e 46 72 61 6d 65 20 0a 20 20 20  p<p->nFrame .   
1ae70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
1ae80 20 69 53 65 63 74 6f 72 3d 3d 28 28 70 2d 3e 61   iSector==((p->a
1ae90 46 72 61 6d 65 5b 70 2d 3e 6e 53 74 65 70 5d 2e  Frame[p->nStep].
1aea0 69 44 62 50 61 67 65 2d 31 29 20 2f 20 70 2d 3e  iDbPage-1) / p->
1aeb0 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 29 0a  nPagePerSector).
1aec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aed0 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   && p->rc==SQLIT
1aee0 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20  E_OK.           
1aef0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   );.          }.
1af00 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 50 72            p->nPr
1af10 6f 67 72 65 73 73 2b 2b 3b 0a 20 20 20 20 20 20  ogress++;.      
1af20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
1af30 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
1af40 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
1af50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1af60 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63      return p->rc
1af70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1af80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
1af90 45 4d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  EM;.  }.}../*.**
1afa0 20 43 6f 6d 70 61 72 65 20 73 74 72 69 6e 67 73   Compare strings
1afb0 20 7a 31 20 61 6e 64 20 7a 32 2c 20 72 65 74 75   z1 and z2, retu
1afc0 72 6e 69 6e 67 20 30 20 69 66 20 74 68 65 79 20  rning 0 if they 
1afd0 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2c 20 6f  are identical, o
1afe0 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74  r non-zero.** ot
1aff0 68 65 72 77 69 73 65 2e 20 45 69 74 68 65 72 20  herwise. Either 
1b000 6f 72 20 62 6f 74 68 20 61 72 67 75 6d 65 6e 74  or both argument
1b010 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 54 77   may be NULL. Tw
1b020 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72  o NULL values ar
1b030 65 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20  e.** considered 
1b040 65 71 75 61 6c 2c 20 61 6e 64 20 4e 55 4c 4c 20  equal, and NULL 
1b050 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 64 69  is considered di
1b060 73 74 69 6e 63 74 20 66 72 6f 6d 20 61 6c 6c 20  stinct from all 
1b070 6f 74 68 65 72 20 76 61 6c 75 65 73 2e 0a 2a 2f  other values..*/
1b080 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 53  .static int rbuS
1b090 74 72 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20  trCompare(const 
1b0a0 63 68 61 72 20 2a 7a 31 2c 20 63 6f 6e 73 74 20  char *z1, const 
1b0b0 63 68 61 72 20 2a 7a 32 29 7b 0a 20 20 69 66 28  char *z2){.  if(
1b0c0 20 7a 31 3d 3d 30 20 26 26 20 7a 32 3d 3d 30 20   z1==0 && z2==0 
1b0d0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
1b0e0 28 20 7a 31 3d 3d 30 20 7c 7c 20 7a 32 3d 3d 30  ( z1==0 || z2==0
1b0f0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72   ) return 1;.  r
1b100 65 74 75 72 6e 20 28 73 71 6c 69 74 65 33 5f 73  eturn (sqlite3_s
1b110 74 72 69 63 6d 70 28 7a 31 2c 20 7a 32 29 21 3d  tricmp(z1, z2)!=
1b120 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  0);.}../*.** Thi
1b130 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1b140 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  lled as part of 
1b150 73 71 6c 69 74 65 33 72 62 75 5f 6f 70 65 6e 28  sqlite3rbu_open(
1b160 29 20 77 68 65 6e 20 69 6e 69 74 69 61 6c 69 7a  ) when initializ
1b170 69 6e 67 0a 2a 2a 20 61 6e 20 72 62 75 20 68 61  ing.** an rbu ha
1b180 6e 64 6c 65 20 69 6e 20 4f 41 4c 20 73 74 61 67  ndle in OAL stag
1b190 65 2e 20 49 66 20 74 68 65 20 72 62 75 20 75 70  e. If the rbu up
1b1a0 64 61 74 65 20 68 61 73 20 6e 6f 74 20 73 74 61  date has not sta
1b1b0 72 74 65 64 20 28 69 2e 65 2e 0a 2a 2a 20 74 68  rted (i.e..** th
1b1c0 65 20 72 62 75 5f 73 74 61 74 65 20 74 61 62 6c  e rbu_state tabl
1b1d0 65 20 77 61 73 20 65 6d 70 74 79 29 20 69 74 20  e was empty) it 
1b1e0 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65  is a no-op. Othe
1b1f0 72 77 69 73 65 2c 20 69 74 20 61 72 72 61 6e 67  rwise, it arrang
1b200 65 73 0a 2a 2a 20 74 68 69 6e 67 73 20 73 6f 20  es.** things so 
1b210 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 63 61  that the next ca
1b220 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 72 62 75  ll to sqlite3rbu
1b230 5f 73 74 65 70 28 29 20 63 6f 6e 74 69 6e 75 65  _step() continue
1b240 73 20 6f 6e 20 66 72 6f 6d 0a 2a 2a 20 77 68 65  s on from.** whe
1b250 72 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  re the previous 
1b260 72 62 75 20 68 61 6e 64 6c 65 20 6c 65 66 74 20  rbu handle left 
1b270 6f 66 66 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  off..**.** If an
1b280 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
1b290 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  n error code and
1b2a0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61   error message a
1b2b0 72 65 20 6c 65 66 74 20 69 6e 20 74 68 65 0a 2a  re left in the.*
1b2c0 2a 20 72 62 75 20 68 61 6e 64 6c 65 20 70 61 73  * rbu handle pas
1b2d0 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
1b2e0 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
1b2f0 61 74 69 63 20 76 6f 69 64 20 72 62 75 53 65 74  atic void rbuSet
1b300 75 70 4f 61 6c 28 73 71 6c 69 74 65 33 72 62 75  upOal(sqlite3rbu
1b310 20 2a 70 2c 20 52 62 75 53 74 61 74 65 20 2a 70   *p, RbuState *p
1b320 53 74 61 74 65 29 7b 0a 20 20 61 73 73 65 72 74  State){.  assert
1b330 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1b340 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 53 74 61  OK );.  if( pSta
1b350 74 65 2d 3e 7a 54 62 6c 20 29 7b 0a 20 20 20 20  te->zTbl ){.    
1b360 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65  RbuObjIter *pIte
1b370 72 20 3d 20 26 70 2d 3e 6f 62 6a 69 74 65 72 3b  r = &p->objiter;
1b380 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51  .    int rc = SQ
1b390 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 20 20 77 68  LITE_OK;..    wh
1b3a0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
1b3b0 4f 4b 20 26 26 20 70 49 74 65 72 2d 3e 7a 54 62  OK && pIter->zTb
1b3c0 6c 20 26 26 20 28 70 49 74 65 72 2d 3e 62 43 6c  l && (pIter->bCl
1b3d0 65 61 6e 75 70 20 0a 20 20 20 20 20 20 20 7c 7c  eanup .       ||
1b3e0 20 72 62 75 53 74 72 43 6f 6d 70 61 72 65 28 70   rbuStrCompare(p
1b3f0 49 74 65 72 2d 3e 7a 49 64 78 2c 20 70 53 74 61  Iter->zIdx, pSta
1b400 74 65 2d 3e 7a 49 64 78 29 0a 20 20 20 20 20 20  te->zIdx).      
1b410 20 7c 7c 20 72 62 75 53 74 72 43 6f 6d 70 61 72   || rbuStrCompar
1b420 65 28 70 49 74 65 72 2d 3e 7a 54 62 6c 2c 20 70  e(pIter->zTbl, p
1b430 53 74 61 74 65 2d 3e 7a 54 62 6c 29 20 0a 20 20  State->zTbl) .  
1b440 20 20 29 29 7b 0a 20 20 20 20 20 20 72 63 20 3d    )){.      rc =
1b450 20 72 62 75 4f 62 6a 49 74 65 72 4e 65 78 74 28   rbuObjIterNext(
1b460 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 7d  p, pIter);.    }
1b470 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
1b480 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 49 74 65  LITE_OK && !pIte
1b490 72 2d 3e 7a 54 62 6c 20 29 7b 0a 20 20 20 20 20  r->zTbl ){.     
1b4a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
1b4b0 4f 52 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72  OR;.      p->zEr
1b4c0 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rmsg = sqlite3_m
1b4d0 70 72 69 6e 74 66 28 22 72 62 75 5f 73 74 61 74  printf("rbu_stat
1b4e0 65 20 6d 69 73 6d 61 74 63 68 20 65 72 72 6f 72  e mismatch error
1b4f0 22 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ");.    }..    i
1b500 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1b510 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 74   ){.      p->nSt
1b520 65 70 20 3d 20 70 53 74 61 74 65 2d 3e 6e 52 6f  ep = pState->nRo
1b530 77 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 62  w;.      rc = rb
1b540 75 4f 62 6a 49 74 65 72 50 72 65 70 61 72 65 41  uObjIterPrepareA
1b550 6c 6c 28 70 2c 20 26 70 2d 3e 6f 62 6a 69 74 65  ll(p, &p->objite
1b560 72 2c 20 70 2d 3e 6e 53 74 65 70 29 3b 0a 20 20  r, p->nStep);.  
1b570 20 20 7d 0a 0a 20 20 20 20 70 2d 3e 72 63 20 3d    }..    p->rc =
1b580 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   rc;.  }.}../*.*
1b590 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
1b5a0 22 2a 2d 6f 61 6c 22 20 66 69 6c 65 20 69 6e 20  "*-oal" file in 
1b5b0 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
1b5c0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
1b5d0 20 74 68 65 0a 2a 2a 20 74 61 72 67 65 74 20 64   the.** target d
1b5e0 61 74 61 62 61 73 65 20 69 6e 20 74 68 65 20 66  atabase in the f
1b5f0 69 6c 65 2d 73 79 73 74 65 6d 2c 20 64 65 6c 65  ile-system, dele
1b600 74 65 20 69 74 2e 20 49 66 20 61 6e 20 65 72 72  te it. If an err
1b610 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 6c 65  or occurs,.** le
1b620 61 76 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ave an error cod
1b630 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73  e and error mess
1b640 61 67 65 20 69 6e 20 74 68 65 20 72 62 75 20 68  age in the rbu h
1b650 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
1b660 20 76 6f 69 64 20 72 62 75 44 65 6c 65 74 65 4f   void rbuDeleteO
1b670 61 6c 46 69 6c 65 28 73 71 6c 69 74 65 33 72 62  alFile(sqlite3rb
1b680 75 20 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a  u *p){.  char *z
1b690 4f 61 6c 20 3d 20 72 62 75 4d 50 72 69 6e 74 66  Oal = rbuMPrintf
1b6a0 28 70 2c 20 22 25 73 2d 6f 61 6c 22 2c 20 70 2d  (p, "%s-oal", p-
1b6b0 3e 7a 54 61 72 67 65 74 29 3b 0a 20 20 69 66 28  >zTarget);.  if(
1b6c0 20 7a 4f 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c   zOal ){.    sql
1b6d0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
1b6e0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
1b6f0 64 28 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  d(0);.    assert
1b700 28 20 70 56 66 73 20 26 26 20 70 2d 3e 72 63 3d  ( pVfs && p->rc=
1b710 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d  =SQLITE_OK && p-
1b720 3e 7a 45 72 72 6d 73 67 3d 3d 30 20 29 3b 0a 20  >zErrmsg==0 );. 
1b730 20 20 20 70 56 66 73 2d 3e 78 44 65 6c 65 74 65     pVfs->xDelete
1b740 28 70 56 66 73 2c 20 7a 4f 61 6c 2c 20 30 29 3b  (pVfs, zOal, 0);
1b750 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1b760 65 28 7a 4f 61 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a  e(zOal);.  }.}..
1b770 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
1b780 20 70 72 69 76 61 74 65 20 72 62 75 20 56 46 53   private rbu VFS
1b790 20 66 6f 72 20 74 68 65 20 72 62 75 20 68 61 6e   for the rbu han
1b7a0 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dle passed as th
1b7b0 65 20 6f 6e 6c 79 0a 2a 2a 20 61 72 67 75 6d 65  e only.** argume
1b7c0 6e 74 2e 20 54 68 69 73 20 56 46 53 20 77 69 6c  nt. This VFS wil
1b7d0 6c 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73  l be used unless
1b7e0 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   the call to sql
1b7f0 69 74 65 33 72 62 75 5f 6f 70 65 6e 28 29 0a 2a  ite3rbu_open().*
1b800 2a 20 73 70 65 63 69 66 69 65 64 20 61 20 55 52  * specified a UR
1b810 49 20 77 69 74 68 20 61 20 76 66 73 3d 3f 20 6f  I with a vfs=? o
1b820 70 74 69 6f 6e 20 69 6e 20 70 6c 61 63 65 20 6f  ption in place o
1b830 66 20 61 20 74 61 72 67 65 74 20 64 61 74 61 62  f a target datab
1b840 61 73 65 0a 2a 2a 20 66 69 6c 65 20 6e 61 6d 65  ase.** file name
1b850 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1b860 20 72 62 75 43 72 65 61 74 65 56 66 73 28 73 71   rbuCreateVfs(sq
1b870 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20  lite3rbu *p){.  
1b880 69 6e 74 20 72 6e 64 3b 0a 20 20 63 68 61 72 20  int rnd;.  char 
1b890 7a 52 6e 64 5b 36 34 5d 3b 0a 0a 20 20 61 73 73  zRnd[64];..  ass
1b8a0 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
1b8b0 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74  TE_OK );.  sqlit
1b8c0 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
1b8d0 7a 65 6f 66 28 69 6e 74 29 2c 20 28 76 6f 69 64  zeof(int), (void
1b8e0 2a 29 26 72 6e 64 29 3b 0a 20 20 73 71 6c 69 74  *)&rnd);.  sqlit
1b8f0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
1b900 6f 66 28 7a 52 6e 64 29 2c 20 7a 52 6e 64 2c 20  of(zRnd), zRnd, 
1b910 22 72 62 75 5f 76 66 73 5f 25 64 22 2c 20 72 6e  "rbu_vfs_%d", rn
1b920 64 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71  d);.  p->rc = sq
1b930 6c 69 74 65 33 72 62 75 5f 63 72 65 61 74 65 5f  lite3rbu_create_
1b940 76 66 73 28 7a 52 6e 64 2c 20 30 29 3b 0a 20 20  vfs(zRnd, 0);.  
1b950 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1b960 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
1b970 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
1b980 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
1b990 28 7a 52 6e 64 29 3b 0a 20 20 20 20 61 73 73 65  (zRnd);.    asse
1b9a0 72 74 28 20 70 56 66 73 20 29 3b 0a 20 20 20 20  rt( pVfs );.    
1b9b0 70 2d 3e 7a 56 66 73 4e 61 6d 65 20 3d 20 70 56  p->zVfsName = pV
1b9c0 66 73 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 28  fs->zName;.    (
1b9d0 28 72 62 75 5f 76 66 73 2a 29 70 56 66 73 29 2d  (rbu_vfs*)pVfs)-
1b9e0 3e 70 52 62 75 20 3d 20 70 3b 0a 20 20 7d 0a 7d  >pRbu = p;.  }.}
1b9f0 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f 79 20  ../*.** Destroy 
1ba00 74 68 65 20 70 72 69 76 61 74 65 20 56 46 53 20  the private VFS 
1ba10 63 72 65 61 74 65 64 20 66 6f 72 20 74 68 65 20  created for the 
1ba20 72 62 75 20 68 61 6e 64 6c 65 20 70 61 73 73 65  rbu handle passe
1ba30 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 0a 2a 2a  d as the only.**
1ba40 20 61 72 67 75 6d 65 6e 74 20 62 79 20 61 6e 20   argument by an 
1ba50 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20  earlier call to 
1ba60 72 62 75 43 72 65 61 74 65 56 66 73 28 29 2e 0a  rbuCreateVfs()..
1ba70 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
1ba80 62 75 44 65 6c 65 74 65 56 66 73 28 73 71 6c 69  buDeleteVfs(sqli
1ba90 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 69 66  te3rbu *p){.  if
1baa0 28 20 70 2d 3e 7a 56 66 73 4e 61 6d 65 20 29 7b  ( p->zVfsName ){
1bab0 0a 20 20 20 20 73 71 6c 69 74 65 33 72 62 75 5f  .    sqlite3rbu_
1bac0 64 65 73 74 72 6f 79 5f 76 66 73 28 70 2d 3e 7a  destroy_vfs(p->z
1bad0 56 66 73 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d  VfsName);.    p-
1bae0 3e 7a 56 66 73 4e 61 6d 65 20 3d 20 30 3b 0a 20  >zVfsName = 0;. 
1baf0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
1bb00 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 53 51   user-defined SQ
1bb10 4c 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e  L function is in
1bb20 76 6f 6b 65 64 20 77 69 74 68 20 61 20 73 69 6e  voked with a sin
1bb30 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 2d 20 74  gle argument - t
1bb40 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20  he.** name of a 
1bb50 74 61 62 6c 65 20 65 78 70 65 63 74 65 64 20 74  table expected t
1bb60 6f 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  o appear in the 
1bb70 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65 2e  target database.
1bb80 20 49 74 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74   It returns.** t
1bb90 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 75 78  he number of aux
1bba0 69 6c 6c 69 61 72 79 20 69 6e 64 65 78 65 73 20  illiary indexes 
1bbb0 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f  on the table..*/
1bbc0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
1bbd0 49 6e 64 65 78 43 6e 74 46 75 6e 63 28 0a 20 20  IndexCntFunc(.  
1bbe0 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1bbf0 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 56  *pCtx, .  int nV
1bc00 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  al,.  sqlite3_va
1bc10 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20  lue **apVal.){. 
1bc20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 20 3d   sqlite3rbu *p =
1bc30 20 28 73 71 6c 69 74 65 33 72 62 75 2a 29 73 71   (sqlite3rbu*)sq
1bc40 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28  lite3_user_data(
1bc50 70 43 74 78 29 3b 0a 20 20 73 71 6c 69 74 65 33  pCtx);.  sqlite3
1bc60 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
1bc70 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 6d 73  ;.  char *zErrms
1bc80 67 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  g = 0;.  int rc;
1bc90 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 56 61 6c  ..  assert( nVal
1bca0 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 72 63 20 3d  ==1 );.  .  rc =
1bcb0 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43   prepareFreeAndC
1bcc0 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64  ollectError(p->d
1bcd0 62 4d 61 69 6e 2c 20 26 70 53 74 6d 74 2c 20 26  bMain, &pStmt, &
1bce0 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20 20  zErrmsg, .      
1bcf0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
1bd00 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  "SELECT count(*)
1bd10 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
1bd20 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22 57  ter ".        "W
1bd30 48 45 52 45 20 74 79 70 65 3d 27 69 6e 64 65 78  HERE type='index
1bd40 27 20 41 4e 44 20 74 62 6c 5f 6e 61 6d 65 20 3d  ' AND tbl_name =
1bd50 20 25 51 22 2c 20 73 71 6c 69 74 65 33 5f 76 61   %Q", sqlite3_va
1bd60 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30  lue_text(apVal[0
1bd70 5d 29 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  ])).  );.  if( r
1bd80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1bd90 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
1bda0 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 7a  lt_error(pCtx, z
1bdb0 45 72 72 6d 73 67 2c 20 2d 31 29 3b 0a 20 20 7d  Errmsg, -1);.  }
1bdc0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 49  else{.    int nI
1bdd0 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 69 66  ndex = 0;.    if
1bde0 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ( SQLITE_ROW==sq
1bdf0 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
1be00 29 20 29 7b 0a 20 20 20 20 20 20 6e 49 6e 64 65  ) ){.      nInde
1be10 78 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  x = sqlite3_colu
1be20 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29  mn_int(pStmt, 0)
1be30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
1be40 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
1be50 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66  e(pStmt);.    if
1be60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1be70 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1be80 5f 72 65 73 75 6c 74 5f 69 6e 74 28 70 43 74 78  _result_int(pCtx
1be90 2c 20 6e 49 6e 64 65 78 29 3b 0a 20 20 20 20 7d  , nIndex);.    }
1bea0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
1beb0 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
1bec0 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 65  (pCtx, sqlite3_e
1bed0 72 72 6d 73 67 28 70 2d 3e 64 62 4d 61 69 6e 29  rrmsg(p->dbMain)
1bee0 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  , -1);.    }.  }
1bef0 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
1bf00 28 7a 45 72 72 6d 73 67 29 3b 0a 7d 0a 0a 2f 2a  (zErrmsg);.}../*
1bf10 0a 2a 2a 20 49 66 20 74 68 65 20 52 42 55 20 64  .** If the RBU d
1bf20 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 73  atabase contains
1bf30 20 74 68 65 20 72 62 75 5f 63 6f 75 6e 74 20 74   the rbu_count t
1bf40 61 62 6c 65 2c 20 75 73 65 20 69 74 20 74 6f 20  able, use it to 
1bf50 69 6e 69 74 69 61 6c 69 7a 65 0a 2a 2a 20 74 68  initialize.** th
1bf60 65 20 73 71 6c 69 74 65 33 72 62 75 2e 6e 50 68  e sqlite3rbu.nPh
1bf70 61 73 65 4f 6e 65 53 74 65 70 20 76 61 72 69 61  aseOneStep varia
1bf80 62 6c 65 2e 20 54 68 65 20 73 63 68 65 6d 61 20  ble. The schema 
1bf90 6f 66 20 74 68 65 20 72 62 75 5f 63 6f 75 6e 74  of the rbu_count
1bfa0 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20 61 73 73   table.** is ass
1bfb0 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20  umed to contain 
1bfc0 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 73  the same columns
1bfd0 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45   as:.**.**   CRE
1bfe0 41 54 45 20 54 41 42 4c 45 20 72 62 75 5f 63 6f  ATE TABLE rbu_co
1bff0 75 6e 74 28 74 62 6c 20 54 45 58 54 20 50 52 49  unt(tbl TEXT PRI
1c000 4d 41 52 59 20 4b 45 59 2c 20 63 6e 74 20 49 4e  MARY KEY, cnt IN
1c010 54 45 47 45 52 29 20 57 49 54 48 4f 55 54 20 52  TEGER) WITHOUT R
1c020 4f 57 49 44 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 72  OWID;.**.** Ther
1c030 65 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20  e should be one 
1c040 72 6f 77 20 69 6e 20 74 68 65 20 74 61 62 6c 65  row in the table
1c050 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 5f 78   for each data_x
1c060 78 78 20 74 61 62 6c 65 20 69 6e 20 74 68 65 0a  xx table in the.
1c070 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65  ** database. The
1c080 20 27 74 62 6c 27 20 63 6f 6c 75 6d 6e 20 73 68   'tbl' column sh
1c090 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 20 74 68 65  ould contain the
1c0a0 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61 5f   name of a data_
1c0b0 78 78 78 20 74 61 62 6c 65 2c 0a 2a 2a 20 61 6e  xxx table,.** an
1c0c0 64 20 74 68 65 20 63 6e 74 20 63 6f 6c 75 6d 6e  d the cnt column
1c0d0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
1c0e0 6f 77 73 20 69 74 20 63 6f 6e 74 61 69 6e 73 2e  ows it contains.
1c0f0 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 72 62  .**.** sqlite3rb
1c100 75 2e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20  u.nPhaseOneStep 
1c110 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
1c120 6f 20 74 68 65 20 73 75 6d 20 6f 66 20 28 31 20  o the sum of (1 
1c130 2b 20 6e 49 6e 64 65 78 29 20 2a 20 63 6e 74 0a  + nIndex) * cnt.
1c140 2a 2a 20 66 6f 72 20 61 6c 6c 20 72 6f 77 73 20  ** for all rows 
1c150 69 6e 20 74 68 65 20 72 62 75 5f 63 6f 75 6e 74  in the rbu_count
1c160 20 74 61 62 6c 65 2c 20 77 68 65 72 65 20 6e 49   table, where nI
1c170 6e 64 65 78 20 69 73 20 74 68 65 20 6e 75 6d 62  ndex is the numb
1c180 65 72 20 6f 66 20 0a 2a 2a 20 69 6e 64 65 78 65  er of .** indexe
1c190 73 20 6f 6e 20 74 68 65 20 63 6f 72 72 65 73 70  s on the corresp
1c1a0 6f 6e 64 69 6e 67 20 74 61 72 67 65 74 20 64 61  onding target da
1c1b0 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2f  tabase table..*/
1c1c0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
1c1d0 49 6e 69 74 50 68 61 73 65 4f 6e 65 53 74 65 70  InitPhaseOneStep
1c1e0 73 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29  s(sqlite3rbu *p)
1c1f0 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
1c200 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c210 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1c220 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  tmt = 0;.    int
1c230 20 62 45 78 69 73 74 73 20 3d 20 30 3b 20 20 20   bExists = 0;   
1c240 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c250 54 72 75 65 20 69 66 20 72 62 75 5f 63 6f 75 6e  True if rbu_coun
1c260 74 20 65 78 69 73 74 73 20 2a 2f 0a 0a 20 20 20  t exists */..   
1c270 20 70 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65   p->nPhaseOneSte
1c280 70 20 3d 20 2d 31 3b 0a 0a 20 20 20 20 70 2d 3e  p = -1;..    p->
1c290 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
1c2a0 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e  ate_function(p->
1c2b0 64 62 52 62 75 2c 20 0a 20 20 20 20 20 20 20 20  dbRbu, .        
1c2c0 22 72 62 75 5f 69 6e 64 65 78 5f 63 6e 74 22 2c  "rbu_index_cnt",
1c2d0 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   1, SQLITE_UTF8,
1c2e0 20 28 76 6f 69 64 2a 29 70 2c 20 72 62 75 49 6e   (void*)p, rbuIn
1c2f0 64 65 78 43 6e 74 46 75 6e 63 2c 20 30 2c 20 30  dexCntFunc, 0, 0
1c300 0a 20 20 20 20 29 3b 0a 20 20 0a 20 20 20 20 2f  .    );.  .    /
1c310 2a 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20  * Check for the 
1c320 72 62 75 5f 63 6f 75 6e 74 20 74 61 62 6c 65 2e  rbu_count table.
1c330 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20   If it does not 
1c340 65 78 69 73 74 2c 20 6f 72 20 69 66 20 61 6e 20  exist, or if an 
1c350 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20 6f 63 63  error.    ** occ
1c360 75 72 73 2c 20 6e 50 68 61 73 65 4f 6e 65 53 74  urs, nPhaseOneSt
1c370 65 70 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 20  ep will be left 
1c380 73 65 74 20 74 6f 20 2d 31 2e 20 2a 2f 0a 20 20  set to -1. */.  
1c390 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1c3a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c3b0 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 41  p->rc = prepareA
1c3c0 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70  ndCollectError(p
1c3d0 2d 3e 64 62 52 62 75 2c 20 26 70 53 74 6d 74 2c  ->dbRbu, &pStmt,
1c3e0 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20   &p->zErrmsg,.  
1c3f0 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
1c400 31 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  1 FROM sqlite_ma
1c410 73 74 65 72 20 57 48 45 52 45 20 74 62 6c 5f 6e  ster WHERE tbl_n
1c420 61 6d 65 20 3d 20 27 72 62 75 5f 63 6f 75 6e 74  ame = 'rbu_count
1c430 27 22 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  '".      );.    
1c440 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  }.    if( p->rc=
1c450 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c460 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52      if( SQLITE_R
1c470 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
1c480 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20  (pStmt) ){.     
1c490 20 20 20 62 45 78 69 73 74 73 20 3d 20 31 3b 0a     bExists = 1;.
1c4a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
1c4b0 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69  >rc = sqlite3_fi
1c4c0 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
1c4d0 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
1c4e0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1c4f0 20 26 26 20 62 45 78 69 73 74 73 20 29 7b 0a 20   && bExists ){. 
1c500 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65       p->rc = pre
1c510 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  pareAndCollectEr
1c520 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20 26 70  ror(p->dbRbu, &p
1c530 53 74 6d 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73  Stmt, &p->zErrms
1c540 67 2c 0a 20 20 20 20 20 20 20 20 20 20 22 53 45  g,.          "SE
1c550 4c 45 43 54 20 73 75 6d 28 63 6e 74 20 2a 20 28  LECT sum(cnt * (
1c560 31 20 2b 20 72 62 75 5f 69 6e 64 65 78 5f 63 6e  1 + rbu_index_cn
1c570 74 28 72 62 75 5f 74 61 72 67 65 74 5f 6e 61 6d  t(rbu_target_nam
1c580 65 28 74 62 6c 29 29 29 29 22 0a 20 20 20 20 20  e(tbl))))".     
1c590 20 20 20 20 20 22 46 52 4f 4d 20 72 62 75 5f 63       "FROM rbu_c
1c5a0 6f 75 6e 74 22 0a 20 20 20 20 20 20 29 3b 0a 20  ount".      );. 
1c5b0 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
1c5c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c5d0 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
1c5e0 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
1c5f0 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20  p(pStmt) ){.    
1c600 20 20 20 20 20 20 70 2d 3e 6e 50 68 61 73 65 4f        p->nPhaseO
1c610 6e 65 53 74 65 70 20 3d 20 73 71 6c 69 74 65 33  neStep = sqlite3
1c620 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53  _column_int64(pS
1c630 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  tmt, 0);.       
1c640 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63   }.        p->rc
1c650 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   = sqlite3_final
1c660 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
1c670 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
1c680 0a 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  ..static sqlite3
1c690 72 62 75 20 2a 6f 70 65 6e 52 62 75 48 61 6e 64  rbu *openRbuHand
1c6a0 6c 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  le(.  const char
1c6b0 20 2a 7a 54 61 72 67 65 74 2c 20 0a 20 20 63 6f   *zTarget, .  co
1c6c0 6e 73 74 20 63 68 61 72 20 2a 7a 52 62 75 2c 0a  nst char *zRbu,.
1c6d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
1c6e0 74 61 74 65 0a 29 7b 0a 20 20 73 71 6c 69 74 65  tate.){.  sqlite
1c6f0 33 72 62 75 20 2a 70 3b 0a 20 20 73 69 7a 65 5f  3rbu *p;.  size_
1c700 74 20 6e 54 61 72 67 65 74 20 3d 20 7a 54 61 72  t nTarget = zTar
1c710 67 65 74 20 3f 20 73 74 72 6c 65 6e 28 7a 54 61  get ? strlen(zTa
1c720 72 67 65 74 29 20 3a 20 30 3b 0a 20 20 73 69 7a  rget) : 0;.  siz
1c730 65 5f 74 20 6e 52 62 75 20 3d 20 73 74 72 6c 65  e_t nRbu = strle
1c740 6e 28 7a 52 62 75 29 3b 0a 20 20 73 69 7a 65 5f  n(zRbu);.  size_
1c750 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66  t nByte = sizeof
1c760 28 73 71 6c 69 74 65 33 72 62 75 29 20 2b 20 6e  (sqlite3rbu) + n
1c770 54 61 72 67 65 74 2b 31 20 2b 20 6e 52 62 75 2b  Target+1 + nRbu+
1c780 31 3b 0a 0a 20 20 70 20 3d 20 28 73 71 6c 69 74  1;..  p = (sqlit
1c790 65 33 72 62 75 2a 29 73 71 6c 69 74 65 33 5f 6d  e3rbu*)sqlite3_m
1c7a0 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29 3b 0a  alloc64(nByte);.
1c7b0 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 52    if( p ){.    R
1c7c0 62 75 53 74 61 74 65 20 2a 70 53 74 61 74 65 20  buState *pState 
1c7d0 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65  = 0;..    /* Cre
1c7e0 61 74 65 20 74 68 65 20 63 75 73 74 6f 6d 20 56  ate the custom V
1c7f0 46 53 2e 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  FS. */.    memse
1c800 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  t(p, 0, sizeof(s
1c810 71 6c 69 74 65 33 72 62 75 29 29 3b 0a 20 20 20  qlite3rbu));.   
1c820 20 72 62 75 43 72 65 61 74 65 56 66 73 28 70 29   rbuCreateVfs(p)
1c830 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74  ;..    /* Open t
1c840 68 65 20 74 61 72 67 65 74 2c 20 52 42 55 20 61  he target, RBU a
1c850 6e 64 20 73 74 61 74 65 20 64 61 74 61 62 61 73  nd state databas
1c860 65 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  es */.    if( p-
1c870 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1c880 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 43  {.      char *pC
1c890 73 72 20 3d 20 28 63 68 61 72 2a 29 26 70 5b 31  sr = (char*)&p[1
1c8a0 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 52 65  ];.      int bRe
1c8b0 74 72 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  try = 0;.      i
1c8c0 66 28 20 7a 54 61 72 67 65 74 20 29 7b 0a 20 20  f( zTarget ){.  
1c8d0 20 20 20 20 20 20 70 2d 3e 7a 54 61 72 67 65 74        p->zTarget
1c8e0 20 3d 20 70 43 73 72 3b 0a 20 20 20 20 20 20 20   = pCsr;.       
1c8f0 20 6d 65 6d 63 70 79 28 70 2d 3e 7a 54 61 72 67   memcpy(p->zTarg
1c900 65 74 2c 20 7a 54 61 72 67 65 74 2c 20 6e 54 61  et, zTarget, nTa
1c910 72 67 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 20  rget+1);.       
1c920 20 70 43 73 72 20 2b 3d 20 6e 54 61 72 67 65 74   pCsr += nTarget
1c930 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  +1;.      }.    
1c940 20 20 70 2d 3e 7a 52 62 75 20 3d 20 70 43 73 72    p->zRbu = pCsr
1c950 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
1c960 2d 3e 7a 52 62 75 2c 20 7a 52 62 75 2c 20 6e 52  ->zRbu, zRbu, nR
1c970 62 75 2b 31 29 3b 0a 20 20 20 20 20 20 70 43 73  bu+1);.      pCs
1c980 72 20 2b 3d 20 6e 52 62 75 2b 31 3b 0a 20 20 20  r += nRbu+1;.   
1c990 20 20 20 69 66 28 20 7a 53 74 61 74 65 20 29 7b     if( zState ){
1c9a0 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 53 74 61  .        p->zSta
1c9b0 74 65 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28  te = rbuMPrintf(
1c9c0 70 2c 20 22 25 73 22 2c 20 7a 53 74 61 74 65 29  p, "%s", zState)
1c9d0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1c9e0 20 2f 2a 20 49 66 20 74 68 65 20 66 69 72 73 74   /* If the first
1c9f0 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e   attempt to open
1ca00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1ca10 6c 65 20 66 61 69 6c 73 20 61 6e 64 20 74 68 65  le fails and the
1ca20 20 62 52 65 74 72 79 0a 20 20 20 20 20 20 2a 2a   bRetry.      **
1ca30 20 66 6c 61 67 20 69 74 20 73 65 74 2c 20 74 68   flag it set, th
1ca40 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  is means that th
1ca50 65 20 64 62 20 77 61 73 20 6e 6f 74 20 6f 70 65  e db was not ope
1ca60 6e 65 64 20 62 65 63 61 75 73 65 20 69 74 20 73  ned because it s
1ca70 65 65 6d 65 64 0a 20 20 20 20 20 20 2a 2a 20 74  eemed.      ** t
1ca80 6f 20 62 65 20 61 20 77 61 6c 2d 6d 6f 64 65 20  o be a wal-mode 
1ca90 64 62 2e 20 42 75 74 2c 20 74 68 69 73 20 6d 61  db. But, this ma
1caa0 79 20 68 61 76 65 20 68 61 70 70 65 6e 65 64 20  y have happened 
1cab0 64 75 65 20 74 6f 20 61 6e 20 65 61 72 6c 69 65  due to an earlie
1cac0 72 0a 20 20 20 20 20 20 2a 2a 20 52 42 55 20 76  r.      ** RBU v
1cad0 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 20  acuum operation 
1cae0 6c 65 61 76 69 6e 67 20 61 6e 20 6f 6c 64 20 77  leaving an old w
1caf0 61 6c 20 66 69 6c 65 20 69 6e 20 74 68 65 20 64  al file in the d
1cb00 69 72 65 63 74 6f 72 79 2e 0a 20 20 20 20 20 20  irectory..      
1cb10 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  ** If this is th
1cb20 65 20 63 61 73 65 2c 20 69 74 20 77 69 6c 6c 20  e case, it will 
1cb30 68 61 76 65 20 62 65 65 6e 20 63 68 65 63 6b 70  have been checkp
1cb40 6f 69 6e 74 65 64 20 61 6e 64 20 64 65 6c 65 74  ointed and delet
1cb50 65 64 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e  ed.      ** when
1cb60 20 74 68 65 20 68 61 6e 64 6c 65 20 77 61 73 20   the handle was 
1cb70 63 6c 6f 73 65 64 20 61 6e 64 20 61 20 73 65 63  closed and a sec
1cb80 6f 6e 64 20 61 74 74 65 6d 70 74 20 74 6f 20 6f  ond attempt to o
1cb90 70 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a  pen the .      *
1cba0 2a 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 73  * database may s
1cbb0 75 63 63 65 65 64 2e 20 20 2a 2f 0a 20 20 20 20  ucceed.  */.    
1cbc0 20 20 72 62 75 4f 70 65 6e 44 61 74 61 62 61 73    rbuOpenDatabas
1cbd0 65 28 70 2c 20 26 62 52 65 74 72 79 29 3b 0a 20  e(p, &bRetry);. 
1cbe0 20 20 20 20 20 69 66 28 20 62 52 65 74 72 79 20       if( bRetry 
1cbf0 29 7b 0a 20 20 20 20 20 20 20 20 72 62 75 4f 70  ){.        rbuOp
1cc00 65 6e 44 61 74 61 62 61 73 65 28 70 2c 20 30 29  enDatabase(p, 0)
1cc10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1cc20 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  .    if( p->rc==
1cc30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1cc40 20 20 20 70 53 74 61 74 65 20 3d 20 72 62 75 4c     pState = rbuL
1cc50 6f 61 64 53 74 61 74 65 28 70 29 3b 0a 20 20 20  oadState(p);.   
1cc60 20 20 20 61 73 73 65 72 74 28 20 70 53 74 61 74     assert( pStat
1cc70 65 20 7c 7c 20 70 2d 3e 72 63 21 3d 53 51 4c 49  e || p->rc!=SQLI
1cc80 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69  TE_OK );.      i
1cc90 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1cca0 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 20 20 20 20  _OK ){..        
1ccb0 69 66 28 20 70 53 74 61 74 65 2d 3e 65 53 74 61  if( pState->eSta
1ccc0 67 65 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20  ge==0 ){ .      
1ccd0 20 20 20 20 72 62 75 44 65 6c 65 74 65 4f 61 6c      rbuDeleteOal
1cce0 46 69 6c 65 28 70 29 3b 0a 20 20 20 20 20 20 20  File(p);.       
1ccf0 20 20 20 72 62 75 49 6e 69 74 50 68 61 73 65 4f     rbuInitPhaseO
1cd00 6e 65 53 74 65 70 73 28 70 29 3b 0a 20 20 20 20  neSteps(p);.    
1cd10 20 20 20 20 20 20 70 2d 3e 65 53 74 61 67 65 20        p->eStage 
1cd20 3d 20 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 3b  = RBU_STAGE_OAL;
1cd30 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1cd40 20 20 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74            p->eSt
1cd50 61 67 65 20 3d 20 70 53 74 61 74 65 2d 3e 65 53  age = pState->eS
1cd60 74 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  tage;.          
1cd70 70 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70  p->nPhaseOneStep
1cd80 20 3d 20 70 53 74 61 74 65 2d 3e 6e 50 68 61 73   = pState->nPhas
1cd90 65 4f 6e 65 53 74 65 70 3b 0a 20 20 20 20 20 20  eOneStep;.      
1cda0 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e    }.        p->n
1cdb0 50 72 6f 67 72 65 73 73 20 3d 20 70 53 74 61 74  Progress = pStat
1cdc0 65 2d 3e 6e 50 72 6f 67 72 65 73 73 3b 0a 20 20  e->nProgress;.  
1cdd0 20 20 20 20 20 20 70 2d 3e 69 4f 61 6c 53 7a 20        p->iOalSz 
1cde0 3d 20 70 53 74 61 74 65 2d 3e 69 4f 61 6c 53 7a  = pState->iOalSz
1cdf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ce00 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
1ce10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
1ce20 70 2d 3e 65 53 74 61 67 65 21 3d 30 20 29 3b 0a  p->eStage!=0 );.
1ce30 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  .    if( p->rc==
1ce40 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e  SQLITE_OK && p->
1ce50 70 54 61 72 67 65 74 46 64 2d 3e 70 57 61 6c 46  pTargetFd->pWalF
1ce60 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  d ){.      if( p
1ce70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  ->eStage==RBU_ST
1ce80 41 47 45 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 20  AGE_OAL ){.     
1ce90 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
1cea0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
1ceb0 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71   p->zErrmsg = sq
1cec0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 63  lite3_mprintf("c
1ced0 61 6e 6e 6f 74 20 75 70 64 61 74 65 20 77 61 6c  annot update wal
1cee0 20 6d 6f 64 65 20 64 61 74 61 62 61 73 65 22 29   mode database")
1cef0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1cf00 28 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55  ( p->eStage==RBU
1cf10 5f 53 54 41 47 45 5f 4d 4f 56 45 20 29 7b 0a 20  _STAGE_MOVE ){. 
1cf20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 67 65         p->eStage
1cf30 20 3d 20 52 42 55 5f 53 54 41 47 45 5f 43 4b 50   = RBU_STAGE_CKP
1cf40 54 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53  T;.        p->nS
1cf50 74 65 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  tep = 0;.      }
1cf60 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
1cf70 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1cf80 20 0a 20 20 20 20 20 26 26 20 28 70 2d 3e 65 53   .     && (p->eS
1cf90 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f  tage==RBU_STAGE_
1cfa0 4f 41 4c 20 7c 7c 20 70 2d 3e 65 53 74 61 67 65  OAL || p->eStage
1cfb0 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45  ==RBU_STAGE_MOVE
1cfc0 29 0a 20 20 20 20 20 26 26 20 70 53 74 61 74 65  ).     && pState
1cfd0 2d 3e 65 53 74 61 67 65 21 3d 30 0a 20 20 20 20  ->eStage!=0.    
1cfe0 29 7b 0a 20 20 20 20 20 20 72 62 75 5f 66 69 6c  ){.      rbu_fil
1cff0 65 20 2a 70 46 64 20 3d 20 28 72 62 75 49 73 56  e *pFd = (rbuIsV
1d000 61 63 75 75 6d 28 70 29 20 3f 20 70 2d 3e 70 52  acuum(p) ? p->pR
1d010 62 75 46 64 20 3a 20 70 2d 3e 70 54 61 72 67 65  buFd : p->pTarge
1d020 74 46 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tFd);.      if( 
1d030 70 46 64 2d 3e 69 43 6f 6f 6b 69 65 21 3d 70 53  pFd->iCookie!=pS
1d040 74 61 74 65 2d 3e 69 43 6f 6f 6b 69 65 20 29 7b  tate->iCookie ){
1d050 20 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 41     .        /* A
1d060 74 20 74 68 69 73 20 70 6f 69 6e 74 20 28 70 54  t this point (pT
1d070 61 72 67 65 74 46 64 2d 3e 69 43 6f 6f 6b 69 65  argetFd->iCookie
1d080 29 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76  ) contains the v
1d090 61 6c 75 65 20 6f 66 20 74 68 65 0a 20 20 20 20  alue of the.    
1d0a0 20 20 20 20 2a 2a 20 63 68 61 6e 67 65 2d 63 6f      ** change-co
1d0b0 75 6e 74 65 72 20 63 6f 6f 6b 69 65 20 28 74 68  unter cookie (th
1d0c0 65 20 74 68 69 6e 67 20 74 68 61 74 20 67 65 74  e thing that get
1d0d0 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68  s incremented wh
1d0e0 65 6e 20 61 20 0a 20 20 20 20 20 20 20 20 2a 2a  en a .        **
1d0f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1d100 63 6f 6d 6d 69 74 74 65 64 20 69 6e 20 72 6f 6c  committed in rol
1d110 6c 62 61 63 6b 20 6d 6f 64 65 29 20 63 75 72 72  lback mode) curr
1d120 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 6f 6e 20  ently stored on 
1d130 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
1d140 20 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61   1 of the databa
1d150 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
1d160 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
1d170 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
1d180 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71   p->zErrmsg = sq
1d190 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 64  lite3_mprintf("d
1d1a0 61 74 61 62 61 73 65 20 6d 6f 64 69 66 69 65 64  atabase modified
1d1b0 20 64 75 72 69 6e 67 20 72 62 75 20 25 73 22 2c   during rbu %s",
1d1c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 72 62  .            (rb
1d1d0 75 49 73 56 61 63 75 75 6d 28 70 29 20 3f 20 22  uIsVacuum(p) ? "
1d1e0 76 61 63 75 75 6d 22 20 3a 20 22 75 70 64 61 74  vacuum" : "updat
1d1f0 65 22 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  e").        );. 
1d200 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1d210 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1d220 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d230 69 66 28 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52  if( p->eStage==R
1d240 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 29 7b 0a  BU_STAGE_OAL ){.
1d250 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 20          sqlite3 
1d260 2a 64 62 20 3d 20 70 2d 3e 64 62 4d 61 69 6e 3b  *db = p->dbMain;
1d270 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
1d280 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
1d290 3e 64 62 52 62 75 2c 20 22 42 45 47 49 4e 22 2c  >dbRbu, "BEGIN",
1d2a0 20 30 2c 20 30 2c 20 26 70 2d 3e 7a 45 72 72 6d   0, 0, &p->zErrm
1d2b0 73 67 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  sg);..        /*
1d2c0 20 50 6f 69 6e 74 20 74 68 65 20 6f 62 6a 65 63   Point the objec
1d2d0 74 20 69 74 65 72 61 74 6f 72 20 61 74 20 74 68  t iterator at th
1d2e0 65 20 66 69 72 73 74 20 6f 62 6a 65 63 74 20 2a  e first object *
1d2f0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  /.        if( p-
1d300 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1d310 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72  {.          p->r
1d320 63 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 46 69  c = rbuObjIterFi
1d330 72 73 74 28 70 2c 20 26 70 2d 3e 6f 62 6a 69 74  rst(p, &p->objit
1d340 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  er);.        }..
1d350 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
1d360 65 20 52 42 55 20 64 61 74 61 62 61 73 65 20 63  e RBU database c
1d370 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 5f  ontains no data_
1d380 78 78 78 20 74 61 62 6c 65 73 2c 20 64 65 63 6c  xxx tables, decl
1d390 61 72 65 20 74 68 65 20 52 42 55 0a 20 20 20 20  are the RBU.    
1d3a0 20 20 20 20 2a 2a 20 75 70 64 61 74 65 20 66 69      ** update fi
1d3b0 6e 69 73 68 65 64 2e 20 20 2a 2f 0a 20 20 20 20  nished.  */.    
1d3c0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
1d3d0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 6f  QLITE_OK && p->o
1d3e0 62 6a 69 74 65 72 2e 7a 54 62 6c 3d 3d 30 20 29  bjiter.zTbl==0 )
1d3f0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72  {.          p->r
1d400 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
1d410 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 65 53  .          p->eS
1d420 74 61 67 65 20 3d 20 52 42 55 5f 53 54 41 47 45  tage = RBU_STAGE
1d430 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d  _DONE;.        }
1d440 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1d450 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1d460 45 5f 4f 4b 20 26 26 20 70 53 74 61 74 65 2d 3e  E_OK && pState->
1d470 65 53 74 61 67 65 3d 3d 30 20 26 26 20 72 62 75  eStage==0 && rbu
1d480 49 73 56 61 63 75 75 6d 28 70 29 20 29 7b 0a 20  IsVacuum(p) ){. 
1d490 20 20 20 20 20 20 20 20 20 20 20 72 62 75 43 6f             rbuCo
1d4a0 70 79 50 72 61 67 6d 61 28 70 2c 20 22 70 61 67  pyPragma(p, "pag
1d4b0 65 5f 73 69 7a 65 22 29 3b 0a 20 20 20 20 20 20  e_size");.      
1d4c0 20 20 20 20 20 20 72 62 75 43 6f 70 79 50 72 61        rbuCopyPra
1d4d0 67 6d 61 28 70 2c 20 22 61 75 74 6f 5f 76 61 63  gma(p, "auto_vac
1d4e0 75 75 6d 22 29 3b 0a 20 20 20 20 20 20 20 20 20  uum");.         
1d4f0 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   }..          /*
1d500 20 4f 70 65 6e 20 74 72 61 6e 73 61 63 74 69 6f   Open transactio
1d510 6e 73 20 62 6f 74 68 20 64 61 74 61 62 61 73 65  ns both database
1d520 73 2e 20 54 68 65 20 2a 2d 6f 61 6c 20 66 69 6c  s. The *-oal fil
1d530 65 20 69 73 20 6f 70 65 6e 65 64 20 6f 72 0a 20  e is opened or. 
1d540 20 20 20 20 20 20 20 20 20 2a 2a 20 63 72 65 61           ** crea
1d550 74 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ted at this poin
1d560 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  t. */.          
1d570 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1d580 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1d590 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
1d5a0 74 65 33 5f 65 78 65 63 28 64 62 2c 20 22 42 45  te3_exec(db, "BE
1d5b0 47 49 4e 20 49 4d 4d 45 44 49 41 54 45 22 2c 20  GIN IMMEDIATE", 
1d5c0 30 2c 20 30 2c 20 26 70 2d 3e 7a 45 72 72 6d 73  0, 0, &p->zErrms
1d5d0 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  g);.          }.
1d5e0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68  .          /* Ch
1d5f0 65 63 6b 20 69 66 20 74 68 65 20 6d 61 69 6e 20  eck if the main 
1d600 64 61 74 61 62 61 73 65 20 69 73 20 61 20 7a 69  database is a zi
1d610 70 76 66 73 20 64 62 2e 20 49 66 20 69 74 20 69  pvfs db. If it i
1d620 73 2c 20 73 65 74 20 74 68 65 20 75 70 70 65 72  s, set the upper
1d630 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6c 65  .          ** le
1d640 76 65 6c 20 70 61 67 65 72 20 74 6f 20 75 73 65  vel pager to use
1d650 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f   "journal_mode=o
1d660 66 66 22 2e 20 54 68 69 73 20 70 72 65 76 65 6e  ff". This preven
1d670 74 73 20 69 74 20 66 72 6f 6d 20 0a 20 20 20 20  ts it from .    
1d680 20 20 20 20 20 20 2a 2a 20 67 65 6e 65 72 61 74        ** generat
1d690 69 6e 67 20 61 20 6c 61 72 67 65 20 6a 6f 75 72  ing a large jour
1d6a0 6e 61 6c 20 75 73 69 6e 67 20 61 20 74 65 6d 70  nal using a temp
1d6b0 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20   file.  */.     
1d6c0 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
1d6d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d6e0 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 72 63           int frc
1d6f0 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
1d700 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 6d 61 69  control(db, "mai
1d710 6e 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  n", SQLITE_FCNTL
1d720 5f 5a 49 50 56 46 53 2c 20 30 29 3b 0a 20 20 20  _ZIPVFS, 0);.   
1d730 20 20 20 20 20 20 20 20 20 69 66 28 20 66 72 63           if( frc
1d740 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1d750 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
1d760 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
1d770 63 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  c(.             
1d780 20 20 20 64 62 2c 20 22 50 52 41 47 4d 41 20 6a     db, "PRAGMA j
1d790 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66 22  ournal_mode=off"
1d7a0 2c 30 2c 30 2c 26 70 2d 3e 7a 45 72 72 6d 73 67  ,0,0,&p->zErrmsg
1d7b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
1d7c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
1d7d0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
1d7e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1d7f0 20 20 20 20 20 20 20 20 20 20 20 20 72 62 75 53              rbuS
1d800 65 74 75 70 4f 61 6c 28 70 2c 20 70 53 74 61 74  etupOal(p, pStat
1d810 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
1d820 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d830 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 53 74  }else if( p->eSt
1d840 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4d  age==RBU_STAGE_M
1d850 4f 56 45 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  OVE ){.        /
1d860 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20  * no-op */.     
1d870 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 53   }else if( p->eS
1d880 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f  tage==RBU_STAGE_
1d890 43 4b 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20  CKPT ){.        
1d8a0 72 62 75 53 65 74 75 70 43 68 65 63 6b 70 6f 69  rbuSetupCheckpoi
1d8b0 6e 74 28 70 2c 20 70 53 74 61 74 65 29 3b 0a 20  nt(p, pState);. 
1d8c0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
1d8d0 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  ->eStage==RBU_ST
1d8e0 41 47 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  AGE_DONE ){.    
1d8f0 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
1d900 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d  TE_DONE;.      }
1d910 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 2d  else{.        p-
1d920 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  >rc = SQLITE_COR
1d930 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RUPT;.      }.  
1d940 20 20 7d 0a 0a 20 20 20 20 72 62 75 46 72 65 65    }..    rbuFree
1d950 53 74 61 74 65 28 70 53 74 61 74 65 29 3b 0a 20  State(pState);. 
1d960 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a   }..  return p;.
1d970 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
1d980 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20  e and return an 
1d990 52 42 55 20 68 61 6e 64 6c 65 20 77 69 74 68 20  RBU handle with 
1d9a0 61 6c 6c 20 66 69 65 6c 64 73 20 7a 65 72 6f 65  all fields zeroe
1d9b0 64 20 65 78 63 65 70 74 20 66 6f 72 20 74 68 65  d except for the
1d9c0 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2c 20  .** error code, 
1d9d0 77 68 69 63 68 20 69 73 20 73 65 74 20 74 6f 20  which is set to 
1d9e0 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2e 0a 2a  SQLITE_MISUSE..*
1d9f0 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
1da00 72 62 75 20 2a 72 62 75 4d 69 73 75 73 65 45 72  rbu *rbuMisuseEr
1da10 72 6f 72 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  ror(void){.  sql
1da20 69 74 65 33 72 62 75 20 2a 70 52 65 74 3b 0a 20  ite3rbu *pRet;. 
1da30 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 5f   pRet = sqlite3_
1da40 6d 61 6c 6c 6f 63 36 34 28 73 69 7a 65 6f 66 28  malloc64(sizeof(
1da50 73 71 6c 69 74 65 33 72 62 75 29 29 3b 0a 20 20  sqlite3rbu));.  
1da60 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20  if( pRet ){.    
1da70 6d 65 6d 73 65 74 28 70 52 65 74 2c 20 30 2c 20  memset(pRet, 0, 
1da80 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 72 62  sizeof(sqlite3rb
1da90 75 29 29 3b 0a 20 20 20 20 70 52 65 74 2d 3e 72  u));.    pRet->r
1daa0 63 20 3d 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  c = SQLITE_MISUS
1dab0 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  E;.  }.  return 
1dac0 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  pRet;.}../*.** O
1dad0 70 65 6e 20 61 6e 64 20 72 65 74 75 72 6e 20 61  pen and return a
1dae0 20 6e 65 77 20 52 42 55 20 68 61 6e 64 6c 65 2e   new RBU handle.
1daf0 20 0a 2a 2f 0a 73 71 6c 69 74 65 33 72 62 75 20   .*/.sqlite3rbu 
1db00 2a 73 71 6c 69 74 65 33 72 62 75 5f 6f 70 65 6e  *sqlite3rbu_open
1db10 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
1db20 7a 54 61 72 67 65 74 2c 20 0a 20 20 63 6f 6e 73  zTarget, .  cons
1db30 74 20 63 68 61 72 20 2a 7a 52 62 75 2c 0a 20 20  t char *zRbu,.  
1db40 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61  const char *zSta
1db50 74 65 0a 29 7b 0a 20 20 69 66 28 20 7a 54 61 72  te.){.  if( zTar
1db60 67 65 74 3d 3d 30 20 7c 7c 20 7a 52 62 75 3d 3d  get==0 || zRbu==
1db70 30 20 29 7b 20 72 65 74 75 72 6e 20 72 62 75 4d  0 ){ return rbuM
1db80 69 73 75 73 65 45 72 72 6f 72 28 29 3b 20 7d 0a  isuseError(); }.
1db90 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b    /* TODO: Check
1dba0 20 74 68 61 74 20 7a 54 61 72 67 65 74 20 61 6e   that zTarget an
1dbb0 64 20 7a 52 62 75 20 61 72 65 20 6e 6f 6e 2d 4e  d zRbu are non-N
1dbc0 55 4c 4c 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ULL */.  return 
1dbd0 6f 70 65 6e 52 62 75 48 61 6e 64 6c 65 28 7a 54  openRbuHandle(zT
1dbe0 61 72 67 65 74 2c 20 7a 52 62 75 2c 20 7a 53 74  arget, zRbu, zSt
1dbf0 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  ate);.}../*.** O
1dc00 70 65 6e 20 61 20 68 61 6e 64 6c 65 20 74 6f 20  pen a handle to 
1dc10 62 65 67 69 6e 20 6f 72 20 72 65 73 75 6d 65 20  begin or resume 
1dc20 61 6e 20 52 42 55 20 56 41 43 55 55 4d 20 6f 70  an RBU VACUUM op
1dc30 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69  eration..*/.sqli
1dc40 74 65 33 72 62 75 20 2a 73 71 6c 69 74 65 33 72  te3rbu *sqlite3r
1dc50 62 75 5f 76 61 63 75 75 6d 28 0a 20 20 63 6f 6e  bu_vacuum(.  con
1dc60 73 74 20 63 68 61 72 20 2a 7a 54 61 72 67 65 74  st char *zTarget
1dc70 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
1dc80 2a 7a 53 74 61 74 65 0a 29 7b 0a 20 20 69 66 28  *zState.){.  if(
1dc90 20 7a 54 61 72 67 65 74 3d 3d 30 20 29 7b 20 72   zTarget==0 ){ r
1dca0 65 74 75 72 6e 20 72 62 75 4d 69 73 75 73 65 45  eturn rbuMisuseE
1dcb0 72 72 6f 72 28 29 3b 20 7d 0a 20 20 2f 2a 20 54  rror(); }.  /* T
1dcc0 4f 44 4f 3a 20 43 68 65 63 6b 20 74 68 61 74 20  ODO: Check that 
1dcd0 62 6f 74 68 20 61 72 67 75 6d 65 6e 74 73 20 61  both arguments a
1dce0 72 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 2a 2f 0a 20  re non-NULL */. 
1dcf0 20 72 65 74 75 72 6e 20 6f 70 65 6e 52 62 75 48   return openRbuH
1dd00 61 6e 64 6c 65 28 30 2c 20 7a 54 61 72 67 65 74  andle(0, zTarget
1dd10 2c 20 7a 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a  , zState);.}../*
1dd20 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
1dd30 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 75  atabase handle u
1dd40 73 65 64 20 62 79 20 70 52 62 75 2e 0a 2a 2f 0a  sed by pRbu..*/.
1dd50 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33  sqlite3 *sqlite3
1dd60 72 62 75 5f 64 62 28 73 71 6c 69 74 65 33 72 62  rbu_db(sqlite3rb
1dd70 75 20 2a 70 52 62 75 2c 20 69 6e 74 20 62 52 62  u *pRbu, int bRb
1dd80 75 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  u){.  sqlite3 *d
1dd90 62 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 52 62  b = 0;.  if( pRb
1dda0 75 20 29 7b 0a 20 20 20 20 64 62 20 3d 20 28 62  u ){.    db = (b
1ddb0 52 62 75 20 3f 20 70 52 62 75 2d 3e 64 62 52 62  Rbu ? pRbu->dbRb
1ddc0 75 20 3a 20 70 52 62 75 2d 3e 64 62 4d 61 69 6e  u : pRbu->dbMain
1ddd0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1dde0 64 62 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66  db;.}.../*.** If
1ddf0 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
1de00 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64  currently stored
1de10 20 69 6e 20 74 68 65 20 52 42 55 20 68 61 6e 64   in the RBU hand
1de20 6c 65 20 69 73 20 53 51 4c 49 54 45 5f 43 4f 4e  le is SQLITE_CON
1de30 53 54 52 41 49 4e 54 2c 0a 2a 2a 20 74 68 65 6e  STRAINT,.** then
1de40 20 65 64 69 74 20 61 6e 79 20 65 72 72 6f 72 20   edit any error 
1de50 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67 20 73  message string s
1de60 6f 20 61 73 20 74 6f 20 72 65 6d 6f 76 65 20 61  o as to remove a
1de70 6c 6c 20 6f 63 63 75 72 72 65 6e 63 65 73 20 6f  ll occurrences o
1de80 66 0a 2a 2a 20 74 68 65 20 70 61 74 74 65 72 6e  f.** the pattern
1de90 20 22 72 62 75 5f 69 6d 70 5f 5b 30 2d 39 5d 2a   "rbu_imp_[0-9]*
1dea0 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  "..*/.static voi
1deb0 64 20 72 62 75 45 64 69 74 45 72 72 6d 73 67 28  d rbuEditErrmsg(
1dec0 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a  sqlite3rbu *p){.
1ded0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1dee0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26  ITE_CONSTRAINT &
1def0 26 20 70 2d 3e 7a 45 72 72 6d 73 67 20 29 7b 0a  & p->zErrmsg ){.
1df00 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
1df10 20 69 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6e   i;.    size_t n
1df20 45 72 72 6d 73 67 20 3d 20 73 74 72 6c 65 6e 28  Errmsg = strlen(
1df30 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20  p->zErrmsg);.   
1df40 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 6e 45 72   for(i=0; i<(nEr
1df50 72 6d 73 67 2d 38 29 3b 20 69 2b 2b 29 7b 0a 20  rmsg-8); i++){. 
1df60 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28       if( memcmp(
1df70 26 70 2d 3e 7a 45 72 72 6d 73 67 5b 69 5d 2c 20  &p->zErrmsg[i], 
1df80 22 72 62 75 5f 69 6d 70 5f 22 2c 20 38 29 3d 3d  "rbu_imp_", 8)==
1df90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  0 ){.        int
1dfa0 20 6e 44 65 6c 20 3d 20 38 3b 0a 20 20 20 20 20   nDel = 8;.     
1dfb0 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 7a 45 72     while( p->zEr
1dfc0 72 6d 73 67 5b 69 2b 6e 44 65 6c 5d 3e 3d 27 30  rmsg[i+nDel]>='0
1dfd0 27 20 26 26 20 70 2d 3e 7a 45 72 72 6d 73 67 5b  ' && p->zErrmsg[
1dfe0 69 2b 6e 44 65 6c 5d 3c 3d 27 39 27 20 29 20 6e  i+nDel]<='9' ) n
1dff0 44 65 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6d  Del++;.        m
1e000 65 6d 6d 6f 76 65 28 26 70 2d 3e 7a 45 72 72 6d  emmove(&p->zErrm
1e010 73 67 5b 69 5d 2c 20 26 70 2d 3e 7a 45 72 72 6d  sg[i], &p->zErrm
1e020 73 67 5b 69 2b 6e 44 65 6c 5d 2c 20 6e 45 72 72  sg[i+nDel], nErr
1e030 6d 73 67 20 2b 20 31 20 2d 20 69 20 2d 20 6e 44  msg + 1 - i - nD
1e040 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 6e 45 72  el);.        nEr
1e050 72 6d 73 67 20 2d 3d 20 6e 44 65 6c 3b 0a 20 20  rmsg -= nDel;.  
1e060 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1e070 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74  }../*.** Close t
1e080 68 65 20 52 42 55 20 68 61 6e 64 6c 65 2e 0a 2a  he RBU handle..*
1e090 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 72 62 75  /.int sqlite3rbu
1e0a0 5f 63 6c 6f 73 65 28 73 71 6c 69 74 65 33 72 62  _close(sqlite3rb
1e0b0 75 20 2a 70 2c 20 63 68 61 72 20 2a 2a 70 7a 45  u *p, char **pzE
1e0c0 72 72 6d 73 67 29 7b 0a 20 20 69 6e 74 20 72 63  rrmsg){.  int rc
1e0d0 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 0a 20 20  ;.  if( p ){..  
1e0e0 20 20 2f 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20    /* Commit the 
1e0f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 74  transaction to t
1e100 68 65 20 2a 2d 6f 61 6c 20 66 69 6c 65 2e 20 2a  he *-oal file. *
1e110 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  /.    if( p->rc=
1e120 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d  =SQLITE_OK && p-
1e130 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41  >eStage==RBU_STA
1e140 47 45 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 20 20  GE_OAL ){.      
1e150 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
1e160 65 78 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  exec(p->dbMain, 
1e170 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20  "COMMIT", 0, 0, 
1e180 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20  &p->zErrmsg);.  
1e190 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63    }..    /* Sync
1e1a0 20 74 68 65 20 64 62 20 66 69 6c 65 20 69 66 20   the db file if 
1e1b0 63 75 72 72 65 6e 74 6c 79 20 64 6f 69 6e 67 20  currently doing 
1e1c0 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 63  an incremental c
1e1d0 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a 20 20 20  heckpoint */.   
1e1e0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1e1f0 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 65 53 74 61  TE_OK && p->eSta
1e200 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 43 4b  ge==RBU_STAGE_CK
1e210 50 54 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  PT ){.      sqli
1e220 74 65 33 5f 66 69 6c 65 20 2a 70 44 62 20 3d 20  te3_file *pDb = 
1e230 70 2d 3e 70 54 61 72 67 65 74 46 64 2d 3e 70 52  p->pTargetFd->pR
1e240 65 61 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 72 63  eal;.      p->rc
1e250 20 3d 20 70 44 62 2d 3e 70 4d 65 74 68 6f 64 73   = pDb->pMethods
1e260 2d 3e 78 53 79 6e 63 28 70 44 62 2c 20 53 51 4c  ->xSync(pDb, SQL
1e270 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
1e280 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 62 75  ;.    }..    rbu
1e290 53 61 76 65 53 74 61 74 65 28 70 2c 20 70 2d 3e  SaveState(p, p->
1e2a0 65 53 74 61 67 65 29 3b 0a 0a 20 20 20 20 69 66  eStage);..    if
1e2b0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1e2c0 4f 4b 20 26 26 20 70 2d 3e 65 53 74 61 67 65 3d  OK && p->eStage=
1e2d0 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 29  =RBU_STAGE_OAL )
1e2e0 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
1e2f0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
1e300 64 62 52 62 75 2c 20 22 43 4f 4d 4d 49 54 22 2c  dbRbu, "COMMIT",
1e310 20 30 2c 20 30 2c 20 26 70 2d 3e 7a 45 72 72 6d   0, 0, &p->zErrm
1e320 73 67 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  sg);.    }..    
1e330 2f 2a 20 43 6c 6f 73 65 20 61 6e 79 20 6f 70 65  /* Close any ope
1e340 6e 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64  n statement hand
1e350 6c 65 73 2e 20 2a 2f 0a 20 20 20 20 72 62 75 4f  les. */.    rbuO
1e360 62 6a 49 74 65 72 46 69 6e 61 6c 69 7a 65 28 26  bjIterFinalize(&
1e370 70 2d 3e 6f 62 6a 69 74 65 72 29 3b 0a 0a 20 20  p->objiter);..  
1e380 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1e390 61 6e 20 52 42 55 20 76 61 63 75 75 6d 20 68 61  an RBU vacuum ha
1e3a0 6e 64 6c 65 20 61 6e 64 20 74 68 65 20 76 61 63  ndle and the vac
1e3b0 75 75 6d 20 68 61 73 20 65 69 74 68 65 72 20 66  uum has either f
1e3c0 69 6e 69 73 68 65 64 0a 20 20 20 20 2a 2a 20 73  inished.    ** s
1e3d0 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 72 20 65  uccessfully or e
1e3e0 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 20 65 72  ncountered an er
1e3f0 72 6f 72 2c 20 64 65 6c 65 74 65 20 74 68 65 20  ror, delete the 
1e400 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1e410 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 20 74 61  .    ** state ta
1e420 62 6c 65 2e 20 54 68 69 73 20 63 61 75 73 65 73  ble. This causes
1e430 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74   the next call t
1e440 6f 20 73 71 6c 69 74 65 33 72 62 75 5f 76 61 63  o sqlite3rbu_vac
1e450 75 75 6d 28 29 20 0a 20 20 20 20 2a 2a 20 73 70  uum() .    ** sp
1e460 65 63 69 66 79 69 6e 67 20 74 68 65 20 63 75 72  ecifying the cur
1e470 72 65 6e 74 20 74 61 72 67 65 74 20 61 6e 64 20  rent target and 
1e480 73 74 61 74 65 20 64 61 74 61 62 61 73 65 73 20  state databases 
1e490 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 0a 20  to start a new. 
1e4a0 20 20 20 2a 2a 20 76 61 63 75 75 6d 20 66 72 6f     ** vacuum fro
1e4b0 6d 20 73 63 72 61 74 63 68 2e 20 20 2a 2f 0a 20  m scratch.  */. 
1e4c0 20 20 20 69 66 28 20 72 62 75 49 73 56 61 63 75     if( rbuIsVacu
1e4d0 75 6d 28 70 29 20 26 26 20 70 2d 3e 72 63 21 3d  um(p) && p->rc!=
1e4e0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e  SQLITE_OK && p->
1e4f0 64 62 52 62 75 20 29 7b 0a 20 20 20 20 20 20 69  dbRbu ){.      i
1e500 6e 74 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33  nt rc2 = sqlite3
1e510 5f 65 78 65 63 28 70 2d 3e 64 62 52 62 75 2c 20  _exec(p->dbRbu, 
1e520 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 73 74 61  "DELETE FROM sta
1e530 74 2e 72 62 75 5f 73 74 61 74 65 22 2c 20 30 2c  t.rbu_state", 0,
1e540 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
1e550 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1e560 44 4f 4e 45 20 26 26 20 72 63 32 21 3d 53 51 4c  DONE && rc2!=SQL
1e570 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63 20 3d  ITE_OK ) p->rc =
1e580 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   rc2;.    }..   
1e590 20 2f 2a 20 43 6c 6f 73 65 20 74 68 65 20 6f 70   /* Close the op
1e5a0 65 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  en database hand
1e5b0 6c 65 20 61 6e 64 20 56 46 53 20 6f 62 6a 65 63  le and VFS objec
1e5c0 74 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  t. */.    sqlite
1e5d0 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 52 62 75  3_close(p->dbRbu
1e5e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
1e5f0 6c 6f 73 65 28 70 2d 3e 64 62 4d 61 69 6e 29 3b  lose(p->dbMain);
1e600 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
1e610 73 7a 54 65 6d 70 3d 3d 30 20 29 3b 0a 20 20 20  szTemp==0 );.   
1e620 20 72 62 75 44 65 6c 65 74 65 56 66 73 28 70 29   rbuDeleteVfs(p)
1e630 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
1e640 65 65 28 70 2d 3e 61 42 75 66 29 3b 0a 20 20 20  ee(p->aBuf);.   
1e650 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
1e660 3e 61 46 72 61 6d 65 29 3b 0a 0a 20 20 20 20 72  >aFrame);..    r
1e670 62 75 45 64 69 74 45 72 72 6d 73 67 28 70 29 3b  buEditErrmsg(p);
1e680 0a 20 20 20 20 72 63 20 3d 20 70 2d 3e 72 63 3b  .    rc = p->rc;
1e690 0a 20 20 20 20 69 66 28 20 70 7a 45 72 72 6d 73  .    if( pzErrms
1e6a0 67 20 29 7b 0a 20 20 20 20 20 20 2a 70 7a 45 72  g ){.      *pzEr
1e6b0 72 6d 73 67 20 3d 20 70 2d 3e 7a 45 72 72 6d 73  rmsg = p->zErrms
1e6c0 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  g;.    }else{.  
1e6d0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1e6e0 28 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20  (p->zErrmsg);.  
1e6f0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
1e700 66 72 65 65 28 70 2d 3e 7a 53 74 61 74 65 29 3b  free(p->zState);
1e710 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1e720 65 28 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  e(p);.  }else{. 
1e730 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1e740 4f 4d 45 4d 3b 0a 20 20 20 20 2a 70 7a 45 72 72  OMEM;.    *pzErr
1e750 6d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  msg = 0;.  }.  r
1e760 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1e770 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f  ** Return the to
1e780 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6b 65  tal number of ke
1e790 79 2d 76 61 6c 75 65 20 6f 70 65 72 61 74 69 6f  y-value operatio
1e7a0 6e 73 20 28 69 6e 73 65 72 74 73 2c 20 64 65 6c  ns (inserts, del
1e7b0 65 74 65 73 20 6f 72 20 0a 2a 2a 20 75 70 64 61  etes or .** upda
1e7c0 74 65 73 29 20 74 68 61 74 20 68 61 76 65 20 62  tes) that have b
1e7d0 65 65 6e 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e  een performed on
1e7e0 20 74 68 65 20 74 61 72 67 65 74 20 64 61 74 61   the target data
1e7f0 62 61 73 65 20 73 69 6e 63 65 20 74 68 65 0a 2a  base since the.*
1e800 2a 20 63 75 72 72 65 6e 74 20 52 42 55 20 75 70  * current RBU up
1e810 64 61 74 65 20 77 61 73 20 73 74 61 72 74 65 64  date was started
1e820 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74  ..*/.sqlite3_int
1e830 36 34 20 73 71 6c 69 74 65 33 72 62 75 5f 70 72  64 sqlite3rbu_pr
1e840 6f 67 72 65 73 73 28 73 71 6c 69 74 65 33 72 62  ogress(sqlite3rb
1e850 75 20 2a 70 52 62 75 29 7b 0a 20 20 72 65 74 75  u *pRbu){.  retu
1e860 72 6e 20 70 52 62 75 2d 3e 6e 50 72 6f 67 72 65  rn pRbu->nProgre
1e870 73 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ss;.}../*.** Ret
1e880 75 72 6e 20 70 65 72 6d 79 72 69 61 64 61 67 65  urn permyriadage
1e890 20 70 72 6f 67 72 65 73 73 20 69 6e 64 69 63 61   progress indica
1e8a0 74 69 6f 6e 73 20 66 6f 72 20 74 68 65 20 74 77  tions for the tw
1e8b0 6f 20 6d 61 69 6e 20 73 74 61 67 65 73 20 6f 66  o main stages of
1e8c0 0a 2a 2a 20 61 6e 20 52 42 55 20 75 70 64 61 74  .** an RBU updat
1e8d0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
1e8e0 65 33 72 62 75 5f 62 70 5f 70 72 6f 67 72 65 73  e3rbu_bp_progres
1e8f0 73 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c  s(sqlite3rbu *p,
1e900 20 69 6e 74 20 2a 70 6e 4f 6e 65 2c 20 69 6e 74   int *pnOne, int
1e910 20 2a 70 6e 54 77 6f 29 7b 0a 20 20 63 6f 6e 73   *pnTwo){.  cons
1e920 74 20 69 6e 74 20 4d 41 58 5f 50 52 4f 47 52 45  t int MAX_PROGRE
1e930 53 53 20 3d 20 31 30 30 30 30 3b 0a 20 20 73 77  SS = 10000;.  sw
1e940 69 74 63 68 28 20 70 2d 3e 65 53 74 61 67 65 20  itch( p->eStage 
1e950 29 7b 0a 20 20 20 20 63 61 73 65 20 52 42 55 5f  ){.    case RBU_
1e960 53 54 41 47 45 5f 4f 41 4c 3a 0a 20 20 20 20 20  STAGE_OAL:.     
1e970 20 69 66 28 20 70 2d 3e 6e 50 68 61 73 65 4f 6e   if( p->nPhaseOn
1e980 65 53 74 65 70 3e 30 20 29 7b 0a 20 20 20 20 20  eStep>0 ){.     
1e990 20 20 20 2a 70 6e 4f 6e 65 20 3d 20 28 69 6e 74     *pnOne = (int
1e9a0 29 28 4d 41 58 5f 50 52 4f 47 52 45 53 53 20 2a  )(MAX_PROGRESS *
1e9b0 20 28 69 36 34 29 70 2d 3e 6e 50 72 6f 67 72 65   (i64)p->nProgre
1e9c0 73 73 2f 28 69 36 34 29 70 2d 3e 6e 50 68 61 73  ss/(i64)p->nPhas
1e9d0 65 4f 6e 65 53 74 65 70 29 3b 0a 20 20 20 20 20  eOneStep);.     
1e9e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1e9f0 2a 70 6e 4f 6e 65 20 3d 20 2d 31 3b 0a 20 20 20  *pnOne = -1;.   
1ea00 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 6e 54 77     }.      *pnTw
1ea10 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  o = 0;.      bre
1ea20 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 52 42  ak;..    case RB
1ea30 55 5f 53 54 41 47 45 5f 4d 4f 56 45 3a 0a 20 20  U_STAGE_MOVE:.  
1ea40 20 20 20 20 2a 70 6e 4f 6e 65 20 3d 20 4d 41 58      *pnOne = MAX
1ea50 5f 50 52 4f 47 52 45 53 53 3b 0a 20 20 20 20 20  _PROGRESS;.     
1ea60 20 2a 70 6e 54 77 6f 20 3d 20 30 3b 0a 20 20 20   *pnTwo = 0;.   
1ea70 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
1ea80 61 73 65 20 52 42 55 5f 53 54 41 47 45 5f 43 4b  ase RBU_STAGE_CK
1ea90 50 54 3a 0a 20 20 20 20 20 20 2a 70 6e 4f 6e 65  PT:.      *pnOne
1eaa0 20 3d 20 4d 41 58 5f 50 52 4f 47 52 45 53 53 3b   = MAX_PROGRESS;
1eab0 0a 20 20 20 20 20 20 2a 70 6e 54 77 6f 20 3d 20  .      *pnTwo = 
1eac0 28 69 6e 74 29 28 4d 41 58 5f 50 52 4f 47 52 45  (int)(MAX_PROGRE
1ead0 53 53 20 2a 20 28 69 36 34 29 70 2d 3e 6e 53 74  SS * (i64)p->nSt
1eae0 65 70 20 2f 20 28 69 36 34 29 70 2d 3e 6e 46 72  ep / (i64)p->nFr
1eaf0 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ame);.      brea
1eb00 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 52 42 55  k;..    case RBU
1eb10 5f 53 54 41 47 45 5f 44 4f 4e 45 3a 0a 20 20 20  _STAGE_DONE:.   
1eb20 20 20 20 2a 70 6e 4f 6e 65 20 3d 20 4d 41 58 5f     *pnOne = MAX_
1eb30 50 52 4f 47 52 45 53 53 3b 0a 20 20 20 20 20 20  PROGRESS;.      
1eb40 2a 70 6e 54 77 6f 20 3d 20 4d 41 58 5f 50 52 4f  *pnTwo = MAX_PRO
1eb50 47 52 45 53 53 3b 0a 20 20 20 20 20 20 62 72 65  GRESS;.      bre
1eb60 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74  ak;..    default
1eb70 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
1eb80 30 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  0 );.  }.}../*.*
1eb90 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
1eba0 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68  rent state of th
1ebb0 65 20 52 42 55 20 76 61 63 75 75 6d 20 6f 72 20  e RBU vacuum or 
1ebc0 75 70 64 61 74 65 20 6f 70 65 72 61 74 69 6f 6e  update operation
1ebd0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1ebe0 72 62 75 5f 73 74 61 74 65 28 73 71 6c 69 74 65  rbu_state(sqlite
1ebf0 33 72 62 75 20 2a 70 29 7b 0a 20 20 69 6e 74 20  3rbu *p){.  int 
1ec00 61 52 65 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 30  aRes[] = {.    0
1ec10 2c 20 53 51 4c 49 54 45 5f 52 42 55 5f 53 54 41  , SQLITE_RBU_STA
1ec20 54 45 5f 4f 41 4c 2c 20 53 51 4c 49 54 45 5f 52  TE_OAL, SQLITE_R
1ec30 42 55 5f 53 54 41 54 45 5f 4d 4f 56 45 2c 0a 20  BU_STATE_MOVE,. 
1ec40 20 20 20 30 2c 20 53 51 4c 49 54 45 5f 52 42 55     0, SQLITE_RBU
1ec50 5f 53 54 41 54 45 5f 43 48 45 43 4b 50 4f 49 4e  _STATE_CHECKPOIN
1ec60 54 2c 20 53 51 4c 49 54 45 5f 52 42 55 5f 53 54  T, SQLITE_RBU_ST
1ec70 41 54 45 5f 44 4f 4e 45 0a 20 20 7d 3b 0a 0a 20  ATE_DONE.  };.. 
1ec80 20 61 73 73 65 72 74 28 20 52 42 55 5f 53 54 41   assert( RBU_STA
1ec90 47 45 5f 4f 41 4c 3d 3d 31 20 29 3b 0a 20 20 61  GE_OAL==1 );.  a
1eca0 73 73 65 72 74 28 20 52 42 55 5f 53 54 41 47 45  ssert( RBU_STAGE
1ecb0 5f 4d 4f 56 45 3d 3d 32 20 29 3b 0a 20 20 61 73  _MOVE==2 );.  as
1ecc0 73 65 72 74 28 20 52 42 55 5f 53 54 41 47 45 5f  sert( RBU_STAGE_
1ecd0 43 4b 50 54 3d 3d 34 20 29 3b 0a 20 20 61 73 73  CKPT==4 );.  ass
1ece0 65 72 74 28 20 52 42 55 5f 53 54 41 47 45 5f 44  ert( RBU_STAGE_D
1ecf0 4f 4e 45 3d 3d 35 20 29 3b 0a 20 20 61 73 73 65  ONE==5 );.  asse
1ed00 72 74 28 20 61 52 65 73 5b 52 42 55 5f 53 54 41  rt( aRes[RBU_STA
1ed10 47 45 5f 4f 41 4c 5d 3d 3d 53 51 4c 49 54 45 5f  GE_OAL]==SQLITE_
1ed20 52 42 55 5f 53 54 41 54 45 5f 4f 41 4c 20 29 3b  RBU_STATE_OAL );
1ed30 0a 20 20 61 73 73 65 72 74 28 20 61 52 65 73 5b  .  assert( aRes[
1ed40 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 5d 3d  RBU_STAGE_MOVE]=
1ed50 3d 53 51 4c 49 54 45 5f 52 42 55 5f 53 54 41 54  =SQLITE_RBU_STAT
1ed60 45 5f 4d 4f 56 45 20 29 3b 0a 20 20 61 73 73 65  E_MOVE );.  asse
1ed70 72 74 28 20 61 52 65 73 5b 52 42 55 5f 53 54 41  rt( aRes[RBU_STA
1ed80 47 45 5f 43 4b 50 54 5d 3d 3d 53 51 4c 49 54 45  GE_CKPT]==SQLITE
1ed90 5f 52 42 55 5f 53 54 41 54 45 5f 43 48 45 43 4b  _RBU_STATE_CHECK
1eda0 50 4f 49 4e 54 20 29 3b 0a 20 20 61 73 73 65 72  POINT );.  asser
1edb0 74 28 20 61 52 65 73 5b 52 42 55 5f 53 54 41 47  t( aRes[RBU_STAG
1edc0 45 5f 44 4f 4e 45 5d 3d 3d 53 51 4c 49 54 45 5f  E_DONE]==SQLITE_
1edd0 52 42 55 5f 53 54 41 54 45 5f 44 4f 4e 45 20 29  RBU_STATE_DONE )
1ede0 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d  ;..  if( p->rc!=
1edf0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e  SQLITE_OK && p->
1ee00 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
1ee10 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1ee20 4c 49 54 45 5f 52 42 55 5f 53 54 41 54 45 5f 45  LITE_RBU_STATE_E
1ee30 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  RROR;.  }else{. 
1ee40 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63     assert( p->rc
1ee50 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c  !=SQLITE_DONE ||
1ee60 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f   p->eStage==RBU_
1ee70 53 54 41 47 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  STAGE_DONE );.  
1ee80 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74    assert( p->eSt
1ee90 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f  age==RBU_STAGE_O
1eea0 41 4c 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  AL.         || p
1eeb0 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  ->eStage==RBU_ST
1eec0 41 47 45 5f 4d 4f 56 45 0a 20 20 20 20 20 20 20  AGE_MOVE.       
1eed0 20 20 7c 7c 20 70 2d 3e 65 53 74 61 67 65 3d 3d    || p->eStage==
1eee0 52 42 55 5f 53 54 41 47 45 5f 43 4b 50 54 0a 20  RBU_STAGE_CKPT. 
1eef0 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53          || p->eS
1ef00 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f  tage==RBU_STAGE_
1ef10 44 4f 4e 45 0a 20 20 20 20 29 3b 0a 20 20 20 20  DONE.    );.    
1ef20 72 65 74 75 72 6e 20 61 52 65 73 5b 70 2d 3e 65  return aRes[p->e
1ef30 53 74 61 67 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 69  Stage];.  }.}..i
1ef40 6e 74 20 73 71 6c 69 74 65 33 72 62 75 5f 73 61  nt sqlite3rbu_sa
1ef50 76 65 73 74 61 74 65 28 73 71 6c 69 74 65 33 72  vestate(sqlite3r
1ef60 62 75 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  bu *p){.  int rc
1ef70 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20   = p->rc;.  if( 
1ef80 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
1ef90 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1efa0 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
1efb0 2d 3e 65 53 74 61 67 65 3e 3d 52 42 55 5f 53 54  ->eStage>=RBU_ST
1efc0 41 47 45 5f 4f 41 4c 20 26 26 20 70 2d 3e 65 53  AGE_OAL && p->eS
1efd0 74 61 67 65 3c 3d 52 42 55 5f 53 54 41 47 45 5f  tage<=RBU_STAGE_
1efe0 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 2d  DONE );.  if( p-
1eff0 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41  >eStage==RBU_STA
1f000 47 45 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 61 73  GE_OAL ){.    as
1f010 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
1f020 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28  _DONE );.    if(
1f030 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1f040 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
1f050 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 43  ec(p->dbMain, "C
1f060 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 30 29  OMMIT", 0, 0, 0)
1f070 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 79 6e 63  ;.  }..  /* Sync
1f080 20 74 68 65 20 64 62 20 66 69 6c 65 20 2a 2f 0a   the db file */.
1f090 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f0a0 5f 4f 4b 20 26 26 20 70 2d 3e 65 53 74 61 67 65  _OK && p->eStage
1f0b0 3d 3d 52 42 55 5f 53 54 41 47 45 5f 43 4b 50 54  ==RBU_STAGE_CKPT
1f0c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1f0d0 66 69 6c 65 20 2a 70 44 62 20 3d 20 70 2d 3e 70  file *pDb = p->p
1f0e0 54 61 72 67 65 74 46 64 2d 3e 70 52 65 61 6c 3b  TargetFd->pReal;
1f0f0 0a 20 20 20 20 72 63 20 3d 20 70 44 62 2d 3e 70  .    rc = pDb->p
1f100 4d 65 74 68 6f 64 73 2d 3e 78 53 79 6e 63 28 70  Methods->xSync(p
1f110 44 62 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  Db, SQLITE_SYNC_
1f120 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a 0a 20 20  NORMAL);.  }..  
1f130 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 72 62  p->rc = rc;.  rb
1f140 75 53 61 76 65 53 74 61 74 65 28 70 2c 20 70 2d  uSaveState(p, p-
1f150 3e 65 53 74 61 67 65 29 3b 0a 20 20 72 63 20 3d  >eStage);.  rc =
1f160 20 70 2d 3e 72 63 3b 0a 0a 20 20 69 66 28 20 70   p->rc;..  if( p
1f170 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  ->eStage==RBU_ST
1f180 41 47 45 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 61  AGE_OAL ){.    a
1f190 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
1f1a0 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66  E_DONE );.    if
1f1b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1f1c0 29 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65  ) rc = sqlite3_e
1f1d0 78 65 63 28 70 2d 3e 64 62 52 62 75 2c 20 22 43  xec(p->dbRbu, "C
1f1e0 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 30 29  OMMIT", 0, 0, 0)
1f1f0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1f200 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 73  LITE_OK ) rc = s
1f210 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
1f220 62 52 62 75 2c 20 22 42 45 47 49 4e 20 49 4d 4d  bRbu, "BEGIN IMM
1f230 45 44 49 41 54 45 22 2c 20 30 2c 20 30 2c 20 30  EDIATE", 0, 0, 0
1f240 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1f250 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
1f260 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
1f270 64 62 4d 61 69 6e 2c 20 22 42 45 47 49 4e 20 49  dbMain, "BEGIN I
1f280 4d 4d 45 44 49 41 54 45 22 2c 20 30 2c 20 30 2c  MMEDIATE", 0, 0,
1f290 30 29 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 72 63  0);.  }..  p->rc
1f2a0 20 3d 20 72 63 3b 0a 20 20 72 65 74 75 72 6e 20   = rc;.  return 
1f2b0 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  rc;.}../********
1f2c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f2d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f2e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f2f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f300 2a 2a 0a 2a 2a 20 42 65 67 69 6e 6e 69 6e 67 20  **.** Beginning 
1f310 6f 66 20 52 42 55 20 56 46 53 20 73 68 69 6d 20  of RBU VFS shim 
1f320 6d 65 74 68 6f 64 73 2e 20 54 68 65 20 56 46 53  methods. The VFS
1f330 20 73 68 69 6d 20 6d 6f 64 69 66 69 65 73 20 74   shim modifies t
1f340 68 65 20 62 65 68 61 76 69 6f 75 72 0a 2a 2a 20  he behaviour.** 
1f350 6f 66 20 61 20 73 74 61 6e 64 61 72 64 20 56 46  of a standard VF
1f360 53 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  S in the followi
1f370 6e 67 20 77 61 79 73 3a 0a 2a 2a 0a 2a 2a 20 31  ng ways:.**.** 1
1f380 2e 20 57 68 65 6e 65 76 65 72 20 74 68 65 20 66  . Whenever the f
1f390 69 72 73 74 20 70 61 67 65 20 6f 66 20 61 20 6d  irst page of a m
1f3a0 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
1f3b0 65 20 69 73 20 72 65 61 64 20 6f 72 20 0a 2a 2a  e is read or .**
1f3c0 20 20 20 20 77 72 69 74 74 65 6e 2c 20 74 68 65      written, the
1f3d0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 68   value of the ch
1f3e0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 63 6f 6f  ange-counter coo
1f3f0 6b 69 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  kie is stored in
1f400 0a 2a 2a 20 20 20 20 72 62 75 5f 66 69 6c 65 2e  .**    rbu_file.
1f410 69 43 6f 6f 6b 69 65 2e 20 53 69 6d 69 6c 61 72  iCookie. Similar
1f420 6c 79 2c 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ly, the value of
1f430 20 74 68 65 20 22 77 72 69 74 65 2d 76 65 72 73   the "write-vers
1f440 69 6f 6e 22 0a 2a 2a 20 20 20 20 64 61 74 61 62  ion".**    datab
1f450 61 73 65 20 68 65 61 64 65 72 20 66 69 65 6c 64  ase header field
1f460 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72 62   is stored in rb
1f470 75 5f 66 69 6c 65 2e 69 57 72 69 74 65 56 65 72  u_file.iWriteVer
1f480 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 0a 2a  . This ensures.*
1f490 2a 20 20 20 20 74 68 61 74 20 74 68 65 20 76 61  *    that the va
1f4a0 6c 75 65 73 20 61 72 65 20 61 6c 77 61 79 73 20  lues are always 
1f4b0 74 72 75 73 74 77 6f 72 74 68 79 20 77 69 74 68  trustworthy with
1f4c0 69 6e 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e 73  in an open trans
1f4d0 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 32 2e  action..**.** 2.
1f4e0 20 57 68 65 6e 65 76 65 72 20 61 6e 20 53 51 4c   Whenever an SQL
1f4f0 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 66 69 6c  ITE_OPEN_WAL fil
1f500 65 20 69 73 20 6f 70 65 6e 65 64 2c 20 74 68 65  e is opened, the
1f510 20 28 72 62 75 5f 66 69 6c 65 2e 70 57 61 6c 46   (rbu_file.pWalF
1f520 64 29 0a 2a 2a 20 20 20 20 6d 65 6d 62 65 72 20  d).**    member 
1f530 76 61 72 69 61 62 6c 65 20 6f 66 20 74 68 65 20  variable of the 
1f540 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62  associated datab
1f550 61 73 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  ase file descrip
1f560 74 6f 72 20 69 73 20 73 65 74 0a 2a 2a 20 20 20  tor is set.**   
1f570 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
1f580 20 6e 65 77 20 66 69 6c 65 2e 20 41 20 6d 75 74   new file. A mut
1f590 65 78 20 70 72 6f 74 65 63 74 65 64 20 6c 69 6e  ex protected lin
1f5a0 6b 65 64 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  ked list of all 
1f5b0 6d 61 69 6e 20 0a 2a 2a 20 20 20 20 64 62 20 66  main .**    db f
1f5c0 64 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20  ds opened using 
1f5d0 61 20 70 61 72 74 69 63 75 6c 61 72 20 52 42 55  a particular RBU
1f5e0 20 56 46 53 20 69 73 20 6d 61 69 6e 74 61 69 6e   VFS is maintain
1f5f0 65 64 20 61 74 20 0a 2a 2a 20 20 20 20 72 62 75  ed at .**    rbu
1f600 5f 76 66 73 2e 70 4d 61 69 6e 20 74 6f 20 66 61  _vfs.pMain to fa
1f610 63 69 6c 69 74 61 74 65 20 74 68 69 73 2e 0a 2a  cilitate this..*
1f620 2a 0a 2a 2a 20 33 2e 20 55 73 69 6e 67 20 61 20  *.** 3. Using a 
1f630 6e 65 77 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c  new file-control
1f640 20 22 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 52   "SQLITE_FCNTL_R
1f650 42 55 22 2c 20 61 20 6d 61 69 6e 20 64 62 20 72  BU", a main db r
1f660 62 75 5f 66 69 6c 65 20 0a 2a 2a 20 20 20 20 6f  bu_file .**    o
1f670 62 6a 65 63 74 20 63 61 6e 20 62 65 20 6d 61 72  bject can be mar
1f680 6b 65 64 20 61 73 20 74 68 65 20 74 61 72 67 65  ked as the targe
1f690 74 20 64 61 74 61 62 61 73 65 20 6f 66 20 61 6e  t database of an
1f6a0 20 52 42 55 20 75 70 64 61 74 65 2e 20 54 68 69   RBU update. Thi
1f6b0 73 0a 2a 2a 20 20 20 20 74 75 72 6e 73 20 6f 6e  s.**    turns on
1f6c0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65   the following e
1f6d0 78 74 72 61 20 73 70 65 63 69 61 6c 20 62 65 68  xtra special beh
1f6e0 61 76 69 6f 75 72 3a 0a 2a 2a 0a 2a 2a 20 33 61  aviour:.**.** 3a
1f6f0 2e 20 49 66 20 78 41 63 63 65 73 73 28 29 20 69  . If xAccess() i
1f700 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 68 65 63  s called to chec
1f710 6b 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74  k if there exist
1f720 73 20 61 20 2a 2d 77 61 6c 20 66 69 6c 65 20 0a  s a *-wal file .
1f730 2a 2a 20 20 20 20 20 61 73 73 6f 63 69 61 74 65  **     associate
1f740 64 20 77 69 74 68 20 61 6e 20 52 42 55 20 74 61  d with an RBU ta
1f750 72 67 65 74 20 64 61 74 61 62 61 73 65 20 63 75  rget database cu
1f760 72 72 65 6e 74 6c 79 20 69 6e 20 52 42 55 5f 53  rrently in RBU_S
1f770 54 41 47 45 5f 4f 41 4c 0a 2a 2a 20 20 20 20 20  TAGE_OAL.**     
1f780 73 74 61 67 65 20 28 70 72 65 70 61 72 69 6e 67  stage (preparing
1f790 20 74 68 65 20 2a 2d 6f 61 6c 20 66 69 6c 65 29   the *-oal file)
1f7a0 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
1f7b0 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67  special handling
1f7c0 0a 2a 2a 20 20 20 20 20 61 70 70 6c 69 65 73 3a  .**     applies:
1f7d0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 2a 20 69 66  .**.**      * if
1f7e0 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20   the *-wal file 
1f7f0 64 6f 65 73 20 65 78 69 73 74 2c 20 72 65 74 75  does exist, retu
1f800 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
1f810 45 4e 2e 20 41 6e 20 52 42 55 0a 2a 2a 20 20 20  EN. An RBU.**   
1f820 20 20 20 20 20 74 61 72 67 65 74 20 64 61 74 61       target data
1f830 62 61 73 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  base may not be 
1f840 69 6e 20 77 61 6c 20 6d 6f 64 65 20 61 6c 72 65  in wal mode alre
1f850 61 64 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ady..**.**      
1f860 2a 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66  * if the *-wal f
1f870 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
1f880 73 74 2c 20 73 65 74 20 74 68 65 20 6f 75 74 70  st, set the outp
1f890 75 74 20 70 61 72 61 6d 65 74 65 72 20 74 6f 0a  ut parameter to.
1f8a0 2a 2a 20 20 20 20 20 20 20 20 6e 6f 6e 2d 7a 65  **        non-ze
1f8b0 72 6f 20 28 74 6f 20 74 65 6c 6c 20 53 51 4c 69  ro (to tell SQLi
1f8c0 74 65 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  te that it does 
1f8d0 65 78 69 73 74 29 20 61 6e 79 77 61 79 2e 0a 2a  exist) anyway..*
1f8e0 2a 0a 2a 2a 20 20 20 20 20 54 68 65 6e 2c 20 77  *.**     Then, w
1f8f0 68 65 6e 20 78 4f 70 65 6e 28 29 20 69 73 20 63  hen xOpen() is c
1f900 61 6c 6c 65 64 20 74 6f 20 6f 70 65 6e 20 74 68  alled to open th
1f910 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 61 73 73  e *-wal file ass
1f920 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  ociated with.** 
1f930 20 20 20 20 74 68 65 20 52 42 55 20 74 61 72 67      the RBU targ
1f940 65 74 20 69 6e 20 52 42 55 5f 53 54 41 47 45 5f  et in RBU_STAGE_
1f950 4f 41 4c 20 73 74 61 67 65 2c 20 69 6e 73 74 65  OAL stage, inste
1f960 61 64 20 6f 66 20 6f 70 65 6e 69 6e 67 20 74 68  ad of opening th
1f970 65 20 2a 2d 77 61 6c 0a 2a 2a 20 20 20 20 20 66  e *-wal.**     f
1f980 69 6c 65 2c 20 74 68 65 20 72 62 75 20 76 66 73  ile, the rbu vfs
1f990 20 6f 70 65 6e 73 20 74 68 65 20 63 6f 72 72 65   opens the corre
1f9a0 73 70 6f 6e 64 69 6e 67 20 2a 2d 6f 61 6c 20 66  sponding *-oal f
1f9b0 69 6c 65 20 69 6e 73 74 65 61 64 2e 20 0a 2a 2a  ile instead. .**
1f9c0 0a 2a 2a 20 33 62 2e 20 54 68 65 20 2a 2d 73 68  .** 3b. The *-sh
1f9d0 6d 20 70 61 67 65 73 20 72 65 74 75 72 6e 65 64  m pages returned
1f9e0 20 62 79 20 78 53 68 6d 4d 61 70 28 29 20 66 6f   by xShmMap() fo
1f9f0 72 20 61 20 74 61 72 67 65 74 20 64 62 20 66 69  r a target db fi
1fa00 6c 65 20 69 6e 0a 2a 2a 20 20 20 20 20 52 42 55  le in.**     RBU
1fa10 5f 53 54 41 47 45 5f 4f 41 4c 20 6d 6f 64 65 20  _STAGE_OAL mode 
1fa20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 73 74 6f  are actually sto
1fa30 72 65 64 20 69 6e 20 68 65 61 70 20 6d 65 6d 6f  red in heap memo
1fa40 72 79 2e 20 54 68 69 73 20 69 73 20 74 6f 0a 2a  ry. This is to.*
1fa50 2a 20 20 20 20 20 61 76 6f 69 64 20 63 72 65 61  *     avoid crea
1fa60 74 69 6e 67 20 61 20 2a 2d 73 68 6d 20 66 69 6c  ting a *-shm fil
1fa70 65 20 6f 6e 20 64 69 73 6b 2e 20 41 64 64 69 74  e on disk. Addit
1fa80 69 6f 6e 61 6c 6c 79 2c 20 78 53 68 6d 4c 6f 63  ionally, xShmLoc
1fa90 6b 28 29 20 63 61 6c 6c 73 0a 2a 2a 20 20 20 20  k() calls.**    
1faa0 20 61 72 65 20 6e 6f 2d 6f 70 73 20 6f 6e 20 74   are no-ops on t
1fab0 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20 66  arget database f
1fac0 69 6c 65 73 20 69 6e 20 52 42 55 5f 53 54 41 47  iles in RBU_STAG
1fad0 45 5f 4f 41 4c 20 6d 6f 64 65 2e 20 54 68 69 73  E_OAL mode. This
1fae0 20 69 73 0a 2a 2a 20 20 20 20 20 62 65 63 61 75   is.**     becau
1faf0 73 65 20 61 73 73 65 72 74 28 29 20 73 74 61 74  se assert() stat
1fb00 65 6d 65 6e 74 73 20 69 6e 20 73 6f 6d 65 20 56  ements in some V
1fb10 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  FS implementatio
1fb20 6e 73 20 66 61 69 6c 20 69 66 20 0a 2a 2a 20 20  ns fail if .**  
1fb30 20 20 20 78 53 68 6d 4c 6f 63 6b 28 29 20 69 73     xShmLock() is
1fb40 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 78   called before x
1fb50 53 68 6d 4d 61 70 28 29 2e 0a 2a 2a 0a 2a 2a 20  ShmMap()..**.** 
1fb60 33 63 2e 20 49 66 20 61 6e 20 45 58 43 4c 55 53  3c. If an EXCLUS
1fb70 49 56 45 20 6c 6f 63 6b 20 69 73 20 61 74 74 65  IVE lock is atte
1fb80 6d 70 74 65 64 20 6f 6e 20 61 20 74 61 72 67 65  mpted on a targe
1fb90 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  t database file 
1fba0 69 6e 20 61 6e 79 0a 2a 2a 20 20 20 20 20 6d 6f  in any.**     mo
1fbb0 64 65 20 65 78 63 65 70 74 20 52 42 55 5f 53 54  de except RBU_ST
1fbc0 41 47 45 5f 44 4f 4e 45 20 28 61 6c 6c 20 77 6f  AGE_DONE (all wo
1fbd0 72 6b 20 63 6f 6d 70 6c 65 74 65 64 20 61 6e 64  rk completed and
1fbe0 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 29 2c 20   checkpointed), 
1fbf0 69 74 20 0a 2a 2a 20 20 20 20 20 66 61 69 6c 73  it .**     fails
1fc00 20 77 69 74 68 20 61 6e 20 53 51 4c 49 54 45 5f   with an SQLITE_
1fc10 42 55 53 59 20 65 72 72 6f 72 2e 20 54 68 69 73  BUSY error. This
1fc20 20 69 73 20 74 6f 20 73 74 6f 70 20 52 42 55 20   is to stop RBU 
1fc30 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 20  connections.**  
1fc40 20 20 20 66 72 6f 6d 20 61 75 74 6f 6d 61 74 69     from automati
1fc50 63 61 6c 6c 79 20 63 68 65 63 6b 70 6f 69 6e 74  cally checkpoint
1fc60 69 6e 67 20 61 20 2a 2d 77 61 6c 20 28 6f 72 20  ing a *-wal (or 
1fc70 2a 2d 6f 61 6c 29 20 66 69 6c 65 20 66 72 6f 6d  *-oal) file from
1fc80 20 77 69 74 68 69 6e 0a 2a 2a 20 20 20 20 20 73   within.**     s
1fc90 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 2e 0a  qlite3_close()..
1fca0 2a 2a 0a 2a 2a 20 33 64 2e 20 49 6e 20 52 42 55  **.** 3d. In RBU
1fcb0 5f 53 54 41 47 45 5f 43 41 50 54 55 52 45 20 6d  _STAGE_CAPTURE m
1fcc0 6f 64 65 2c 20 61 6c 6c 20 78 52 65 61 64 28 29  ode, all xRead()
1fcd0 20 63 61 6c 6c 73 20 6f 6e 20 74 68 65 20 77 61   calls on the wa
1fce0 6c 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20  l file, and.**  
1fcf0 20 20 20 61 6c 6c 20 78 57 72 69 74 65 28 29 20     all xWrite() 
1fd00 63 61 6c 6c 73 20 6f 6e 20 74 68 65 20 74 61 72  calls on the tar
1fd10 67 65 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  get database fil
1fd20 65 20 70 65 72 66 6f 72 6d 20 6e 6f 20 49 4f 2e  e perform no IO.
1fd30 20 0a 2a 2a 20 20 20 20 20 49 6e 73 74 65 61 64   .**     Instead
1fd40 20 74 68 65 20 66 72 61 6d 65 20 61 6e 64 20 70   the frame and p
1fd50 61 67 65 20 6e 75 6d 62 65 72 73 20 74 68 61 74  age numbers that
1fd60 20 77 6f 75 6c 64 20 62 65 20 72 65 61 64 20 61   would be read a
1fd70 6e 64 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20 20  nd written.**   
1fd80 20 20 61 72 65 20 72 65 63 6f 72 64 65 64 2e 20    are recorded. 
1fd90 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 73 75  Additionally, su
1fda0 63 63 65 73 73 66 75 6c 20 61 74 74 65 6d 70 74  ccessful attempt
1fdb0 73 20 74 6f 20 6f 62 74 61 69 6e 20 65 78 63 6c  s to obtain excl
1fdc0 75 73 69 76 65 0a 2a 2a 20 20 20 20 20 78 53 68  usive.**     xSh
1fdd0 6d 4c 6f 63 6b 28 29 20 57 52 49 54 45 52 2c 20  mLock() WRITER, 
1fde0 43 48 45 43 4b 50 4f 49 4e 54 45 52 20 61 6e 64  CHECKPOINTER and
1fdf0 20 52 45 41 44 30 20 6c 6f 63 6b 73 20 6f 6e 20   READ0 locks on 
1fe00 74 68 65 20 74 61 72 67 65 74 20 0a 2a 2a 20 20  the target .**  
1fe10 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65     database file
1fe20 20 61 72 65 20 72 65 63 6f 72 64 65 64 2e 20 78   are recorded. x
1fe30 53 68 6d 4c 6f 63 6b 28 29 20 63 61 6c 6c 73 20  ShmLock() calls 
1fe40 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 73 61  to unlock the sa
1fe50 6d 65 0a 2a 2a 20 20 20 20 20 6c 6f 63 6b 73 20  me.**     locks 
1fe60 61 72 65 20 6e 6f 2d 6f 70 73 20 28 73 6f 20 74  are no-ops (so t
1fe70 68 61 74 20 6f 6e 63 65 20 6f 62 74 61 69 6e 65  hat once obtaine
1fe80 64 2c 20 74 68 65 73 65 20 6c 6f 63 6b 73 20 61  d, these locks a
1fe90 72 65 20 6e 65 76 65 72 0a 2a 2a 20 20 20 20 20  re never.**     
1fea0 72 65 6c 69 6e 71 75 69 73 68 65 64 29 2e 20 46  relinquished). F
1feb0 69 6e 61 6c 6c 79 2c 20 63 61 6c 6c 73 20 74 6f  inally, calls to
1fec0 20 78 53 79 6e 63 28 29 20 6f 6e 20 74 68 65 20   xSync() on the 
1fed0 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65 0a  target database.
1fee0 2a 2a 20 20 20 20 20 66 69 6c 65 20 66 61 69 6c  **     file fail
1fef0 20 77 69 74 68 20 53 51 4c 49 54 45 5f 49 4e 54   with SQLITE_INT
1ff00 45 52 4e 41 4c 20 65 72 72 6f 72 73 2e 0a 2a 2f  ERNAL errors..*/
1ff10 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62  ..static void rb
1ff20 75 55 6e 6c 6f 63 6b 53 68 6d 28 72 62 75 5f 66  uUnlockShm(rbu_f
1ff30 69 6c 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  ile *p){.  asser
1ff40 74 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20  t( p->openFlags 
1ff50 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  & SQLITE_OPEN_MA
1ff60 49 4e 5f 44 42 20 29 3b 0a 20 20 69 66 28 20 70  IN_DB );.  if( p
1ff70 2d 3e 70 52 62 75 20 29 7b 0a 20 20 20 20 69 6e  ->pRbu ){.    in
1ff80 74 20 28 2a 78 53 68 6d 4c 6f 63 6b 29 28 73 71  t (*xShmLock)(sq
1ff90 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c  lite3_file*,int,
1ffa0 69 6e 74 2c 69 6e 74 29 20 3d 20 70 2d 3e 70 52  int,int) = p->pR
1ffb0 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  eal->pMethods->x
1ffc0 53 68 6d 4c 6f 63 6b 3b 0a 20 20 20 20 69 6e 74  ShmLock;.    int
1ffd0 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
1ffe0 20 69 3c 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c   i<SQLITE_SHM_NL
1fff0 4f 43 4b 3b 69 2b 2b 29 7b 0a 20 20 20 20 20 20  OCK;i++){.      
20000 69 66 28 20 28 31 3c 3c 69 29 20 26 20 70 2d 3e  if( (1<<i) & p->
20010 70 52 62 75 2d 3e 6d 4c 6f 63 6b 20 29 7b 0a 20  pRbu->mLock ){. 
20020 20 20 20 20 20 20 20 78 53 68 6d 4c 6f 63 6b 28         xShmLock(
20030 70 2d 3e 70 52 65 61 6c 2c 20 69 2c 20 31 2c 20  p->pReal, i, 1, 
20040 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
20050 4b 7c 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43  K|SQLITE_SHM_EXC
20060 4c 55 53 49 56 45 29 3b 0a 20 20 20 20 20 20 7d  LUSIVE);.      }
20070 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 52  .    }.    p->pR
20080 62 75 2d 3e 6d 4c 6f 63 6b 20 3d 20 30 3b 0a 20  bu->mLock = 0;. 
20090 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2f 0a 73 74 61 74   }.}../*.*/.stat
200a0 69 63 20 69 6e 74 20 72 62 75 55 70 64 61 74 65  ic int rbuUpdate
200b0 54 65 6d 70 53 69 7a 65 28 72 62 75 5f 66 69 6c  TempSize(rbu_fil
200c0 65 20 2a 70 46 64 2c 20 73 71 6c 69 74 65 33 5f  e *pFd, sqlite3_
200d0 69 6e 74 36 34 20 6e 4e 65 77 29 7b 0a 20 20 73  int64 nNew){.  s
200e0 71 6c 69 74 65 33 72 62 75 20 2a 70 52 62 75 20  qlite3rbu *pRbu 
200f0 3d 20 70 46 64 2d 3e 70 52 62 75 3b 0a 20 20 69  = pFd->pRbu;.  i
20100 36 34 20 6e 44 69 66 66 20 3d 20 6e 4e 65 77 20  64 nDiff = nNew 
20110 2d 20 70 46 64 2d 3e 73 7a 3b 0a 20 20 70 52 62  - pFd->sz;.  pRb
20120 75 2d 3e 73 7a 54 65 6d 70 20 2b 3d 20 6e 44 69  u->szTemp += nDi
20130 66 66 3b 0a 20 20 70 46 64 2d 3e 73 7a 20 3d 20  ff;.  pFd->sz = 
20140 6e 4e 65 77 3b 0a 20 20 61 73 73 65 72 74 28 20  nNew;.  assert( 
20150 70 52 62 75 2d 3e 73 7a 54 65 6d 70 3e 3d 30 20  pRbu->szTemp>=0 
20160 29 3b 0a 20 20 69 66 28 20 70 52 62 75 2d 3e 73  );.  if( pRbu->s
20170 7a 54 65 6d 70 4c 69 6d 69 74 20 26 26 20 70 52  zTempLimit && pR
20180 62 75 2d 3e 73 7a 54 65 6d 70 3e 70 52 62 75 2d  bu->szTemp>pRbu-
20190 3e 73 7a 54 65 6d 70 4c 69 6d 69 74 20 29 20 72  >szTempLimit ) r
201a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
201b0 4c 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  L;.  return SQLI
201c0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
201d0 41 64 64 20 61 6e 20 69 74 65 6d 20 74 6f 20 74  Add an item to t
201e0 68 65 20 6d 61 69 6e 2d 64 62 20 6c 69 73 74 73  he main-db lists
201f0 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
20200 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 2e 0a  lready present..
20210 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20  **.** There are 
20220 74 77 6f 20 6d 61 69 6e 2d 64 62 20 6c 69 73 74  two main-db list
20230 73 2e 20 4f 6e 65 20 66 6f 72 20 61 6c 6c 20 66  s. One for all f
20240 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c  ile descriptors,
20250 20 61 6e 64 20 6f 6e 65 0a 2a 2a 20 66 6f 72 20   and one.** for 
20260 61 6c 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  all file descrip
20270 74 6f 72 73 20 77 69 74 68 20 72 62 75 5f 66 69  tors with rbu_fi
20280 6c 65 2e 70 44 62 21 3d 30 2e 20 49 66 20 74 68  le.pDb!=0. If th
20290 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73 0a 2a  e argument has.*
202a0 2a 20 72 62 75 5f 66 69 6c 65 2e 70 44 62 21 3d  * rbu_file.pDb!=
202b0 30 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61 73  0, then it is as
202c0 73 75 6d 65 64 20 74 6f 20 61 6c 72 65 61 64 79  sumed to already
202d0 20 62 65 20 70 72 65 73 65 6e 74 20 6f 6e 20 74   be present on t
202e0 68 65 0a 2a 2a 20 6d 61 69 6e 20 6c 69 73 74 20  he.** main list 
202f0 61 6e 64 20 69 73 20 6f 6e 6c 79 20 61 64 64 65  and is only adde
20300 64 20 74 6f 20 74 68 65 20 70 44 62 21 3d 30 20  d to the pDb!=0 
20310 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
20320 76 6f 69 64 20 72 62 75 4d 61 69 6e 6c 69 73 74  void rbuMainlist
20330 41 64 64 28 72 62 75 5f 66 69 6c 65 20 2a 70 29  Add(rbu_file *p)
20340 7b 0a 20 20 72 62 75 5f 76 66 73 20 2a 70 52 62  {.  rbu_vfs *pRb
20350 75 56 66 73 20 3d 20 70 2d 3e 70 52 62 75 56 66  uVfs = p->pRbuVf
20360 73 3b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70  s;.  rbu_file *p
20370 49 74 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20  Iter;.  assert( 
20380 28 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20  (p->openFlags & 
20390 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
203a0 5f 44 42 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  _DB) );.  sqlite
203b0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 52  3_mutex_enter(pR
203c0 62 75 56 66 73 2d 3e 6d 75 74 65 78 29 3b 0a 20  buVfs->mutex);. 
203d0 20 69 66 28 20 70 2d 3e 70 52 62 75 3d 3d 30 20   if( p->pRbu==0 
203e0 29 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72  ){.    for(pIter
203f0 3d 70 52 62 75 56 66 73 2d 3e 70 4d 61 69 6e 3b  =pRbuVfs->pMain;
20400 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
20410 74 65 72 2d 3e 70 4d 61 69 6e 4e 65 78 74 29 3b  ter->pMainNext);
20420 0a 20 20 20 20 70 2d 3e 70 4d 61 69 6e 4e 65 78  .    p->pMainNex
20430 74 20 3d 20 70 52 62 75 56 66 73 2d 3e 70 4d 61  t = pRbuVfs->pMa
20440 69 6e 3b 0a 20 20 20 20 70 52 62 75 56 66 73 2d  in;.    pRbuVfs-
20450 3e 70 4d 61 69 6e 20 3d 20 70 3b 0a 20 20 7d 65  >pMain = p;.  }e
20460 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 49 74  lse{.    for(pIt
20470 65 72 3d 70 52 62 75 56 66 73 2d 3e 70 4d 61 69  er=pRbuVfs->pMai
20480 6e 52 62 75 3b 20 70 49 74 65 72 20 26 26 20 70  nRbu; pIter && p
20490 49 74 65 72 21 3d 70 3b 20 70 49 74 65 72 3d 70  Iter!=p; pIter=p
204a0 49 74 65 72 2d 3e 70 4d 61 69 6e 52 62 75 4e 65  Iter->pMainRbuNe
204b0 78 74 29 7b 7d 0a 20 20 20 20 69 66 28 20 70 49  xt){}.    if( pI
204c0 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ter==0 ){.      
204d0 70 2d 3e 70 4d 61 69 6e 52 62 75 4e 65 78 74 20  p->pMainRbuNext 
204e0 3d 20 70 52 62 75 56 66 73 2d 3e 70 4d 61 69 6e  = pRbuVfs->pMain
204f0 52 62 75 3b 0a 20 20 20 20 20 20 70 52 62 75 56  Rbu;.      pRbuV
20500 66 73 2d 3e 70 4d 61 69 6e 52 62 75 20 3d 20 70  fs->pMainRbu = p
20510 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
20520 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
20530 65 28 70 52 62 75 56 66 73 2d 3e 6d 75 74 65 78  e(pRbuVfs->mutex
20540 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  );.}../*.** Remo
20550 76 65 20 61 6e 20 69 74 65 6d 20 66 72 6f 6d 20  ve an item from 
20560 74 68 65 20 6d 61 69 6e 2d 64 62 20 6c 69 73 74  the main-db list
20570 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
20580 64 20 72 62 75 4d 61 69 6e 6c 69 73 74 52 65 6d  d rbuMainlistRem
20590 6f 76 65 28 72 62 75 5f 66 69 6c 65 20 2a 70 29  ove(rbu_file *p)
205a0 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 2a 70  {.  rbu_file **p
205b0 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  p;.  sqlite3_mut
205c0 65 78 5f 65 6e 74 65 72 28 70 2d 3e 70 52 62 75  ex_enter(p->pRbu
205d0 56 66 73 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66  Vfs->mutex);.  f
205e0 6f 72 28 70 70 3d 26 70 2d 3e 70 52 62 75 56 66  or(pp=&p->pRbuVf
205f0 73 2d 3e 70 4d 61 69 6e 3b 20 2a 70 70 20 26 26  s->pMain; *pp &&
20600 20 2a 70 70 21 3d 70 3b 20 70 70 3d 26 28 28 2a   *pp!=p; pp=&((*
20610 70 70 29 2d 3e 70 4d 61 69 6e 4e 65 78 74 29 29  pp)->pMainNext))
20620 7b 7d 0a 20 20 69 66 28 20 2a 70 70 20 29 20 2a  {}.  if( *pp ) *
20630 70 70 20 3d 20 70 2d 3e 70 4d 61 69 6e 4e 65 78  pp = p->pMainNex
20640 74 3b 0a 20 20 70 2d 3e 70 4d 61 69 6e 4e 65 78  t;.  p->pMainNex
20650 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 70 3d  t = 0;.  for(pp=
20660 26 70 2d 3e 70 52 62 75 56 66 73 2d 3e 70 4d 61  &p->pRbuVfs->pMa
20670 69 6e 52 62 75 3b 20 2a 70 70 20 26 26 20 2a 70  inRbu; *pp && *p
20680 70 21 3d 70 3b 20 70 70 3d 26 28 28 2a 70 70 29  p!=p; pp=&((*pp)
20690 2d 3e 70 4d 61 69 6e 52 62 75 4e 65 78 74 29 29  ->pMainRbuNext))
206a0 7b 7d 0a 20 20 69 66 28 20 2a 70 70 20 29 20 2a  {}.  if( *pp ) *
206b0 70 70 20 3d 20 70 2d 3e 70 4d 61 69 6e 52 62 75  pp = p->pMainRbu
206c0 4e 65 78 74 3b 0a 20 20 70 2d 3e 70 4d 61 69 6e  Next;.  p->pMain
206d0 52 62 75 4e 65 78 74 20 3d 20 30 3b 0a 20 20 73  RbuNext = 0;.  s
206e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
206f0 76 65 28 70 2d 3e 70 52 62 75 56 66 73 2d 3e 6d  ve(p->pRbuVfs->m
20700 75 74 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  utex);.}../*.** 
20710 47 69 76 65 6e 20 74 68 61 74 20 7a 57 61 6c 20  Given that zWal 
20720 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66  points to a buff
20730 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20  er containing a 
20740 77 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 70 61  wal file name pa
20750 73 73 65 64 20 74 6f 20 0a 2a 2a 20 65 69 74 68  ssed to .** eith
20760 65 72 20 74 68 65 20 78 4f 70 65 6e 28 29 20 6f  er the xOpen() o
20770 72 20 78 41 63 63 65 73 73 28 29 20 56 46 53 20  r xAccess() VFS 
20780 6d 65 74 68 6f 64 2c 20 73 65 61 72 63 68 20 74  method, search t
20790 68 65 20 6d 61 69 6e 2d 64 62 20 6c 69 73 74 20  he main-db list 
207a0 66 6f 72 0a 2a 2a 20 61 20 66 69 6c 65 2d 68 61  for.** a file-ha
207b0 6e 64 6c 65 20 6f 70 65 6e 65 64 20 62 79 20 74  ndle opened by t
207c0 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
207d0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 6e 20 74   connection on t
207e0 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
207f0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
20800 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61  e..**.** If para
20810 6d 65 74 65 72 20 62 52 62 75 20 69 73 20 74 72  meter bRbu is tr
20820 75 65 2c 20 6f 6e 6c 79 20 73 65 61 72 63 68 20  ue, only search 
20830 66 6f 72 20 66 69 6c 65 2d 64 65 73 63 72 69 70  for file-descrip
20840 74 6f 72 73 20 77 69 74 68 0a 2a 2a 20 72 62 75  tors with.** rbu
20850 5f 66 69 6c 65 2e 70 44 62 21 3d 30 2e 0a 2a 2f  _file.pDb!=0..*/
20860 0a 73 74 61 74 69 63 20 72 62 75 5f 66 69 6c 65  .static rbu_file
20870 20 2a 72 62 75 46 69 6e 64 4d 61 69 6e 64 62 28   *rbuFindMaindb(
20880 72 62 75 5f 76 66 73 20 2a 70 52 62 75 56 66 73  rbu_vfs *pRbuVfs
20890 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57  , const char *zW
208a0 61 6c 2c 20 69 6e 74 20 62 52 62 75 29 7b 0a 20  al, int bRbu){. 
208b0 20 72 62 75 5f 66 69 6c 65 20 2a 70 44 62 3b 0a   rbu_file *pDb;.
208c0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
208d0 65 6e 74 65 72 28 70 52 62 75 56 66 73 2d 3e 6d  enter(pRbuVfs->m
208e0 75 74 65 78 29 3b 0a 20 20 69 66 28 20 62 52 62  utex);.  if( bRb
208f0 75 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 44 62  u ){.    for(pDb
20900 3d 70 52 62 75 56 66 73 2d 3e 70 4d 61 69 6e 52  =pRbuVfs->pMainR
20910 62 75 3b 20 70 44 62 20 26 26 20 70 44 62 2d 3e  bu; pDb && pDb->
20920 7a 57 61 6c 21 3d 7a 57 61 6c 3b 20 70 44 62 3d  zWal!=zWal; pDb=
20930 70 44 62 2d 3e 70 4d 61 69 6e 52 62 75 4e 65 78  pDb->pMainRbuNex
20940 74 29 7b 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t){}.  }else{.  
20950 20 20 66 6f 72 28 70 44 62 3d 70 52 62 75 56 66    for(pDb=pRbuVf
20960 73 2d 3e 70 4d 61 69 6e 3b 20 70 44 62 20 26 26  s->pMain; pDb &&
20970 20 70 44 62 2d 3e 7a 57 61 6c 21 3d 7a 57 61 6c   pDb->zWal!=zWal
20980 3b 20 70 44 62 3d 70 44 62 2d 3e 70 4d 61 69 6e  ; pDb=pDb->pMain
20990 4e 65 78 74 29 7b 7d 0a 20 20 7d 0a 20 20 73 71  Next){}.  }.  sq
209a0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
209b0 65 28 70 52 62 75 56 66 73 2d 3e 6d 75 74 65 78  e(pRbuVfs->mutex
209c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 44 62 3b  );.  return pDb;
209d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
209e0 61 6e 20 72 62 75 20 66 69 6c 65 2e 0a 2a 2f 0a  an rbu file..*/.
209f0 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66  static int rbuVf
20a00 73 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  sClose(sqlite3_f
20a10 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 72  ile *pFile){.  r
20a20 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62  bu_file *p = (rb
20a30 75 5f 66 69 6c 65 2a 29 70 46 69 6c 65 3b 0a 20  u_file*)pFile;. 
20a40 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
20a50 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65  ;..  /* Free the
20a60 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
20a70 20 61 70 53 68 6d 5b 5d 20 61 72 72 61 79 2e 20   apShm[] array. 
20a80 41 6e 64 20 74 68 65 20 61 72 72 61 79 20 69 74  And the array it
20a90 73 65 6c 66 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  self. */.  for(i
20aa0 3d 30 3b 20 69 3c 70 2d 3e 6e 53 68 6d 3b 20 69  =0; i<p->nShm; i
20ab0 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
20ac0 5f 66 72 65 65 28 70 2d 3e 61 70 53 68 6d 5b 69  _free(p->apShm[i
20ad0 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ]);.  }.  sqlite
20ae0 33 5f 66 72 65 65 28 70 2d 3e 61 70 53 68 6d 29  3_free(p->apShm)
20af0 3b 0a 20 20 70 2d 3e 61 70 53 68 6d 20 3d 20 30  ;.  p->apShm = 0
20b00 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
20b10 28 70 2d 3e 7a 44 65 6c 29 3b 0a 0a 20 20 69 66  (p->zDel);..  if
20b20 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26  ( p->openFlags &
20b30 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
20b40 4e 5f 44 42 20 29 7b 0a 20 20 20 20 72 62 75 4d  N_DB ){.    rbuM
20b50 61 69 6e 6c 69 73 74 52 65 6d 6f 76 65 28 70 29  ainlistRemove(p)
20b60 3b 0a 20 20 20 20 72 62 75 55 6e 6c 6f 63 6b 53  ;.    rbuUnlockS
20b70 68 6d 28 70 29 3b 0a 20 20 20 20 70 2d 3e 70 52  hm(p);.    p->pR
20b80 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  eal->pMethods->x
20b90 53 68 6d 55 6e 6d 61 70 28 70 2d 3e 70 52 65 61  ShmUnmap(p->pRea
20ba0 6c 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 65 6c 73  l, 0);.  }.  els
20bb0 65 20 69 66 28 20 28 70 2d 3e 6f 70 65 6e 46 6c  e if( (p->openFl
20bc0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
20bd0 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29  N_DELETEONCLOSE)
20be0 20 26 26 20 70 2d 3e 70 52 62 75 20 29 7b 0a 20   && p->pRbu ){. 
20bf0 20 20 20 72 62 75 55 70 64 61 74 65 54 65 6d 70     rbuUpdateTemp
20c00 53 69 7a 65 28 70 2c 20 30 29 3b 0a 20 20 7d 0a  Size(p, 0);.  }.
20c10 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4d 61    assert( p->pMa
20c20 69 6e 4e 65 78 74 3d 3d 30 20 26 26 20 70 2d 3e  inNext==0 && p->
20c30 70 52 62 75 56 66 73 2d 3e 70 4d 61 69 6e 21 3d  pRbuVfs->pMain!=
20c40 70 20 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65  p );..  /* Close
20c50 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
20c60 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  file handle */. 
20c70 20 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e   rc = p->pReal->
20c80 70 4d 65 74 68 6f 64 73 2d 3e 78 43 6c 6f 73 65  pMethods->xClose
20c90 28 70 2d 3e 70 52 65 61 6c 29 3b 0a 20 20 72 65  (p->pReal);.  re
20ca0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
20cb0 2a 2a 20 52 65 61 64 20 61 6e 64 20 72 65 74 75  ** Read and retu
20cc0 72 6e 20 61 6e 20 75 6e 73 69 67 6e 65 64 20 33  rn an unsigned 3
20cd0 32 2d 62 69 74 20 62 69 67 2d 65 6e 64 69 61 6e  2-bit big-endian
20ce0 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68   integer from th
20cf0 65 20 62 75 66 66 65 72 20 0a 2a 2a 20 70 61 73  e buffer .** pas
20d00 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
20d10 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
20d20 74 69 63 20 75 33 32 20 72 62 75 47 65 74 55 33  tic u32 rbuGetU3
20d30 32 28 75 38 20 2a 61 42 75 66 29 7b 0a 20 20 72  2(u8 *aBuf){.  r
20d40 65 74 75 72 6e 20 28 28 75 33 32 29 61 42 75 66  eturn ((u32)aBuf
20d50 5b 30 5d 20 3c 3c 20 32 34 29 0a 20 20 20 20 20  [0] << 24).     
20d60 20 20 2b 20 28 28 75 33 32 29 61 42 75 66 5b 31    + ((u32)aBuf[1
20d70 5d 20 3c 3c 20 31 36 29 0a 20 20 20 20 20 20 20  ] << 16).       
20d80 2b 20 28 28 75 33 32 29 61 42 75 66 5b 32 5d 20  + ((u32)aBuf[2] 
20d90 3c 3c 20 20 38 29 0a 20 20 20 20 20 20 20 2b 20  <<  8).       + 
20da0 28 28 75 33 32 29 61 42 75 66 5b 33 5d 29 3b 0a  ((u32)aBuf[3]);.
20db0 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  }../*.** Write a
20dc0 6e 20 75 6e 73 69 67 6e 65 64 20 33 32 2d 62 69  n unsigned 32-bi
20dd0 74 20 76 61 6c 75 65 20 69 6e 20 62 69 67 2d 65  t value in big-e
20de0 6e 64 69 61 6e 20 66 6f 72 6d 61 74 20 74 6f 20  ndian format to 
20df0 74 68 65 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20  the supplied.** 
20e00 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  buffer..*/.stati
20e10 63 20 76 6f 69 64 20 72 62 75 50 75 74 55 33 32  c void rbuPutU32
20e20 28 75 38 20 2a 61 42 75 66 2c 20 75 33 32 20 69  (u8 *aBuf, u32 i
20e30 56 61 6c 29 7b 0a 20 20 61 42 75 66 5b 30 5d 20  Val){.  aBuf[0] 
20e40 3d 20 28 69 56 61 6c 20 3e 3e 20 32 34 29 20 26  = (iVal >> 24) &
20e50 20 30 78 46 46 3b 0a 20 20 61 42 75 66 5b 31 5d   0xFF;.  aBuf[1]
20e60 20 3d 20 28 69 56 61 6c 20 3e 3e 20 31 36 29 20   = (iVal >> 16) 
20e70 26 20 30 78 46 46 3b 0a 20 20 61 42 75 66 5b 32  & 0xFF;.  aBuf[2
20e80 5d 20 3d 20 28 69 56 61 6c 20 3e 3e 20 20 38 29  ] = (iVal >>  8)
20e90 20 26 20 30 78 46 46 3b 0a 20 20 61 42 75 66 5b   & 0xFF;.  aBuf[
20ea0 33 5d 20 3d 20 28 69 56 61 6c 20 3e 3e 20 20 30  3] = (iVal >>  0
20eb0 29 20 26 20 30 78 46 46 3b 0a 7d 0a 0a 73 74 61  ) & 0xFF;.}..sta
20ec0 74 69 63 20 76 6f 69 64 20 72 62 75 50 75 74 55  tic void rbuPutU
20ed0 31 36 28 75 38 20 2a 61 42 75 66 2c 20 75 31 36  16(u8 *aBuf, u16
20ee0 20 69 56 61 6c 29 7b 0a 20 20 61 42 75 66 5b 30   iVal){.  aBuf[0
20ef0 5d 20 3d 20 28 69 56 61 6c 20 3e 3e 20 20 38 29  ] = (iVal >>  8)
20f00 20 26 20 30 78 46 46 3b 0a 20 20 61 42 75 66 5b   & 0xFF;.  aBuf[
20f10 31 5d 20 3d 20 28 69 56 61 6c 20 3e 3e 20 20 30  1] = (iVal >>  0
20f20 29 20 26 20 30 78 46 46 3b 0a 7d 0a 0a 2f 2a 0a  ) & 0xFF;.}../*.
20f30 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f  ** Read data fro
20f40 6d 20 61 6e 20 72 62 75 56 66 73 2d 66 69 6c 65  m an rbuVfs-file
20f50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
20f60 72 62 75 56 66 73 52 65 61 64 28 0a 20 20 73 71  rbuVfsRead(.  sq
20f70 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
20f80 65 2c 20 0a 20 20 76 6f 69 64 20 2a 7a 42 75 66  e, .  void *zBuf
20f90 2c 20 0a 20 20 69 6e 74 20 69 41 6d 74 2c 20 0a  , .  int iAmt, .
20fa0 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69    sqlite_int64 i
20fb0 4f 66 73 74 0a 29 7b 0a 20 20 72 62 75 5f 66 69  Ofst.){.  rbu_fi
20fc0 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c  le *p = (rbu_fil
20fd0 65 2a 29 70 46 69 6c 65 3b 0a 20 20 73 71 6c 69  e*)pFile;.  sqli
20fe0 74 65 33 72 62 75 20 2a 70 52 62 75 20 3d 20 70  te3rbu *pRbu = p
20ff0 2d 3e 70 52 62 75 3b 0a 20 20 69 6e 74 20 72 63  ->pRbu;.  int rc
21000 3b 0a 0a 20 20 69 66 28 20 70 52 62 75 20 26 26  ;..  if( pRbu &&
21010 20 70 52 62 75 2d 3e 65 53 74 61 67 65 3d 3d 52   pRbu->eStage==R
21020 42 55 5f 53 54 41 47 45 5f 43 41 50 54 55 52 45  BU_STAGE_CAPTURE
21030 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
21040 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53  p->openFlags & S
21050 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29  QLITE_OPEN_WAL )
21060 3b 0a 20 20 20 20 72 63 20 3d 20 72 62 75 43 61  ;.    rc = rbuCa
21070 70 74 75 72 65 57 61 6c 52 65 61 64 28 70 2d 3e  ptureWalRead(p->
21080 70 52 62 75 2c 20 69 4f 66 73 74 2c 20 69 41 6d  pRbu, iOfst, iAm
21090 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
210a0 20 69 66 28 20 70 52 62 75 20 26 26 20 70 52 62   if( pRbu && pRb
210b0 75 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53  u->eStage==RBU_S
210c0 54 41 47 45 5f 4f 41 4c 20 0a 20 20 20 20 20 26  TAGE_OAL .     &
210d0 26 20 28 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20  & (p->openFlags 
210e0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  & SQLITE_OPEN_WA
210f0 4c 29 20 0a 20 20 20 20 20 26 26 20 69 4f 66 73  L) .     && iOfs
21100 74 3e 3d 70 52 62 75 2d 3e 69 4f 61 6c 53 7a 20  t>=pRbu->iOalSz 
21110 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63  .    ){.      rc
21120 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
21130 20 20 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c      memset(zBuf,
21140 20 30 2c 20 69 41 6d 74 29 3b 0a 20 20 20 20 7d   0, iAmt);.    }
21150 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
21160 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68   p->pReal->pMeth
21170 6f 64 73 2d 3e 78 52 65 61 64 28 70 2d 3e 70 52  ods->xRead(p->pR
21180 65 61 6c 2c 20 7a 42 75 66 2c 20 69 41 6d 74 2c  eal, zBuf, iAmt,
21190 20 69 4f 66 73 74 29 3b 0a 23 69 66 20 31 0a 20   iOfst);.#if 1. 
211a0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
211b0 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20  is being called 
211c0 74 6f 20 72 65 61 64 20 74 68 65 20 66 69 72 73  to read the firs
211d0 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 74 61  t page of the ta
211e0 72 67 65 74 20 0a 20 20 20 20 20 20 2a 2a 20 64  rget .      ** d
211f0 61 74 61 62 61 73 65 20 61 73 20 70 61 72 74 20  atabase as part 
21200 6f 66 20 61 6e 20 72 62 75 20 76 61 63 75 75 6d  of an rbu vacuum
21210 20 6f 70 65 72 61 74 69 6f 6e 2c 20 73 79 6e 74   operation, synt
21220 68 65 73 69 7a 65 20 74 68 65 20 0a 20 20 20 20  hesize the .    
21230 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66    ** contents of
21240 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
21250 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 79  if it does not y
21260 65 74 20 65 78 69 73 74 2e 20 4f 74 68 65 72 77  et exist. Otherw
21270 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20 53 51  ise,.      ** SQ
21280 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20 63 68  Lite will not ch
21290 65 63 6b 20 66 6f 72 20 61 20 2a 2d 77 61 6c 20  eck for a *-wal 
212a0 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  file.  */.      
212b0 69 66 28 20 70 52 62 75 20 26 26 20 72 62 75 49  if( pRbu && rbuI
212c0 73 56 61 63 75 75 6d 28 70 52 62 75 29 20 0a 20  sVacuum(pRbu) . 
212d0 20 20 20 20 20 20 20 20 20 26 26 20 72 63 3d 3d           && rc==
212e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
212f0 52 54 5f 52 45 41 44 20 26 26 20 69 4f 66 73 74  RT_READ && iOfst
21300 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26 26  ==0.          &&
21310 20 28 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26   (p->openFlags &
21320 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
21330 4e 5f 44 42 29 0a 20 20 20 20 20 20 20 20 20 20  N_DB).          
21340 26 26 20 70 52 62 75 2d 3e 72 63 3d 3d 53 51 4c  && pRbu->rc==SQL
21350 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 29 7b 0a  ITE_OK.      ){.
21360 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
21370 66 69 6c 65 20 2a 70 46 64 20 3d 20 28 73 71 6c  file *pFd = (sql
21380 69 74 65 33 5f 66 69 6c 65 2a 29 70 52 62 75 2d  ite3_file*)pRbu-
21390 3e 70 52 62 75 46 64 3b 0a 20 20 20 20 20 20 20  >pRbuFd;.       
213a0 20 72 63 20 3d 20 70 46 64 2d 3e 70 4d 65 74 68   rc = pFd->pMeth
213b0 6f 64 73 2d 3e 78 52 65 61 64 28 70 46 64 2c 20  ods->xRead(pFd, 
213c0 7a 42 75 66 2c 20 69 41 6d 74 2c 20 69 4f 66 73  zBuf, iAmt, iOfs
213d0 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
213e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
213f0 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 61  .          u8 *a
21400 42 75 66 20 3d 20 28 75 38 2a 29 7a 42 75 66 3b  Buf = (u8*)zBuf;
21410 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20 69  .          u32 i
21420 52 6f 6f 74 20 3d 20 72 62 75 47 65 74 55 33 32  Root = rbuGetU32
21430 28 26 61 42 75 66 5b 35 32 5d 29 20 3f 20 31 20  (&aBuf[52]) ? 1 
21440 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  : 0;.          r
21450 62 75 50 75 74 55 33 32 28 26 61 42 75 66 5b 35  buPutU32(&aBuf[5
21460 32 5d 2c 20 69 52 6f 6f 74 29 3b 20 20 20 20 20  2], iRoot);     
21470 20 2f 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f 74   /* largest root
21480 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
21490 20 20 20 20 20 20 20 20 20 20 72 62 75 50 75 74            rbuPut
214a0 55 33 32 28 26 61 42 75 66 5b 33 36 5d 2c 20 30  U32(&aBuf[36], 0
214b0 29 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e  );          /* n
214c0 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 70 61  umber of free pa
214d0 67 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ges */.         
214e0 20 72 62 75 50 75 74 55 33 32 28 26 61 42 75 66   rbuPutU32(&aBuf
214f0 5b 33 32 5d 2c 20 30 29 3b 20 20 20 20 20 20 20  [32], 0);       
21500 20 20 20 2f 2a 20 66 69 72 73 74 20 70 61 67 65     /* first page
21510 20 6f 6e 20 66 72 65 65 20 6c 69 73 74 20 74 72   on free list tr
21520 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  unk */.         
21530 20 72 62 75 50 75 74 55 33 32 28 26 61 42 75 66   rbuPutU32(&aBuf
21540 5b 32 38 5d 2c 20 31 29 3b 20 20 20 20 20 20 20  [28], 1);       
21550 20 20 20 2f 2a 20 73 69 7a 65 20 6f 66 20 64 62     /* size of db
21560 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a   file in pages *
21570 2f 0a 20 20 20 20 20 20 20 20 20 20 72 62 75 50  /.          rbuP
21580 75 74 55 33 32 28 26 61 42 75 66 5b 32 34 5d 2c  utU32(&aBuf[24],
21590 20 70 52 62 75 2d 3e 70 52 62 75 46 64 2d 3e 69   pRbu->pRbuFd->i
215a0 43 6f 6f 6b 69 65 2b 31 29 3b 20 20 2f 2a 20 43  Cookie+1);  /* C
215b0 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 2a 2f  hange counter */
215c0 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ..          if( 
215d0 69 41 6d 74 3e 31 30 30 20 29 7b 0a 20 20 20 20  iAmt>100 ){.    
215e0 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
215f0 61 42 75 66 5b 31 30 30 5d 2c 20 30 2c 20 69 41  aBuf[100], 0, iA
21600 6d 74 2d 31 30 30 29 3b 0a 20 20 20 20 20 20 20  mt-100);.       
21610 20 20 20 20 20 72 62 75 50 75 74 55 31 36 28 26       rbuPutU16(&
21620 61 42 75 66 5b 31 30 35 5d 2c 20 69 41 6d 74 20  aBuf[105], iAmt 
21630 26 20 30 78 46 46 46 46 29 3b 0a 20 20 20 20 20  & 0xFFFF);.     
21640 20 20 20 20 20 20 20 61 42 75 66 5b 31 30 30 5d         aBuf[100]
21650 20 3d 20 30 78 30 44 3b 0a 20 20 20 20 20 20 20   = 0x0D;.       
21660 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
21670 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
21680 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
21690 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4f 66  SQLITE_OK && iOf
216a0 73 74 3d 3d 30 20 26 26 20 28 70 2d 3e 6f 70 65  st==0 && (p->ope
216b0 6e 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  nFlags & SQLITE_
216c0 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 29 7b  OPEN_MAIN_DB) ){
216d0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 73 65 20  .      /* These 
216e0 6c 6f 6f 6b 20 6c 69 6b 65 20 6d 61 67 69 63 20  look like magic 
216f0 6e 75 6d 62 65 72 73 2e 20 42 75 74 20 74 68 65  numbers. But the
21700 79 20 61 72 65 20 73 74 61 62 6c 65 2c 20 61 73  y are stable, as
21710 20 74 68 65 79 20 61 72 65 20 70 61 72 74 0a 20   they are part. 
21720 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
21730 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 74 68  definition of th
21740 65 20 53 51 4c 69 74 65 20 66 69 6c 65 20 66 6f  e SQLite file fo
21750 72 6d 61 74 2c 20 77 68 69 63 68 20 6d 61 79 20  rmat, which may 
21760 6e 6f 74 20 63 68 61 6e 67 65 2e 20 2a 2f 0a 20  not change. */. 
21770 20 20 20 20 20 75 38 20 2a 70 42 75 66 20 3d 20       u8 *pBuf = 
21780 28 75 38 2a 29 7a 42 75 66 3b 0a 20 20 20 20 20  (u8*)zBuf;.     
21790 20 70 2d 3e 69 43 6f 6f 6b 69 65 20 3d 20 72 62   p->iCookie = rb
217a0 75 47 65 74 55 33 32 28 26 70 42 75 66 5b 32 34  uGetU32(&pBuf[24
217b0 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 57 72  ]);.      p->iWr
217c0 69 74 65 56 65 72 20 3d 20 70 42 75 66 5b 31 39  iteVer = pBuf[19
217d0 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  ];.    }.  }.  r
217e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
217f0 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 74 6f  ** Write data to
21800 20 61 6e 20 72 62 75 56 66 73 2d 66 69 6c 65 2e   an rbuVfs-file.
21810 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
21820 62 75 56 66 73 57 72 69 74 65 28 0a 20 20 73 71  buVfsWrite(.  sq
21830 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
21840 65 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  e, .  const void
21850 20 2a 7a 42 75 66 2c 20 0a 20 20 69 6e 74 20 69   *zBuf, .  int i
21860 41 6d 74 2c 20 0a 20 20 73 71 6c 69 74 65 5f 69  Amt, .  sqlite_i
21870 6e 74 36 34 20 69 4f 66 73 74 0a 29 7b 0a 20 20  nt64 iOfst.){.  
21880 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72  rbu_file *p = (r
21890 62 75 5f 66 69 6c 65 2a 29 70 46 69 6c 65 3b 0a  bu_file*)pFile;.
218a0 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 52    sqlite3rbu *pR
218b0 62 75 20 3d 20 70 2d 3e 70 52 62 75 3b 0a 20 20  bu = p->pRbu;.  
218c0 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70  int rc;..  if( p
218d0 52 62 75 20 26 26 20 70 52 62 75 2d 3e 65 53 74  Rbu && pRbu->eSt
218e0 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 43  age==RBU_STAGE_C
218f0 41 50 54 55 52 45 20 29 7b 0a 20 20 20 20 61 73  APTURE ){.    as
21900 73 65 72 74 28 20 70 2d 3e 6f 70 65 6e 46 6c 61  sert( p->openFla
21910 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
21920 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 20 20  _MAIN_DB );.    
21930 72 63 20 3d 20 72 62 75 43 61 70 74 75 72 65 44  rc = rbuCaptureD
21940 62 57 72 69 74 65 28 70 2d 3e 70 52 62 75 2c 20  bWrite(p->pRbu, 
21950 69 4f 66 73 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  iOfst);.  }else{
21960 0a 20 20 20 20 69 66 28 20 70 52 62 75 20 29 7b  .    if( pRbu ){
21970 0a 20 20 20 20 20 20 69 66 28 20 70 52 62 75 2d  .      if( pRbu-
21980 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41  >eStage==RBU_STA
21990 47 45 5f 4f 41 4c 20 0a 20 20 20 20 20 20 20 26  GE_OAL .       &
219a0 26 20 28 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20  & (p->openFlags 
219b0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  & SQLITE_OPEN_WA
219c0 4c 29 20 0a 20 20 20 20 20 20 20 26 26 20 69 4f  L) .       && iO
219d0 66 73 74 3e 3d 70 52 62 75 2d 3e 69 4f 61 6c 53  fst>=pRbu->iOalS
219e0 7a 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  z.      ){.     
219f0 20 20 20 70 52 62 75 2d 3e 69 4f 61 6c 53 7a 20     pRbu->iOalSz 
21a00 3d 20 69 41 6d 74 20 2b 20 69 4f 66 73 74 3b 0a  = iAmt + iOfst;.
21a10 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
21a20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53  p->openFlags & S
21a30 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
21a40 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a 20 20 20 20  EONCLOSE ){.    
21a50 20 20 20 20 69 36 34 20 73 7a 4e 65 77 20 3d 20      i64 szNew = 
21a60 69 41 6d 74 2b 69 4f 66 73 74 3b 0a 20 20 20 20  iAmt+iOfst;.    
21a70 20 20 20 20 69 66 28 20 73 7a 4e 65 77 3e 70 2d      if( szNew>p-
21a80 3e 73 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >sz ){.         
21a90 20 72 63 20 3d 20 72 62 75 55 70 64 61 74 65 54   rc = rbuUpdateT
21aa0 65 6d 70 53 69 7a 65 28 70 2c 20 73 7a 4e 65 77  empSize(p, szNew
21ab0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
21ac0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
21ad0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
21ae0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
21af0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 70 2d 3e    }.    rc = p->
21b00 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d  pReal->pMethods-
21b10 3e 78 57 72 69 74 65 28 70 2d 3e 70 52 65 61 6c  >xWrite(p->pReal
21b20 2c 20 7a 42 75 66 2c 20 69 41 6d 74 2c 20 69 4f  , zBuf, iAmt, iO
21b30 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  fst);.    if( rc
21b40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
21b50 4f 66 73 74 3d 3d 30 20 26 26 20 28 70 2d 3e 6f  Ofst==0 && (p->o
21b60 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49 54  penFlags & SQLIT
21b70 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20  E_OPEN_MAIN_DB) 
21b80 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 73  ){.      /* Thes
21b90 65 20 6c 6f 6f 6b 20 6c 69 6b 65 20 6d 61 67 69  e look like magi
21ba0 63 20 6e 75 6d 62 65 72 73 2e 20 42 75 74 20 74  c numbers. But t
21bb0 68 65 79 20 61 72 65 20 73 74 61 62 6c 65 2c 20  hey are stable, 
21bc0 61 73 20 74 68 65 79 20 61 72 65 20 70 61 72 74  as they are part
21bd0 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
21be0 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 74   definition of t
21bf0 68 65 20 53 51 4c 69 74 65 20 66 69 6c 65 20 66  he SQLite file f
21c00 6f 72 6d 61 74 2c 20 77 68 69 63 68 20 6d 61 79  ormat, which may
21c10 20 6e 6f 74 20 63 68 61 6e 67 65 2e 20 2a 2f 0a   not change. */.
21c20 20 20 20 20 20 20 75 38 20 2a 70 42 75 66 20 3d        u8 *pBuf =
21c30 20 28 75 38 2a 29 7a 42 75 66 3b 0a 20 20 20 20   (u8*)zBuf;.    
21c40 20 20 70 2d 3e 69 43 6f 6f 6b 69 65 20 3d 20 72    p->iCookie = r
21c50 62 75 47 65 74 55 33 32 28 26 70 42 75 66 5b 32  buGetU32(&pBuf[2
21c60 34 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 57  4]);.      p->iW
21c70 72 69 74 65 56 65 72 20 3d 20 70 42 75 66 5b 31  riteVer = pBuf[1
21c80 39 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  9];.    }.  }.  
21c90 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21ca0 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20  .** Truncate an 
21cb0 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a  rbuVfs-file..*/.
21cc0 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66  static int rbuVf
21cd0 73 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65  sTruncate(sqlite
21ce0 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73  3_file *pFile, s
21cf0 71 6c 69 74 65 5f 69 6e 74 36 34 20 73 69 7a 65  qlite_int64 size
21d00 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70  ){.  rbu_file *p
21d10 20 3d 20 28 72 62 75 5f 66 69 6c 65 2a 29 70 46   = (rbu_file*)pF
21d20 69 6c 65 3b 0a 20 20 69 66 28 20 28 70 2d 3e 6f  ile;.  if( (p->o
21d30 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49 54  penFlags & SQLIT
21d40 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
21d50 4c 4f 53 45 29 20 26 26 20 70 2d 3e 70 52 62 75  LOSE) && p->pRbu
21d60 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   ){.    int rc =
21d70 20 72 62 75 55 70 64 61 74 65 54 65 6d 70 53 69   rbuUpdateTempSi
21d80 7a 65 28 70 2c 20 73 69 7a 65 29 3b 0a 20 20 20  ze(p, size);.   
21d90 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
21da0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
21db0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e    }.  return p->
21dc0 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d  pReal->pMethods-
21dd0 3e 78 54 72 75 6e 63 61 74 65 28 70 2d 3e 70 52  >xTruncate(p->pR
21de0 65 61 6c 2c 20 73 69 7a 65 29 3b 0a 7d 0a 0a 2f  eal, size);.}../
21df0 2a 0a 2a 2a 20 53 79 6e 63 20 61 6e 20 72 62 75  *.** Sync an rbu
21e00 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  Vfs-file..*/.sta
21e10 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 53 79  tic int rbuVfsSy
21e20 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  nc(sqlite3_file 
21e30 2a 70 46 69 6c 65 2c 20 69 6e 74 20 66 6c 61 67  *pFile, int flag
21e40 73 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a  s){.  rbu_file *
21e50 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a 29  p = (rbu_file *)
21e60 70 46 69 6c 65 3b 0a 20 20 69 66 28 20 70 2d 3e  pFile;.  if( p->
21e70 70 52 62 75 20 26 26 20 70 2d 3e 70 52 62 75 2d  pRbu && p->pRbu-
21e80 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41  >eStage==RBU_STA
21e90 47 45 5f 43 41 50 54 55 52 45 20 29 7b 0a 20 20  GE_CAPTURE ){.  
21ea0 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e 46 6c 61    if( p->openFla
21eb0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
21ec0 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20  _MAIN_DB ){.    
21ed0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21ee0 49 4e 54 45 52 4e 41 4c 3b 0a 20 20 20 20 7d 0a  INTERNAL;.    }.
21ef0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
21f00 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  E_OK;.  }.  retu
21f10 72 6e 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65  rn p->pReal->pMe
21f20 74 68 6f 64 73 2d 3e 78 53 79 6e 63 28 70 2d 3e  thods->xSync(p->
21f30 70 52 65 61 6c 2c 20 66 6c 61 67 73 29 3b 0a 7d  pReal, flags);.}
21f40 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
21f50 68 65 20 63 75 72 72 65 6e 74 20 66 69 6c 65 2d  he current file-
21f60 73 69 7a 65 20 6f 66 20 61 6e 20 72 62 75 56 66  size of an rbuVf
21f70 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  s-file..*/.stati
21f80 63 20 69 6e 74 20 72 62 75 56 66 73 46 69 6c 65  c int rbuVfsFile
21f90 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  Size(sqlite3_fil
21fa0 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74 65  e *pFile, sqlite
21fb0 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65 29 7b 0a  _int64 *pSize){.
21fc0 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20    rbu_file *p = 
21fd0 28 72 62 75 5f 66 69 6c 65 20 2a 29 70 46 69 6c  (rbu_file *)pFil
21fe0 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72  e;.  int rc;.  r
21ff0 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d  c = p->pReal->pM
22000 65 74 68 6f 64 73 2d 3e 78 46 69 6c 65 53 69 7a  ethods->xFileSiz
22010 65 28 70 2d 3e 70 52 65 61 6c 2c 20 70 53 69 7a  e(p->pReal, pSiz
22020 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  e);..  /* If thi
22030 73 20 69 73 20 61 6e 20 52 42 55 20 76 61 63 75  s is an RBU vacu
22040 75 6d 20 6f 70 65 72 61 74 69 6f 6e 20 61 6e 64  um operation and
22050 20 74 68 69 73 20 69 73 20 74 68 65 20 74 61 72   this is the tar
22060 67 65 74 20 64 61 74 61 62 61 73 65 2c 0a 20 20  get database,.  
22070 2a 2a 20 70 72 65 74 65 6e 64 20 74 68 61 74 20  ** pretend that 
22080 69 74 20 68 61 73 20 61 74 20 6c 65 61 73 74 20  it has at least 
22090 6f 6e 65 20 70 61 67 65 2e 20 4f 74 68 65 72 77  one page. Otherw
220a0 69 73 65 2c 20 53 51 4c 69 74 65 20 77 69 6c 6c  ise, SQLite will
220b0 20 6e 6f 74 0a 20 20 2a 2a 20 63 68 65 63 6b 20   not.  ** check 
220c0 66 6f 72 20 74 68 65 20 65 78 69 73 74 61 6e 63  for the existanc
220d0 65 20 6f 66 20 61 20 2a 2d 77 61 6c 20 66 69 6c  e of a *-wal fil
220e0 65 2e 20 72 62 75 56 66 73 52 65 61 64 28 29 20  e. rbuVfsRead() 
220f0 63 6f 6e 74 61 69 6e 73 20 0a 20 20 2a 2a 20 73  contains .  ** s
22100 69 6d 69 6c 61 72 20 6c 6f 67 69 63 2e 20 20 2a  imilar logic.  *
22110 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
22120 54 45 5f 4f 4b 20 26 26 20 2a 70 53 69 7a 65 3d  TE_OK && *pSize=
22130 3d 30 20 0a 20 20 20 26 26 20 70 2d 3e 70 52 62  =0 .   && p->pRb
22140 75 20 26 26 20 72 62 75 49 73 56 61 63 75 75 6d  u && rbuIsVacuum
22150 28 70 2d 3e 70 52 62 75 29 20 0a 20 20 20 26 26  (p->pRbu) .   &&
22160 20 28 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26   (p->openFlags &
22170 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
22180 4e 5f 44 42 29 0a 20 20 29 7b 0a 20 20 20 20 2a  N_DB).  ){.    *
22190 70 53 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20  pSize = 1024;.  
221a0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
221b0 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 61 6e 20  ../*.** Lock an 
221c0 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a  rbuVfs-file..*/.
221d0 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66  static int rbuVf
221e0 73 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  sLock(sqlite3_fi
221f0 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 65  le *pFile, int e
22200 4c 6f 63 6b 29 7b 0a 20 20 72 62 75 5f 66 69 6c  Lock){.  rbu_fil
22210 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65  e *p = (rbu_file
22220 2a 29 70 46 69 6c 65 3b 0a 20 20 73 71 6c 69 74  *)pFile;.  sqlit
22230 65 33 72 62 75 20 2a 70 52 62 75 20 3d 20 70 2d  e3rbu *pRbu = p-
22240 3e 70 52 62 75 3b 0a 20 20 69 6e 74 20 72 63 20  >pRbu;.  int rc 
22250 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
22260 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 65 6e 46  assert( p->openF
22270 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f  lags & (SQLITE_O
22280 50 45 4e 5f 4d 41 49 4e 5f 44 42 7c 53 51 4c 49  PEN_MAIN_DB|SQLI
22290 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 29  TE_OPEN_TEMP_DB)
222a0 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63 6b 3d   );.  if( eLock=
222b0 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 45 58 43  =SQLITE_LOCK_EXC
222c0 4c 55 53 49 56 45 20 0a 20 20 20 26 26 20 28 70  LUSIVE .   && (p
222d0 2d 3e 62 4e 6f 6c 6f 63 6b 20 7c 7c 20 28 70 52  ->bNolock || (pR
222e0 62 75 20 26 26 20 70 52 62 75 2d 3e 65 53 74 61  bu && pRbu->eSta
222f0 67 65 21 3d 52 42 55 5f 53 54 41 47 45 5f 44 4f  ge!=RBU_STAGE_DO
22300 4e 45 29 29 0a 20 20 29 7b 0a 20 20 20 20 2f 2a  NE)).  ){.    /*
22310 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 45 58   Do not allow EX
22320 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 50  CLUSIVE locks. P
22330 72 65 76 65 6e 74 69 6e 67 20 53 51 4c 69 74 65  reventing SQLite
22340 20 66 72 6f 6d 20 74 61 6b 69 6e 67 20 74 68 69   from taking thi
22350 73 20 0a 20 20 20 20 2a 2a 20 70 72 65 76 65 6e  s .    ** preven
22360 74 73 20 69 74 20 66 72 6f 6d 20 63 68 65 63 6b  ts it from check
22370 70 6f 69 6e 74 69 6e 67 20 74 68 65 20 64 61 74  pointing the dat
22380 61 62 61 73 65 20 66 72 6f 6d 20 73 71 6c 69 74  abase from sqlit
22390 65 33 5f 63 6c 6f 73 65 28 29 2e 20 2a 2f 0a 20  e3_close(). */. 
223a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
223b0 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  USY;.  }else{.  
223c0 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d    rc = p->pReal-
223d0 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 4c 6f 63 6b  >pMethods->xLock
223e0 28 70 2d 3e 70 52 65 61 6c 2c 20 65 4c 6f 63 6b  (p->pReal, eLock
223f0 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
22400 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e   rc;.}../*.** Un
22410 6c 6f 63 6b 20 61 6e 20 72 62 75 56 66 73 2d 66  lock an rbuVfs-f
22420 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
22430 6e 74 20 72 62 75 56 66 73 55 6e 6c 6f 63 6b 28  nt rbuVfsUnlock(
22440 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
22450 69 6c 65 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b  ile, int eLock){
22460 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d  .  rbu_file *p =
22470 20 28 72 62 75 5f 66 69 6c 65 20 2a 29 70 46 69   (rbu_file *)pFi
22480 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  le;.  return p->
22490 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d  pReal->pMethods-
224a0 3e 78 55 6e 6c 6f 63 6b 28 70 2d 3e 70 52 65 61  >xUnlock(p->pRea
224b0 6c 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a  l, eLock);.}../*
224c0 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 61 6e 6f  .** Check if ano
224d0 74 68 65 72 20 66 69 6c 65 2d 68 61 6e 64 6c 65  ther file-handle
224e0 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45   holds a RESERVE
224f0 44 20 6c 6f 63 6b 20 6f 6e 20 61 6e 20 72 62 75  D lock on an rbu
22500 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  Vfs-file..*/.sta
22510 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 43 68  tic int rbuVfsCh
22520 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
22530 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
22540 69 6c 65 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  ile, int *pResOu
22550 74 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a  t){.  rbu_file *
22560 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a 29  p = (rbu_file *)
22570 70 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20  pFile;.  return 
22580 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f  p->pReal->pMetho
22590 64 73 2d 3e 78 43 68 65 63 6b 52 65 73 65 72 76  ds->xCheckReserv
225a0 65 64 4c 6f 63 6b 28 70 2d 3e 70 52 65 61 6c 2c  edLock(p->pReal,
225b0 20 70 52 65 73 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a   pResOut);.}../*
225c0 0a 2a 2a 20 46 69 6c 65 20 63 6f 6e 74 72 6f 6c  .** File control
225d0 20 6d 65 74 68 6f 64 2e 20 46 6f 72 20 63 75 73   method. For cus
225e0 74 6f 6d 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f  tom operations o
225f0 6e 20 61 6e 20 72 62 75 56 66 73 2d 66 69 6c 65  n an rbuVfs-file
22600 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
22610 72 62 75 56 66 73 46 69 6c 65 43 6f 6e 74 72 6f  rbuVfsFileContro
22620 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  l(sqlite3_file *
22630 70 46 69 6c 65 2c 20 69 6e 74 20 6f 70 2c 20 76  pFile, int op, v
22640 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 72 62  oid *pArg){.  rb
22650 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75  u_file *p = (rbu
22660 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20  _file *)pFile;. 
22670 20 69 6e 74 20 28 2a 78 43 6f 6e 74 72 6f 6c 29   int (*xControl)
22680 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69  (sqlite3_file*,i
22690 6e 74 2c 76 6f 69 64 2a 29 20 3d 20 70 2d 3e 70  nt,void*) = p->p
226a0 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  Real->pMethods->
226b0 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 3b 0a 20 20  xFileControl;.  
226c0 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
226d0 74 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20  t( p->openFlags 
226e0 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  & (SQLITE_OPEN_M
226f0 41 49 4e 5f 44 42 7c 53 51 4c 49 54 45 5f 4f 50  AIN_DB|SQLITE_OP
22700 45 4e 5f 54 45 4d 50 5f 44 42 29 0a 20 20 20 20  EN_TEMP_DB).    
22710 20 20 20 7c 7c 20 70 2d 3e 6f 70 65 6e 46 6c 61     || p->openFla
22720 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs & (SQLITE_OPE
22730 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 7c 53  N_TRANSIENT_DB|S
22740 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
22750 4a 4f 55 52 4e 41 4c 29 0a 20 20 29 3b 0a 20 20  JOURNAL).  );.  
22760 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46  if( op==SQLITE_F
22770 43 4e 54 4c 5f 52 42 55 20 29 7b 0a 20 20 20 20  CNTL_RBU ){.    
22780 73 71 6c 69 74 65 33 72 62 75 20 2a 70 52 62 75  sqlite3rbu *pRbu
22790 20 3d 20 28 73 71 6c 69 74 65 33 72 62 75 2a 29   = (sqlite3rbu*)
227a0 70 41 72 67 3b 0a 0a 20 20 20 20 2f 2a 20 46 69  pArg;..    /* Fi
227b0 72 73 74 20 74 72 79 20 74 6f 20 66 69 6e 64 20  rst try to find 
227c0 61 6e 6f 74 68 65 72 20 52 42 55 20 76 66 73 20  another RBU vfs 
227d0 6c 6f 77 65 72 20 64 6f 77 6e 20 69 6e 20 74 68  lower down in th
227e0 65 20 76 66 73 20 73 74 61 63 6b 2e 20 49 66 0a  e vfs stack. If.
227f0 20 20 20 20 2a 2a 20 6f 6e 65 20 69 73 20 66 6f      ** one is fo
22800 75 6e 64 2c 20 74 68 69 73 20 76 66 73 20 77 69  und, this vfs wi
22810 6c 6c 20 6f 70 65 72 61 74 65 20 69 6e 20 70 61  ll operate in pa
22820 73 73 2d 74 68 72 6f 75 67 68 20 6d 6f 64 65 2e  ss-through mode.
22830 20 54 68 65 20 6c 6f 77 65 72 0a 20 20 20 20 2a   The lower.    *
22840 2a 20 6c 65 76 65 6c 20 76 66 73 20 77 69 6c 6c  * level vfs will
22850 20 64 6f 20 74 68 65 20 73 70 65 63 69 61 6c 20   do the special 
22860 52 42 55 20 68 61 6e 64 6c 69 6e 67 2e 20 20 2a  RBU handling.  *
22870 2f 0a 20 20 20 20 72 63 20 3d 20 78 43 6f 6e 74  /.    rc = xCont
22880 72 6f 6c 28 70 2d 3e 70 52 65 61 6c 2c 20 6f 70  rol(p->pReal, op
22890 2c 20 70 41 72 67 29 3b 0a 0a 20 20 20 20 69 66  , pArg);..    if
228a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54  ( rc==SQLITE_NOT
228b0 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 2f  FOUND ){.      /
228c0 2a 20 4e 6f 77 20 73 65 61 72 63 68 20 66 6f 72  * Now search for
228d0 20 61 20 7a 69 70 76 66 73 20 69 6e 73 74 61 6e   a zipvfs instan
228e0 63 65 20 6c 6f 77 65 72 20 64 6f 77 6e 20 69 6e  ce lower down in
228f0 20 74 68 65 20 56 46 53 20 73 74 61 63 6b 2e 20   the VFS stack. 
22900 49 66 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20  If.      ** one 
22910 69 73 20 66 6f 75 6e 64 2c 20 74 68 69 73 20 69  is found, this i
22920 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 2f 0a  s an error.  */.
22930 20 20 20 20 20 20 76 6f 69 64 20 2a 64 75 6d 6d        void *dumm
22940 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  y = 0;.      rc 
22950 3d 20 78 43 6f 6e 74 72 6f 6c 28 70 2d 3e 70 52  = xControl(p->pR
22960 65 61 6c 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  eal, SQLITE_FCNT
22970 4c 5f 5a 49 50 56 46 53 2c 20 26 64 75 6d 6d 79  L_ZIPVFS, &dummy
22980 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
22990 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
229a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
229b0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
229c0 20 70 52 62 75 2d 3e 7a 45 72 72 6d 73 67 20 3d   pRbu->zErrmsg =
229d0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
229e0 28 22 72 62 75 2f 7a 69 70 76 66 73 20 73 65 74  ("rbu/zipvfs set
229f0 75 70 20 65 72 72 6f 72 22 29 3b 0a 20 20 20 20  up error");.    
22a00 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
22a10 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
22a20 29 7b 0a 20 20 20 20 20 20 20 20 70 52 62 75 2d  ){.        pRbu-
22a30 3e 70 54 61 72 67 65 74 46 64 20 3d 20 70 3b 0a  >pTargetFd = p;.
22a40 20 20 20 20 20 20 20 20 70 2d 3e 70 52 62 75 20          p->pRbu 
22a50 3d 20 70 52 62 75 3b 0a 20 20 20 20 20 20 20 20  = pRbu;.        
22a60 69 66 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73  if( p->openFlags
22a70 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d   & SQLITE_OPEN_M
22a80 41 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20 20 20  AIN_DB ){.      
22a90 20 20 20 20 72 62 75 4d 61 69 6e 6c 69 73 74 41      rbuMainlistA
22aa0 64 64 28 70 29 3b 0a 20 20 20 20 20 20 20 20 7d  dd(p);.        }
22ab0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
22ac0 70 57 61 6c 46 64 20 29 20 70 2d 3e 70 57 61 6c  pWalFd ) p->pWal
22ad0 46 64 2d 3e 70 52 62 75 20 3d 20 70 52 62 75 3b  Fd->pRbu = pRbu;
22ae0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
22af0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
22b00 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
22b10 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 65 6c 73 65  n rc;.  }.  else
22b20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f   if( op==SQLITE_
22b30 46 43 4e 54 4c 5f 52 42 55 43 4e 54 20 29 7b 0a  FCNTL_RBUCNT ){.
22b40 20 20 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a      sqlite3rbu *
22b50 70 52 62 75 20 3d 20 28 73 71 6c 69 74 65 33 72  pRbu = (sqlite3r
22b60 62 75 2a 29 70 41 72 67 3b 0a 20 20 20 20 70 52  bu*)pArg;.    pR
22b70 62 75 2d 3e 6e 52 62 75 2b 2b 3b 0a 20 20 20 20  bu->nRbu++;.    
22b80 70 52 62 75 2d 3e 70 52 62 75 46 64 20 3d 20 70  pRbu->pRbuFd = p
22b90 3b 0a 20 20 20 20 70 2d 3e 62 4e 6f 6c 6f 63 6b  ;.    p->bNolock
22ba0 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 72 63 20   = 1;.  }..  rc 
22bb0 3d 20 78 43 6f 6e 74 72 6f 6c 28 70 2d 3e 70 52  = xControl(p->pR
22bc0 65 61 6c 2c 20 6f 70 2c 20 70 41 72 67 29 3b 0a  eal, op, pArg);.
22bd0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
22be0 5f 4f 4b 20 26 26 20 6f 70 3d 3d 53 51 4c 49 54  _OK && op==SQLIT
22bf0 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 20  E_FCNTL_VFSNAME 
22c00 29 7b 0a 20 20 20 20 72 62 75 5f 76 66 73 20 2a  ){.    rbu_vfs *
22c10 70 52 62 75 56 66 73 20 3d 20 70 2d 3e 70 52 62  pRbuVfs = p->pRb
22c20 75 56 66 73 3b 0a 20 20 20 20 63 68 61 72 20 2a  uVfs;.    char *
22c30 7a 49 6e 20 3d 20 2a 28 63 68 61 72 2a 2a 29 70  zIn = *(char**)p
22c40 41 72 67 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  Arg;.    char *z
22c50 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Out = sqlite3_mp
22c60 72 69 6e 74 66 28 22 72 62 75 28 25 73 29 2f 25  rintf("rbu(%s)/%
22c70 7a 22 2c 20 70 52 62 75 56 66 73 2d 3e 62 61 73  z", pRbuVfs->bas
22c80 65 2e 7a 4e 61 6d 65 2c 20 7a 49 6e 29 3b 0a 20  e.zName, zIn);. 
22c90 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67     *(char**)pArg
22ca0 20 3d 20 7a 4f 75 74 3b 0a 20 20 20 20 69 66 28   = zOut;.    if(
22cb0 20 7a 4f 75 74 3d 3d 30 20 29 20 72 63 20 3d 20   zOut==0 ) rc = 
22cc0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
22cd0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
22ce0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
22cf0 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  the sector-size 
22d00 69 6e 20 62 79 74 65 73 20 66 6f 72 20 61 6e 20  in bytes for an 
22d10 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a  rbuVfs-file..*/.
22d20 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66  static int rbuVf
22d30 73 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69  sSectorSize(sqli
22d40 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29  te3_file *pFile)
22d50 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20  {.  rbu_file *p 
22d60 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a 29 70 46  = (rbu_file *)pF
22d70 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  ile;.  return p-
22d80 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73  >pReal->pMethods
22d90 2d 3e 78 53 65 63 74 6f 72 53 69 7a 65 28 70 2d  ->xSectorSize(p-
22da0 3e 70 52 65 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  >pReal);.}../*.*
22db0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 76  * Return the dev
22dc0 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
22dd0 69 63 20 66 6c 61 67 73 20 73 75 70 70 6f 72 74  ic flags support
22de0 65 64 20 62 79 20 61 6e 20 72 62 75 56 66 73 2d  ed by an rbuVfs-
22df0 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
22e00 69 6e 74 20 72 62 75 56 66 73 44 65 76 69 63 65  int rbuVfsDevice
22e10 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
22e20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
22e30 69 6c 65 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65  ile){.  rbu_file
22e40 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 20   *p = (rbu_file 
22e50 2a 29 70 46 69 6c 65 3b 0a 20 20 72 65 74 75 72  *)pFile;.  retur
22e60 6e 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74  n p->pReal->pMet
22e70 68 6f 64 73 2d 3e 78 44 65 76 69 63 65 43 68 61  hods->xDeviceCha
22e80 72 61 63 74 65 72 69 73 74 69 63 73 28 70 2d 3e  racteristics(p->
22e90 70 52 65 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pReal);.}../*.**
22ea0 20 54 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65   Take or release
22eb0 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79   a shared-memory
22ec0 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   lock..*/.static
22ed0 20 69 6e 74 20 72 62 75 56 66 73 53 68 6d 4c 6f   int rbuVfsShmLo
22ee0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
22ef0 2a 70 46 69 6c 65 2c 20 69 6e 74 20 6f 66 73 74  *pFile, int ofst
22f00 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20 66 6c 61  , int n, int fla
22f10 67 73 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20  gs){.  rbu_file 
22f20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 2a 29  *p = (rbu_file*)
22f30 70 46 69 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33  pFile;.  sqlite3
22f40 72 62 75 20 2a 70 52 62 75 20 3d 20 70 2d 3e 70  rbu *pRbu = p->p
22f50 52 62 75 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Rbu;.  int rc = 
22f60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 64  SQLITE_OK;..#ifd
22f70 65 66 20 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41  ef SQLITE_AMALGA
22f80 4d 41 54 49 4f 4e 0a 20 20 20 20 61 73 73 65 72  MATION.    asser
22f90 74 28 20 57 41 4c 5f 43 4b 50 54 5f 4c 4f 43 4b  t( WAL_CKPT_LOCK
22fa0 3d 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ==1 );.#endif.. 
22fb0 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 65 6e   assert( p->open
22fc0 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f  Flags & (SQLITE_
22fd0 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 7c 53 51 4c  OPEN_MAIN_DB|SQL
22fe0 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
22ff0 29 20 29 3b 0a 20 20 69 66 28 20 70 52 62 75 20  ) );.  if( pRbu 
23000 26 26 20 28 70 52 62 75 2d 3e 65 53 74 61 67 65  && (pRbu->eStage
23010 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20  ==RBU_STAGE_OAL 
23020 7c 7c 20 70 52 62 75 2d 3e 65 53 74 61 67 65 3d  || pRbu->eStage=
23030 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 29  =RBU_STAGE_MOVE)
23040 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 61 67 69 63   ){.    /* Magic
23050 20 6e 75 6d 62 65 72 20 31 20 69 73 20 74 68 65   number 1 is the
23060 20 57 41 4c 5f 43 4b 50 54 5f 4c 4f 43 4b 20 6c   WAL_CKPT_LOCK l
23070 6f 63 6b 2e 20 50 72 65 76 65 6e 74 69 6e 67 20  ock. Preventing 
23080 53 51 4c 69 74 65 20 66 72 6f 6d 0a 20 20 20 20  SQLite from.    
23090 2a 2a 20 74 61 6b 69 6e 67 20 74 68 69 73 20 6c  ** taking this l
230a0 6f 63 6b 20 61 6c 73 6f 20 70 72 65 76 65 6e 74  ock also prevent
230b0 73 20 61 6e 79 20 63 68 65 63 6b 70 6f 69 6e 74  s any checkpoint
230c0 73 20 66 72 6f 6d 20 6f 63 63 75 72 72 69 6e 67  s from occurring
230d0 2e 20 0a 20 20 20 20 2a 2a 20 74 6f 64 6f 3a 20  . .    ** todo: 
230e0 72 65 61 6c 6c 79 2c 20 69 74 27 73 20 6e 6f 74  really, it's not
230f0 20 63 6c 65 61 72 20 77 68 79 20 74 68 69 73 20   clear why this 
23100 6d 69 67 68 74 20 6f 63 63 75 72 2c 20 61 73 20  might occur, as 
23110 0a 20 20 20 20 2a 2a 20 77 61 6c 5f 61 75 74 6f  .    ** wal_auto
23120 63 68 65 63 6b 70 6f 69 6e 74 20 6f 75 67 68 74  checkpoint ought
23130 20 74 6f 20 62 65 20 74 75 72 6e 65 64 20 6f 66   to be turned of
23140 66 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f  f.  */.    if( o
23150 66 73 74 3d 3d 57 41 4c 5f 4c 4f 43 4b 5f 43 4b  fst==WAL_LOCK_CK
23160 50 54 20 26 26 20 6e 3d 3d 31 20 29 20 72 63 20  PT && n==1 ) rc 
23170 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
23180 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
23190 62 43 61 70 74 75 72 65 20 3d 20 30 3b 0a 20 20  bCapture = 0;.  
231a0 20 20 69 66 28 20 6e 3d 3d 31 20 26 26 20 28 66    if( n==1 && (f
231b0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48  lags & SQLITE_SH
231c0 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20  M_EXCLUSIVE).   
231d0 20 20 26 26 20 70 52 62 75 20 26 26 20 70 52 62    && pRbu && pRb
231e0 75 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53  u->eStage==RBU_S
231f0 54 41 47 45 5f 43 41 50 54 55 52 45 0a 20 20 20  TAGE_CAPTURE.   
23200 20 20 26 26 20 28 6f 66 73 74 3d 3d 57 41 4c 5f    && (ofst==WAL_
23210 4c 4f 43 4b 5f 57 52 49 54 45 20 7c 7c 20 6f 66  LOCK_WRITE || of
23220 73 74 3d 3d 57 41 4c 5f 4c 4f 43 4b 5f 43 4b 50  st==WAL_LOCK_CKP
23230 54 20 7c 7c 20 6f 66 73 74 3d 3d 57 41 4c 5f 4c  T || ofst==WAL_L
23240 4f 43 4b 5f 52 45 41 44 30 29 0a 20 20 20 20 29  OCK_READ0).    )
23250 7b 0a 20 20 20 20 20 20 62 43 61 70 74 75 72 65  {.      bCapture
23260 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 1;.    }..   
23270 20 69 66 28 20 62 43 61 70 74 75 72 65 3d 3d 30   if( bCapture==0
23280 20 7c 7c 20 30 3d 3d 28 66 6c 61 67 73 20 26 20   || 0==(flags & 
23290 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
232a0 4b 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  K) ){.      rc =
232b0 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68   p->pReal->pMeth
232c0 6f 64 73 2d 3e 78 53 68 6d 4c 6f 63 6b 28 70 2d  ods->xShmLock(p-
232d0 3e 70 52 65 61 6c 2c 20 6f 66 73 74 2c 20 6e 2c  >pReal, ofst, n,
232e0 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69   flags);.      i
232f0 66 28 20 62 43 61 70 74 75 72 65 20 26 26 20 72  f( bCapture && r
23300 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
23310 20 20 20 20 20 20 20 20 70 52 62 75 2d 3e 6d 4c          pRbu->mL
23320 6f 63 6b 20 7c 3d 20 28 31 20 3c 3c 20 6f 66 73  ock |= (1 << ofs
23330 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
23340 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
23350 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74  rc;.}../*.** Obt
23360 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ain a pointer to
23370 20 61 20 6d 61 70 70 69 6e 67 20 6f 66 20 61 20   a mapping of a 
23380 73 69 6e 67 6c 65 20 33 32 4b 69 42 20 70 61 67  single 32KiB pag
23390 65 20 6f 66 20 74 68 65 20 2a 2d 73 68 6d 20 66  e of the *-shm f
233a0 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
233b0 6e 74 20 72 62 75 56 66 73 53 68 6d 4d 61 70 28  nt rbuVfsShmMap(
233c0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
233d0 2a 70 46 69 6c 65 2c 20 0a 20 20 69 6e 74 20 69  *pFile, .  int i
233e0 52 65 67 69 6f 6e 2c 20 0a 20 20 69 6e 74 20 73  Region, .  int s
233f0 7a 52 65 67 69 6f 6e 2c 20 0a 20 20 69 6e 74 20  zRegion, .  int 
23400 69 73 57 72 69 74 65 2c 20 0a 20 20 76 6f 69 64  isWrite, .  void
23410 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 0a 29   volatile **pp.)
23420 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20  {.  rbu_file *p 
23430 3d 20 28 72 62 75 5f 66 69 6c 65 2a 29 70 46 69  = (rbu_file*)pFi
23440 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  le;.  int rc = S
23450 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
23460 65 53 74 61 67 65 20 3d 20 28 70 2d 3e 70 52 62  eStage = (p->pRb
23470 75 20 3f 20 70 2d 3e 70 52 62 75 2d 3e 65 53 74  u ? p->pRbu->eSt
23480 61 67 65 20 3a 20 30 29 3b 0a 0a 20 20 2f 2a 20  age : 0);..  /* 
23490 49 66 20 6e 6f 74 20 69 6e 20 52 42 55 5f 53 54  If not in RBU_ST
234a0 41 47 45 5f 4f 41 4c 2c 20 61 6c 6c 6f 77 20 74  AGE_OAL, allow t
234b0 68 69 73 20 63 61 6c 6c 20 74 6f 20 70 61 73 73  his call to pass
234c0 20 74 68 72 6f 75 67 68 2e 20 4f 72 2c 20 69 66   through. Or, if
234d0 20 74 68 69 73 0a 20 20 2a 2a 20 72 62 75 20 69   this.  ** rbu i
234e0 73 20 69 6e 20 74 68 65 20 52 42 55 5f 53 54 41  s in the RBU_STA
234f0 47 45 5f 4f 41 4c 20 73 74 61 74 65 2c 20 75 73  GE_OAL state, us
23500 65 20 68 65 61 70 20 6d 65 6d 6f 72 79 20 66 6f  e heap memory fo
23510 72 20 2a 2d 73 68 6d 20 73 70 61 63 65 20 0a 20  r *-shm space . 
23520 20 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 20 61   ** instead of a
23530 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 20   file on disk.  
23540 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
23550 6f 70 65 6e 46 6c 61 67 73 20 26 20 28 53 51 4c  openFlags & (SQL
23560 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
23570 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  |SQLITE_OPEN_TEM
23580 50 5f 44 42 29 20 29 3b 0a 20 20 69 66 28 20 65  P_DB) );.  if( e
23590 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45  Stage==RBU_STAGE
235a0 5f 4f 41 4c 20 7c 7c 20 65 53 74 61 67 65 3d 3d  _OAL || eStage==
235b0 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 20 29  RBU_STAGE_MOVE )
235c0 7b 0a 20 20 20 20 69 66 28 20 69 52 65 67 69 6f  {.    if( iRegio
235d0 6e 3c 3d 70 2d 3e 6e 53 68 6d 20 29 7b 0a 20 20  n<=p->nShm ){.  
235e0 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
235f0 28 69 52 65 67 69 6f 6e 2b 31 29 20 2a 20 73 69  (iRegion+1) * si
23600 7a 65 6f 66 28 63 68 61 72 2a 29 3b 0a 20 20 20  zeof(char*);.   
23610 20 20 20 63 68 61 72 20 2a 2a 61 70 4e 65 77 20     char **apNew 
23620 3d 20 28 63 68 61 72 2a 2a 29 73 71 6c 69 74 65  = (char**)sqlite
23630 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 2d 3e 61  3_realloc64(p->a
23640 70 53 68 6d 2c 20 6e 42 79 74 65 29 3b 0a 20 20  pShm, nByte);.  
23650 20 20 20 20 69 66 28 20 61 70 4e 65 77 3d 3d 30      if( apNew==0
23660 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
23670 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
23680 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
23690 20 20 20 20 6d 65 6d 73 65 74 28 26 61 70 4e 65      memset(&apNe
236a0 77 5b 70 2d 3e 6e 53 68 6d 5d 2c 20 30 2c 20 73  w[p->nShm], 0, s
236b0 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 2a 20 28  izeof(char*) * (
236c0 31 20 2b 20 69 52 65 67 69 6f 6e 20 2d 20 70 2d  1 + iRegion - p-
236d0 3e 6e 53 68 6d 29 29 3b 0a 20 20 20 20 20 20 20  >nShm));.       
236e0 20 70 2d 3e 61 70 53 68 6d 20 3d 20 61 70 4e 65   p->apShm = apNe
236f0 77 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53  w;.        p->nS
23700 68 6d 20 3d 20 69 52 65 67 69 6f 6e 2b 31 3b 0a  hm = iRegion+1;.
23710 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
23720 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
23730 45 5f 4f 4b 20 26 26 20 70 2d 3e 61 70 53 68 6d  E_OK && p->apShm
23740 5b 69 52 65 67 69 6f 6e 5d 3d 3d 30 20 29 7b 0a  [iRegion]==0 ){.
23750 20 20 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77        char *pNew
23760 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
23770 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 7a 52 65 67  3_malloc64(szReg
23780 69 6f 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ion);.      if( 
23790 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pNew==0 ){.     
237a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
237b0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  OMEM;.      }els
237c0 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  e{.        memse
237d0 74 28 70 4e 65 77 2c 20 30 2c 20 73 7a 52 65 67  t(pNew, 0, szReg
237e0 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  ion);.        p-
237f0 3e 61 70 53 68 6d 5b 69 52 65 67 69 6f 6e 5d 20  >apShm[iRegion] 
23800 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a  = pNew;.      }.
23810 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
23820 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
23830 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 61        *pp = p->a
23840 70 53 68 6d 5b 69 52 65 67 69 6f 6e 5d 3b 0a 20  pShm[iRegion];. 
23850 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23860 2a 70 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  *pp = 0;.    }. 
23870 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
23880 72 74 28 20 70 2d 3e 61 70 53 68 6d 3d 3d 30 20  rt( p->apShm==0 
23890 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 2d 3e 70  );.    rc = p->p
238a0 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  Real->pMethods->
238b0 78 53 68 6d 4d 61 70 28 70 2d 3e 70 52 65 61 6c  xShmMap(p->pReal
238c0 2c 20 69 52 65 67 69 6f 6e 2c 20 73 7a 52 65 67  , iRegion, szReg
238d0 69 6f 6e 2c 20 69 73 57 72 69 74 65 2c 20 70 70  ion, isWrite, pp
238e0 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
238f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65   rc;.}../*.** Me
23900 6d 6f 72 79 20 62 61 72 72 69 65 72 2e 0a 2a 2f  mory barrier..*/
23910 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
23920 56 66 73 53 68 6d 42 61 72 72 69 65 72 28 73 71  VfsShmBarrier(sq
23930 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
23940 65 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a  e){.  rbu_file *
23950 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a 29  p = (rbu_file *)
23960 70 46 69 6c 65 3b 0a 20 20 70 2d 3e 70 52 65 61  pFile;.  p->pRea
23970 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68  l->pMethods->xSh
23980 6d 42 61 72 72 69 65 72 28 70 2d 3e 70 52 65 61  mBarrier(p->pRea
23990 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  l);.}../*.** The
239a0 20 78 53 68 6d 55 6e 6d 61 70 20 6d 65 74 68 6f   xShmUnmap metho
239b0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
239c0 20 72 62 75 56 66 73 53 68 6d 55 6e 6d 61 70 28   rbuVfsShmUnmap(
239d0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
239e0 69 6c 65 2c 20 69 6e 74 20 64 65 6c 46 6c 61 67  ile, int delFlag
239f0 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70  ){.  rbu_file *p
23a00 20 3d 20 28 72 62 75 5f 66 69 6c 65 2a 29 70 46   = (rbu_file*)pF
23a10 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ile;.  int rc = 
23a20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
23a30 20 65 53 74 61 67 65 20 3d 20 28 70 2d 3e 70 52   eStage = (p->pR
23a40 62 75 20 3f 20 70 2d 3e 70 52 62 75 2d 3e 65 53  bu ? p->pRbu->eS
23a50 74 61 67 65 20 3a 20 30 29 3b 0a 0a 20 20 61 73  tage : 0);..  as
23a60 73 65 72 74 28 20 70 2d 3e 6f 70 65 6e 46 6c 61  sert( p->openFla
23a70 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs & (SQLITE_OPE
23a80 4e 5f 4d 41 49 4e 5f 44 42 7c 53 51 4c 49 54 45  N_MAIN_DB|SQLITE
23a90 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 29 20 29  _OPEN_TEMP_DB) )
23aa0 3b 0a 20 20 69 66 28 20 65 53 74 61 67 65 3d 3d  ;.  if( eStage==
23ab0 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 7c 7c  RBU_STAGE_OAL ||
23ac0 20 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41   eStage==RBU_STA
23ad0 47 45 5f 4d 4f 56 45 20 29 7b 0a 20 20 20 20 2f  GE_MOVE ){.    /
23ae0 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 7d 65 6c  * no-op */.  }el
23af0 73 65 7b 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61  se{.    /* Relea
23b00 73 65 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  se the checkpoin
23b10 74 65 72 20 61 6e 64 20 77 72 69 74 65 72 20 6c  ter and writer l
23b20 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 72 62 75 55  ocks */.    rbuU
23b30 6e 6c 6f 63 6b 53 68 6d 28 70 29 3b 0a 20 20 20  nlockShm(p);.   
23b40 20 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e   rc = p->pReal->
23b50 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 55 6e  pMethods->xShmUn
23b60 6d 61 70 28 70 2d 3e 70 52 65 61 6c 2c 20 64 65  map(p->pReal, de
23b70 6c 46 6c 61 67 29 3b 0a 20 20 7d 0a 20 20 72 65  lFlag);.  }.  re
23b80 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a  turn rc;.}../* .
23b90 2a 2a 20 41 20 6d 61 69 6e 20 64 61 74 61 62 61  ** A main databa
23ba0 73 65 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 20 68  se named zName h
23bb0 61 73 20 6a 75 73 74 20 62 65 65 6e 20 6f 70 65  as just been ope
23bc0 6e 65 64 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ned. The followi
23bd0 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ng .** function 
23be0 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
23bf0 72 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 77  r to a buffer ow
23c00 6e 65 64 20 62 79 20 53 51 4c 69 74 65 20 74 68  ned by SQLite th
23c10 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74  at contains.** t
23c20 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 2a  he name of the *
23c30 2d 77 61 6c 20 66 69 6c 65 20 74 68 69 73 20 64  -wal file this d
23c40 62 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c  b connection wil
23c50 6c 20 75 73 65 2e 20 53 51 4c 69 74 65 0a 2a 2a  l use. SQLite.**
23c60 20 68 61 70 70 65 6e 73 20 74 6f 20 70 61 73 73   happens to pass
23c70 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
23c80 69 73 20 62 75 66 66 65 72 20 77 68 65 6e 20 75  is buffer when u
23c90 73 69 6e 67 20 78 41 63 63 65 73 73 28 29 0a 2a  sing xAccess().*
23ca0 2a 20 6f 72 20 78 4f 70 65 6e 28 29 20 74 6f 20  * or xOpen() to 
23cb0 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 2a  operate on the *
23cc0 2d 77 61 6c 20 66 69 6c 65 2e 20 20 0a 2a 2f 0a  -wal file.  .*/.
23cd0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
23ce0 72 20 2a 72 62 75 4d 61 69 6e 54 6f 57 61 6c 28  r *rbuMainToWal(
23cf0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
23d00 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
23d10 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29 73 74   int n = (int)st
23d20 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 63  rlen(zName);.  c
23d30 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 26  onst char *z = &
23d40 7a 4e 61 6d 65 5b 6e 5d 3b 0a 20 20 69 66 28 20  zName[n];.  if( 
23d50 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
23d60 50 45 4e 5f 55 52 49 20 29 7b 0a 20 20 20 20 69  PEN_URI ){.    i
23d70 6e 74 20 6f 64 64 20 3d 20 30 3b 0a 20 20 20 20  nt odd = 0;.    
23d80 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
23d90 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 30 20 29 7b    if( z[0]==0 ){
23da0 0a 20 20 20 20 20 20 20 20 6f 64 64 20 3d 20 31  .        odd = 1
23db0 20 2d 20 6f 64 64 3b 0a 20 20 20 20 20 20 20 20   - odd;.        
23dc0 69 66 28 20 6f 64 64 20 26 26 20 7a 5b 31 5d 3d  if( odd && z[1]=
23dd0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
23de0 20 20 7d 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20    }.      z++;. 
23df0 20 20 20 7d 0a 20 20 20 20 7a 20 2b 3d 20 32 3b     }.    z += 2;
23e00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68  .  }else{.    wh
23e10 69 6c 65 28 20 2a 7a 3d 3d 30 20 29 20 7a 2b 2b  ile( *z==0 ) z++
23e20 3b 0a 20 20 7d 0a 20 20 7a 20 2b 3d 20 28 6e 20  ;.  }.  z += (n 
23e30 2b 20 38 20 2b 20 31 29 3b 0a 20 20 72 65 74 75  + 8 + 1);.  retu
23e40 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  rn z;.}../*.** O
23e50 70 65 6e 20 61 6e 20 72 62 75 20 66 69 6c 65 20  pen an rbu file 
23e60 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  handle..*/.stati
23e70 63 20 69 6e 74 20 72 62 75 56 66 73 4f 70 65 6e  c int rbuVfsOpen
23e80 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
23e90 2a 70 56 66 73 2c 0a 20 20 63 6f 6e 73 74 20 63  *pVfs,.  const c
23ea0 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 73 71  har *zName,.  sq
23eb0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
23ec0 65 2c 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 0a  e,.  int flags,.
23ed0 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73    int *pOutFlags
23ee0 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71 6c  .){.  static sql
23ef0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
23f00 72 62 75 76 66 73 5f 69 6f 5f 6d 65 74 68 6f 64  rbuvfs_io_method
23f10 73 20 3d 20 7b 0a 20 20 20 20 32 2c 20 20 20 20  s = {.    2,    
23f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f30 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
23f40 69 6f 6e 20 2a 2f 0a 20 20 20 20 72 62 75 56 66  ion */.    rbuVf
23f50 73 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  sClose,         
23f60 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
23f70 73 65 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73  se */.    rbuVfs
23f80 52 65 61 64 2c 20 20 20 20 20 20 20 20 20 20 20  Read,           
23f90 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64          /* xRead
23fa0 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 57 72   */.    rbuVfsWr
23fb0 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ite,            
23fc0 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20        /* xWrite 
23fd0 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 54 72 75  */.    rbuVfsTru
23fe0 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  ncate,          
23ff0 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74       /* xTruncat
24000 65 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 53  e */.    rbuVfsS
24010 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  ync,            
24020 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20         /* xSync 
24030 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 46 69 6c  */.    rbuVfsFil
24040 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  eSize,          
24050 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a       /* xFileSiz
24060 65 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 4c  e */.    rbuVfsL
24070 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
24080 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
24090 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 55 6e 6c  */.    rbuVfsUnl
240a0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
240b0 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
240c0 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 43 68 65  */.    rbuVfsChe
240d0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20  ckReservedLock, 
240e0 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65       /* xCheckRe
240f0 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20  servedLock */.  
24100 20 20 72 62 75 56 66 73 46 69 6c 65 43 6f 6e 74    rbuVfsFileCont
24110 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  rol,            
24120 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20  /* xFileControl 
24130 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 53 65 63  */.    rbuVfsSec
24140 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20  torSize,        
24150 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53       /* xSectorS
24160 69 7a 65 20 2a 2f 0a 20 20 20 20 72 62 75 56 66  ize */.    rbuVf
24170 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
24180 69 73 74 69 63 73 2c 20 20 2f 2a 20 78 44 65 76  istics,  /* xDev
24190 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
241a0 63 73 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73  cs */.    rbuVfs
241b0 53 68 6d 4d 61 70 2c 20 20 20 20 20 20 20 20 20  ShmMap,         
241c0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
241d0 61 70 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73  ap */.    rbuVfs
241e0 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ShmLock,        
241f0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c          /* xShmL
24200 6f 63 6b 20 2a 2f 0a 20 20 20 20 72 62 75 56 66  ock */.    rbuVf
24210 73 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20  sShmBarrier,    
24220 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
24230 42 61 72 72 69 65 72 20 2a 2f 0a 20 20 20 20 72  Barrier */.    r
24240 62 75 56 66 73 53 68 6d 55 6e 6d 61 70 2c 20 20  buVfsShmUnmap,  
24250 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24260 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a 20 20 20  xShmUnmap */.   
24270 20 30 2c 20 30 20 20 20 20 20 20 20 20 20 20 20   0, 0           
24280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24290 2a 20 78 46 65 74 63 68 2c 20 78 55 6e 66 65 74  * xFetch, xUnfet
242a0 63 68 20 2a 2f 0a 20 20 7d 3b 0a 20 20 72 62 75  ch */.  };.  rbu
242b0 5f 76 66 73 20 2a 70 52 62 75 56 66 73 20 3d 20  _vfs *pRbuVfs = 
242c0 28 72 62 75 5f 76 66 73 2a 29 70 56 66 73 3b 0a  (rbu_vfs*)pVfs;.
242d0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
242e0 52 65 61 6c 56 66 73 20 3d 20 70 52 62 75 56 66  RealVfs = pRbuVf
242f0 73 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20 72  s->pRealVfs;.  r
24300 62 75 5f 66 69 6c 65 20 2a 70 46 64 20 3d 20 28  bu_file *pFd = (
24310 72 62 75 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65  rbu_file *)pFile
24320 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
24330 49 54 45 5f 4f 4b 3b 0a 20 20 63 6f 6e 73 74 20  ITE_OK;.  const 
24340 63 68 61 72 20 2a 7a 4f 70 65 6e 20 3d 20 7a 4e  char *zOpen = zN
24350 61 6d 65 3b 0a 20 20 69 6e 74 20 6f 66 6c 61 67  ame;.  int oflag
24360 73 20 3d 20 66 6c 61 67 73 3b 0a 0a 20 20 6d 65  s = flags;..  me
24370 6d 73 65 74 28 70 46 64 2c 20 30 2c 20 73 69 7a  mset(pFd, 0, siz
24380 65 6f 66 28 72 62 75 5f 66 69 6c 65 29 29 3b 0a  eof(rbu_file));.
24390 20 20 70 46 64 2d 3e 70 52 65 61 6c 20 3d 20 28    pFd->pReal = (
243a0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70  sqlite3_file*)&p
243b0 46 64 5b 31 5d 3b 0a 20 20 70 46 64 2d 3e 70 52  Fd[1];.  pFd->pR
243c0 62 75 56 66 73 20 3d 20 70 52 62 75 56 66 73 3b  buVfs = pRbuVfs;
243d0 0a 20 20 70 46 64 2d 3e 6f 70 65 6e 46 6c 61 67  .  pFd->openFlag
243e0 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 69 66 28  s = flags;.  if(
243f0 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 69 66   zName ){.    if
24400 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
24410 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b  _OPEN_MAIN_DB ){
24420 0a 20 20 20 20 20 20 2f 2a 20 41 20 6d 61 69 6e  .      /* A main
24430 20 64 61 74 61 62 61 73 65 20 68 61 73 20 6a 75   database has ju
24440 73 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 20  st been opened. 
24450 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
24460 6f 63 6b 20 73 65 74 73 0a 20 20 20 20 20 20 2a  ock sets.      *
24470 2a 20 28 70 46 64 2d 3e 7a 57 61 6c 29 20 74 6f  * (pFd->zWal) to
24480 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
24490 65 72 20 6f 77 6e 65 64 20 62 79 20 53 51 4c 69  er owned by SQLi
244a0 74 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  te that contains
244b0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 61  .      ** the na
244c0 6d 65 20 6f 66 20 74 68 65 20 2a 2d 77 61 6c 20  me of the *-wal 
244d0 66 69 6c 65 20 74 68 69 73 20 64 62 20 63 6f 6e  file this db con
244e0 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65  nection will use
244f0 2e 20 53 51 4c 69 74 65 0a 20 20 20 20 20 20 2a  . SQLite.      *
24500 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 70 61 73  * happens to pas
24510 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
24520 68 69 73 20 62 75 66 66 65 72 20 77 68 65 6e 20  his buffer when 
24530 75 73 69 6e 67 20 78 41 63 63 65 73 73 28 29 0a  using xAccess().
24540 20 20 20 20 20 20 2a 2a 20 6f 72 20 78 4f 70 65        ** or xOpe
24550 6e 28 29 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  n() to operate o
24560 6e 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  n the *-wal file
24570 2e 20 20 2a 2f 0a 20 20 20 20 20 20 70 46 64 2d  .  */.      pFd-
24580 3e 7a 57 61 6c 20 3d 20 72 62 75 4d 61 69 6e 54  >zWal = rbuMainT
24590 6f 57 61 6c 28 7a 4e 61 6d 65 2c 20 66 6c 61 67  oWal(zName, flag
245a0 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c  s);.    }.    el
245b0 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  se if( flags & S
245c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29  QLITE_OPEN_WAL )
245d0 7b 0a 20 20 20 20 20 20 72 62 75 5f 66 69 6c 65  {.      rbu_file
245e0 20 2a 70 44 62 20 3d 20 72 62 75 46 69 6e 64 4d   *pDb = rbuFindM
245f0 61 69 6e 64 62 28 70 52 62 75 56 66 73 2c 20 7a  aindb(pRbuVfs, z
24600 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Name, 0);.      
24610 69 66 28 20 70 44 62 20 29 7b 0a 20 20 20 20 20  if( pDb ){.     
24620 20 20 20 69 66 28 20 70 44 62 2d 3e 70 52 62 75     if( pDb->pRbu
24630 20 26 26 20 70 44 62 2d 3e 70 52 62 75 2d 3e 65   && pDb->pRbu->e
24640 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45  Stage==RBU_STAGE
24650 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  _OAL ){.        
24660 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 69    /* This call i
24670 73 20 74 6f 20 6f 70 65 6e 20 61 20 2a 2d 77 61  s to open a *-wa
24680 6c 20 66 69 6c 65 2e 20 49 6e 74 65 61 64 2c 20  l file. Intead, 
24690 6f 70 65 6e 20 74 68 65 20 2a 2d 6f 61 6c 2e 20  open the *-oal. 
246a0 54 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a  This.          *
246b0 2a 20 63 6f 64 65 20 65 6e 73 75 72 65 73 20 74  * code ensures t
246c0 68 61 74 20 74 68 65 20 73 74 72 69 6e 67 20 70  hat the string p
246d0 61 73 73 65 64 20 74 6f 20 78 4f 70 65 6e 28 29  assed to xOpen()
246e0 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64 20 62   is terminated b
246f0 79 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  y a.          **
24700 20 70 61 69 72 20 6f 66 20 27 5c 30 27 20 62 79   pair of '\0' by
24710 74 65 73 20 69 6e 20 63 61 73 65 20 74 68 65 20  tes in case the 
24720 56 46 53 20 61 74 74 65 6d 70 74 73 20 74 6f 20  VFS attempts to 
24730 65 78 74 72 61 63 74 20 61 20 55 52 49 20 0a 20  extract a URI . 
24740 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 72 61           ** para
24750 6d 65 74 65 72 20 66 72 6f 6d 20 69 74 2e 20 20  meter from it.  
24760 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  */.          con
24770 73 74 20 63 68 61 72 20 2a 7a 42 61 73 65 20 3d  st char *zBase =
24780 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20   zName;.        
24790 20 20 73 69 7a 65 5f 74 20 6e 43 6f 70 79 3b 0a    size_t nCopy;.
247a0 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
247b0 7a 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20 20  zCopy;.         
247c0 20 69 66 28 20 72 62 75 49 73 56 61 63 75 75 6d   if( rbuIsVacuum
247d0 28 70 44 62 2d 3e 70 52 62 75 29 20 29 7b 0a 20  (pDb->pRbu) ){. 
247e0 20 20 20 20 20 20 20 20 20 20 20 7a 42 61 73 65             zBase
247f0 20 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f 66 69   = sqlite3_db_fi
24800 6c 65 6e 61 6d 65 28 70 44 62 2d 3e 70 52 62 75  lename(pDb->pRbu
24810 2d 3e 64 62 52 62 75 2c 20 22 6d 61 69 6e 22 29  ->dbRbu, "main")
24820 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 42  ;.            zB
24830 61 73 65 20 3d 20 72 62 75 4d 61 69 6e 54 6f 57  ase = rbuMainToW
24840 61 6c 28 7a 42 61 73 65 2c 20 53 51 4c 49 54 45  al(zBase, SQLITE
24850 5f 4f 50 45 4e 5f 55 52 49 29 3b 0a 20 20 20 20  _OPEN_URI);.    
24860 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24870 20 20 6e 43 6f 70 79 20 3d 20 73 74 72 6c 65 6e    nCopy = strlen
24880 28 7a 42 61 73 65 29 3b 0a 20 20 20 20 20 20 20  (zBase);.       
24890 20 20 20 7a 43 6f 70 79 20 3d 20 73 71 6c 69 74     zCopy = sqlit
248a0 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 43 6f 70  e3_malloc64(nCop
248b0 79 2b 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  y+2);.          
248c0 69 66 28 20 7a 43 6f 70 79 20 29 7b 0a 20 20 20  if( zCopy ){.   
248d0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
248e0 7a 43 6f 70 79 2c 20 7a 42 61 73 65 2c 20 6e 43  zCopy, zBase, nC
248f0 6f 70 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  opy);.          
24900 20 20 7a 43 6f 70 79 5b 6e 43 6f 70 79 2d 33 5d    zCopy[nCopy-3]
24910 20 3d 20 27 6f 27 3b 0a 20 20 20 20 20 20 20 20   = 'o';.        
24920 20 20 20 20 7a 43 6f 70 79 5b 6e 43 6f 70 79 5d      zCopy[nCopy]
24930 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20   = '\0';.       
24940 20 20 20 20 20 7a 43 6f 70 79 5b 6e 43 6f 70 79       zCopy[nCopy
24950 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  +1] = '\0';.    
24960 20 20 20 20 20 20 20 20 7a 4f 70 65 6e 20 3d 20          zOpen = 
24970 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 28 70 46  (const char*)(pF
24980 64 2d 3e 7a 44 65 6c 20 3d 20 7a 43 6f 70 79 29  d->zDel = zCopy)
24990 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
249a0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
249b0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
249c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
249d0 20 20 20 20 20 20 20 20 70 46 64 2d 3e 70 52 62          pFd->pRb
249e0 75 20 3d 20 70 44 62 2d 3e 70 52 62 75 3b 0a 20  u = pDb->pRbu;. 
249f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
24a00 20 70 44 62 2d 3e 70 57 61 6c 46 64 20 3d 20 70   pDb->pWalFd = p
24a10 46 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Fd;.      }.    
24a20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  }.  }else{.    p
24a30 46 64 2d 3e 70 52 62 75 20 3d 20 70 52 62 75 56  Fd->pRbu = pRbuV
24a40 66 73 2d 3e 70 52 62 75 3b 0a 20 20 7d 0a 0a 20  fs->pRbu;.  }.. 
24a50 20 69 66 28 20 6f 66 6c 61 67 73 20 26 20 53 51   if( oflags & SQ
24a60 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
24a70 42 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  B .   && sqlite3
24a80 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 4e 61  _uri_boolean(zNa
24a90 6d 65 2c 20 22 72 62 75 5f 6d 65 6d 6f 72 79 22  me, "rbu_memory"
24aa0 2c 20 30 29 20 0a 20 20 29 7b 0a 20 20 20 20 61  , 0) .  ){.    a
24ab0 73 73 65 72 74 28 20 6f 66 6c 61 67 73 20 26 20  ssert( oflags & 
24ac0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
24ad0 5f 44 42 20 29 3b 0a 20 20 20 20 6f 66 6c 61 67  _DB );.    oflag
24ae0 73 20 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s =  SQLITE_OPEN
24af0 5f 54 45 4d 50 5f 44 42 20 7c 20 53 51 4c 49 54  _TEMP_DB | SQLIT
24b00 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
24b10 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
24b20 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20  REATE |.        
24b30 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
24b40 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53 51  N_EXCLUSIVE | SQ
24b50 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
24b60 4f 4e 43 4c 4f 53 45 3b 0a 20 20 20 20 7a 4f 70  ONCLOSE;.    zOp
24b70 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 69  en = 0;.  }..  i
24b80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
24b90 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 52 65   ){.    rc = pRe
24ba0 61 6c 56 66 73 2d 3e 78 4f 70 65 6e 28 70 52 65  alVfs->xOpen(pRe
24bb0 61 6c 56 66 73 2c 20 7a 4f 70 65 6e 2c 20 70 46  alVfs, zOpen, pF
24bc0 64 2d 3e 70 52 65 61 6c 2c 20 6f 66 6c 61 67 73  d->pReal, oflags
24bd0 2c 20 70 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20  , pOutFlags);.  
24be0 7d 0a 20 20 69 66 28 20 70 46 64 2d 3e 70 52 65  }.  if( pFd->pRe
24bf0 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  al->pMethods ){.
24c00 20 20 20 20 2f 2a 20 54 68 65 20 78 4f 70 65 6e      /* The xOpen
24c10 28 29 20 6f 70 65 72 61 74 69 6f 6e 20 68 61 73  () operation has
24c20 20 73 75 63 63 65 65 64 65 64 2e 20 53 65 74 20   succeeded. Set 
24c30 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  the sqlite3_file
24c40 2e 70 4d 65 74 68 6f 64 73 0a 20 20 20 20 2a 2a  .pMethods.    **
24c50 20 70 6f 69 6e 74 65 72 20 61 6e 64 2c 20 69 66   pointer and, if
24c60 20 74 68 65 20 66 69 6c 65 20 69 73 20 61 20 6d   the file is a m
24c70 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
24c80 65 2c 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20  e, link it into 
24c90 74 68 65 0a 20 20 20 20 2a 2a 20 6d 75 74 65 78  the.    ** mutex
24ca0 20 70 72 6f 74 65 63 74 65 64 20 6c 69 6e 6b 65   protected linke
24cb0 64 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 75  d list of all su
24cc0 63 68 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20  ch files.  */.  
24cd0 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64    pFile->pMethod
24ce0 73 20 3d 20 26 72 62 75 76 66 73 5f 69 6f 5f 6d  s = &rbuvfs_io_m
24cf0 65 74 68 6f 64 73 3b 0a 20 20 20 20 69 66 28 20  ethods;.    if( 
24d00 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
24d10 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20  PEN_MAIN_DB ){. 
24d20 20 20 20 20 20 72 62 75 4d 61 69 6e 6c 69 73 74       rbuMainlist
24d30 41 64 64 28 70 46 64 29 3b 0a 20 20 20 20 7d 0a  Add(pFd);.    }.
24d40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
24d50 69 74 65 33 5f 66 72 65 65 28 70 46 64 2d 3e 7a  ite3_free(pFd->z
24d60 44 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Del);.  }..  ret
24d70 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
24d80 20 44 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65   Delete the file
24d90 20 6c 6f 63 61 74 65 64 20 61 74 20 7a 50 61 74   located at zPat
24da0 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  h..*/.static int
24db0 20 72 62 75 56 66 73 44 65 6c 65 74 65 28 73 71   rbuVfsDelete(sq
24dc0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
24dd0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
24de0 74 68 2c 20 69 6e 74 20 64 69 72 53 79 6e 63 29  th, int dirSync)
24df0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
24e00 2a 70 52 65 61 6c 56 66 73 20 3d 20 28 28 72 62  *pRealVfs = ((rb
24e10 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e 70 52  u_vfs*)pVfs)->pR
24e20 65 61 6c 56 66 73 3b 0a 20 20 72 65 74 75 72 6e  ealVfs;.  return
24e30 20 70 52 65 61 6c 56 66 73 2d 3e 78 44 65 6c 65   pRealVfs->xDele
24e40 74 65 28 70 52 65 61 6c 56 66 73 2c 20 7a 50 61  te(pRealVfs, zPa
24e50 74 68 2c 20 64 69 72 53 79 6e 63 29 3b 0a 7d 0a  th, dirSync);.}.
24e60 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 66 6f 72 20  ./*.** Test for 
24e70 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f  access permissio
24e80 6e 73 2e 20 52 65 74 75 72 6e 20 74 72 75 65 20  ns. Return true 
24e90 69 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  if the requested
24ea0 20 70 65 72 6d 69 73 73 69 6f 6e 0a 2a 2a 20 69   permission.** i
24eb0 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20  s available, or 
24ec0 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
24ed0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
24ee0 62 75 56 66 73 41 63 63 65 73 73 28 0a 20 20 73  buVfsAccess(.  s
24ef0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
24f00 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
24f10 2a 7a 50 61 74 68 2c 20 0a 20 20 69 6e 74 20 66  *zPath, .  int f
24f20 6c 61 67 73 2c 20 0a 20 20 69 6e 74 20 2a 70 52  lags, .  int *pR
24f30 65 73 4f 75 74 0a 29 7b 0a 20 20 72 62 75 5f 76  esOut.){.  rbu_v
24f40 66 73 20 2a 70 52 62 75 56 66 73 20 3d 20 28 72  fs *pRbuVfs = (r
24f50 62 75 5f 76 66 73 2a 29 70 56 66 73 3b 0a 20 20  bu_vfs*)pVfs;.  
24f60 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65  sqlite3_vfs *pRe
24f70 61 6c 56 66 73 20 3d 20 70 52 62 75 56 66 73 2d  alVfs = pRbuVfs-
24f80 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20 69 6e 74  >pRealVfs;.  int
24f90 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 70 52 65   rc;..  rc = pRe
24fa0 61 6c 56 66 73 2d 3e 78 41 63 63 65 73 73 28 70  alVfs->xAccess(p
24fb0 52 65 61 6c 56 66 73 2c 20 7a 50 61 74 68 2c 20  RealVfs, zPath, 
24fc0 66 6c 61 67 73 2c 20 70 52 65 73 4f 75 74 29 3b  flags, pResOut);
24fd0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 63  ..  /* If this c
24fe0 61 6c 6c 20 69 73 20 74 6f 20 63 68 65 63 6b 20  all is to check 
24ff0 69 66 20 61 20 2a 2d 77 61 6c 20 66 69 6c 65 20  if a *-wal file 
25000 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
25010 61 6e 20 52 42 55 20 74 61 72 67 65 74 0a 20 20  an RBU target.  
25020 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
25030 65 63 74 69 6f 6e 20 65 78 69 73 74 73 2c 20 61  ection exists, a
25040 6e 64 20 74 68 65 20 52 42 55 20 75 70 64 61 74  nd the RBU updat
25050 65 20 69 73 20 69 6e 20 52 42 55 5f 53 54 41 47  e is in RBU_STAG
25060 45 5f 4f 41 4c 2c 0a 20 20 2a 2a 20 74 68 65 20  E_OAL,.  ** the 
25070 66 6f 6c 6c 6f 77 69 6e 67 20 73 70 65 63 69 61  following specia
25080 6c 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 61 63  l handling is ac
25090 74 69 76 61 74 65 64 3a 0a 20 20 2a 2a 0a 20 20  tivated:.  **.  
250a0 2a 2a 20 20 20 61 29 20 69 66 20 74 68 65 20 2a  **   a) if the *
250b0 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 65  -wal file does e
250c0 78 69 73 74 2c 20 72 65 74 75 72 6e 20 53 51 4c  xist, return SQL
250d0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2e 20 54 68  ITE_CANTOPEN. Th
250e0 69 73 0a 20 20 2a 2a 20 20 20 20 20 20 65 6e 73  is.  **      ens
250f0 75 72 65 73 20 74 68 61 74 20 74 68 65 20 52 42  ures that the RB
25100 55 20 65 78 74 65 6e 73 69 6f 6e 20 6e 65 76 65  U extension neve
25110 72 20 74 72 69 65 73 20 74 6f 20 75 70 64 61 74  r tries to updat
25120 65 20 61 20 64 61 74 61 62 61 73 65 0a 20 20 2a  e a database.  *
25130 2a 20 20 20 20 20 20 69 6e 20 77 61 6c 20 6d 6f  *      in wal mo
25140 64 65 2c 20 65 76 65 6e 20 69 66 20 74 68 65 20  de, even if the 
25150 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
25160 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
25170 68 61 73 0a 20 20 2a 2a 20 20 20 20 20 20 62 65  has.  **      be
25180 65 6e 20 64 61 6d 61 67 65 64 2e 20 0a 20 20 2a  en damaged. .  *
25190 2a 0a 20 20 2a 2a 20 20 20 62 29 20 69 66 20 74  *.  **   b) if t
251a0 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f  he *-wal file do
251b0 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 63 6c  es not exist, cl
251c0 61 69 6d 20 74 68 61 74 20 69 74 20 64 6f 65 73  aim that it does
251d0 20 61 6e 79 77 61 79 2c 0a 20 20 2a 2a 20 20 20   anyway,.  **   
251e0 20 20 20 63 61 75 73 69 6e 67 20 53 51 4c 69 74     causing SQLit
251f0 65 20 74 6f 20 63 61 6c 6c 20 78 4f 70 65 6e 28  e to call xOpen(
25200 29 20 74 6f 20 6f 70 65 6e 20 69 74 2e 20 54 68  ) to open it. Th
25210 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20 61 6c 73  is call will als
25220 6f 0a 20 20 2a 2a 20 20 20 20 20 20 62 65 20 69  o.  **      be i
25230 6e 74 65 72 63 65 70 74 65 64 20 28 73 65 65 20  ntercepted (see 
25240 74 68 65 20 72 62 75 56 66 73 4f 70 65 6e 28 29  the rbuVfsOpen()
25250 20 66 75 6e 63 74 69 6f 6e 29 20 61 6e 64 20 74   function) and t
25260 68 65 20 2a 2d 6f 61 6c 0a 20 20 2a 2a 20 20 20  he *-oal.  **   
25270 20 20 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 69     file opened i
25280 6e 73 74 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69  nstead..  */.  i
25290 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
252a0 20 26 26 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54   && flags==SQLIT
252b0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 20  E_ACCESS_EXISTS 
252c0 29 7b 0a 20 20 20 20 72 62 75 5f 66 69 6c 65 20  ){.    rbu_file 
252d0 2a 70 44 62 20 3d 20 72 62 75 46 69 6e 64 4d 61  *pDb = rbuFindMa
252e0 69 6e 64 62 28 70 52 62 75 56 66 73 2c 20 7a 50  indb(pRbuVfs, zP
252f0 61 74 68 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  ath, 1);.    if(
25300 20 70 44 62 20 26 26 20 70 44 62 2d 3e 70 52 62   pDb && pDb->pRb
25310 75 20 26 26 20 70 44 62 2d 3e 70 52 62 75 2d 3e  u && pDb->pRbu->
25320 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47  eStage==RBU_STAG
25330 45 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 20 20 69  E_OAL ){.      i
25340 66 28 20 2a 70 52 65 73 4f 75 74 20 29 7b 0a 20  f( *pResOut ){. 
25350 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
25360 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20  TE_CANTOPEN;.   
25370 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25380 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
25390 73 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  sz = 0;.        
253a0 72 63 20 3d 20 72 62 75 56 66 73 46 69 6c 65 53  rc = rbuVfsFileS
253b0 69 7a 65 28 26 70 44 62 2d 3e 62 61 73 65 2c 20  ize(&pDb->base, 
253c0 26 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  &sz);.        *p
253d0 52 65 73 4f 75 74 20 3d 20 28 73 7a 3e 30 29 3b  ResOut = (sz>0);
253e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
253f0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
25400 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61  .}../*.** Popula
25410 74 65 20 62 75 66 66 65 72 20 7a 4f 75 74 20 77  te buffer zOut w
25420 69 74 68 20 74 68 65 20 66 75 6c 6c 20 63 61 6e  ith the full can
25430 6f 6e 69 63 61 6c 20 70 61 74 68 6e 61 6d 65 20  onical pathname 
25440 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
25450 20 74 6f 20 74 68 65 20 70 61 74 68 6e 61 6d 65   to the pathname
25460 20 69 6e 20 7a 50 61 74 68 2e 20 7a 4f 75 74 20   in zPath. zOut 
25470 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
25480 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
25490 65 72 0a 2a 2a 20 6f 66 20 61 74 20 6c 65 61 73  er.** of at leas
254a0 74 20 28 44 45 56 53 59 4d 5f 4d 41 58 5f 50 41  t (DEVSYM_MAX_PA
254b0 54 48 4e 41 4d 45 2b 31 29 20 62 79 74 65 73 2e  THNAME+1) bytes.
254c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
254d0 62 75 56 66 73 46 75 6c 6c 50 61 74 68 6e 61 6d  buVfsFullPathnam
254e0 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
254f0 20 2a 70 56 66 73 2c 20 0a 20 20 63 6f 6e 73 74   *pVfs, .  const
25500 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 0a 20   char *zPath, . 
25510 20 69 6e 74 20 6e 4f 75 74 2c 20 0a 20 20 63 68   int nOut, .  ch
25520 61 72 20 2a 7a 4f 75 74 0a 29 7b 0a 20 20 73 71  ar *zOut.){.  sq
25530 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65 61 6c  lite3_vfs *pReal
25540 56 66 73 20 3d 20 28 28 72 62 75 5f 76 66 73 2a  Vfs = ((rbu_vfs*
25550 29 70 56 66 73 29 2d 3e 70 52 65 61 6c 56 66 73  )pVfs)->pRealVfs
25560 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 61 6c  ;.  return pReal
25570 56 66 73 2d 3e 78 46 75 6c 6c 50 61 74 68 6e 61  Vfs->xFullPathna
25580 6d 65 28 70 52 65 61 6c 56 66 73 2c 20 7a 50 61  me(pRealVfs, zPa
25590 74 68 2c 20 6e 4f 75 74 2c 20 7a 4f 75 74 29 3b  th, nOut, zOut);
255a0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
255b0 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
255c0 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 4f 70 65  ENSION./*.** Ope
255d0 6e 20 74 68 65 20 64 79 6e 61 6d 69 63 20 6c 69  n the dynamic li
255e0 62 72 61 72 79 20 6c 6f 63 61 74 65 64 20 61 74  brary located at
255f0 20 7a 50 61 74 68 20 61 6e 64 20 72 65 74 75 72   zPath and retur
25600 6e 20 61 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  n a handle..*/.s
25610 74 61 74 69 63 20 76 6f 69 64 20 2a 72 62 75 56  tatic void *rbuV
25620 66 73 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33  fsDlOpen(sqlite3
25630 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73  _vfs *pVfs, cons
25640 74 20 63 68 61 72 20 2a 7a 50 61 74 68 29 7b 0a  t char *zPath){.
25650 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
25660 52 65 61 6c 56 66 73 20 3d 20 28 28 72 62 75 5f  RealVfs = ((rbu_
25670 76 66 73 2a 29 70 56 66 73 29 2d 3e 70 52 65 61  vfs*)pVfs)->pRea
25680 6c 56 66 73 3b 0a 20 20 72 65 74 75 72 6e 20 70  lVfs;.  return p
25690 52 65 61 6c 56 66 73 2d 3e 78 44 6c 4f 70 65 6e  RealVfs->xDlOpen
256a0 28 70 52 65 61 6c 56 66 73 2c 20 7a 50 61 74 68  (pRealVfs, zPath
256b0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75  );.}../*.** Popu
256c0 6c 61 74 65 20 74 68 65 20 62 75 66 66 65 72 20  late the buffer 
256d0 7a 45 72 72 4d 73 67 20 28 73 69 7a 65 20 6e 42  zErrMsg (size nB
256e0 79 74 65 20 62 79 74 65 73 29 20 77 69 74 68 20  yte bytes) with 
256f0 61 20 68 75 6d 61 6e 20 72 65 61 64 61 62 6c 65  a human readable
25700 0a 2a 2a 20 75 74 66 2d 38 20 73 74 72 69 6e 67  .** utf-8 string
25710 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20   describing the 
25720 6d 6f 73 74 20 72 65 63 65 6e 74 20 65 72 72 6f  most recent erro
25730 72 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 73  r encountered as
25740 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20 77 69 74  sociated .** wit
25750 68 20 64 79 6e 61 6d 69 63 20 6c 69 62 72 61 72  h dynamic librar
25760 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ies..*/.static v
25770 6f 69 64 20 72 62 75 56 66 73 44 6c 45 72 72 6f  oid rbuVfsDlErro
25780 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  r(sqlite3_vfs *p
25790 56 66 73 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20  Vfs, int nByte, 
257a0 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 29 7b 0a  char *zErrMsg){.
257b0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
257c0 52 65 61 6c 56 66 73 20 3d 20 28 28 72 62 75 5f  RealVfs = ((rbu_
257d0 76 66 73 2a 29 70 56 66 73 29 2d 3e 70 52 65 61  vfs*)pVfs)->pRea
257e0 6c 56 66 73 3b 0a 20 20 70 52 65 61 6c 56 66 73  lVfs;.  pRealVfs
257f0 2d 3e 78 44 6c 45 72 72 6f 72 28 70 52 65 61 6c  ->xDlError(pReal
25800 56 66 73 2c 20 6e 42 79 74 65 2c 20 7a 45 72 72  Vfs, nByte, zErr
25810 4d 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Msg);.}../*.** R
25820 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
25830 74 6f 20 74 68 65 20 73 79 6d 62 6f 6c 20 7a 53  to the symbol zS
25840 79 6d 62 6f 6c 20 69 6e 20 74 68 65 20 64 79 6e  ymbol in the dyn
25850 61 6d 69 63 20 6c 69 62 72 61 72 79 20 70 48 61  amic library pHa
25860 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndle..*/.static 
25870 76 6f 69 64 20 28 2a 72 62 75 56 66 73 44 6c 53  void (*rbuVfsDlS
25880 79 6d 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  ym(.  sqlite3_vf
25890 73 20 2a 70 56 66 73 2c 20 0a 20 20 76 6f 69 64  s *pVfs, .  void
258a0 20 2a 70 41 72 67 2c 20 0a 20 20 63 6f 6e 73 74   *pArg, .  const
258b0 20 63 68 61 72 20 2a 7a 53 79 6d 0a 29 29 28 76   char *zSym.))(v
258c0 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
258d0 76 66 73 20 2a 70 52 65 61 6c 56 66 73 20 3d 20  vfs *pRealVfs = 
258e0 28 28 72 62 75 5f 76 66 73 2a 29 70 56 66 73 29  ((rbu_vfs*)pVfs)
258f0 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20 72 65  ->pRealVfs;.  re
25900 74 75 72 6e 20 70 52 65 61 6c 56 66 73 2d 3e 78  turn pRealVfs->x
25910 44 6c 53 79 6d 28 70 52 65 61 6c 56 66 73 2c 20  DlSym(pRealVfs, 
25920 70 41 72 67 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 0a  pArg, zSym);.}..
25930 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20  /*.** Close the 
25940 64 79 6e 61 6d 69 63 20 6c 69 62 72 61 72 79 20  dynamic library 
25950 68 61 6e 64 6c 65 20 70 48 61 6e 64 6c 65 2e 0a  handle pHandle..
25960 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
25970 62 75 56 66 73 44 6c 43 6c 6f 73 65 28 73 71 6c  buVfsDlClose(sql
25980 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
25990 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a  void *pHandle){.
259a0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
259b0 52 65 61 6c 56 66 73 20 3d 20 28 28 72 62 75 5f  RealVfs = ((rbu_
259c0 76 66 73 2a 29 70 56 66 73 29 2d 3e 70 52 65 61  vfs*)pVfs)->pRea
259d0 6c 56 66 73 3b 0a 20 20 70 52 65 61 6c 56 66 73  lVfs;.  pRealVfs
259e0 2d 3e 78 44 6c 43 6c 6f 73 65 28 70 52 65 61 6c  ->xDlClose(pReal
259f0 56 66 73 2c 20 70 48 61 6e 64 6c 65 29 3b 0a 7d  Vfs, pHandle);.}
25a00 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
25a10 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
25a20 4e 53 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  NSION */../*.** 
25a30 50 6f 70 75 6c 61 74 65 20 74 68 65 20 62 75 66  Populate the buf
25a40 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  fer pointed to b
25a50 79 20 7a 42 75 66 4f 75 74 20 77 69 74 68 20 6e  y zBufOut with n
25a60 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 0a 2a  Byte bytes of .*
25a70 2a 20 72 61 6e 64 6f 6d 20 64 61 74 61 2e 0a 2a  * random data..*
25a80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75  /.static int rbu
25a90 56 66 73 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71  VfsRandomness(sq
25aa0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
25ab0 20 69 6e 74 20 6e 42 79 74 65 2c 20 63 68 61 72   int nByte, char
25ac0 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 73 71   *zBufOut){.  sq
25ad0 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65 61 6c  lite3_vfs *pReal
25ae0 56 66 73 20 3d 20 28 28 72 62 75 5f 76 66 73 2a  Vfs = ((rbu_vfs*
25af0 29 70 56 66 73 29 2d 3e 70 52 65 61 6c 56 66 73  )pVfs)->pRealVfs
25b00 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 61 6c  ;.  return pReal
25b10 56 66 73 2d 3e 78 52 61 6e 64 6f 6d 6e 65 73 73  Vfs->xRandomness
25b20 28 70 52 65 61 6c 56 66 73 2c 20 6e 42 79 74 65  (pRealVfs, nByte
25b30 2c 20 7a 42 75 66 4f 75 74 29 3b 0a 7d 0a 0a 2f  , zBufOut);.}../
25b40 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 6e  *.** Sleep for n
25b50 4d 69 63 72 6f 20 6d 69 63 72 6f 73 65 63 6f 6e  Micro microsecon
25b60 64 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e  ds. Return the n
25b70 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65  umber of microse
25b80 63 6f 6e 64 73 20 0a 2a 2a 20 61 63 74 75 61 6c  conds .** actual
25b90 6c 79 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61  ly slept..*/.sta
25ba0 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 53 6c  tic int rbuVfsSl
25bb0 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20  eep(sqlite3_vfs 
25bc0 2a 70 56 66 73 2c 20 69 6e 74 20 6e 4d 69 63 72  *pVfs, int nMicr
25bd0 6f 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  o){.  sqlite3_vf
25be0 73 20 2a 70 52 65 61 6c 56 66 73 20 3d 20 28 28  s *pRealVfs = ((
25bf0 72 62 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e  rbu_vfs*)pVfs)->
25c00 70 52 65 61 6c 56 66 73 3b 0a 20 20 72 65 74 75  pRealVfs;.  retu
25c10 72 6e 20 70 52 65 61 6c 56 66 73 2d 3e 78 53 6c  rn pRealVfs->xSl
25c20 65 65 70 28 70 52 65 61 6c 56 66 73 2c 20 6e 4d  eep(pRealVfs, nM
25c30 69 63 72 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  icro);.}../*.** 
25c40 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  Return the curre
25c50 6e 74 20 74 69 6d 65 20 61 73 20 61 20 4a 75 6c  nt time as a Jul
25c60 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69  ian Day number i
25c70 6e 20 2a 70 54 69 6d 65 4f 75 74 2e 0a 2a 2f 0a  n *pTimeOut..*/.
25c80 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66  static int rbuVf
25c90 73 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c  sCurrentTime(sql
25ca0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
25cb0 64 6f 75 62 6c 65 20 2a 70 54 69 6d 65 4f 75 74  double *pTimeOut
25cc0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
25cd0 20 2a 70 52 65 61 6c 56 66 73 20 3d 20 28 28 72   *pRealVfs = ((r
25ce0 62 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e 70  bu_vfs*)pVfs)->p
25cf0 52 65 61 6c 56 66 73 3b 0a 20 20 72 65 74 75 72  RealVfs;.  retur
25d00 6e 20 70 52 65 61 6c 56 66 73 2d 3e 78 43 75 72  n pRealVfs->xCur
25d10 72 65 6e 74 54 69 6d 65 28 70 52 65 61 6c 56 66  rentTime(pRealVf
25d20 73 2c 20 70 54 69 6d 65 4f 75 74 29 3b 0a 7d 0a  s, pTimeOut);.}.
25d30 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 2e 0a 2a 2f  ./*.** No-op..*/
25d40 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56  .static int rbuV
25d50 66 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73  fsGetLastError(s
25d60 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
25d70 2c 20 69 6e 74 20 61 2c 20 63 68 61 72 20 2a 62  , int a, char *b
25d80 29 7b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  ){.  return 0;.}
25d90 0a 0a 2f 2a 0a 2a 2a 20 44 65 72 65 67 69 73 74  ../*.** Deregist
25da0 65 72 20 61 6e 64 20 64 65 73 74 72 6f 79 20 61  er and destroy a
25db0 6e 20 52 42 55 20 76 66 73 20 63 72 65 61 74 65  n RBU vfs create
25dc0 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  d by an earlier 
25dd0 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69 74  call to.** sqlit
25de0 65 33 72 62 75 5f 63 72 65 61 74 65 5f 76 66 73  e3rbu_create_vfs
25df0 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
25e00 74 65 33 72 62 75 5f 64 65 73 74 72 6f 79 5f 76  te3rbu_destroy_v
25e10 66 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  fs(const char *z
25e20 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  Name){.  sqlite3
25e30 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 73 71 6c  _vfs *pVfs = sql
25e40 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a 4e  ite3_vfs_find(zN
25e50 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 56 66 73  ame);.  if( pVfs
25e60 20 26 26 20 70 56 66 73 2d 3e 78 4f 70 65 6e 3d   && pVfs->xOpen=
25e70 3d 72 62 75 56 66 73 4f 70 65 6e 20 29 7b 0a 20  =rbuVfsOpen ){. 
25e80 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
25e90 5f 66 72 65 65 28 28 28 72 62 75 5f 76 66 73 2a  _free(((rbu_vfs*
25ea0 29 70 56 66 73 29 2d 3e 6d 75 74 65 78 29 3b 0a  )pVfs)->mutex);.
25eb0 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f      sqlite3_vfs_
25ec0 75 6e 72 65 67 69 73 74 65 72 28 70 56 66 73 29  unregister(pVfs)
25ed0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
25ee0 65 65 28 70 56 66 73 29 3b 0a 20 20 7d 0a 7d 0a  ee(pVfs);.  }.}.
25ef0 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e  ./*.** Create an
25f00 20 52 42 55 20 56 46 53 20 6e 61 6d 65 64 20 7a   RBU VFS named z
25f10 4e 61 6d 65 20 74 68 61 74 20 61 63 63 65 73 73  Name that access
25f20 65 73 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  es the underlyin
25f30 67 20 66 69 6c 65 2d 73 79 73 74 65 6d 0a 2a 2a  g file-system.**
25f40 20 76 69 61 20 65 78 69 73 74 69 6e 67 20 56 46   via existing VF
25f50 53 20 7a 50 61 72 65 6e 74 2e 20 54 68 65 20 6e  S zParent. The n
25f60 65 77 20 6f 62 6a 65 63 74 20 69 73 20 72 65 67  ew object is reg
25f70 69 73 74 65 72 65 64 20 61 73 20 61 20 6e 6f 6e  istered as a non
25f80 2d 64 65 66 61 75 6c 74 0a 2a 2a 20 56 46 53 20  -default.** VFS 
25f90 77 69 74 68 20 53 51 4c 69 74 65 20 62 65 66 6f  with SQLite befo
25fa0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
25fb0 0a 69 6e 74 20 73 71 6c 69 74 65 33 72 62 75 5f  .int sqlite3rbu_
25fc0 63 72 65 61 74 65 5f 76 66 73 28 63 6f 6e 73 74  create_vfs(const
25fd0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f   char *zName, co
25fe0 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 65 6e  nst char *zParen
25ff0 74 29 7b 0a 0a 20 20 2f 2a 20 54 65 6d 70 6c 61  t){..  /* Templa
26000 74 65 20 66 6f 72 20 56 46 53 20 2a 2f 0a 20 20  te for VFS */.  
26010 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76  static sqlite3_v
26020 66 73 20 76 66 73 5f 74 65 6d 70 6c 61 74 65 20  fs vfs_template 
26030 3d 20 7b 0a 20 20 20 20 31 2c 20 20 20 20 20 20  = {.    1,      
26040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26050 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
26060 6e 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  n */.    0,     
26070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26080 20 20 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69         /* szOsFi
26090 6c 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20  le */.    0,    
260a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
260b0 20 20 20 20 20 20 20 20 2f 2a 20 6d 78 50 61 74          /* mxPat
260c0 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20  hname */.    0, 
260d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
260e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e             /* pN
260f0 65 78 74 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20  ext */.    0,   
26100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26110 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d           /* zNam
26120 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  e */.    0,     
26130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26140 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61         /* pAppDa
26150 74 61 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73  ta */.    rbuVfs
26160 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
26170 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e          /* xOpen
26180 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 44 65   */.    rbuVfsDe
26190 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  lete,           
261a0 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65        /* xDelete
261b0 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 41 63   */.    rbuVfsAc
261c0 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20  cess,           
261d0 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73        /* xAccess
261e0 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 46 75   */.    rbuVfsFu
261f0 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20  llPathname,     
26200 20 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61        /* xFullPa
26210 74 68 6e 61 6d 65 20 2a 2f 0a 0a 23 69 66 6e 64  thname */..#ifnd
26220 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
26230 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20  OAD_EXTENSION.  
26240 20 20 72 62 75 56 66 73 44 6c 4f 70 65 6e 2c 20    rbuVfsDlOpen, 
26250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26260 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20  /* xDlOpen */.  
26270 20 20 72 62 75 56 66 73 44 6c 45 72 72 6f 72 2c    rbuVfsDlError,
26280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26290 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20  /* xDlError */. 
262a0 20 20 20 72 62 75 56 66 73 44 6c 53 79 6d 2c 20     rbuVfsDlSym, 
262b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262c0 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20   /* xDlSym */.  
262d0 20 20 72 62 75 56 66 73 44 6c 43 6c 6f 73 65 2c    rbuVfsDlClose,
262e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262f0 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 23  /* xDlClose */.#
26300 65 6c 73 65 0a 20 20 20 20 30 2c 20 30 2c 20 30  else.    0, 0, 0
26310 2c 20 30 2c 0a 23 65 6e 64 69 66 0a 0a 20 20 20  , 0,.#endif..   
26320 20 72 62 75 56 66 73 52 61 6e 64 6f 6d 6e 65 73   rbuVfsRandomnes
26330 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s,             /
26340 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f  * xRandomness */
26350 0a 20 20 20 20 72 62 75 56 66 73 53 6c 65 65 70  .    rbuVfsSleep
26360 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26370 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a     /* xSleep */.
26380 20 20 20 20 72 62 75 56 66 73 43 75 72 72 65 6e      rbuVfsCurren
26390 74 54 69 6d 65 2c 20 20 20 20 20 20 20 20 20 20  tTime,          
263a0 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d    /* xCurrentTim
263b0 65 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 47  e */.    rbuVfsG
263c0 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20  etLastError,    
263d0 20 20 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61         /* xGetLa
263e0 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 30  stError */.    0
263f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26400 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26410 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  xCurrentTimeInt6
26420 34 20 28 76 65 72 73 69 6f 6e 20 32 29 20 2a 2f  4 (version 2) */
26430 0a 20 20 20 20 30 2c 20 30 2c 20 30 20 20 20 20  .    0, 0, 0    
26440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26450 20 20 20 2f 2a 20 55 6e 69 6d 70 6c 65 6d 65 6e     /* Unimplemen
26460 74 65 64 20 76 65 72 73 69 6f 6e 20 33 20 6d 65  ted version 3 me
26470 74 68 6f 64 73 20 2a 2f 0a 20 20 7d 3b 0a 0a 20  thods */.  };.. 
26480 20 72 62 75 5f 76 66 73 20 2a 70 4e 65 77 20 3d   rbu_vfs *pNew =
26490 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
264a0 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61   /* Newly alloca
264b0 74 65 64 20 56 46 53 20 2a 2f 0a 20 20 69 6e 74  ted VFS */.  int
264c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
264d0 0a 20 20 73 69 7a 65 5f 74 20 6e 4e 61 6d 65 3b  .  size_t nName;
264e0 0a 20 20 73 69 7a 65 5f 74 20 6e 42 79 74 65 3b  .  size_t nByte;
264f0 0a 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c  ..  nName = strl
26500 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e 42 79  en(zName);.  nBy
26510 74 65 20 3d 20 73 69 7a 65 6f 66 28 72 62 75 5f  te = sizeof(rbu_
26520 76 66 73 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31  vfs) + nName + 1
26530 3b 0a 20 20 70 4e 65 77 20 3d 20 28 72 62 75 5f  ;.  pNew = (rbu_
26540 76 66 73 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  vfs*)sqlite3_mal
26550 6c 6f 63 36 34 28 6e 42 79 74 65 29 3b 0a 20 20  loc64(nByte);.  
26560 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
26570 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
26580 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OMEM;.  }else{. 
26590 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a     sqlite3_vfs *
265a0 70 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20  pParent;        
265b0 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 56 46 53     /* Parent VFS
265c0 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   */.    memset(p
265d0 4e 65 77 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a  New, 0, nByte);.
265e0 20 20 20 20 70 50 61 72 65 6e 74 20 3d 20 73 71      pParent = sq
265f0 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a  lite3_vfs_find(z
26600 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 69 66 28  Parent);.    if(
26610 20 70 50 61 72 65 6e 74 3d 3d 30 20 29 7b 0a 20   pParent==0 ){. 
26620 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
26630 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 20 20 7d  _NOTFOUND;.    }
26640 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
26650 20 2a 7a 53 70 61 63 65 3b 0a 20 20 20 20 20 20   *zSpace;.      
26660 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e 62 61  memcpy(&pNew->ba
26670 73 65 2c 20 26 76 66 73 5f 74 65 6d 70 6c 61 74  se, &vfs_templat
26680 65 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65  e, sizeof(sqlite
26690 33 5f 76 66 73 29 29 3b 0a 20 20 20 20 20 20 70  3_vfs));.      p
266a0 4e 65 77 2d 3e 62 61 73 65 2e 6d 78 50 61 74 68  New->base.mxPath
266b0 6e 61 6d 65 20 3d 20 70 50 61 72 65 6e 74 2d 3e  name = pParent->
266c0 6d 78 50 61 74 68 6e 61 6d 65 3b 0a 20 20 20 20  mxPathname;.    
266d0 20 20 70 4e 65 77 2d 3e 62 61 73 65 2e 73 7a 4f    pNew->base.szO
266e0 73 46 69 6c 65 20 3d 20 73 69 7a 65 6f 66 28 72  sFile = sizeof(r
266f0 62 75 5f 66 69 6c 65 29 20 2b 20 70 50 61 72 65  bu_file) + pPare
26700 6e 74 2d 3e 73 7a 4f 73 46 69 6c 65 3b 0a 20 20  nt->szOsFile;.  
26710 20 20 20 20 70 4e 65 77 2d 3e 70 52 65 61 6c 56      pNew->pRealV
26720 66 73 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20  fs = pParent;.  
26730 20 20 20 20 70 4e 65 77 2d 3e 62 61 73 65 2e 7a      pNew->base.z
26740 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  Name = (const ch
26750 61 72 2a 29 28 7a 53 70 61 63 65 20 3d 20 28 63  ar*)(zSpace = (c
26760 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 29 3b 0a  har*)&pNew[1]);.
26770 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 53 70        memcpy(zSp
26780 61 63 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  ace, zName, nNam
26790 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 41 6c  e);..      /* Al
267a0 6c 6f 63 61 74 65 20 74 68 65 20 6d 75 74 65 78  locate the mutex
267b0 20 61 6e 64 20 72 65 67 69 73 74 65 72 20 74 68   and register th
267c0 65 20 6e 65 77 20 56 46 53 20 28 6e 6f 74 20 61  e new VFS (not a
267d0 73 20 74 68 65 20 64 65 66 61 75 6c 74 29 20 2a  s the default) *
267e0 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6d 75  /.      pNew->mu
267f0 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75  tex = sqlite3_mu
26800 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
26810 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45  _MUTEX_RECURSIVE
26820 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
26830 77 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  w->mutex==0 ){. 
26840 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
26850 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
26860 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
26870 63 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  c = sqlite3_vfs_
26880 72 65 67 69 73 74 65 72 28 26 70 4e 65 77 2d 3e  register(&pNew->
26890 62 61 73 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  base, 0);.      
268a0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
268b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
268c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
268d0 6d 75 74 65 78 5f 66 72 65 65 28 70 4e 65 77 2d  mutex_free(pNew-
268e0 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 73  >mutex);.      s
268f0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
26900 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
26910 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
26920 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 74 68  .** Configure th
26930 65 20 61 67 67 72 65 67 61 74 65 20 74 65 6d 70  e aggregate temp
26940 20 66 69 6c 65 20 73 69 7a 65 20 6c 69 6d 69 74   file size limit
26950 20 66 6f 72 20 74 68 69 73 20 52 42 55 20 68 61   for this RBU ha
26960 6e 64 6c 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  ndle..*/.sqlite3
26970 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33 72 62  _int64 sqlite3rb
26980 75 5f 74 65 6d 70 5f 73 69 7a 65 5f 6c 69 6d 69  u_temp_size_limi
26990 74 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 52  t(sqlite3rbu *pR
269a0 62 75 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  bu, sqlite3_int6
269b0 34 20 6e 29 7b 0a 20 20 69 66 28 20 6e 3e 3d 30  4 n){.  if( n>=0
269c0 20 29 7b 0a 20 20 20 20 70 52 62 75 2d 3e 73 7a   ){.    pRbu->sz
269d0 54 65 6d 70 4c 69 6d 69 74 20 3d 20 6e 3b 0a 20  TempLimit = n;. 
269e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 62 75   }.  return pRbu
269f0 2d 3e 73 7a 54 65 6d 70 4c 69 6d 69 74 3b 0a 7d  ->szTempLimit;.}
26a00 0a 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  ..sqlite3_int64 
26a10 73 71 6c 69 74 65 33 72 62 75 5f 74 65 6d 70 5f  sqlite3rbu_temp_
26a20 73 69 7a 65 28 73 71 6c 69 74 65 33 72 62 75 20  size(sqlite3rbu 
26a30 2a 70 52 62 75 29 7b 0a 20 20 72 65 74 75 72 6e  *pRbu){.  return
26a40 20 70 52 62 75 2d 3e 73 7a 54 65 6d 70 3b 0a 7d   pRbu->szTemp;.}
26a50 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
26a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
26aa0 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
26ab0 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 52 45 29  ned(SQLITE_CORE)
26ac0 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
26ad0 54 45 5f 45 4e 41 42 4c 45 5f 52 42 55 29 20 2a  TE_ENABLE_RBU) *
26ae0 2f 0a                                            /.