/ Hex Artifact Content
Login

Artifact d0627582dc894d96e70a1f4b3c8953abdd9fd4870f9a229479309ebfca9eda41:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 41 75 67 75 73  /*.** 2014 Augus
0010: 74 20 33 30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  t 30.**.** The a
0020: 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20  uthor disclaims 
0030: 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69  copyright to thi
0040: 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20  s source code.  
0050: 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61  In place of.** a
0060: 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68   legal notice, h
0070: 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e  ere is a blessin
0080: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20  g:.**.**    May 
0090: 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20  you do good and 
00a0: 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20  not evil..**    
00b0: 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72  May you find for
00c0: 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75  giveness for you
00d0: 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76  rself and forgiv
00e0: 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20  e others..**    
00f0: 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72  May you share fr
0100: 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69  eely, never taki
0110: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75  ng more than you
0120: 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   give..**.******
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 56 45  ***.**.**.** OVE
0180: 52 56 49 45 57 20 0a 2a 2a 0a 2a 2a 20 20 54 68  RVIEW .**.**  Th
0190: 65 20 52 42 55 20 65 78 74 65 6e 73 69 6f 6e 20  e RBU extension 
01a0: 72 65 71 75 69 72 65 73 20 74 68 61 74 20 74 68  requires that th
01b0: 65 20 52 42 55 20 75 70 64 61 74 65 20 62 65 20  e RBU update be 
01c0: 70 61 63 6b 61 67 65 64 20 61 73 20 61 6e 0a 2a  packaged as an.*
01d0: 2a 20 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  *  SQLite databa
01e0: 73 65 2e 20 54 68 65 20 74 61 62 6c 65 73 20 69  se. The tables i
01f0: 74 20 65 78 70 65 63 74 73 20 74 6f 20 66 69 6e  t expects to fin
0200: 64 20 61 72 65 20 64 65 73 63 72 69 62 65 64 20  d are described 
0210: 69 6e 0a 2a 2a 20 20 73 71 6c 69 74 65 33 72 62  in.**  sqlite3rb
0220: 75 2e 68 2e 20 20 45 73 73 65 6e 74 69 61 6c 6c  u.h.  Essentiall
0230: 79 2c 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c  y, for each tabl
0240: 65 20 78 79 7a 20 69 6e 20 74 68 65 20 74 61 72  e xyz in the tar
0250: 67 65 74 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  get database.** 
0260: 20 74 68 61 74 20 74 68 65 20 75 73 65 72 20 77   that the user w
0270: 69 73 68 65 73 20 74 6f 20 77 72 69 74 65 20 74  ishes to write t
0280: 6f 2c 20 61 20 63 6f 72 72 65 73 70 6f 6e 64 69  o, a correspondi
0290: 6e 67 20 64 61 74 61 5f 78 79 7a 20 74 61 62 6c  ng data_xyz tabl
02a0: 65 20 69 73 0a 2a 2a 20 20 63 72 65 61 74 65 64  e is.**  created
02b0: 20 69 6e 20 74 68 65 20 52 42 55 20 64 61 74 61   in the RBU data
02c0: 62 61 73 65 20 61 6e 64 20 70 6f 70 75 6c 61 74  base and populat
02d0: 65 64 20 77 69 74 68 20 6f 6e 65 20 72 6f 77 20  ed with one row 
02e0: 66 6f 72 20 65 61 63 68 20 72 6f 77 20 74 6f 0a  for each row to.
02f0: 2a 2a 20 20 75 70 64 61 74 65 2c 20 69 6e 73 65  **  update, inse
0300: 72 74 20 6f 72 20 64 65 6c 65 74 65 20 66 72 6f  rt or delete fro
0310: 6d 20 74 68 65 20 74 61 72 67 65 74 20 74 61 62  m the target tab
0320: 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 20 54 68 65 20  le..** .**  The 
0330: 75 70 64 61 74 65 20 70 72 6f 63 65 65 64 73 20  update proceeds 
0340: 69 6e 20 74 68 72 65 65 20 73 74 61 67 65 73 3a  in three stages:
0350: 0a 2a 2a 20 0a 2a 2a 20 20 31 29 20 54 68 65 20  .** .**  1) The 
0360: 64 61 74 61 62 61 73 65 20 69 73 20 75 70 64 61  database is upda
0370: 74 65 64 2e 20 54 68 65 20 6d 6f 64 69 66 69 65  ted. The modifie
0380: 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 73  d database pages
0390: 20 61 72 65 20 77 72 69 74 74 65 6e 0a 2a 2a 20   are written.** 
03a0: 20 20 20 20 74 6f 20 61 20 2a 2d 6f 61 6c 20 66      to a *-oal f
03b0: 69 6c 65 2e 20 41 20 2a 2d 6f 61 6c 20 66 69 6c  ile. A *-oal fil
03c0: 65 20 69 73 20 6a 75 73 74 20 6c 69 6b 65 20 61  e is just like a
03d0: 20 2a 2d 77 61 6c 20 66 69 6c 65 2c 20 65 78 63   *-wal file, exc
03e0: 65 70 74 0a 2a 2a 20 20 20 20 20 74 68 61 74 20  ept.**     that 
03f0: 69 74 20 69 73 20 6e 61 6d 65 64 20 22 3c 64 61  it is named "<da
0400: 74 61 62 61 73 65 3e 2d 6f 61 6c 22 20 69 6e 73  tabase>-oal" ins
0410: 74 65 61 64 20 6f 66 20 22 3c 64 61 74 61 62 61  tead of "<databa
0420: 73 65 3e 2d 77 61 6c 22 2e 0a 2a 2a 20 20 20 20  se>-wal"..**    
0430: 20 42 65 63 61 75 73 65 20 72 65 67 75 6c 61 72   Because regular
0440: 20 53 51 4c 69 74 65 20 63 6c 69 65 6e 74 73 20   SQLite clients 
0450: 64 6f 20 6e 6f 74 20 6c 6f 6f 6b 20 66 6f 72 20  do not look for 
0460: 66 69 6c 65 20 6e 61 6d 65 64 0a 2a 2a 20 20 20  file named.**   
0470: 20 20 22 3c 64 61 74 61 62 61 73 65 3e 2d 6f 61    "<database>-oa
0480: 6c 22 2c 20 74 68 65 79 20 67 6f 20 6f 6e 20 75  l", they go on u
0490: 73 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61  sing the origina
04a0: 6c 20 64 61 74 61 62 61 73 65 20 69 6e 0a 2a 2a  l database in.**
04b0: 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f       rollback mo
04c0: 64 65 20 77 68 69 6c 65 20 74 68 65 20 2a 2d 6f  de while the *-o
04d0: 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67  al file is being
04e0: 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2a 20 0a   generated..** .
04f0: 2a 2a 20 20 20 20 20 44 75 72 69 6e 67 20 74 68  **     During th
0500: 69 73 20 73 74 61 67 65 20 52 42 55 20 64 6f 65  is stage RBU doe
0510: 73 20 6e 6f 74 20 75 70 64 61 74 65 20 74 68 65  s not update the
0520: 20 64 61 74 61 62 61 73 65 20 62 79 20 77 72 69   database by wri
0530: 74 69 6e 67 0a 2a 2a 20 20 20 20 20 64 69 72 65  ting.**     dire
0540: 63 74 6c 79 20 74 6f 20 74 68 65 20 74 61 72 67  ctly to the targ
0550: 65 74 20 74 61 62 6c 65 73 2e 20 49 6e 73 74 65  et tables. Inste
0560: 61 64 20 69 74 20 63 72 65 61 74 65 73 20 22 69  ad it creates "i
0570: 6d 70 6f 73 74 65 72 22 0a 2a 2a 20 20 20 20 20  mposter".**     
0580: 74 61 62 6c 65 73 20 75 73 69 6e 67 20 74 68 65  tables using the
0590: 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
05a0: 5f 49 4d 50 4f 53 54 45 52 20 69 6e 74 65 72 66  _IMPOSTER interf
05b0: 61 63 65 20 74 68 61 74 20 69 74 20 75 73 65 73  ace that it uses
05c0: 0a 2a 2a 20 20 20 20 20 74 6f 20 75 70 64 61 74  .**     to updat
05d0: 65 20 65 61 63 68 20 62 2d 74 72 65 65 20 69 6e  e each b-tree in
05e0: 64 69 76 69 64 75 61 6c 6c 79 2e 20 41 6c 6c 20  dividually. All 
05f0: 75 70 64 61 74 65 73 20 72 65 71 75 69 72 65 64  updates required
0600: 20 62 79 20 65 61 63 68 0a 2a 2a 20 20 20 20 20   by each.**     
0610: 62 2d 74 72 65 65 20 61 72 65 20 63 6f 6d 70 6c  b-tree are compl
0620: 65 74 65 64 20 62 65 66 6f 72 65 20 6d 6f 76 69  eted before movi
0630: 6e 67 20 6f 6e 20 74 6f 20 74 68 65 20 6e 65 78  ng on to the nex
0640: 74 2c 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 20 20  t, and all.**   
0650: 20 20 75 70 64 61 74 65 73 20 61 72 65 20 64 6f    updates are do
0660: 6e 65 20 69 6e 20 73 6f 72 74 65 64 20 6b 65 79  ne in sorted key
0670: 20 6f 72 64 65 72 2e 0a 2a 2a 20 0a 2a 2a 20 20   order..** .**  
0680: 32 29 20 54 68 65 20 22 3c 64 61 74 61 62 61 73  2) The "<databas
0690: 65 3e 2d 6f 61 6c 22 20 66 69 6c 65 20 69 73 20  e>-oal" file is 
06a0: 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 65 71 75  moved to the equ
06b0: 69 76 61 6c 65 6e 74 20 22 3c 64 61 74 61 62 61  ivalent "<databa
06c0: 73 65 3e 2d 77 61 6c 22 0a 2a 2a 20 20 20 20 20  se>-wal".**     
06d0: 6c 6f 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 61  location using a
06e0: 20 63 61 6c 6c 20 74 6f 20 72 65 6e 61 6d 65 28   call to rename(
06f0: 32 29 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67  2). Before doing
0700: 20 74 68 69 73 20 74 68 65 20 52 42 55 0a 2a 2a   this the RBU.**
0710: 20 20 20 20 20 6d 6f 64 75 6c 65 20 74 61 6b 65       module take
0720: 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  s an EXCLUSIVE l
0730: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
0740: 61 73 65 20 66 69 6c 65 2c 20 65 6e 73 75 72 69  ase file, ensuri
0750: 6e 67 0a 2a 2a 20 20 20 20 20 74 68 61 74 20 74  ng.**     that t
0760: 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 74 68 65  here are no othe
0770: 72 20 61 63 74 69 76 65 20 72 65 61 64 65 72 73  r active readers
0780: 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 4f 6e 63  ..** .**     Onc
0790: 65 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20  e the EXCLUSIVE 
07a0: 6c 6f 63 6b 20 69 73 20 72 65 6c 65 61 73 65 64  lock is released
07b0: 2c 20 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61  , any other data
07c0: 62 61 73 65 20 72 65 61 64 65 72 73 0a 2a 2a 20  base readers.** 
07d0: 20 20 20 20 64 65 74 65 63 74 20 74 68 65 20 6e      detect the n
07e0: 65 77 20 2a 2d 77 61 6c 20 66 69 6c 65 20 61 6e  ew *-wal file an
07f0: 64 20 72 65 61 64 20 74 68 65 20 64 61 74 61 62  d read the datab
0800: 61 73 65 20 69 6e 20 77 61 6c 20 6d 6f 64 65 2e  ase in wal mode.
0810: 20 41 74 0a 2a 2a 20 20 20 20 20 74 68 69 73 20   At.**     this 
0820: 70 6f 69 6e 74 20 74 68 65 79 20 73 65 65 20 74  point they see t
0830: 68 65 20 6e 65 77 20 76 65 72 73 69 6f 6e 20 6f  he new version o
0840: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2d  f the database -
0850: 20 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20   including.**   
0860: 20 20 74 68 65 20 75 70 64 61 74 65 73 20 6d 61    the updates ma
0870: 64 65 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  de as part of th
0880: 65 20 52 42 55 20 75 70 64 61 74 65 2e 0a 2a 2a  e RBU update..**
0890: 20 0a 2a 2a 20 20 33 29 20 54 68 65 20 6e 65 77   .**  3) The new
08a0: 20 2a 2d 77 61 6c 20 66 69 6c 65 20 69 73 20 63   *-wal file is c
08b0: 68 65 63 6b 70 6f 69 6e 74 65 64 2e 20 54 68 69  heckpointed. Thi
08c0: 73 20 70 72 6f 63 65 65 64 73 20 69 6e 20 74 68  s proceeds in th
08d0: 65 20 73 61 6d 65 20 77 61 79 20 0a 2a 2a 20 20  e same way .**  
08e0: 20 20 20 61 73 20 61 20 72 65 67 75 6c 61 72 20     as a regular 
08f0: 64 61 74 61 62 61 73 65 20 63 68 65 63 6b 70 6f  database checkpo
0900: 69 6e 74 2c 20 65 78 63 65 70 74 20 74 68 61 74  int, except that
0910: 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20   a single frame 
0920: 69 73 0a 2a 2a 20 20 20 20 20 63 68 65 63 6b 70  is.**     checkp
0930: 6f 69 6e 74 65 64 20 65 61 63 68 20 74 69 6d 65  ointed each time
0940: 20 73 71 6c 69 74 65 33 72 62 75 5f 73 74 65 70   sqlite3rbu_step
0950: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 49 66  () is called. If
0960: 20 74 68 65 20 52 42 55 0a 2a 2a 20 20 20 20 20   the RBU.**     
0970: 68 61 6e 64 6c 65 20 69 73 20 63 6c 6f 73 65 64  handle is closed
0980: 20 62 65 66 6f 72 65 20 74 68 65 20 65 6e 74 69   before the enti
0990: 72 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 69 73  re *-wal file is
09a0: 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2c 0a 2a   checkpointed,.*
09b0: 2a 20 20 20 20 20 74 68 65 20 63 68 65 63 6b 70  *     the checkp
09c0: 6f 69 6e 74 20 70 72 6f 67 72 65 73 73 20 69 73  oint progress is
09d0: 20 73 61 76 65 64 20 69 6e 20 74 68 65 20 52 42   saved in the RB
09e0: 55 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  U database and t
09f0: 68 65 0a 2a 2a 20 20 20 20 20 63 68 65 63 6b 70  he.**     checkp
0a00: 6f 69 6e 74 20 63 61 6e 20 62 65 20 72 65 73 75  oint can be resu
0a10: 6d 65 64 20 62 79 20 61 6e 6f 74 68 65 72 20 52  med by another R
0a20: 42 55 20 63 6c 69 65 6e 74 20 61 74 20 73 6f 6d  BU client at som
0a30: 65 20 70 6f 69 6e 74 20 69 6e 0a 2a 2a 20 20 20  e point in.**   
0a40: 20 20 74 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a    the future..**
0a50: 0a 2a 2a 20 50 4f 54 45 4e 54 49 41 4c 20 50 52  .** POTENTIAL PR
0a60: 4f 42 4c 45 4d 53 0a 2a 2a 20 0a 2a 2a 20 20 54  OBLEMS.** .**  T
0a70: 68 65 20 72 65 6e 61 6d 65 28 29 20 63 61 6c 6c  he rename() call
0a80: 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 70 6f   might not be po
0a90: 72 74 61 62 6c 65 2e 20 41 6e 64 20 52 42 55 20  rtable. And RBU 
0aa0: 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
0ab0: 0a 2a 2a 20 20 73 79 6e 63 69 6e 67 20 74 68 65  .**  syncing the
0ac0: 20 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72   directory after
0ad0: 20 72 65 6e 61 6d 69 6e 67 20 74 68 65 20 66 69   renaming the fi
0ae0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 57 68 65 6e 20  le..**.**  When 
0af0: 73 74 61 74 65 20 69 73 20 73 61 76 65 64 2c 20  state is saved, 
0b00: 61 6e 79 20 63 6f 6d 6d 69 74 20 74 6f 20 74 68  any commit to th
0b10: 65 20 2a 2d 6f 61 6c 20 66 69 6c 65 20 61 6e 64  e *-oal file and
0b20: 20 74 68 65 20 63 6f 6d 6d 69 74 20 74 6f 0a 2a   the commit to.*
0b30: 2a 20 20 74 68 65 20 52 42 55 20 75 70 64 61 74  *  the RBU updat
0b40: 65 20 64 61 74 61 62 61 73 65 20 61 72 65 20 6e  e database are n
0b50: 6f 74 20 61 74 6f 6d 69 63 2e 20 53 6f 20 69 66  ot atomic. So if
0b60: 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73   the power fails
0b70: 20 61 74 20 74 68 65 0a 2a 2a 20 20 77 72 6f 6e   at the.**  wron
0b80: 67 20 6d 6f 6d 65 6e 74 20 74 68 65 79 20 6d 69  g moment they mi
0b90: 67 68 74 20 67 65 74 20 6f 75 74 20 6f 66 20 73  ght get out of s
0ba0: 79 6e 63 2e 20 41 73 20 74 68 65 20 6d 61 69 6e  ync. As the main
0bb0: 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62   database will b
0bc0: 65 0a 2a 2a 20 20 63 6f 6d 6d 69 74 74 65 64 20  e.**  committed 
0bd0: 62 65 66 6f 72 65 20 74 68 65 20 52 42 55 20 75  before the RBU u
0be0: 70 64 61 74 65 20 64 61 74 61 62 61 73 65 20 74  pdate database t
0bf0: 68 69 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  his will likely 
0c00: 65 69 74 68 65 72 20 6a 75 73 74 0a 2a 2a 20 20  either just.**  
0c10: 70 61 73 73 20 75 6e 6e 6f 74 69 63 65 64 2c 20  pass unnoticed, 
0c20: 6f 72 20 72 65 73 75 6c 74 20 69 6e 20 53 51 4c  or result in SQL
0c30: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65  ITE_CONSTRAINT e
0c40: 72 72 6f 72 73 20 28 64 75 65 20 74 6f 20 55 4e  rrors (due to UN
0c50: 49 51 55 45 0a 2a 2a 20 20 63 6f 6e 73 74 72 61  IQUE.**  constra
0c60: 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 29 2e  int violations).
0c70: 0a 2a 2a 0a 2a 2a 20 20 49 66 20 73 6f 6d 65 20  .**.**  If some 
0c80: 63 6c 69 65 6e 74 20 64 6f 65 73 20 6d 6f 64 69  client does modi
0c90: 66 79 20 74 68 65 20 74 61 72 67 65 74 20 64 61  fy the target da
0ca0: 74 61 62 61 73 65 20 6d 69 64 20 52 42 55 20 75  tabase mid RBU u
0cb0: 70 64 61 74 65 2c 20 6f 72 20 73 6f 6d 65 0a 2a  pdate, or some.*
0cc0: 2a 20 20 6f 74 68 65 72 20 65 72 72 6f 72 20 6f  *  other error o
0cd0: 63 63 75 72 73 2c 20 74 68 65 20 52 42 55 20 65  ccurs, the RBU e
0ce0: 78 74 65 6e 73 69 6f 6e 20 77 69 6c 6c 20 6b 65  xtension will ke
0cf0: 65 70 20 74 68 72 6f 77 69 6e 67 20 65 72 72 6f  ep throwing erro
0d00: 72 73 2e 20 49 74 27 73 0a 2a 2a 20 20 6e 6f 74  rs. It's.**  not
0d10: 20 72 65 61 6c 6c 79 20 63 6c 65 61 72 20 68 6f   really clear ho
0d20: 77 20 74 6f 20 67 65 74 20 6f 75 74 20 6f 66 20  w to get out of 
0d30: 74 68 69 73 20 73 74 61 74 65 2e 20 54 68 65 20  this state. The 
0d40: 73 79 73 74 65 6d 20 63 6f 75 6c 64 20 6a 75 73  system could jus
0d50: 74 0a 2a 2a 20 20 62 79 20 64 65 6c 65 74 65 20  t.**  by delete 
0d60: 74 68 65 20 52 42 55 20 75 70 64 61 74 65 20 64  the RBU update d
0d70: 61 74 61 62 61 73 65 20 61 6e 64 20 2a 2d 6f 61  atabase and *-oa
0d80: 6c 20 66 69 6c 65 20 61 6e 64 20 68 61 76 65 20  l file and have 
0d90: 74 68 65 20 64 65 76 69 63 65 0a 2a 2a 20 20 64  the device.**  d
0da0: 6f 77 6e 6c 6f 61 64 20 74 68 65 20 75 70 64 61  ownload the upda
0db0: 74 65 20 61 67 61 69 6e 20 61 6e 64 20 73 74 61  te again and sta
0dc0: 72 74 20 6f 76 65 72 2e 0a 2a 2a 0a 2a 2a 20 20  rt over..**.**  
0dd0: 41 74 20 70 72 65 73 65 6e 74 2c 20 66 6f 72 20  At present, for 
0de0: 61 6e 20 55 50 44 41 54 45 2c 20 62 6f 74 68 20  an UPDATE, both 
0df0: 74 68 65 20 6e 65 77 2e 2a 20 61 6e 64 20 6f 6c  the new.* and ol
0e00: 64 2e 2a 20 72 65 63 6f 72 64 73 20 61 72 65 0a  d.* records are.
0e10: 2a 2a 20 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e  **  collected in
0e20: 20 74 68 65 20 72 62 75 5f 78 79 7a 20 74 61 62   the rbu_xyz tab
0e30: 6c 65 2e 20 41 6e 64 20 66 6f 72 20 62 6f 74 68  le. And for both
0e40: 20 55 50 44 41 54 45 73 20 61 6e 64 20 44 45 4c   UPDATEs and DEL
0e50: 45 54 45 73 20 61 6c 6c 0a 2a 2a 20 20 66 69 65  ETEs all.**  fie
0e60: 6c 64 73 20 61 72 65 20 63 6f 6c 6c 65 63 74 65  lds are collecte
0e70: 64 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20 77  d.  This means w
0e80: 65 27 72 65 20 70 72 6f 62 61 62 6c 79 20 77 72  e're probably wr
0e90: 69 74 69 6e 67 20 61 20 6c 6f 74 20 6d 6f 72 65  iting a lot more
0ea0: 0a 2a 2a 20 20 64 61 74 61 20 74 6f 20 64 69 73  .**  data to dis
0eb0: 6b 20 77 68 65 6e 20 73 61 76 69 6e 67 20 74 68  k when saving th
0ec0: 65 20 73 74 61 74 65 20 6f 66 20 61 6e 20 6f 6e  e state of an on
0ed0: 67 6f 69 6e 67 20 75 70 64 61 74 65 20 74 6f 20  going update to 
0ee0: 74 68 65 20 52 42 55 0a 2a 2a 20 20 75 70 64 61  the RBU.**  upda
0ef0: 74 65 20 64 61 74 61 62 61 73 65 20 74 68 61 6e  te database than
0f00: 20 69 73 20 73 74 72 69 63 74 6c 79 20 6e 65 63   is strictly nec
0f10: 65 73 73 61 72 79 2e 0a 2a 2a 20 0a 2a 2f 0a 0a  essary..** .*/..
0f20: 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74  #include <assert
0f30: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
0f40: 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ring.h>.#include
0f50: 20 3c 73 74 64 69 6f 2e 68 3e 0a 0a 23 69 6e 63   <stdio.h>..#inc
0f60: 6c 75 64 65 20 22 73 71 6c 69 74 65 33 2e 68 22  lude "sqlite3.h"
0f70: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
0f80: 51 4c 49 54 45 5f 43 4f 52 45 29 20 7c 7c 20 64  QLITE_CORE) || d
0f90: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
0fa0: 41 42 4c 45 5f 52 42 55 29 0a 23 69 6e 63 6c 75  ABLE_RBU).#inclu
0fb0: 64 65 20 22 73 71 6c 69 74 65 33 72 62 75 2e 68  de "sqlite3rbu.h
0fc0: 22 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  "..#if defined(_
0fd0: 57 49 4e 33 32 5f 57 43 45 29 0a 23 69 6e 63 6c  WIN32_WCE).#incl
0fe0: 75 64 65 20 22 77 69 6e 64 6f 77 73 2e 68 22 0a  ude "windows.h".
0ff0: 23 65 6e 64 69 66 0a 0a 2f 2a 20 4d 61 78 69 6d  #endif../* Maxim
1000: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 72 65  um number of pre
1010: 70 61 72 65 64 20 55 50 44 41 54 45 20 73 74 61  pared UPDATE sta
1020: 74 65 6d 65 6e 74 73 20 68 65 6c 64 20 62 79 20  tements held by 
1030: 74 68 69 73 20 6d 6f 64 75 6c 65 20 2a 2f 0a 23  this module */.#
1040: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 52 42  define SQLITE_RB
1050: 55 5f 55 50 44 41 54 45 5f 43 41 43 48 45 53 49  U_UPDATE_CACHESI
1060: 5a 45 20 31 36 0a 0a 2f 2a 20 44 65 6c 74 61 20  ZE 16../* Delta 
1070: 63 68 65 63 6b 73 75 6d 73 20 64 69 73 61 62 6c  checksums disabl
1080: 65 64 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20  ed by default.  
1090: 43 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d 44 52  Compile with -DR
10a0: 42 55 5f 45 4e 41 42 4c 45 5f 44 45 4c 54 41 5f  BU_ENABLE_DELTA_
10b0: 43 4b 53 55 4d 0a 2a 2a 20 74 6f 20 65 6e 61 62  CKSUM.** to enab
10c0: 6c 65 20 63 68 65 63 6b 73 75 6d 20 76 65 72 69  le checksum veri
10d0: 66 69 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66  fication..*/.#if
10e0: 6e 64 65 66 20 52 42 55 5f 45 4e 41 42 4c 45 5f  ndef RBU_ENABLE_
10f0: 44 45 4c 54 41 5f 43 4b 53 55 4d 0a 23 20 64 65  DELTA_CKSUM.# de
1100: 66 69 6e 65 20 52 42 55 5f 45 4e 41 42 4c 45 5f  fine RBU_ENABLE_
1110: 44 45 4c 54 41 5f 43 4b 53 55 4d 20 30 0a 23 65  DELTA_CKSUM 0.#e
1120: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70  ndif../*.** Swap
1130: 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66 20   two objects of 
1140: 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f 0a 23 69  type TYPE..*/.#i
1150: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
1160: 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 29 0a  E_AMALGAMATION).
1170: 23 20 64 65 66 69 6e 65 20 53 57 41 50 28 54 59  # define SWAP(TY
1180: 50 45 2c 41 2c 42 29 20 7b 54 59 50 45 20 74 3d  PE,A,B) {TYPE t=
1190: 41 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 23 65  A; A=B; B=t;}.#e
11a0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
11b0: 72 62 75 5f 73 74 61 74 65 20 74 61 62 6c 65 20  rbu_state table 
11c0: 69 73 20 75 73 65 64 20 74 6f 20 73 61 76 65 20  is used to save 
11d0: 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 20 70  the state of a p
11e0: 61 72 74 69 61 6c 6c 79 20 61 70 70 6c 69 65 64  artially applied
11f0: 0a 2a 2a 20 75 70 64 61 74 65 20 73 6f 20 74 68  .** update so th
1200: 61 74 20 69 74 20 63 61 6e 20 62 65 20 72 65 73  at it can be res
1210: 75 6d 65 64 20 6c 61 74 65 72 2e 20 54 68 65 20  umed later. The 
1220: 74 61 62 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f  table consists o
1230: 66 20 69 6e 74 65 67 65 72 0a 2a 2a 20 6b 65 79  f integer.** key
1240: 73 20 6d 61 70 70 65 64 20 74 6f 20 76 61 6c 75  s mapped to valu
1250: 65 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  es as follows:.*
1260: 2a 0a 2a 2a 20 52 42 55 5f 53 54 41 54 45 5f 53  *.** RBU_STATE_S
1270: 54 41 47 45 3a 0a 2a 2a 20 20 20 4d 61 79 20 62  TAGE:.**   May b
1280: 65 20 73 65 74 20 74 6f 20 69 6e 74 65 67 65 72  e set to integer
1290: 20 76 61 6c 75 65 73 20 31 2c 20 32 2c 20 34 20   values 1, 2, 4 
12a0: 6f 72 20 35 2e 20 41 73 20 66 6f 6c 6c 6f 77 73  or 5. As follows
12b0: 3a 0a 2a 2a 20 20 20 20 20 20 20 31 3a 20 74 68  :.**       1: th
12c0: 65 20 2a 2d 72 62 75 20 66 69 6c 65 20 69 73 20  e *-rbu file is 
12d0: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
12e0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a  construction..**
12f0: 20 20 20 20 20 20 20 32 3a 20 74 68 65 20 2a 2d         2: the *-
1300: 72 62 75 20 66 69 6c 65 20 68 61 73 20 62 65 65  rbu file has bee
1310: 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 2c 20 62  n constructed, b
1320: 75 74 20 6e 6f 74 20 79 65 74 20 6d 6f 76 65 64  ut not yet moved
1330: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f   .**          to
1340: 20 74 68 65 20 2a 2d 77 61 6c 20 70 61 74 68 2e   the *-wal path.
1350: 0a 2a 2a 20 20 20 20 20 20 20 34 3a 20 74 68 65  .**       4: the
1360: 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 75   checkpoint is u
1370: 6e 64 65 72 77 61 79 2e 0a 2a 2a 20 20 20 20 20  nderway..**     
1380: 20 20 35 3a 20 74 68 65 20 72 62 75 20 75 70 64    5: the rbu upd
1390: 61 74 65 20 68 61 73 20 62 65 65 6e 20 63 68 65  ate has been che
13a0: 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a  ckpointed..**.**
13b0: 20 52 42 55 5f 53 54 41 54 45 5f 54 42 4c 3a 0a   RBU_STATE_TBL:.
13c0: 2a 2a 20 20 20 4f 6e 6c 79 20 76 61 6c 69 64 20  **   Only valid 
13d0: 69 66 20 53 54 41 47 45 3d 3d 31 2e 20 54 68 65  if STAGE==1. The
13e0: 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65   target database
13f0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
1400: 6c 65 20 0a 2a 2a 20 20 20 63 75 72 72 65 6e 74  le .**   current
1410: 6c 79 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  ly being written
1420: 2e 0a 2a 2a 0a 2a 2a 20 52 42 55 5f 53 54 41 54  ..**.** RBU_STAT
1430: 45 5f 49 44 58 3a 0a 2a 2a 20 20 20 4f 6e 6c 79  E_IDX:.**   Only
1440: 20 76 61 6c 69 64 20 69 66 20 53 54 41 47 45 3d   valid if STAGE=
1450: 3d 31 2e 20 54 68 65 20 74 61 72 67 65 74 20 64  =1. The target d
1460: 61 74 61 62 61 73 65 20 6e 61 6d 65 20 6f 66 20  atabase name of 
1470: 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 20 20  the index .**   
1480: 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
1490: 77 72 69 74 74 65 6e 2c 20 6f 72 20 4e 55 4c 4c  written, or NULL
14a0: 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 61 62   if the main tab
14b0: 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  le is currently 
14c0: 62 65 69 6e 67 0a 2a 2a 20 20 20 75 70 64 61 74  being.**   updat
14d0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 42 55 5f 53 54  ed..**.** RBU_ST
14e0: 41 54 45 5f 52 4f 57 3a 0a 2a 2a 20 20 20 4f 6e  ATE_ROW:.**   On
14f0: 6c 79 20 76 61 6c 69 64 20 69 66 20 53 54 41 47  ly valid if STAG
1500: 45 3d 3d 31 2e 20 4e 75 6d 62 65 72 20 6f 66 20  E==1. Number of 
1510: 72 6f 77 73 20 61 6c 72 65 61 64 79 20 70 72 6f  rows already pro
1520: 63 65 73 73 65 64 20 66 6f 72 20 74 68 65 20 63  cessed for the c
1530: 75 72 72 65 6e 74 0a 2a 2a 20 20 20 74 61 62 6c  urrent.**   tabl
1540: 65 2f 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 52  e/index..**.** R
1550: 42 55 5f 53 54 41 54 45 5f 50 52 4f 47 52 45 53  BU_STATE_PROGRES
1560: 53 3a 0a 2a 2a 20 20 20 54 72 62 75 6c 20 6e 75  S:.**   Trbul nu
1570: 6d 62 65 72 20 6f 66 20 73 71 6c 69 74 65 33 72  mber of sqlite3r
1580: 62 75 5f 73 74 65 70 28 29 20 63 61 6c 6c 73 20  bu_step() calls 
1590: 6d 61 64 65 20 73 6f 20 66 61 72 20 61 73 20 70  made so far as p
15a0: 61 72 74 20 6f 66 20 74 68 69 73 0a 2a 2a 20 20  art of this.**  
15b0: 20 72 62 75 20 75 70 64 61 74 65 2e 0a 2a 2a 0a   rbu update..**.
15c0: 2a 2a 20 52 42 55 5f 53 54 41 54 45 5f 43 4b 50  ** RBU_STATE_CKP
15d0: 54 3a 0a 2a 2a 20 20 20 56 61 6c 69 64 20 69 66  T:.**   Valid if
15e0: 20 53 54 41 47 45 3d 3d 34 2e 20 54 68 65 20 36   STAGE==4. The 6
15f0: 34 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 61  4-bit checksum a
1600: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
1610: 68 65 20 77 61 6c 2d 69 6e 64 65 78 0a 2a 2a 20  he wal-index.** 
1620: 20 20 68 65 61 64 65 72 20 63 72 65 61 74 65 64    header created
1630: 20 62 79 20 72 65 63 6f 76 65 72 69 6e 67 20 74   by recovering t
1640: 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 2e 20 54  he *-wal file. T
1650: 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 64  his is used to d
1660: 65 74 65 63 74 0a 2a 2a 20 20 20 63 61 73 65 73  etect.**   cases
1670: 20 77 68 65 6e 20 61 6e 6f 74 68 65 72 20 63 6c   when another cl
1680: 69 65 6e 74 20 61 70 70 65 6e 64 73 20 66 72 61  ient appends fra
1690: 6d 65 73 20 74 6f 20 74 68 65 20 2a 2d 77 61 6c  mes to the *-wal
16a0: 20 66 69 6c 65 20 69 6e 20 74 68 65 0a 2a 2a 20   file in the.** 
16b0: 20 20 6d 69 64 64 6c 65 20 6f 66 20 61 6e 20 69    middle of an i
16c0: 6e 63 72 65 6d 65 6e 74 61 6c 20 63 68 65 63 6b  ncremental check
16d0: 70 6f 69 6e 74 20 28 61 6e 20 69 6e 63 72 65 6d  point (an increm
16e0: 65 6e 74 61 6c 20 63 68 65 63 6b 70 6f 69 6e 74  ental checkpoint
16f0: 20 63 61 6e 6e 6f 74 0a 2a 2a 20 20 20 62 65 20   cannot.**   be 
1700: 63 6f 6e 74 69 6e 75 65 64 20 69 66 20 74 68 69  continued if thi
1710: 73 20 68 61 70 70 65 6e 73 29 2e 0a 2a 2a 0a 2a  s happens)..**.*
1720: 2a 20 52 42 55 5f 53 54 41 54 45 5f 43 4f 4f 4b  * RBU_STATE_COOK
1730: 49 45 3a 0a 2a 2a 20 20 20 56 61 6c 69 64 20 69  IE:.**   Valid i
1740: 66 20 53 54 41 47 45 3d 3d 31 2e 20 54 68 65 20  f STAGE==1. The 
1750: 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 2d 63  current change-c
1760: 6f 75 6e 74 65 72 20 63 6f 6f 6b 69 65 20 76 61  ounter cookie va
1770: 6c 75 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 20  lue in the .**  
1780: 20 74 61 72 67 65 74 20 64 62 20 66 69 6c 65 2e   target db file.
1790: 0a 2a 2a 0a 2a 2a 20 52 42 55 5f 53 54 41 54 45  .**.** RBU_STATE
17a0: 5f 4f 41 4c 53 5a 3a 0a 2a 2a 20 20 20 56 61 6c  _OALSZ:.**   Val
17b0: 69 64 20 69 66 20 53 54 41 47 45 3d 3d 31 2e 20  id if STAGE==1. 
17c0: 54 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65  The size in byte
17d0: 73 20 6f 66 20 74 68 65 20 2a 2d 6f 61 6c 20 66  s of the *-oal f
17e0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 42 55 5f 53  ile..**.** RBU_S
17f0: 54 41 54 45 5f 44 41 54 41 54 42 4c 3a 0a 2a 2a  TATE_DATATBL:.**
1800: 20 20 20 4f 6e 6c 79 20 76 61 6c 69 64 20 69 66     Only valid if
1810: 20 53 54 41 47 45 3d 3d 31 2e 20 54 68 65 20 52   STAGE==1. The R
1820: 42 55 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  BU database name
1830: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 0a 2a   of the table .*
1840: 2a 20 20 20 63 75 72 72 65 6e 74 6c 79 20 62 65  *   currently be
1850: 69 6e 67 20 72 65 61 64 2e 0a 2a 2f 0a 23 64 65  ing read..*/.#de
1860: 66 69 6e 65 20 52 42 55 5f 53 54 41 54 45 5f 53  fine RBU_STATE_S
1870: 54 41 47 45 20 20 20 20 20 20 20 20 31 0a 23 64  TAGE        1.#d
1880: 65 66 69 6e 65 20 52 42 55 5f 53 54 41 54 45 5f  efine RBU_STATE_
1890: 54 42 4c 20 20 20 20 20 20 20 20 20 20 32 0a 23  TBL          2.#
18a0: 64 65 66 69 6e 65 20 52 42 55 5f 53 54 41 54 45  define RBU_STATE
18b0: 5f 49 44 58 20 20 20 20 20 20 20 20 20 20 33 0a  _IDX          3.
18c0: 23 64 65 66 69 6e 65 20 52 42 55 5f 53 54 41 54  #define RBU_STAT
18d0: 45 5f 52 4f 57 20 20 20 20 20 20 20 20 20 20 34  E_ROW          4
18e0: 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53 54 41  .#define RBU_STA
18f0: 54 45 5f 50 52 4f 47 52 45 53 53 20 20 20 20 20  TE_PROGRESS     
1900: 35 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53 54  5.#define RBU_ST
1910: 41 54 45 5f 43 4b 50 54 20 20 20 20 20 20 20 20  ATE_CKPT        
1920: 20 36 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53   6.#define RBU_S
1930: 54 41 54 45 5f 43 4f 4f 4b 49 45 20 20 20 20 20  TATE_COOKIE     
1940: 20 20 37 0a 23 64 65 66 69 6e 65 20 52 42 55 5f    7.#define RBU_
1950: 53 54 41 54 45 5f 4f 41 4c 53 5a 20 20 20 20 20  STATE_OALSZ     
1960: 20 20 20 38 0a 23 64 65 66 69 6e 65 20 52 42 55     8.#define RBU
1970: 5f 53 54 41 54 45 5f 50 48 41 53 45 4f 4e 45 53  _STATE_PHASEONES
1980: 54 45 50 20 39 0a 23 64 65 66 69 6e 65 20 52 42  TEP 9.#define RB
1990: 55 5f 53 54 41 54 45 5f 44 41 54 41 54 42 4c 20  U_STATE_DATATBL 
19a0: 20 20 20 20 31 30 0a 0a 23 64 65 66 69 6e 65 20      10..#define 
19b0: 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 20 20  RBU_STAGE_OAL   
19c0: 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20        1.#define 
19d0: 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 20 20  RBU_STAGE_MOVE  
19e0: 20 20 20 20 20 20 32 0a 23 64 65 66 69 6e 65 20        2.#define 
19f0: 52 42 55 5f 53 54 41 47 45 5f 43 41 50 54 55 52  RBU_STAGE_CAPTUR
1a00: 45 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20  E     3.#define 
1a10: 52 42 55 5f 53 54 41 47 45 5f 43 4b 50 54 20 20  RBU_STAGE_CKPT  
1a20: 20 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20        4.#define 
1a30: 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45 20 20  RBU_STAGE_DONE  
1a40: 20 20 20 20 20 20 35 0a 0a 0a 23 64 65 66 69 6e        5...#defin
1a50: 65 20 52 42 55 5f 43 52 45 41 54 45 5f 53 54 41  e RBU_CREATE_STA
1a60: 54 45 20 5c 0a 20 20 22 43 52 45 41 54 45 20 54  TE \.  "CREATE T
1a70: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53  ABLE IF NOT EXIS
1a80: 54 53 20 25 73 2e 72 62 75 5f 73 74 61 74 65 28  TS %s.rbu_state(
1a90: 6b 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  k INTEGER PRIMAR
1aa0: 59 20 4b 45 59 2c 20 76 29 22 0a 0a 74 79 70 65  Y KEY, v)"..type
1ab0: 64 65 66 20 73 74 72 75 63 74 20 52 62 75 46 72  def struct RbuFr
1ac0: 61 6d 65 20 52 62 75 46 72 61 6d 65 3b 0a 74 79  ame RbuFrame;.ty
1ad0: 70 65 64 65 66 20 73 74 72 75 63 74 20 52 62 75  pedef struct Rbu
1ae0: 4f 62 6a 49 74 65 72 20 52 62 75 4f 62 6a 49 74  ObjIter RbuObjIt
1af0: 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  er;.typedef stru
1b00: 63 74 20 52 62 75 53 74 61 74 65 20 52 62 75 53  ct RbuState RbuS
1b10: 74 61 74 65 3b 0a 74 79 70 65 64 65 66 20 73 74  tate;.typedef st
1b20: 72 75 63 74 20 72 62 75 5f 76 66 73 20 72 62 75  ruct rbu_vfs rbu
1b30: 5f 76 66 73 3b 0a 74 79 70 65 64 65 66 20 73 74  _vfs;.typedef st
1b40: 72 75 63 74 20 72 62 75 5f 66 69 6c 65 20 72 62  ruct rbu_file rb
1b50: 75 5f 66 69 6c 65 3b 0a 74 79 70 65 64 65 66 20  u_file;.typedef 
1b60: 73 74 72 75 63 74 20 52 62 75 55 70 64 61 74 65  struct RbuUpdate
1b70: 53 74 6d 74 20 52 62 75 55 70 64 61 74 65 53 74  Stmt RbuUpdateSt
1b80: 6d 74 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  mt;..#if !define
1b90: 64 28 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41 4d  d(SQLITE_AMALGAM
1ba0: 41 54 49 4f 4e 29 0a 74 79 70 65 64 65 66 20 75  ATION).typedef u
1bb0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 33 32 3b  nsigned int u32;
1bc0: 0a 74 79 70 65 64 65 66 20 75 6e 73 69 67 6e 65  .typedef unsigne
1bd0: 64 20 73 68 6f 72 74 20 75 31 36 3b 0a 74 79 70  d short u16;.typ
1be0: 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20 63 68  edef unsigned ch
1bf0: 61 72 20 75 38 3b 0a 74 79 70 65 64 65 66 20 73  ar u8;.typedef s
1c00: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 36 34  qlite3_int64 i64
1c10: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
1c20: 54 68 65 73 65 20 76 61 6c 75 65 73 20 6d 75 73  These values mus
1c30: 74 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75  t match the valu
1c40: 65 73 20 64 65 66 69 6e 65 64 20 69 6e 20 77 61  es defined in wa
1c50: 6c 2e 63 20 66 6f 72 20 74 68 65 20 65 71 75 69  l.c for the equi
1c60: 76 61 6c 65 6e 74 0a 2a 2a 20 6c 6f 63 6b 73 2e  valent.** locks.
1c70: 20 54 68 65 73 65 20 61 72 65 20 6e 6f 74 20 6d   These are not m
1c80: 61 67 69 63 20 6e 75 6d 62 65 72 73 20 61 73 20  agic numbers as 
1c90: 74 68 65 79 20 61 72 65 20 70 61 72 74 20 6f 66  they are part of
1ca0: 20 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c 65   the SQLite file
1cb0: 0a 2a 2a 20 66 6f 72 6d 61 74 2e 0a 2a 2f 0a 23  .** format..*/.#
1cc0: 64 65 66 69 6e 65 20 57 41 4c 5f 4c 4f 43 4b 5f  define WAL_LOCK_
1cd0: 57 52 49 54 45 20 20 30 0a 23 64 65 66 69 6e 65  WRITE  0.#define
1ce0: 20 57 41 4c 5f 4c 4f 43 4b 5f 43 4b 50 54 20 20   WAL_LOCK_CKPT  
1cf0: 20 31 0a 23 64 65 66 69 6e 65 20 57 41 4c 5f 4c   1.#define WAL_L
1d00: 4f 43 4b 5f 52 45 41 44 30 20 20 33 0a 0a 23 64  OCK_READ0  3..#d
1d10: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 46 43 4e  efine SQLITE_FCN
1d20: 54 4c 5f 52 42 55 43 4e 54 20 20 20 20 35 31 34  TL_RBUCNT    514
1d30: 39 32 31 36 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74  9216../*.** A st
1d40: 72 75 63 74 75 72 65 20 74 6f 20 73 74 6f 72 65  ructure to store
1d50: 20 76 61 6c 75 65 73 20 72 65 61 64 20 66 72 6f   values read fro
1d60: 6d 20 74 68 65 20 72 62 75 5f 73 74 61 74 65 20  m the rbu_state 
1d70: 74 61 62 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 2e  table in memory.
1d80: 0a 2a 2f 0a 73 74 72 75 63 74 20 52 62 75 53 74  .*/.struct RbuSt
1d90: 61 74 65 20 7b 0a 20 20 69 6e 74 20 65 53 74 61  ate {.  int eSta
1da0: 67 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 62 6c  ge;.  char *zTbl
1db0: 3b 0a 20 20 63 68 61 72 20 2a 7a 44 61 74 61 54  ;.  char *zDataT
1dc0: 62 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 49 64 78  bl;.  char *zIdx
1dd0: 3b 0a 20 20 69 36 34 20 69 57 61 6c 43 6b 73 75  ;.  i64 iWalCksu
1de0: 6d 3b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 0a 20  m;.  int nRow;. 
1df0: 20 69 36 34 20 6e 50 72 6f 67 72 65 73 73 3b 0a   i64 nProgress;.
1e00: 20 20 75 33 32 20 69 43 6f 6f 6b 69 65 3b 0a 20    u32 iCookie;. 
1e10: 20 69 36 34 20 69 4f 61 6c 53 7a 3b 0a 20 20 69   i64 iOalSz;.  i
1e20: 36 34 20 6e 50 68 61 73 65 4f 6e 65 53 74 65 70  64 nPhaseOneStep
1e30: 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 52 62 75  ;.};..struct Rbu
1e40: 55 70 64 61 74 65 53 74 6d 74 20 7b 0a 20 20 63  UpdateStmt {.  c
1e50: 68 61 72 20 2a 7a 4d 61 73 6b 3b 20 20 20 20 20  har *zMask;     
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e70: 2a 20 43 6f 70 79 20 6f 66 20 75 70 64 61 74 65  * Copy of update
1e80: 20 6d 61 73 6b 20 75 73 65 64 20 77 69 74 68 20   mask used with 
1e90: 70 55 70 64 61 74 65 20 2a 2f 0a 20 20 73 71 6c  pUpdate */.  sql
1ea0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 55 70 64 61  ite3_stmt *pUpda
1eb0: 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  te;          /* 
1ec0: 4c 61 73 74 20 75 70 64 61 74 65 20 73 74 61 74  Last update stat
1ed0: 65 6d 65 6e 74 20 28 6f 72 20 4e 55 4c 4c 29 20  ement (or NULL) 
1ee0: 2a 2f 0a 20 20 52 62 75 55 70 64 61 74 65 53 74  */.  RbuUpdateSt
1ef0: 6d 74 20 2a 70 4e 65 78 74 3b 0a 7d 3b 0a 0a 2f  mt *pNext;.};../
1f00: 2a 0a 2a 2a 20 41 6e 20 69 74 65 72 61 74 6f 72  *.** An iterator
1f10: 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 69 73   of this type is
1f20: 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
1f30: 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f 62 6a   through all obj
1f40: 65 63 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20 74  ects in.** the t
1f50: 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20 74  arget database t
1f60: 68 61 74 20 72 65 71 75 69 72 65 20 75 70 64 61  hat require upda
1f70: 74 69 6e 67 2e 20 46 6f 72 20 65 61 63 68 20 73  ting. For each s
1f80: 75 63 68 20 74 61 62 6c 65 2c 20 74 68 65 0a 2a  uch table, the.*
1f90: 2a 20 69 74 65 72 61 74 6f 72 20 76 69 73 69 74  * iterator visit
1fa0: 73 2c 20 69 6e 20 6f 72 64 65 72 3a 0a 2a 2a 0a  s, in order:.**.
1fb0: 2a 2a 20 20 20 20 20 2a 20 74 68 65 20 74 61 62  **     * the tab
1fc0: 6c 65 20 69 74 73 65 6c 66 2c 20 0a 2a 2a 20 20  le itself, .**  
1fd0: 20 20 20 2a 20 65 61 63 68 20 69 6e 64 65 78 20     * each index 
1fe0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 28 7a 65  of the table (ze
1ff0: 72 6f 20 6f 72 20 6d 6f 72 65 20 70 6f 69 6e 74  ro or more point
2000: 73 20 74 6f 20 76 69 73 69 74 29 2c 20 61 6e 64  s to visit), and
2010: 0a 2a 2a 20 20 20 20 20 2a 20 61 20 73 70 65 63  .**     * a spec
2020: 69 61 6c 20 22 63 6c 65 61 6e 75 70 20 74 61 62  ial "cleanup tab
2030: 6c 65 22 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  le" state..**.**
2040: 20 61 62 49 6e 64 65 78 65 64 3a 0a 2a 2a 20 20   abIndexed:.**  
2050: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 68 61   If the table ha
2060: 73 20 6e 6f 20 69 6e 64 65 78 65 73 20 6f 6e 20  s no indexes on 
2070: 69 74 2c 20 61 62 49 6e 64 65 78 65 64 20 69 73  it, abIndexed is
2080: 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 20 4f 74   set to NULL. Ot
2090: 68 65 72 77 69 73 65 2c 0a 2a 2a 20 20 20 69 74  herwise,.**   it
20a0: 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 72   points to an ar
20b0: 72 61 79 20 6f 66 20 66 6c 61 67 73 20 6e 54 62  ray of flags nTb
20c0: 6c 43 6f 6c 20 65 6c 65 6d 65 6e 74 73 20 69 6e  lCol elements in
20d0: 20 73 69 7a 65 2e 20 54 68 65 20 66 6c 61 67 20   size. The flag 
20e0: 69 73 0a 2a 2a 20 20 20 73 65 74 20 66 6f 72 20  is.**   set for 
20f0: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 74 68 61 74  each column that
2100: 20 69 73 20 65 69 74 68 65 72 20 61 20 70 61 72   is either a par
2110: 74 20 6f 66 20 74 68 65 20 50 4b 20 6f 72 20 61  t of the PK or a
2120: 20 70 61 72 74 20 6f 66 20 61 6e 0a 2a 2a 20 20   part of an.**  
2130: 20 69 6e 64 65 78 2e 20 4f 72 20 63 6c 65 61 72   index. Or clear
2140: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 20 20   otherwise..**  
2150: 20 0a 2a 2f 0a 73 74 72 75 63 74 20 52 62 75 4f   .*/.struct RbuO
2160: 62 6a 49 74 65 72 20 7b 0a 20 20 73 71 6c 69 74  bjIter {.  sqlit
2170: 65 33 5f 73 74 6d 74 20 2a 70 54 62 6c 49 74 65  e3_stmt *pTblIte
2180: 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74  r;         /* It
2190: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 61  erate through ta
21a0: 62 6c 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  bles */.  sqlite
21b0: 33 5f 73 74 6d 74 20 2a 70 49 64 78 49 74 65 72  3_stmt *pIdxIter
21c0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  ;         /* Ind
21d0: 65 78 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20  ex iterator */. 
21e0: 20 69 6e 74 20 6e 54 62 6c 43 6f 6c 3b 20 20 20   int nTblCol;   
21f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2200: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 7a 54 62   /* Size of azTb
2210: 6c 43 6f 6c 5b 5d 20 61 72 72 61 79 20 2a 2f 0a  lCol[] array */.
2220: 20 20 63 68 61 72 20 2a 2a 61 7a 54 62 6c 43 6f    char **azTblCo
2230: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
2240: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 75 6e    /* Array of un
2250: 71 75 6f 74 65 64 20 74 61 72 67 65 74 20 63 6f  quoted target co
2260: 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  lumn names */.  
2270: 63 68 61 72 20 2a 2a 61 7a 54 62 6c 54 79 70 65  char **azTblType
2280: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2290: 2f 2a 20 41 72 72 61 79 20 6f 66 20 74 61 72 67  /* Array of targ
22a0: 65 74 20 63 6f 6c 75 6d 6e 20 74 79 70 65 73 20  et column types 
22b0: 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 53 72 63 4f  */.  int *aiSrcO
22c0: 72 64 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  rder;           
22d0: 20 20 20 20 20 2f 2a 20 73 72 63 20 74 61 62 6c       /* src tabl
22e0: 65 20 63 6f 6c 20 2d 3e 20 74 61 72 67 65 74 20  e col -> target 
22f0: 74 61 62 6c 65 20 63 6f 6c 20 2a 2f 0a 20 20 75  table col */.  u
2300: 38 20 2a 61 62 54 62 6c 50 6b 3b 20 20 20 20 20  8 *abTblPk;     
2310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2320: 2a 20 41 72 72 61 79 20 6f 66 20 66 6c 61 67 73  * Array of flags
2330: 2c 20 73 65 74 20 6f 6e 20 74 61 72 67 65 74 20  , set on target 
2340: 50 4b 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  PK columns */.  
2350: 75 38 20 2a 61 62 4e 6f 74 4e 75 6c 6c 3b 20 20  u8 *abNotNull;  
2360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2370: 2f 2a 20 41 72 72 61 79 20 6f 66 20 66 6c 61 67  /* Array of flag
2380: 73 2c 20 73 65 74 20 6f 6e 20 4e 4f 54 20 4e 55  s, set on NOT NU
2390: 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  LL columns */.  
23a0: 75 38 20 2a 61 62 49 6e 64 65 78 65 64 3b 20 20  u8 *abIndexed;  
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 66 6c 61 67  /* Array of flag
23d0: 73 2c 20 73 65 74 20 6f 6e 20 69 6e 64 65 78 65  s, set on indexe
23e0: 64 20 26 20 50 4b 20 63 6f 6c 73 20 2a 2f 0a 20  d & PK cols */. 
23f0: 20 69 6e 74 20 65 54 79 70 65 3b 20 20 20 20 20   int eType;     
2400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2410: 20 2f 2a 20 54 61 62 6c 65 20 74 79 70 65 20 2d   /* Table type -
2420: 20 61 6e 20 52 42 55 5f 50 4b 5f 58 58 58 20 76   an RBU_PK_XXX v
2430: 61 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75  alue */..  /* Ou
2440: 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 2e 20  tput variables. 
2450: 7a 54 62 6c 3d 3d 30 20 69 6d 70 6c 69 65 73 20  zTbl==0 implies 
2460: 45 4f 46 2e 20 2a 2f 0a 20 20 69 6e 74 20 62 43  EOF. */.  int bC
2470: 6c 65 61 6e 75 70 3b 20 20 20 20 20 20 20 20 20  leanup;         
2480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2490: 65 20 69 6e 20 22 63 6c 65 61 6e 75 70 22 20 73  e in "cleanup" s
24a0: 74 61 74 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tate */.  const 
24b0: 63 68 61 72 20 2a 7a 54 62 6c 3b 20 20 20 20 20  char *zTbl;     
24c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
24d0: 65 20 6f 66 20 74 61 72 67 65 74 20 64 62 20 74  e of target db t
24e0: 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  able */.  const 
24f0: 63 68 61 72 20 2a 7a 44 61 74 61 54 62 6c 3b 20  char *zDataTbl; 
2500: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
2510: 65 20 6f 66 20 72 62 75 20 64 62 20 74 61 62 6c  e of rbu db tabl
2520: 65 20 28 6f 72 20 6e 75 6c 6c 29 20 2a 2f 0a 20  e (or null) */. 
2530: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
2540: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
2550: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 72 67   /* Name of targ
2560: 65 74 20 64 62 20 69 6e 64 65 78 20 28 6f 72 20  et db index (or 
2570: 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 69  null) */.  int i
2580: 54 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Tnum;           
2590: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
25a0: 6f 74 20 70 61 67 65 20 6f 66 20 63 75 72 72 65  ot page of curre
25b0: 6e 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  nt object */.  i
25c0: 6e 74 20 69 50 6b 54 6e 75 6d 3b 20 20 20 20 20  nt iPkTnum;     
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25e0: 2a 20 49 66 20 65 54 79 70 65 3d 3d 45 58 54 45  * If eType==EXTE
25f0: 52 4e 41 4c 2c 20 72 6f 6f 74 20 6f 66 20 50 4b  RNAL, root of PK
2600: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
2610: 62 55 6e 69 71 75 65 3b 20 20 20 20 20 20 20 20  bUnique;        
2620: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2630: 75 72 72 65 6e 74 20 69 6e 64 65 78 20 69 73 20  urrent index is 
2640: 75 6e 69 71 75 65 20 2a 2f 0a 20 20 69 6e 74 20  unique */.  int 
2650: 6e 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20  nIndex;         
2660: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2670: 75 6d 62 65 72 20 6f 66 20 61 75 78 2e 20 69 6e  umber of aux. in
2680: 64 65 78 65 73 20 6f 6e 20 74 61 62 6c 65 20 7a  dexes on table z
2690: 54 62 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 53 74 61  Tbl */..  /* Sta
26a0: 74 65 6d 65 6e 74 73 20 63 72 65 61 74 65 64 20  tements created 
26b0: 62 79 20 72 62 75 4f 62 6a 49 74 65 72 50 72 65  by rbuObjIterPre
26c0: 70 61 72 65 41 6c 6c 28 29 20 2a 2f 0a 20 20 69  pareAll() */.  i
26d0: 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt nCol;        
26e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26f0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
2700: 6d 6e 73 20 69 6e 20 63 75 72 72 65 6e 74 20 6f  mns in current o
2710: 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74  bject */.  sqlit
2720: 65 33 5f 73 74 6d 74 20 2a 70 53 65 6c 65 63 74  e3_stmt *pSelect
2730: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f  ;          /* So
2740: 75 72 63 65 20 64 61 74 61 20 2a 2f 0a 20 20 73  urce data */.  s
2750: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 6e  qlite3_stmt *pIn
2760: 73 65 72 74 3b 20 20 20 20 20 20 20 20 20 20 2f  sert;          /
2770: 2a 20 53 74 61 74 65 6d 65 6e 74 20 66 6f 72 20  * Statement for 
2780: 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e  INSERT operation
2790: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  s */.  sqlite3_s
27a0: 74 6d 74 20 2a 70 44 65 6c 65 74 65 3b 20 20 20  tmt *pDelete;   
27b0: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d         /* Statem
27c0: 65 6e 74 20 66 6f 72 20 44 45 4c 45 54 45 20 6f  ent for DELETE o
27d0: 70 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ps */.  sqlite3_
27e0: 73 74 6d 74 20 2a 70 54 6d 70 49 6e 73 65 72 74  stmt *pTmpInsert
27f0: 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72  ;       /* Inser
2800: 74 20 69 6e 74 6f 20 72 62 75 5f 74 6d 70 5f 24  t into rbu_tmp_$
2810: 7a 44 61 74 61 54 62 6c 20 2a 2f 0a 0a 20 20 2f  zDataTbl */..  /
2820: 2a 20 4c 61 73 74 20 55 50 44 41 54 45 20 75 73  * Last UPDATE us
2830: 65 64 20 28 66 6f 72 20 50 4b 20 62 2d 74 72 65  ed (for PK b-tre
2840: 65 20 75 70 64 61 74 65 73 20 6f 6e 6c 79 29 2c  e updates only),
2850: 20 6f 72 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 52   or NULL. */.  R
2860: 62 75 55 70 64 61 74 65 53 74 6d 74 20 2a 70 52  buUpdateStmt *pR
2870: 62 75 55 70 64 61 74 65 3b 0a 7d 3b 0a 0a 2f 2a  buUpdate;.};../*
2880: 0a 2a 2a 20 56 61 6c 75 65 73 20 66 6f 72 20 52  .** Values for R
2890: 62 75 4f 62 6a 49 74 65 72 2e 65 54 79 70 65 0a  buObjIter.eType.
28a0: 2a 2a 0a 2a 2a 20 20 20 20 20 30 3a 20 54 61 62  **.**     0: Tab
28b0: 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  le does not exis
28c0: 74 20 28 65 72 72 6f 72 29 0a 2a 2a 20 20 20 20  t (error).**    
28d0: 20 31 3a 20 54 61 62 6c 65 20 68 61 73 20 61 6e   1: Table has an
28e0: 20 69 6d 70 6c 69 63 69 74 20 72 6f 77 69 64 2e   implicit rowid.
28f0: 0a 2a 2a 20 20 20 20 20 32 3a 20 54 61 62 6c 65  .**     2: Table
2900: 20 68 61 73 20 61 6e 20 65 78 70 6c 69 63 69 74   has an explicit
2910: 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20   IPK column..** 
2920: 20 20 20 20 33 3a 20 54 61 62 6c 65 20 68 61 73      3: Table has
2930: 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 50 4b 20   an external PK 
2940: 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 20 20 34 3a  index..**     4:
2950: 20 54 61 62 6c 65 20 69 73 20 57 49 54 48 4f 55   Table is WITHOU
2960: 54 20 52 4f 57 49 44 2e 0a 2a 2a 20 20 20 20 20  T ROWID..**     
2970: 35 3a 20 54 61 62 6c 65 20 69 73 20 61 20 76 69  5: Table is a vi
2980: 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a  rtual table..*/.
2990: 23 64 65 66 69 6e 65 20 52 42 55 5f 50 4b 5f 4e  #define RBU_PK_N
29a0: 4f 54 41 42 4c 45 20 20 20 20 20 20 20 20 30 0a  OTABLE        0.
29b0: 23 64 65 66 69 6e 65 20 52 42 55 5f 50 4b 5f 4e  #define RBU_PK_N
29c0: 4f 4e 45 20 20 20 20 20 20 20 20 20 20 20 31 0a  ONE           1.
29d0: 23 64 65 66 69 6e 65 20 52 42 55 5f 50 4b 5f 49  #define RBU_PK_I
29e0: 50 4b 20 20 20 20 20 20 20 20 20 20 20 20 32 0a  PK            2.
29f0: 23 64 65 66 69 6e 65 20 52 42 55 5f 50 4b 5f 45  #define RBU_PK_E
2a00: 58 54 45 52 4e 41 4c 20 20 20 20 20 20 20 33 0a  XTERNAL       3.
2a10: 23 64 65 66 69 6e 65 20 52 42 55 5f 50 4b 5f 57  #define RBU_PK_W
2a20: 49 54 48 4f 55 54 5f 52 4f 57 49 44 20 20 34 0a  ITHOUT_ROWID  4.
2a30: 23 64 65 66 69 6e 65 20 52 42 55 5f 50 4b 5f 56  #define RBU_PK_V
2a40: 54 41 42 20 20 20 20 20 20 20 20 20 20 20 35 0a  TAB           5.
2a50: 0a 0a 2f 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74  ../*.** Within t
2a60: 68 65 20 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c  he RBU_STAGE_OAL
2a70: 20 73 74 61 67 65 2c 20 65 61 63 68 20 63 61 6c   stage, each cal
2a80: 6c 20 74 6f 20 73 71 6c 69 74 65 33 72 62 75 5f  l to sqlite3rbu_
2a90: 73 74 65 70 28 29 20 70 65 72 66 6f 72 6d 73 0a  step() performs.
2aa0: 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  ** one of the fo
2ab0: 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74 69 6f  llowing operatio
2ac0: 6e 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 52  ns..*/.#define R
2ad0: 42 55 5f 49 4e 53 45 52 54 20 20 20 20 20 31 20  BU_INSERT     1 
2ae0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65           /* Inse
2af0: 72 74 20 6f 6e 20 61 20 6d 61 69 6e 20 74 61 62  rt on a main tab
2b00: 6c 65 20 62 2d 74 72 65 65 20 2a 2f 0a 23 64 65  le b-tree */.#de
2b10: 66 69 6e 65 20 52 42 55 5f 44 45 4c 45 54 45 20  fine RBU_DELETE 
2b20: 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 2f      2          /
2b30: 2a 20 44 65 6c 65 74 65 20 61 20 72 6f 77 20 66  * Delete a row f
2b40: 72 6f 6d 20 61 20 6d 61 69 6e 20 74 61 62 6c 65  rom a main table
2b50: 20 62 2d 74 72 65 65 20 2a 2f 0a 23 64 65 66 69   b-tree */.#defi
2b60: 6e 65 20 52 42 55 5f 52 45 50 4c 41 43 45 20 20  ne RBU_REPLACE  
2b70: 20 20 33 20 20 20 20 20 20 20 20 20 20 2f 2a 20    3          /* 
2b80: 44 65 6c 65 74 65 20 61 6e 64 20 74 68 65 6e 20  Delete and then 
2b90: 69 6e 73 65 72 74 20 61 20 72 6f 77 20 2a 2f 0a  insert a row */.
2ba0: 23 64 65 66 69 6e 65 20 52 42 55 5f 49 44 58 5f  #define RBU_IDX_
2bb0: 44 45 4c 45 54 45 20 34 20 20 20 20 20 20 20 20  DELETE 4        
2bc0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 20 72 6f    /* Delete a ro
2bd0: 77 20 66 72 6f 6d 20 61 6e 20 61 75 78 2e 20 69  w from an aux. i
2be0: 6e 64 65 78 20 62 2d 74 72 65 65 20 2a 2f 0a 23  ndex b-tree */.#
2bf0: 64 65 66 69 6e 65 20 52 42 55 5f 49 44 58 5f 49  define RBU_IDX_I
2c00: 4e 53 45 52 54 20 35 20 20 20 20 20 20 20 20 20  NSERT 5         
2c10: 20 2f 2a 20 49 6e 73 65 72 74 20 6f 6e 20 61 6e   /* Insert on an
2c20: 20 61 75 78 2e 20 69 6e 64 65 78 20 62 2d 74 72   aux. index b-tr
2c30: 65 65 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 52  ee */..#define R
2c40: 42 55 5f 55 50 44 41 54 45 20 20 20 20 20 36 20  BU_UPDATE     6 
2c50: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 70 64 61           /* Upda
2c60: 74 65 20 61 20 72 6f 77 20 69 6e 20 61 20 6d 61  te a row in a ma
2c70: 69 6e 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20  in table b-tree 
2c80: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 69 6e 67  */../*.** A sing
2c90: 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e  le step of an in
2ca0: 63 72 65 6d 65 6e 74 61 6c 20 63 68 65 63 6b 70  cremental checkp
2cb0: 6f 69 6e 74 20 2d 20 66 72 61 6d 65 20 69 57 61  oint - frame iWa
2cc0: 6c 46 72 61 6d 65 20 6f 66 20 74 68 65 20 77 61  lFrame of the wa
2cd0: 6c 0a 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64  l.** file should
2ce0: 20 62 65 20 63 6f 70 69 65 64 20 74 6f 20 70 61   be copied to pa
2cf0: 67 65 20 69 44 62 50 61 67 65 20 6f 66 20 74 68  ge iDbPage of th
2d00: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2d10: 0a 2a 2f 0a 73 74 72 75 63 74 20 52 62 75 46 72  .*/.struct RbuFr
2d20: 61 6d 65 20 7b 0a 20 20 75 33 32 20 69 44 62 50  ame {.  u32 iDbP
2d30: 61 67 65 3b 0a 20 20 75 33 32 20 69 57 61 6c 46  age;.  u32 iWalF
2d40: 72 61 6d 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  rame;.};../*.** 
2d50: 52 42 55 20 68 61 6e 64 6c 65 2e 0a 2a 2a 0a 2a  RBU handle..**.*
2d60: 2a 20 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 3a  * nPhaseOneStep:
2d70: 0a 2a 2a 20 20 20 49 66 20 74 68 65 20 52 42 55  .**   If the RBU
2d80: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
2d90: 6e 73 20 61 6e 20 72 62 75 5f 63 6f 75 6e 74 20  ns an rbu_count 
2da0: 74 61 62 6c 65 2c 20 74 68 69 73 20 76 61 6c 75  table, this valu
2db0: 65 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 20  e is set to.**  
2dc0: 20 61 20 72 75 6e 6e 69 6e 67 20 65 73 74 69 6d   a running estim
2dd0: 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ate of the numbe
2de0: 72 20 6f 66 20 62 2d 74 72 65 65 20 6f 70 65 72  r of b-tree oper
2df0: 61 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20  ations required 
2e00: 74 6f 20 0a 2a 2a 20 20 20 66 69 6e 69 73 68 20  to .**   finish 
2e10: 70 6f 70 75 6c 61 74 69 6e 67 20 74 68 65 20 2a  populating the *
2e20: 2d 6f 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  -oal file. This 
2e30: 61 6c 6c 6f 77 73 20 74 68 65 20 73 71 6c 69 74  allows the sqlit
2e40: 65 33 5f 62 70 5f 70 72 6f 67 72 65 73 73 28 29  e3_bp_progress()
2e50: 0a 2a 2a 20 20 20 41 50 49 20 74 6f 20 63 61 6c  .**   API to cal
2e60: 63 75 6c 61 74 65 20 74 68 65 20 70 65 72 6d 79  culate the permy
2e70: 72 69 61 64 61 67 65 20 70 72 6f 67 72 65 73 73  riadage progress
2e80: 20 6f 66 20 70 6f 70 75 6c 61 74 69 6e 67 20 74   of populating t
2e90: 68 65 20 2a 2d 6f 61 6c 20 66 69 6c 65 0a 2a 2a  he *-oal file.**
2ea0: 20 20 20 75 73 69 6e 67 20 74 68 65 20 66 6f 72     using the for
2eb0: 6d 75 6c 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mula:.**.**     
2ec0: 70 65 72 6d 79 72 69 61 64 61 67 65 20 3d 20 28  permyriadage = (
2ed0: 31 30 30 30 30 20 2a 20 6e 50 72 6f 67 72 65 73  10000 * nProgres
2ee0: 73 29 20 2f 20 6e 50 68 61 73 65 4f 6e 65 53 74  s) / nPhaseOneSt
2ef0: 65 70 0a 2a 2a 0a 2a 2a 20 20 20 6e 50 68 61 73  ep.**.**   nPhas
2f00: 65 4f 6e 65 53 74 65 70 20 69 73 20 69 6e 69 74  eOneStep is init
2f10: 69 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20 73  ialized to the s
2f20: 75 6d 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  um of:.**.**    
2f30: 20 6e 52 6f 77 20 2a 20 28 6e 49 6e 64 65 78 20   nRow * (nIndex 
2f40: 2b 20 31 29 0a 2a 2a 0a 2a 2a 20 20 20 66 6f 72  + 1).**.**   for
2f50: 20 61 6c 6c 20 73 6f 75 72 63 65 20 74 61 62 6c   all source tabl
2f60: 65 73 20 69 6e 20 74 68 65 20 52 42 55 20 64 61  es in the RBU da
2f70: 74 61 62 61 73 65 2c 20 77 68 65 72 65 20 6e 52  tabase, where nR
2f80: 6f 77 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ow is the number
2f90: 0a 2a 2a 20 20 20 6f 66 20 72 6f 77 73 20 69 6e  .**   of rows in
2fa0: 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c   the source tabl
2fb0: 65 20 61 6e 64 20 6e 49 6e 64 65 78 20 74 68 65  e and nIndex the
2fc0: 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78   number of index
2fd0: 65 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 63  es on the.**   c
2fe0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 72  orresponding tar
2ff0: 67 65 74 20 64 61 74 61 62 61 73 65 20 74 61 62  get database tab
3000: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73  le..**.**   This
3010: 20 65 73 74 69 6d 61 74 65 20 69 73 20 61 63 63   estimate is acc
3020: 75 72 61 74 65 20 69 66 20 74 68 65 20 52 42 55  urate if the RBU
3030: 20 75 70 64 61 74 65 20 63 6f 6e 73 69 73 74 73   update consists
3040: 20 65 6e 74 69 72 65 6c 79 20 6f 66 0a 2a 2a 20   entirely of.** 
3050: 20 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69    INSERT operati
3060: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 74  ons. However, it
3070: 20 69 73 20 69 6e 61 63 63 75 72 61 74 65 20 69   is inaccurate i
3080: 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 74  f:.**.**     * t
3090: 68 65 20 52 42 55 20 75 70 64 61 74 65 20 63 6f  he RBU update co
30a0: 6e 74 61 69 6e 73 20 61 6e 79 20 55 50 44 41 54  ntains any UPDAT
30b0: 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 49 66  E operations. If
30c0: 20 74 68 65 20 50 4b 20 73 70 65 63 69 66 69 65   the PK specifie
30d0: 64 0a 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 61  d.**       for a
30e0: 6e 20 55 50 44 41 54 45 20 6f 70 65 72 61 74 69  n UPDATE operati
30f0: 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  on does not exis
3100: 74 20 69 6e 20 74 68 65 20 74 61 72 67 65 74 20  t in the target 
3110: 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 20  table, then.**  
3120: 20 20 20 20 20 6e 6f 20 62 2d 74 72 65 65 20 6f       no b-tree o
3130: 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20 72 65  perations are re
3140: 71 75 69 72 65 64 20 6f 6e 20 69 6e 64 65 78 20  quired on index 
3150: 62 2d 74 72 65 65 73 2e 20 4f 72 20 69 66 20 74  b-trees. Or if t
3160: 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 70 65  he .**       spe
3170: 63 69 66 69 65 64 20 50 4b 20 64 6f 65 73 20 65  cified PK does e
3180: 78 69 73 74 2c 20 74 68 65 6e 20 28 6e 49 6e 64  xist, then (nInd
3190: 65 78 2a 32 29 20 73 75 63 68 20 6f 70 65 72 61  ex*2) such opera
31a0: 74 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 20 20 20  tions are.**    
31b0: 20 20 20 72 65 71 75 69 72 65 64 20 28 6f 6e 65     required (one
31c0: 20 64 65 6c 65 74 65 20 61 6e 64 20 6f 6e 65 20   delete and one 
31d0: 69 6e 73 65 72 74 20 6f 6e 20 65 61 63 68 20 69  insert on each i
31e0: 6e 64 65 78 20 62 2d 74 72 65 65 29 2e 0a 2a 2a  ndex b-tree)..**
31f0: 0a 2a 2a 20 20 20 20 20 2a 20 74 68 65 20 52 42  .**     * the RB
3200: 55 20 75 70 64 61 74 65 20 63 6f 6e 74 61 69 6e  U update contain
3210: 73 20 61 6e 79 20 44 45 4c 45 54 45 20 6f 70 65  s any DELETE ope
3220: 72 61 74 69 6f 6e 73 20 66 6f 72 20 77 68 69 63  rations for whic
3230: 68 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  h the specified.
3240: 2a 2a 20 20 20 20 20 20 20 50 4b 20 64 6f 65 73  **       PK does
3250: 20 6e 6f 74 20 65 78 69 73 74 2e 20 49 6e 20 74   not exist. In t
3260: 68 69 73 20 63 61 73 65 20 6e 6f 20 6f 70 65 72  his case no oper
3270: 61 74 69 6f 6e 73 20 61 72 65 20 72 65 71 75 69  ations are requi
3280: 72 65 64 20 6f 6e 20 69 6e 64 65 78 0a 2a 2a 20  red on index.** 
3290: 20 20 20 20 20 20 62 2d 74 72 65 65 73 2e 0a 2a        b-trees..*
32a0: 2a 0a 2a 2a 20 20 20 20 20 2a 20 74 68 65 20 52  *.**     * the R
32b0: 42 55 20 75 70 64 61 74 65 20 63 6f 6e 74 61 69  BU update contai
32c0: 6e 73 20 52 45 50 4c 41 43 45 20 6f 70 65 72 61  ns REPLACE opera
32d0: 74 69 6f 6e 73 2e 20 54 68 65 73 65 20 61 72 65  tions. These are
32e0: 20 73 69 6d 69 6c 61 72 20 74 6f 0a 2a 2a 20 20   similar to.**  
32f0: 20 20 20 20 20 55 50 44 41 54 45 20 6f 70 65 72       UPDATE oper
3300: 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  ations..**.**   
3310: 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20 69 73  nPhaseOneStep is
3320: 20 75 70 64 61 74 65 64 20 74 6f 20 61 63 63 6f   updated to acco
3330: 75 6e 74 20 66 6f 72 20 74 68 65 20 63 6f 6e 64  unt for the cond
3340: 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 64 75 72  itions above dur
3350: 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 66 69 72  ing the.**   fir
3360: 73 74 20 70 61 73 73 20 6f 66 20 65 61 63 68 20  st pass of each 
3370: 73 6f 75 72 63 65 20 74 61 62 6c 65 2e 20 54 68  source table. Th
3380: 65 20 75 70 64 61 74 65 64 20 6e 50 68 61 73 65  e updated nPhase
3390: 4f 6e 65 53 74 65 70 20 76 61 6c 75 65 20 69 73  OneStep value is
33a0: 0a 2a 2a 20 20 20 73 74 6f 72 65 64 20 69 6e 20  .**   stored in 
33b0: 74 68 65 20 72 62 75 5f 73 74 61 74 65 20 74 61  the rbu_state ta
33c0: 62 6c 65 20 69 66 20 74 68 65 20 52 42 55 20 75  ble if the RBU u
33d0: 70 64 61 74 65 20 69 73 20 73 75 73 70 65 6e 64  pdate is suspend
33e0: 65 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 71  ed..*/.struct sq
33f0: 6c 69 74 65 33 72 62 75 20 7b 0a 20 20 69 6e 74  lite3rbu {.  int
3400: 20 65 53 74 61 67 65 3b 20 20 20 20 20 20 20 20   eStage;        
3410: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3420: 56 61 6c 75 65 20 6f 66 20 52 42 55 5f 53 54 41  Value of RBU_STA
3430: 54 45 5f 53 54 41 47 45 20 66 69 65 6c 64 20 2a  TE_STAGE field *
3440: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 4d  /.  sqlite3 *dbM
3450: 61 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ain;            
3460: 20 20 20 20 2f 2a 20 74 61 72 67 65 74 20 64 61      /* target da
3470: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
3480: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 52 62  .  sqlite3 *dbRb
3490: 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
34a0: 20 20 20 2f 2a 20 72 62 75 20 64 61 74 61 62 61     /* rbu databa
34b0: 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63  se handle */.  c
34c0: 68 61 72 20 2a 7a 54 61 72 67 65 74 3b 20 20 20  har *zTarget;   
34d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34e0: 2a 20 50 61 74 68 20 74 6f 20 74 61 72 67 65 74  * Path to target
34f0: 20 64 62 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a   db */.  char *z
3500: 52 62 75 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rbu;            
3510: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68           /* Path
3520: 20 74 6f 20 72 62 75 20 64 62 20 2a 2f 0a 20 20   to rbu db */.  
3530: 63 68 61 72 20 2a 7a 53 74 61 74 65 3b 20 20 20  char *zState;   
3540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3550: 2f 2a 20 50 61 74 68 20 74 6f 20 73 74 61 74 65  /* Path to state
3560: 20 64 62 20 28 6f 72 20 4e 55 4c 4c 20 69 66 20   db (or NULL if 
3570: 7a 52 62 75 29 20 2a 2f 0a 20 20 63 68 61 72 20  zRbu) */.  char 
3580: 7a 53 74 61 74 65 44 62 5b 35 5d 3b 20 20 20 20  zStateDb[5];    
3590: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 62             /* Db
35a0: 20 6e 61 6d 65 20 66 6f 72 20 73 74 61 74 65 20   name for state 
35b0: 28 22 73 74 61 74 22 20 6f 72 20 22 6d 61 69 6e  ("stat" or "main
35c0: 22 29 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ") */.  int rc; 
35d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35e0: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
35f0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 6c 61 73   returned by las
3600: 74 20 72 62 75 5f 73 74 65 70 28 29 20 63 61 6c  t rbu_step() cal
3610: 6c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 72  l */.  char *zEr
3620: 72 6d 73 67 3b 20 20 20 20 20 20 20 20 20 20 20  rmsg;           
3630: 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
3640: 6d 65 73 73 61 67 65 20 69 66 20 72 63 21 3d 53  message if rc!=S
3650: 51 4c 49 54 45 5f 4f 4b 20 2a 2f 0a 20 20 69 6e  QLITE_OK */.  in
3660: 74 20 6e 53 74 65 70 3b 20 20 20 20 20 20 20 20  t nStep;        
3670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3680: 20 52 6f 77 73 20 70 72 6f 63 65 73 73 65 64 20   Rows processed 
3690: 66 6f 72 20 63 75 72 72 65 6e 74 20 6f 62 6a 65  for current obje
36a0: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 6f  ct */.  int nPro
36b0: 67 72 65 73 73 3b 20 20 20 20 20 20 20 20 20 20  gress;          
36c0: 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20          /* Rows 
36d0: 70 72 6f 63 65 73 73 65 64 20 66 6f 72 20 61 6c  processed for al
36e0: 6c 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 52  l objects */.  R
36f0: 62 75 4f 62 6a 49 74 65 72 20 6f 62 6a 69 74 65  buObjIter objite
3700: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r;             /
3710: 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 73  * Iterator for s
3720: 6b 69 70 70 69 6e 67 20 74 68 72 6f 75 67 68 20  kipping through 
3730: 74 62 6c 2f 69 64 78 20 2a 2f 0a 20 20 63 6f 6e  tbl/idx */.  con
3740: 73 74 20 63 68 61 72 20 2a 7a 56 66 73 4e 61 6d  st char *zVfsNam
3750: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
3760: 4e 61 6d 65 20 6f 66 20 61 75 74 6f 6d 61 74 69  Name of automati
3770: 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20 72 62  cally created rb
3780: 75 20 76 66 73 20 2a 2f 0a 20 20 72 62 75 5f 66  u vfs */.  rbu_f
3790: 69 6c 65 20 2a 70 54 61 72 67 65 74 46 64 3b 20  ile *pTargetFd; 
37a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
37b0: 6c 65 20 68 61 6e 64 6c 65 20 6f 70 65 6e 20 6f  le handle open o
37c0: 6e 20 74 61 72 67 65 74 20 64 62 20 2a 2f 0a 20  n target db */. 
37d0: 20 69 6e 74 20 6e 50 61 67 65 50 65 72 53 65 63   int nPagePerSec
37e0: 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  tor;            
37f0: 20 2f 2a 20 50 61 67 65 73 20 70 65 72 20 73 65   /* Pages per se
3800: 63 74 6f 72 20 66 6f 72 20 70 54 61 72 67 65 74  ctor for pTarget
3810: 46 64 20 2a 2f 0a 20 20 69 36 34 20 69 4f 61 6c  Fd */.  i64 iOal
3820: 53 7a 3b 0a 20 20 69 36 34 20 6e 50 68 61 73 65  Sz;.  i64 nPhase
3830: 4f 6e 65 53 74 65 70 3b 0a 0a 20 20 2f 2a 20 54  OneStep;..  /* T
3840: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61  he following sta
3850: 74 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  te variables are
3860: 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66   used as part of
3870: 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c   the incremental
3880: 0a 20 20 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74  .  ** checkpoint
3890: 20 73 74 61 67 65 20 28 65 53 74 61 67 65 3d 3d   stage (eStage==
38a0: 52 42 55 5f 53 54 41 47 45 5f 43 4b 50 54 29 2e  RBU_STAGE_CKPT).
38b0: 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 73 75   See comments su
38c0: 72 72 6f 75 6e 64 69 6e 67 0a 20 20 2a 2a 20 66  rrounding.  ** f
38d0: 75 6e 63 74 69 6f 6e 20 72 62 75 53 65 74 75 70  unction rbuSetup
38e0: 43 68 65 63 6b 70 6f 69 6e 74 28 29 20 66 6f 72  Checkpoint() for
38f0: 20 64 65 74 61 69 6c 73 2e 20 20 2a 2f 0a 20 20   details.  */.  
3900: 75 33 32 20 69 4d 61 78 46 72 61 6d 65 3b 20 20  u32 iMaxFrame;  
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3920: 2f 2a 20 4c 61 72 67 65 73 74 20 69 57 61 6c 46  /* Largest iWalF
3930: 72 61 6d 65 20 76 61 6c 75 65 20 69 6e 20 61 46  rame value in aF
3940: 72 61 6d 65 5b 5d 20 2a 2f 0a 20 20 75 33 32 20  rame[] */.  u32 
3950: 6d 4c 6f 63 6b 3b 0a 20 20 69 6e 74 20 6e 46 72  mLock;.  int nFr
3960: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
3970: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 74 72           /* Entr
3980: 69 65 73 20 69 6e 20 61 46 72 61 6d 65 5b 5d 20  ies in aFrame[] 
3990: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  array */.  int n
39a0: 46 72 61 6d 65 41 6c 6c 6f 63 3b 20 20 20 20 20  FrameAlloc;     
39b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
39c0: 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20  located size of 
39d0: 61 46 72 61 6d 65 5b 5d 20 61 72 72 61 79 20 2a  aFrame[] array *
39e0: 2f 0a 20 20 52 62 75 46 72 61 6d 65 20 2a 61 46  /.  RbuFrame *aF
39f0: 72 61 6d 65 3b 0a 20 20 69 6e 74 20 70 67 73 7a  rame;.  int pgsz
3a00: 3b 0a 20 20 75 38 20 2a 61 42 75 66 3b 0a 20 20  ;.  u8 *aBuf;.  
3a10: 69 36 34 20 69 57 61 6c 43 6b 73 75 6d 3b 0a 20  i64 iWalCksum;. 
3a20: 20 69 36 34 20 73 7a 54 65 6d 70 3b 20 20 20 20   i64 szTemp;    
3a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a40: 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 69 7a 65   /* Current size
3a50: 20 6f 66 20 61 6c 6c 20 74 65 6d 70 20 66 69 6c   of all temp fil
3a60: 65 73 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20 69  es in use */.  i
3a70: 36 34 20 73 7a 54 65 6d 70 4c 69 6d 69 74 3b 20  64 szTempLimit; 
3a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3a90: 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6c 69 6d  * Total size lim
3aa0: 69 74 20 66 6f 72 20 74 65 6d 70 20 66 69 6c 65  it for temp file
3ab0: 73 20 2a 2f 0a 0a 20 20 2f 2a 20 55 73 65 64 20  s */..  /* Used 
3ac0: 69 6e 20 52 42 55 20 76 61 63 75 75 6d 20 6d 6f  in RBU vacuum mo
3ad0: 64 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74  de only */.  int
3ae0: 20 6e 52 62 75 3b 20 20 20 20 20 20 20 20 20 20   nRbu;          
3af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3b00: 4e 75 6d 62 65 72 20 6f 66 20 52 42 55 20 56 46  Number of RBU VF
3b10: 53 20 69 6e 20 74 68 65 20 73 74 61 63 6b 20 2a  S in the stack *
3b20: 2f 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 52  /.  rbu_file *pR
3b30: 62 75 46 64 3b 20 20 20 20 20 20 20 20 20 20 20  buFd;           
3b40: 20 20 20 20 2f 2a 20 46 64 20 66 6f 72 20 6d 61      /* Fd for ma
3b50: 69 6e 20 64 62 20 6f 66 20 64 62 52 62 75 20 2a  in db of dbRbu *
3b60: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 72  /.};../*.** An r
3b70: 62 75 20 56 46 53 20 69 73 20 69 6d 70 6c 65 6d  bu VFS is implem
3b80: 65 6e 74 65 64 20 75 73 69 6e 67 20 61 6e 20 69  ented using an i
3b90: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
3ba0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
3bb0: 20 56 61 72 69 61 62 6c 65 20 70 52 62 75 20 69   Variable pRbu i
3bc0: 73 20 6f 6e 6c 79 20 6e 6f 6e 2d 4e 55 4c 4c 20  s only non-NULL 
3bd0: 66 6f 72 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  for automaticall
3be0: 79 20 63 72 65 61 74 65 64 20 52 42 55 20 56 46  y created RBU VF
3bf0: 53 20 6f 62 6a 65 63 74 73 2e 0a 2a 2a 20 49 74  S objects..** It
3c00: 20 69 73 20 4e 55 4c 4c 20 66 6f 72 20 52 42 55   is NULL for RBU
3c10: 20 56 46 53 20 6f 62 6a 65 63 74 73 20 63 72 65   VFS objects cre
3c20: 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c 79 20  ated explicitly 
3c30: 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  using.** sqlite3
3c40: 72 62 75 5f 63 72 65 61 74 65 5f 76 66 73 28 29  rbu_create_vfs()
3c50: 2e 20 49 74 20 69 73 20 75 73 65 64 20 74 6f 20  . It is used to 
3c60: 74 72 61 63 6b 20 74 68 65 20 74 6f 74 61 6c 20  track the total 
3c70: 61 6d 6f 75 6e 74 20 6f 66 20 74 65 6d 70 0a 2a  amount of temp.*
3c80: 2a 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20  * space used by 
3c90: 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65 2e 0a  the RBU handle..
3ca0: 2a 2f 0a 73 74 72 75 63 74 20 72 62 75 5f 76 66  */.struct rbu_vf
3cb0: 73 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  s {.  sqlite3_vf
3cc0: 73 20 62 61 73 65 3b 20 20 20 20 20 20 20 20 20  s base;         
3cd0: 20 20 20 20 20 20 2f 2a 20 72 62 75 20 56 46 53        /* rbu VFS
3ce0: 20 73 68 69 6d 20 6d 65 74 68 6f 64 73 20 2a 2f   shim methods */
3cf0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
3d00: 70 52 65 61 6c 56 66 73 3b 20 20 20 20 20 20 20  pRealVfs;       
3d10: 20 20 20 2f 2a 20 55 6e 64 65 72 6c 79 69 6e 67     /* Underlying
3d20: 20 56 46 53 20 2a 2f 0a 20 20 73 71 6c 69 74 65   VFS */.  sqlite
3d30: 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20  3_mutex *mutex; 
3d40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 74            /* Mut
3d50: 65 78 20 74 6f 20 70 72 6f 74 65 63 74 20 70 4d  ex to protect pM
3d60: 61 69 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ain */.  sqlite3
3d70: 72 62 75 20 2a 70 52 62 75 3b 20 20 20 20 20 20  rbu *pRbu;      
3d80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 77 6e 65           /* Owne
3d90: 72 20 52 42 55 20 6f 62 6a 65 63 74 20 2a 2f 0a  r RBU object */.
3da0: 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 4d 61 69    rbu_file *pMai
3db0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
3dc0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6d 61 69    /* List of mai
3dd0: 6e 20 64 62 20 66 69 6c 65 73 20 2a 2f 0a 20 20  n db files */.  
3de0: 72 62 75 5f 66 69 6c 65 20 2a 70 4d 61 69 6e 52  rbu_file *pMainR
3df0: 62 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  bu;             
3e00: 2f 2a 20 4c 69 73 74 20 6f 66 20 6d 61 69 6e 20  /* List of main 
3e10: 64 62 20 66 69 6c 65 73 20 77 69 74 68 20 70 52  db files with pR
3e20: 62 75 21 3d 30 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  bu!=0 */.};../*.
3e30: 2a 2a 20 45 61 63 68 20 66 69 6c 65 20 6f 70 65  ** Each file ope
3e40: 6e 65 64 20 62 79 20 61 6e 20 72 62 75 20 56 46  ned by an rbu VF
3e50: 53 20 69 73 20 72 65 70 72 65 73 65 6e 74 65 64  S is represented
3e60: 20 62 79 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   by an instance 
3e70: 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77  of.** the follow
3e80: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ing structure..*
3e90: 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20  *.** If this is 
3ea0: 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
3eb0: 20 28 70 52 62 75 21 3d 30 20 26 26 20 66 6c 61   (pRbu!=0 && fla
3ec0: 67 73 26 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c 4f  gs&DELETE_ON_CLO
3ed0: 53 45 29 2c 20 76 61 72 69 61 62 6c 65 0a 2a 2a  SE), variable.**
3ee0: 20 22 73 7a 22 20 69 73 20 73 65 74 20 74 6f 20   "sz" is set to 
3ef0: 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
3f00: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
3f10: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74   file..*/.struct
3f20: 20 72 62 75 5f 66 69 6c 65 20 7b 0a 20 20 73 71   rbu_file {.  sq
3f30: 6c 69 74 65 33 5f 66 69 6c 65 20 62 61 73 65 3b  lite3_file base;
3f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3f50: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65   sqlite3_file me
3f60: 74 68 6f 64 73 20 2a 2f 0a 20 20 73 71 6c 69 74  thods */.  sqlit
3f70: 65 33 5f 66 69 6c 65 20 2a 70 52 65 61 6c 3b 20  e3_file *pReal; 
3f80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
3f90: 64 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 68 61  derlying file ha
3fa0: 6e 64 6c 65 20 2a 2f 0a 20 20 72 62 75 5f 76 66  ndle */.  rbu_vf
3fb0: 73 20 2a 70 52 62 75 56 66 73 3b 20 20 20 20 20  s *pRbuVfs;     
3fc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
3fd0: 6e 74 65 72 20 74 6f 20 74 68 65 20 72 62 75 5f  nter to the rbu_
3fe0: 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  vfs object */.  
3ff0: 73 71 6c 69 74 65 33 72 62 75 20 2a 70 52 62 75  sqlite3rbu *pRbu
4000: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4010: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 72 62  /* Pointer to rb
4020: 75 20 6f 62 6a 65 63 74 20 28 72 62 75 20 74 61  u object (rbu ta
4030: 72 67 65 74 20 6f 6e 6c 79 29 20 2a 2f 0a 20 20  rget only) */.  
4040: 69 36 34 20 73 7a 3b 20 20 20 20 20 20 20 20 20  i64 sz;         
4050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4060: 2f 2a 20 53 69 7a 65 20 6f 66 20 66 69 6c 65 20  /* Size of file 
4070: 69 6e 20 62 79 74 65 73 20 28 74 65 6d 70 20 6f  in bytes (temp o
4080: 6e 6c 79 29 20 2a 2f 0a 0a 20 20 69 6e 74 20 6f  nly) */..  int o
4090: 70 65 6e 46 6c 61 67 73 3b 20 20 20 20 20 20 20  penFlags;       
40a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
40b0: 61 67 73 20 74 68 69 73 20 66 69 6c 65 20 77 61  ags this file wa
40c0: 73 20 6f 70 65 6e 65 64 20 77 69 74 68 20 2a 2f  s opened with */
40d0: 0a 20 20 75 33 32 20 69 43 6f 6f 6b 69 65 3b 20  .  u32 iCookie; 
40e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40f0: 20 20 20 2f 2a 20 43 6f 6f 6b 69 65 20 76 61 6c     /* Cookie val
4100: 75 65 20 66 6f 72 20 6d 61 69 6e 20 64 62 20 66  ue for main db f
4110: 69 6c 65 73 20 2a 2f 0a 20 20 75 38 20 69 57 72  iles */.  u8 iWr
4120: 69 74 65 56 65 72 3b 20 20 20 20 20 20 20 20 20  iteVer;         
4130: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22 77 72            /* "wr
4140: 69 74 65 2d 76 65 72 73 69 6f 6e 22 20 76 61 6c  ite-version" val
4150: 75 65 20 66 6f 72 20 6d 61 69 6e 20 64 62 20 66  ue for main db f
4160: 69 6c 65 73 20 2a 2f 0a 20 20 75 38 20 62 4e 6f  iles */.  u8 bNo
4170: 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  lock;           
4180: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
4190: 65 20 74 6f 20 66 61 69 6c 20 45 58 43 4c 55 53  e to fail EXCLUS
41a0: 49 56 45 20 6c 6f 63 6b 73 20 2a 2f 0a 0a 20 20  IVE locks */..  
41b0: 69 6e 74 20 6e 53 68 6d 3b 20 20 20 20 20 20 20  int nShm;       
41c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41d0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
41e0: 72 69 65 73 20 69 6e 20 61 70 53 68 6d 5b 5d 20  ries in apShm[] 
41f0: 61 72 72 61 79 20 2a 2f 0a 20 20 63 68 61 72 20  array */.  char 
4200: 2a 2a 61 70 53 68 6d 3b 20 20 20 20 20 20 20 20  **apShm;        
4210: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
4220: 72 61 79 20 6f 66 20 6d 6d 61 70 27 64 20 2a 2d  ray of mmap'd *-
4230: 73 68 6d 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20  shm regions */. 
4240: 20 63 68 61 72 20 2a 7a 44 65 6c 3b 20 20 20 20   char *zDel;    
4250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4260: 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 69 73 20   /* Delete this 
4270: 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20 66 69 6c  when closing fil
4280: 65 20 2a 2f 0a 0a 20 20 63 6f 6e 73 74 20 63 68  e */..  const ch
4290: 61 72 20 2a 7a 57 61 6c 3b 20 20 20 20 20 20 20  ar *zWal;       
42a0: 20 20 20 20 20 20 20 20 2f 2a 20 57 61 6c 20 66          /* Wal f
42b0: 69 6c 65 6e 61 6d 65 20 66 6f 72 20 74 68 69 73  ilename for this
42c0: 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f   main db file */
42d0: 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 57 61  .  rbu_file *pWa
42e0: 6c 46 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  lFd;            
42f0: 20 20 20 2f 2a 20 57 61 6c 20 66 69 6c 65 20 64     /* Wal file d
4300: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68  escriptor for th
4310: 69 73 20 6d 61 69 6e 20 64 62 20 2a 2f 0a 20 20  is main db */.  
4320: 72 62 75 5f 66 69 6c 65 20 2a 70 4d 61 69 6e 4e  rbu_file *pMainN
4330: 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
4340: 2f 2a 20 4e 65 78 74 20 4d 41 49 4e 5f 44 42 20  /* Next MAIN_DB 
4350: 66 69 6c 65 20 2a 2f 0a 20 20 72 62 75 5f 66 69  file */.  rbu_fi
4360: 6c 65 20 2a 70 4d 61 69 6e 52 62 75 4e 65 78 74  le *pMainRbuNext
4370: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78  ;         /* Nex
4380: 74 20 4d 41 49 4e 5f 44 42 20 66 69 6c 65 20 77  t MAIN_DB file w
4390: 69 74 68 20 70 52 62 75 21 3d 30 20 2a 2f 0a 7d  ith pRbu!=0 */.}
43a0: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 65 20 66 6f  ;../*.** True fo
43b0: 72 20 61 6e 20 52 42 55 20 76 61 63 75 75 6d 20  r an RBU vacuum 
43c0: 68 61 6e 64 6c 65 2c 20 6f 72 20 66 61 6c 73 65  handle, or false
43d0: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 23   otherwise..*/.#
43e0: 64 65 66 69 6e 65 20 72 62 75 49 73 56 61 63 75  define rbuIsVacu
43f0: 75 6d 28 70 29 20 28 28 70 29 2d 3e 7a 54 61 72  um(p) ((p)->zTar
4400: 67 65 74 3d 3d 30 29 0a 0a 0a 2f 2a 2a 2a 2a 2a  get==0).../*****
4410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4450: 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ****.** The foll
4460: 6f 77 69 6e 67 20 74 68 72 65 65 20 66 75 6e 63  owing three func
4470: 74 69 6f 6e 73 2c 20 66 6f 75 6e 64 20 62 65 6c  tions, found bel
4480: 6f 77 3a 0a 2a 2a 0a 2a 2a 20 20 20 72 62 75 44  ow:.**.**   rbuD
4490: 65 6c 74 61 47 65 74 49 6e 74 28 29 0a 2a 2a 20  eltaGetInt().** 
44a0: 20 20 72 62 75 44 65 6c 74 61 43 68 65 63 6b 73    rbuDeltaChecks
44b0: 75 6d 28 29 0a 2a 2a 20 20 20 72 62 75 44 65 6c  um().**   rbuDel
44c0: 74 61 41 70 70 6c 79 28 29 0a 2a 2a 0a 2a 2a 20  taApply().**.** 
44d0: 61 72 65 20 6c 69 66 74 65 64 20 66 72 6f 6d 20  are lifted from 
44e0: 74 68 65 20 66 6f 73 73 69 6c 20 73 6f 75 72 63  the fossil sourc
44f0: 65 20 63 6f 64 65 20 28 68 74 74 70 3a 2f 2f 66  e code (http://f
4500: 6f 73 73 69 6c 2d 73 63 6d 2e 6f 72 67 29 2e 20  ossil-scm.org). 
4510: 54 68 65 79 0a 2a 2a 20 61 72 65 20 75 73 65 64  They.** are used
4520: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
4530: 65 20 73 63 61 6c 61 72 20 53 51 4c 20 66 75 6e  e scalar SQL fun
4540: 63 74 69 6f 6e 20 72 62 75 5f 66 6f 73 73 69 6c  ction rbu_fossil
4550: 5f 64 65 6c 74 61 28 29 2e 0a 2a 2f 0a 0a 2f 2a  _delta()..*/../*
4560: 0a 2a 2a 20 52 65 61 64 20 62 79 74 65 73 20 66  .** Read bytes f
4570: 72 6f 6d 20 2a 70 7a 20 61 6e 64 20 63 6f 6e 76  rom *pz and conv
4580: 65 72 74 20 74 68 65 6d 20 69 6e 74 6f 20 61 20  ert them into a 
4590: 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72  positive integer
45a0: 2e 20 20 57 68 65 6e 0a 2a 2a 20 66 69 6e 69 73  .  When.** finis
45b0: 68 65 64 2c 20 6c 65 61 76 65 20 2a 70 7a 20 70  hed, leave *pz p
45c0: 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66  ointing to the f
45d0: 69 72 73 74 20 63 68 61 72 61 63 74 65 72 20 70  irst character p
45e0: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a  ast the end of.*
45f0: 2a 20 74 68 65 20 69 6e 74 65 67 65 72 2e 20 20  * the integer.  
4600: 54 68 65 20 2a 70 4c 65 6e 20 70 61 72 61 6d 65  The *pLen parame
4610: 74 65 72 20 68 6f 6c 64 73 20 74 68 65 20 6c 65  ter holds the le
4620: 6e 67 74 68 20 6f 66 20 74 68 65 20 73 74 72 69  ngth of the stri
4630: 6e 67 0a 2a 2a 20 69 6e 20 2a 70 7a 20 61 6e 64  ng.** in *pz and
4640: 20 69 73 20 64 65 63 72 65 6d 65 6e 74 65 64 20   is decremented 
4650: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 68  once for each ch
4660: 61 72 61 63 74 65 72 20 69 6e 20 74 68 65 20 69  aracter in the i
4670: 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  nteger..*/.stati
4680: 63 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 72  c unsigned int r
4690: 62 75 44 65 6c 74 61 47 65 74 49 6e 74 28 63 6f  buDeltaGetInt(co
46a0: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 2c 20 69  nst char **pz, i
46b0: 6e 74 20 2a 70 4c 65 6e 29 7b 0a 20 20 73 74 61  nt *pLen){.  sta
46c0: 74 69 63 20 63 6f 6e 73 74 20 73 69 67 6e 65 64  tic const signed
46d0: 20 63 68 61 72 20 7a 56 61 6c 75 65 5b 5d 20 3d   char zValue[] =
46e0: 20 7b 0a 20 20 20 20 2d 31 2c 20 2d 31 2c 20 2d   {.    -1, -1, -
46f0: 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d  1, -1, -1, -1, -
4700: 31 2c 20 2d 31 2c 20 20 20 2d 31 2c 20 2d 31 2c  1, -1,   -1, -1,
4710: 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c   -1, -1, -1, -1,
4720: 20 2d 31 2c 20 2d 31 2c 0a 20 20 20 20 2d 31 2c   -1, -1,.    -1,
4730: 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c   -1, -1, -1, -1,
4740: 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 20 20 2d   -1, -1, -1,   -
4750: 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d  1, -1, -1, -1, -
4760: 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 0a 20  1, -1, -1, -1,. 
4770: 20 20 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d     -1, -1, -1, -
4780: 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d  1, -1, -1, -1, -
4790: 31 2c 20 20 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c  1,   -1, -1, -1,
47a0: 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c   -1, -1, -1, -1,
47b0: 20 2d 31 2c 0a 20 20 20 20 20 30 2c 20 20 31 2c   -1,.     0,  1,
47c0: 20 20 32 2c 20 20 33 2c 20 20 34 2c 20 20 35 2c    2,  3,  4,  5,
47d0: 20 20 36 2c 20 20 37 2c 20 20 20 20 38 2c 20 20    6,  7,    8,  
47e0: 39 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d  9, -1, -1, -1, -
47f0: 31 2c 20 2d 31 2c 20 2d 31 2c 0a 20 20 20 20 2d  1, -1, -1,.    -
4800: 31 2c 20 31 30 2c 20 31 31 2c 20 31 32 2c 20 31  1, 10, 11, 12, 1
4810: 33 2c 20 31 34 2c 20 31 35 2c 20 31 36 2c 20 20  3, 14, 15, 16,  
4820: 20 31 37 2c 20 31 38 2c 20 31 39 2c 20 32 30 2c   17, 18, 19, 20,
4830: 20 32 31 2c 20 32 32 2c 20 32 33 2c 20 32 34 2c   21, 22, 23, 24,
4840: 0a 20 20 20 20 32 35 2c 20 32 36 2c 20 32 37 2c  .    25, 26, 27,
4850: 20 32 38 2c 20 32 39 2c 20 33 30 2c 20 33 31 2c   28, 29, 30, 31,
4860: 20 33 32 2c 20 20 20 33 33 2c 20 33 34 2c 20 33   32,   33, 34, 3
4870: 35 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d  5, -1, -1, -1, -
4880: 31 2c 20 33 36 2c 0a 20 20 20 20 2d 31 2c 20 33  1, 36,.    -1, 3
4890: 37 2c 20 33 38 2c 20 33 39 2c 20 34 30 2c 20 34  7, 38, 39, 40, 4
48a0: 31 2c 20 34 32 2c 20 34 33 2c 20 20 20 34 34 2c  1, 42, 43,   44,
48b0: 20 34 35 2c 20 34 36 2c 20 34 37 2c 20 34 38 2c   45, 46, 47, 48,
48c0: 20 34 39 2c 20 35 30 2c 20 35 31 2c 0a 20 20 20   49, 50, 51,.   
48d0: 20 35 32 2c 20 35 33 2c 20 35 34 2c 20 35 35 2c   52, 53, 54, 55,
48e0: 20 35 36 2c 20 35 37 2c 20 35 38 2c 20 35 39 2c   56, 57, 58, 59,
48f0: 20 20 20 36 30 2c 20 36 31 2c 20 36 32 2c 20 2d     60, 61, 62, -
4900: 31 2c 20 2d 31 2c 20 2d 31 2c 20 36 33 2c 20 2d  1, -1, -1, 63, -
4910: 31 2c 0a 20 20 7d 3b 0a 20 20 75 6e 73 69 67 6e  1,.  };.  unsign
4920: 65 64 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20  ed int v = 0;.  
4930: 69 6e 74 20 63 3b 0a 20 20 75 6e 73 69 67 6e 65  int c;.  unsigne
4940: 64 20 63 68 61 72 20 2a 7a 20 3d 20 28 75 6e 73  d char *z = (uns
4950: 69 67 6e 65 64 20 63 68 61 72 2a 29 2a 70 7a 3b  igned char*)*pz;
4960: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
4970: 20 2a 7a 53 74 61 72 74 20 3d 20 7a 3b 0a 20 20   *zStart = z;.  
4980: 77 68 69 6c 65 28 20 28 63 20 3d 20 7a 56 61 6c  while( (c = zVal
4990: 75 65 5b 30 78 37 66 26 2a 28 7a 2b 2b 29 5d 29  ue[0x7f&*(z++)])
49a0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 76 20 3d 20  >=0 ){.     v = 
49b0: 28 76 3c 3c 36 29 20 2b 20 63 3b 0a 20 20 7d 0a  (v<<6) + c;.  }.
49c0: 20 20 7a 2d 2d 3b 0a 20 20 2a 70 4c 65 6e 20 2d    z--;.  *pLen -
49d0: 3d 20 7a 20 2d 20 7a 53 74 61 72 74 3b 0a 20 20  = z - zStart;.  
49e0: 2a 70 7a 20 3d 20 28 63 68 61 72 2a 29 7a 3b 0a  *pz = (char*)z;.
49f0: 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 23    return v;.}..#
4a00: 69 66 20 52 42 55 5f 45 4e 41 42 4c 45 5f 44 45  if RBU_ENABLE_DE
4a10: 4c 54 41 5f 43 4b 53 55 4d 0a 2f 2a 0a 2a 2a 20  LTA_CKSUM./*.** 
4a20: 43 6f 6d 70 75 74 65 20 61 20 33 32 2d 62 69 74  Compute a 32-bit
4a30: 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 74 68 65   checksum on the
4a40: 20 4e 2d 62 79 74 65 20 62 75 66 66 65 72 2e 20   N-byte buffer. 
4a50: 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
4a60: 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e  lt..*/.static un
4a70: 73 69 67 6e 65 64 20 69 6e 74 20 72 62 75 44 65  signed int rbuDe
4a80: 6c 74 61 43 68 65 63 6b 73 75 6d 28 63 6f 6e 73  ltaChecksum(cons
4a90: 74 20 63 68 61 72 20 2a 7a 49 6e 2c 20 73 69 7a  t char *zIn, siz
4aa0: 65 5f 74 20 4e 29 7b 0a 20 20 63 6f 6e 73 74 20  e_t N){.  const 
4ab0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
4ac0: 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
4ad0: 65 64 20 63 68 61 72 20 2a 29 7a 49 6e 3b 0a 20  ed char *)zIn;. 
4ae0: 20 75 6e 73 69 67 6e 65 64 20 73 75 6d 30 20 3d   unsigned sum0 =
4af0: 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 73   0;.  unsigned s
4b00: 75 6d 31 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67  um1 = 0;.  unsig
4b10: 6e 65 64 20 73 75 6d 32 20 3d 20 30 3b 0a 20 20  ned sum2 = 0;.  
4b20: 75 6e 73 69 67 6e 65 64 20 73 75 6d 33 20 3d 20  unsigned sum3 = 
4b30: 30 3b 0a 20 20 77 68 69 6c 65 28 4e 20 3e 3d 20  0;.  while(N >= 
4b40: 31 36 29 7b 0a 20 20 20 20 73 75 6d 30 20 2b 3d  16){.    sum0 +=
4b50: 20 28 28 75 6e 73 69 67 6e 65 64 29 7a 5b 30 5d   ((unsigned)z[0]
4b60: 20 2b 20 7a 5b 34 5d 20 2b 20 7a 5b 38 5d 20 2b   + z[4] + z[8] +
4b70: 20 7a 5b 31 32 5d 29 3b 0a 20 20 20 20 73 75 6d   z[12]);.    sum
4b80: 31 20 2b 3d 20 28 28 75 6e 73 69 67 6e 65 64 29  1 += ((unsigned)
4b90: 7a 5b 31 5d 20 2b 20 7a 5b 35 5d 20 2b 20 7a 5b  z[1] + z[5] + z[
4ba0: 39 5d 20 2b 20 7a 5b 31 33 5d 29 3b 0a 20 20 20  9] + z[13]);.   
4bb0: 20 73 75 6d 32 20 2b 3d 20 28 28 75 6e 73 69 67   sum2 += ((unsig
4bc0: 6e 65 64 29 7a 5b 32 5d 20 2b 20 7a 5b 36 5d 20  ned)z[2] + z[6] 
4bd0: 2b 20 7a 5b 31 30 5d 2b 20 7a 5b 31 34 5d 29 3b  + z[10]+ z[14]);
4be0: 0a 20 20 20 20 73 75 6d 33 20 2b 3d 20 28 28 75  .    sum3 += ((u
4bf0: 6e 73 69 67 6e 65 64 29 7a 5b 33 5d 20 2b 20 7a  nsigned)z[3] + z
4c00: 5b 37 5d 20 2b 20 7a 5b 31 31 5d 2b 20 7a 5b 31  [7] + z[11]+ z[1
4c10: 35 5d 29 3b 0a 20 20 20 20 7a 20 2b 3d 20 31 36  5]);.    z += 16
4c20: 3b 0a 20 20 20 20 4e 20 2d 3d 20 31 36 3b 0a 20  ;.    N -= 16;. 
4c30: 20 7d 0a 20 20 77 68 69 6c 65 28 4e 20 3e 3d 20   }.  while(N >= 
4c40: 34 29 7b 0a 20 20 20 20 73 75 6d 30 20 2b 3d 20  4){.    sum0 += 
4c50: 7a 5b 30 5d 3b 0a 20 20 20 20 73 75 6d 31 20 2b  z[0];.    sum1 +
4c60: 3d 20 7a 5b 31 5d 3b 0a 20 20 20 20 73 75 6d 32  = z[1];.    sum2
4c70: 20 2b 3d 20 7a 5b 32 5d 3b 0a 20 20 20 20 73 75   += z[2];.    su
4c80: 6d 33 20 2b 3d 20 7a 5b 33 5d 3b 0a 20 20 20 20  m3 += z[3];.    
4c90: 7a 20 2b 3d 20 34 3b 0a 20 20 20 20 4e 20 2d 3d  z += 4;.    N -=
4ca0: 20 34 3b 0a 20 20 7d 0a 20 20 73 75 6d 33 20 2b   4;.  }.  sum3 +
4cb0: 3d 20 28 73 75 6d 32 20 3c 3c 20 38 29 20 2b 20  = (sum2 << 8) + 
4cc0: 28 73 75 6d 31 20 3c 3c 20 31 36 29 20 2b 20 28  (sum1 << 16) + (
4cd0: 73 75 6d 30 20 3c 3c 20 32 34 29 3b 0a 20 20 73  sum0 << 24);.  s
4ce0: 77 69 74 63 68 28 4e 29 7b 0a 20 20 20 20 63 61  witch(N){.    ca
4cf0: 73 65 20 33 3a 20 20 20 73 75 6d 33 20 2b 3d 20  se 3:   sum3 += 
4d00: 28 7a 5b 32 5d 20 3c 3c 20 38 29 3b 0a 20 20 20  (z[2] << 8);.   
4d10: 20 63 61 73 65 20 32 3a 20 20 20 73 75 6d 33 20   case 2:   sum3 
4d20: 2b 3d 20 28 7a 5b 31 5d 20 3c 3c 20 31 36 29 3b  += (z[1] << 16);
4d30: 0a 20 20 20 20 63 61 73 65 20 31 3a 20 20 20 73  .    case 1:   s
4d40: 75 6d 33 20 2b 3d 20 28 7a 5b 30 5d 20 3c 3c 20  um3 += (z[0] << 
4d50: 32 34 29 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  24);.    default
4d60: 3a 20 20 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  :  ;.  }.  retur
4d70: 6e 20 73 75 6d 33 3b 0a 7d 0a 23 65 6e 64 69 66  n sum3;.}.#endif
4d80: 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 20  ../*.** Apply a 
4d90: 64 65 6c 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  delta..**.** The
4da0: 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 73   output buffer s
4db0: 68 6f 75 6c 64 20 62 65 20 62 69 67 20 65 6e 6f  hould be big eno
4dc0: 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ugh to hold the 
4dd0: 77 68 6f 6c 65 20 6f 75 74 70 75 74 0a 2a 2a 20  whole output.** 
4de0: 66 69 6c 65 20 61 6e 64 20 61 20 4e 55 4c 20 74  file and a NUL t
4df0: 65 72 6d 69 6e 61 74 6f 72 20 61 74 20 74 68 65  erminator at the
4e00: 20 65 6e 64 2e 20 20 54 68 65 20 64 65 6c 74 61   end.  The delta
4e10: 5f 6f 75 74 70 75 74 5f 73 69 7a 65 28 29 0a 2a  _output_size().*
4e20: 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64  * routine will d
4e30: 65 74 65 72 6d 69 6e 65 20 74 68 69 73 20 73 69  etermine this si
4e40: 7a 65 20 66 6f 72 20 79 6f 75 2e 0a 2a 2a 0a 2a  ze for you..**.*
4e50: 2a 20 54 68 65 20 64 65 6c 74 61 20 73 74 72 69  * The delta stri
4e60: 6e 67 20 73 68 6f 75 6c 64 20 62 65 20 6e 75 6c  ng should be nul
4e70: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42  l-terminated.  B
4e80: 75 74 20 74 68 65 20 64 65 6c 74 61 20 73 74 72  ut the delta str
4e90: 69 6e 67 0a 2a 2a 20 6d 61 79 20 63 6f 6e 74 61  ing.** may conta
4ea0: 69 6e 20 65 6d 62 65 64 64 65 64 20 4e 55 4c 20  in embedded NUL 
4eb0: 63 68 61 72 61 63 74 65 72 73 20 28 69 66 20 74  characters (if t
4ec0: 68 65 20 69 6e 70 75 74 20 61 6e 64 20 6f 75 74  he input and out
4ed0: 70 75 74 20 61 72 65 0a 2a 2a 20 62 69 6e 61 72  put are.** binar
4ee0: 79 20 66 69 6c 65 73 29 20 73 6f 20 77 65 20 61  y files) so we a
4ef0: 6c 73 6f 20 68 61 76 65 20 74 6f 20 70 61 73 73  lso have to pass
4f00: 20 69 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f   in the length o
4f10: 66 20 74 68 65 20 64 65 6c 74 61 20 69 6e 0a 2a  f the delta in.*
4f20: 2a 20 74 68 65 20 6c 65 6e 44 65 6c 74 61 20 70  * the lenDelta p
4f30: 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  arameter..**.** 
4f40: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
4f50: 74 75 72 6e 73 20 74 68 65 20 73 69 7a 65 20 6f  turns the size o
4f60: 66 20 74 68 65 20 6f 75 74 70 75 74 20 66 69 6c  f the output fil
4f70: 65 20 69 6e 20 62 79 74 65 73 20 28 65 78 63 6c  e in bytes (excl
4f80: 75 64 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 6e  uding.** the fin
4f90: 61 6c 20 4e 55 4c 20 74 65 72 6d 69 6e 61 74 6f  al NUL terminato
4fa0: 72 20 63 68 61 72 61 63 74 65 72 29 2e 20 20 45  r character).  E
4fb0: 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 64 65  xcept, if the de
4fc0: 6c 74 61 20 73 74 72 69 6e 67 20 69 73 0a 2a 2a  lta string is.**
4fd0: 20 6d 61 6c 66 6f 72 6d 65 64 20 6f 72 20 69 6e   malformed or in
4fe0: 74 65 6e 64 65 64 20 66 6f 72 20 75 73 65 20 77  tended for use w
4ff0: 69 74 68 20 61 20 73 6f 75 72 63 65 20 66 69 6c  ith a source fil
5000: 65 20 6f 74 68 65 72 20 74 68 61 6e 20 7a 53 72  e other than zSr
5010: 63 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  c,.** then this 
5020: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
5030: 2d 31 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 20  -1..**.** Refer 
5040: 74 6f 20 74 68 65 20 64 65 6c 74 61 5f 63 72 65  to the delta_cre
5050: 61 74 65 28 29 20 64 6f 63 75 6d 65 6e 74 61 74  ate() documentat
5060: 69 6f 6e 20 61 62 6f 76 65 20 66 6f 72 20 61 20  ion above for a 
5070: 64 65 73 63 72 69 70 74 69 6f 6e 0a 2a 2a 20 6f  description.** o
5080: 66 20 74 68 65 20 64 65 6c 74 61 20 66 69 6c 65  f the delta file
5090: 20 66 6f 72 6d 61 74 2e 0a 2a 2f 0a 73 74 61 74   format..*/.stat
50a0: 69 63 20 69 6e 74 20 72 62 75 44 65 6c 74 61 41  ic int rbuDeltaA
50b0: 70 70 6c 79 28 0a 20 20 63 6f 6e 73 74 20 63 68  pply(.  const ch
50c0: 61 72 20 2a 7a 53 72 63 2c 20 20 20 20 20 20 2f  ar *zSrc,      /
50d0: 2a 20 54 68 65 20 73 6f 75 72 63 65 20 6f 72 20  * The source or 
50e0: 70 61 74 74 65 72 6e 20 66 69 6c 65 20 2a 2f 0a  pattern file */.
50f0: 20 20 69 6e 74 20 6c 65 6e 53 72 63 2c 20 20 20    int lenSrc,   
5100: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
5110: 74 68 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65  th of the source
5120: 20 66 69 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   file */.  const
5130: 20 63 68 61 72 20 2a 7a 44 65 6c 74 61 2c 20 20   char *zDelta,  
5140: 20 20 2f 2a 20 44 65 6c 74 61 20 74 6f 20 61 70    /* Delta to ap
5150: 70 6c 79 20 74 6f 20 74 68 65 20 70 61 74 74 65  ply to the patte
5160: 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 44  rn */.  int lenD
5170: 65 6c 74 61 2c 20 20 20 20 20 20 20 20 20 20 2f  elta,          /
5180: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  * Length of the 
5190: 64 65 6c 74 61 20 2a 2f 0a 20 20 63 68 61 72 20  delta */.  char 
51a0: 2a 7a 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  *zOut           
51b0: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6f    /* Write the o
51c0: 75 74 70 75 74 20 69 6e 74 6f 20 74 68 69 73 20  utput into this 
51d0: 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66  preallocated buf
51e0: 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69  fer */.){.  unsi
51f0: 67 6e 65 64 20 69 6e 74 20 6c 69 6d 69 74 3b 0a  gned int limit;.
5200: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 74    unsigned int t
5210: 6f 74 61 6c 20 3d 20 30 3b 0a 23 69 66 20 52 42  otal = 0;.#if RB
5220: 55 5f 45 4e 41 42 4c 45 5f 44 45 4c 54 41 5f 43  U_ENABLE_DELTA_C
5230: 4b 53 55 4d 0a 20 20 63 68 61 72 20 2a 7a 4f 72  KSUM.  char *zOr
5240: 69 67 4f 75 74 20 3d 20 7a 4f 75 74 3b 0a 23 65  igOut = zOut;.#e
5250: 6e 64 69 66 0a 0a 20 20 6c 69 6d 69 74 20 3d 20  ndif..  limit = 
5260: 72 62 75 44 65 6c 74 61 47 65 74 49 6e 74 28 26  rbuDeltaGetInt(&
5270: 7a 44 65 6c 74 61 2c 20 26 6c 65 6e 44 65 6c 74  zDelta, &lenDelt
5280: 61 29 3b 0a 20 20 69 66 28 20 2a 7a 44 65 6c 74  a);.  if( *zDelt
5290: 61 21 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 2f  a!='\n' ){.    /
52a0: 2a 20 45 52 52 4f 52 3a 20 73 69 7a 65 20 69 6e  * ERROR: size in
52b0: 74 65 67 65 72 20 6e 6f 74 20 74 65 72 6d 69 6e  teger not termin
52c0: 61 74 65 64 20 62 79 20 22 5c 6e 22 20 2a 2f 0a  ated by "\n" */.
52d0: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
52e0: 20 7d 0a 20 20 7a 44 65 6c 74 61 2b 2b 3b 20 6c   }.  zDelta++; l
52f0: 65 6e 44 65 6c 74 61 2d 2d 3b 0a 20 20 77 68 69  enDelta--;.  whi
5300: 6c 65 28 20 2a 7a 44 65 6c 74 61 20 26 26 20 6c  le( *zDelta && l
5310: 65 6e 44 65 6c 74 61 3e 30 20 29 7b 0a 20 20 20  enDelta>0 ){.   
5320: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 63 6e   unsigned int cn
5330: 74 2c 20 6f 66 73 74 3b 0a 20 20 20 20 63 6e 74  t, ofst;.    cnt
5340: 20 3d 20 72 62 75 44 65 6c 74 61 47 65 74 49 6e   = rbuDeltaGetIn
5350: 74 28 26 7a 44 65 6c 74 61 2c 20 26 6c 65 6e 44  t(&zDelta, &lenD
5360: 65 6c 74 61 29 3b 0a 20 20 20 20 73 77 69 74 63  elta);.    switc
5370: 68 28 20 7a 44 65 6c 74 61 5b 30 5d 20 29 7b 0a  h( zDelta[0] ){.
5380: 20 20 20 20 20 20 63 61 73 65 20 27 40 27 3a 20        case '@': 
5390: 7b 0a 20 20 20 20 20 20 20 20 7a 44 65 6c 74 61  {.        zDelta
53a0: 2b 2b 3b 20 6c 65 6e 44 65 6c 74 61 2d 2d 3b 0a  ++; lenDelta--;.
53b0: 20 20 20 20 20 20 20 20 6f 66 73 74 20 3d 20 72          ofst = r
53c0: 62 75 44 65 6c 74 61 47 65 74 49 6e 74 28 26 7a  buDeltaGetInt(&z
53d0: 44 65 6c 74 61 2c 20 26 6c 65 6e 44 65 6c 74 61  Delta, &lenDelta
53e0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c  );.        if( l
53f0: 65 6e 44 65 6c 74 61 3e 30 20 26 26 20 7a 44 65  enDelta>0 && zDe
5400: 6c 74 61 5b 30 5d 21 3d 27 2c 27 20 29 7b 0a 20  lta[0]!=',' ){. 
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 63 6f 6d 6d 61 6e 64 20  R: copy command 
5430: 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65 64 20 62  not terminated b
5440: 79 20 27 2c 27 20 2a 2f 0a 20 20 20 20 20 20 20  y ',' */.       
5450: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
5460: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5470: 7a 44 65 6c 74 61 2b 2b 3b 20 6c 65 6e 44 65 6c  zDelta++; lenDel
5480: 74 61 2d 2d 3b 0a 20 20 20 20 20 20 20 20 74 6f  ta--;.        to
5490: 74 61 6c 20 2b 3d 20 63 6e 74 3b 0a 20 20 20 20  tal += cnt;.    
54a0: 20 20 20 20 69 66 28 20 74 6f 74 61 6c 3e 6c 69      if( total>li
54b0: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  mit ){.         
54c0: 20 2f 2a 20 45 52 52 4f 52 3a 20 63 6f 70 79 20   /* ERROR: copy 
54d0: 65 78 63 65 65 64 73 20 6f 75 74 70 75 74 20 66  exceeds output f
54e0: 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  ile size */.    
54f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
5500: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5510: 20 20 20 69 66 28 20 28 69 6e 74 29 28 6f 66 73     if( (int)(ofs
5520: 74 2b 63 6e 74 29 20 3e 20 6c 65 6e 53 72 63 20  t+cnt) > lenSrc 
5530: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
5540: 45 52 52 4f 52 3a 20 63 6f 70 79 20 65 78 74 65  ERROR: copy exte
5550: 6e 64 73 20 70 61 73 74 20 65 6e 64 20 6f 66 20  nds past end of 
5560: 69 6e 70 75 74 20 2a 2f 0a 20 20 20 20 20 20 20  input */.       
5570: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
5580: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5590: 6d 65 6d 63 70 79 28 7a 4f 75 74 2c 20 26 7a 53  memcpy(zOut, &zS
55a0: 72 63 5b 6f 66 73 74 5d 2c 20 63 6e 74 29 3b 0a  rc[ofst], cnt);.
55b0: 20 20 20 20 20 20 20 20 7a 4f 75 74 20 2b 3d 20          zOut += 
55c0: 63 6e 74 3b 0a 20 20 20 20 20 20 20 20 62 72 65  cnt;.        bre
55d0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
55e0: 20 20 63 61 73 65 20 27 3a 27 3a 20 7b 0a 20 20    case ':': {.  
55f0: 20 20 20 20 20 20 7a 44 65 6c 74 61 2b 2b 3b 20        zDelta++; 
5600: 6c 65 6e 44 65 6c 74 61 2d 2d 3b 0a 20 20 20 20  lenDelta--;.    
5610: 20 20 20 20 74 6f 74 61 6c 20 2b 3d 20 63 6e 74      total += cnt
5620: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 6f  ;.        if( to
5630: 74 61 6c 3e 6c 69 6d 69 74 20 29 7b 0a 20 20 20  tal>limit ){.   
5640: 20 20 20 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a         /* ERROR:
5650: 20 20 69 6e 73 65 72 74 20 63 6f 6d 6d 61 6e 64    insert command
5660: 20 67 69 76 65 73 20 61 6e 20 6f 75 74 70 75 74   gives an output
5670: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 72 65   larger than pre
5680: 64 69 63 74 65 64 20 2a 2f 0a 20 20 20 20 20 20  dicted */.      
5690: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
56a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
56b0: 20 69 66 28 20 28 69 6e 74 29 63 6e 74 3e 6c 65   if( (int)cnt>le
56c0: 6e 44 65 6c 74 61 20 29 7b 0a 20 20 20 20 20 20  nDelta ){.      
56d0: 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20 69 6e      /* ERROR: in
56e0: 73 65 72 74 20 63 6f 75 6e 74 20 65 78 63 65 65  sert count excee
56f0: 64 73 20 73 69 7a 65 20 6f 66 20 64 65 6c 74 61  ds size of delta
5700: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65   */.          re
5710: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20  turn -1;.       
5720: 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70   }.        memcp
5730: 79 28 7a 4f 75 74 2c 20 7a 44 65 6c 74 61 2c 20  y(zOut, zDelta, 
5740: 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7a 4f  cnt);.        zO
5750: 75 74 20 2b 3d 20 63 6e 74 3b 0a 20 20 20 20 20  ut += cnt;.     
5760: 20 20 20 7a 44 65 6c 74 61 20 2b 3d 20 63 6e 74     zDelta += cnt
5770: 3b 0a 20 20 20 20 20 20 20 20 6c 65 6e 44 65 6c  ;.        lenDel
5780: 74 61 20 2d 3d 20 63 6e 74 3b 0a 20 20 20 20 20  ta -= cnt;.     
5790: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
57a0: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 27 3b 27  }.      case ';'
57b0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 7a 44 65 6c  : {.        zDel
57c0: 74 61 2b 2b 3b 20 6c 65 6e 44 65 6c 74 61 2d 2d  ta++; lenDelta--
57d0: 3b 0a 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 30  ;.        zOut[0
57e0: 5d 20 3d 20 30 3b 0a 23 69 66 20 52 42 55 5f 45  ] = 0;.#if RBU_E
57f0: 4e 41 42 4c 45 5f 44 45 4c 54 41 5f 43 4b 53 55  NABLE_DELTA_CKSU
5800: 4d 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6e  M.        if( cn
5810: 74 21 3d 72 62 75 44 65 6c 74 61 43 68 65 63 6b  t!=rbuDeltaCheck
5820: 73 75 6d 28 7a 4f 72 69 67 4f 75 74 2c 20 74 6f  sum(zOrigOut, to
5830: 74 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  tal) ){.        
5840: 20 20 2f 2a 20 45 52 52 4f 52 3a 20 20 62 61 64    /* ERROR:  bad
5850: 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 20   checksum */.   
5860: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31         return -1
5870: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64  ;.        }.#end
5880: 69 66 0a 20 20 20 20 20 20 20 20 69 66 28 20 74  if.        if( t
5890: 6f 74 61 6c 21 3d 6c 69 6d 69 74 20 29 7b 0a 20  otal!=limit ){. 
58a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 52 52 4f           /* ERRO
58b0: 52 3a 20 67 65 6e 65 72 61 74 65 64 20 73 69 7a  R: generated siz
58c0: 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  e does not match
58d0: 20 70 72 65 64 69 63 74 65 64 20 73 69 7a 65 20   predicted size 
58e0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  */.          ret
58f0: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  urn -1;.        
5900: 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  }.        return
5910: 20 74 6f 74 61 6c 3b 0a 20 20 20 20 20 20 7d 0a   total;.      }.
5920: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b        default: {
5930: 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 52 52 4f  .        /* ERRO
5940: 52 3a 20 75 6e 6b 6e 6f 77 6e 20 64 65 6c 74 61  R: unknown delta
5950: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
5960: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
5970: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
5980: 7d 0a 20 20 2f 2a 20 45 52 52 4f 52 3a 20 75 6e  }.  /* ERROR: un
5990: 74 65 72 6d 69 6e 61 74 65 64 20 64 65 6c 74 61  terminated delta
59a0: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b   */.  return -1;
59b0: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .}..static int r
59c0: 62 75 44 65 6c 74 61 4f 75 74 70 75 74 53 69 7a  buDeltaOutputSiz
59d0: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  e(const char *zD
59e0: 65 6c 74 61 2c 20 69 6e 74 20 6c 65 6e 44 65 6c  elta, int lenDel
59f0: 74 61 29 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b  ta){.  int size;
5a00: 0a 20 20 73 69 7a 65 20 3d 20 72 62 75 44 65 6c  .  size = rbuDel
5a10: 74 61 47 65 74 49 6e 74 28 26 7a 44 65 6c 74 61  taGetInt(&zDelta
5a20: 2c 20 26 6c 65 6e 44 65 6c 74 61 29 3b 0a 20 20  , &lenDelta);.  
5a30: 69 66 28 20 2a 7a 44 65 6c 74 61 21 3d 27 5c 6e  if( *zDelta!='\n
5a40: 27 20 29 7b 0a 20 20 20 20 2f 2a 20 45 52 52 4f  ' ){.    /* ERRO
5a50: 52 3a 20 73 69 7a 65 20 69 6e 74 65 67 65 72 20  R: size integer 
5a60: 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65 64 20 62  not terminated b
5a70: 79 20 22 5c 6e 22 20 2a 2f 0a 20 20 20 20 72 65  y "\n" */.    re
5a80: 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 72  turn -1;.  }.  r
5a90: 65 74 75 72 6e 20 73 69 7a 65 3b 0a 7d 0a 0a 2f  eturn size;.}../
5aa0: 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 63 6f 64 65  *.** End of code
5ab0: 20 74 61 6b 65 6e 20 66 72 6f 6d 20 66 6f 73 73   taken from foss
5ac0: 69 6c 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  il..************
5ad0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5af0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5b00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
5b10: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
5b20: 74 69 6f 6e 20 6f 66 20 53 51 4c 20 73 63 61 6c  tion of SQL scal
5b30: 61 72 20 66 75 6e 63 74 69 6f 6e 20 72 62 75 5f  ar function rbu_
5b40: 66 6f 73 73 69 6c 5f 64 65 6c 74 61 28 29 2e 0a  fossil_delta()..
5b50: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
5b60: 69 6f 6e 20 61 70 70 6c 69 65 73 20 61 20 66 6f  ion applies a fo
5b70: 73 73 69 6c 20 64 65 6c 74 61 20 70 61 74 63 68  ssil delta patch
5b80: 20 74 6f 20 61 20 62 6c 6f 62 2e 20 45 78 61 63   to a blob. Exac
5b90: 74 6c 79 20 74 77 6f 0a 2a 2a 20 61 72 67 75 6d  tly two.** argum
5ba0: 65 6e 74 73 20 6d 75 73 74 20 62 65 20 70 61 73  ents must be pas
5bb0: 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
5bc0: 74 69 6f 6e 2e 20 54 68 65 20 66 69 72 73 74 20  tion. The first 
5bd0: 69 73 20 74 68 65 20 62 6c 6f 62 20 74 6f 0a 2a  is the blob to.*
5be0: 2a 20 70 61 74 63 68 20 61 6e 64 20 74 68 65 20  * patch and the 
5bf0: 73 65 63 6f 6e 64 20 74 68 65 20 70 61 74 63 68  second the patch
5c00: 20 74 6f 20 61 70 70 6c 79 2e 20 49 66 20 6e 6f   to apply. If no
5c10: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
5c20: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
5c30: 72 65 74 75 72 6e 73 20 74 68 65 20 70 61 74 63  returns the patc
5c40: 68 65 64 20 62 6c 6f 62 2e 0a 2a 2f 0a 73 74 61  hed blob..*/.sta
5c50: 74 69 63 20 76 6f 69 64 20 72 62 75 46 6f 73 73  tic void rbuFoss
5c60: 69 6c 44 65 6c 74 61 46 75 6e 63 28 0a 20 20 73  ilDeltaFunc(.  s
5c70: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
5c80: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
5c90: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
5ca0: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
5cb0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 44 65   const char *aDe
5cc0: 6c 74 61 3b 0a 20 20 69 6e 74 20 6e 44 65 6c 74  lta;.  int nDelt
5cd0: 61 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  a;.  const char 
5ce0: 2a 61 4f 72 69 67 3b 0a 20 20 69 6e 74 20 6e 4f  *aOrig;.  int nO
5cf0: 72 69 67 3b 0a 0a 20 20 69 6e 74 20 6e 4f 75 74  rig;..  int nOut
5d00: 3b 0a 20 20 69 6e 74 20 6e 4f 75 74 32 3b 0a 20  ;.  int nOut2;. 
5d10: 20 63 68 61 72 20 2a 61 4f 75 74 3b 0a 0a 20 20   char *aOut;..  
5d20: 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 32 20  assert( argc==2 
5d30: 29 3b 0a 0a 20 20 6e 4f 72 69 67 20 3d 20 73 71  );..  nOrig = sq
5d40: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
5d50: 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 61 4f  s(argv[0]);.  aO
5d60: 72 69 67 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  rig = (const cha
5d70: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
5d80: 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a  _blob(argv[0]);.
5d90: 20 20 6e 44 65 6c 74 61 20 3d 20 73 71 6c 69 74    nDelta = sqlit
5da0: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
5db0: 72 67 76 5b 31 5d 29 3b 0a 20 20 61 44 65 6c 74  rgv[1]);.  aDelt
5dc0: 61 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  a = (const char*
5dd0: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62  )sqlite3_value_b
5de0: 6c 6f 62 28 61 72 67 76 5b 31 5d 29 3b 0a 0a 20  lob(argv[1]);.. 
5df0: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74   /* Figure out t
5e00: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6f  he size of the o
5e10: 75 74 70 75 74 20 2a 2f 0a 20 20 6e 4f 75 74 20  utput */.  nOut 
5e20: 3d 20 72 62 75 44 65 6c 74 61 4f 75 74 70 75 74  = rbuDeltaOutput
5e30: 53 69 7a 65 28 61 44 65 6c 74 61 2c 20 6e 44 65  Size(aDelta, nDe
5e40: 6c 74 61 29 3b 0a 20 20 69 66 28 20 6e 4f 75 74  lta);.  if( nOut
5e50: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
5e60: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63  3_result_error(c
5e70: 6f 6e 74 65 78 74 2c 20 22 63 6f 72 72 75 70 74  ontext, "corrupt
5e80: 20 66 6f 73 73 69 6c 20 64 65 6c 74 61 22 2c 20   fossil delta", 
5e90: 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  -1);.    return;
5ea0: 0a 20 20 7d 0a 0a 20 20 61 4f 75 74 20 3d 20 73  .  }..  aOut = s
5eb0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 4f  qlite3_malloc(nO
5ec0: 75 74 2b 31 29 3b 0a 20 20 69 66 28 20 61 4f 75  ut+1);.  if( aOu
5ed0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  t==0 ){.    sqli
5ee0: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
5ef0: 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b  _nomem(context);
5f00: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4f  .  }else{.    nO
5f10: 75 74 32 20 3d 20 72 62 75 44 65 6c 74 61 41 70  ut2 = rbuDeltaAp
5f20: 70 6c 79 28 61 4f 72 69 67 2c 20 6e 4f 72 69 67  ply(aOrig, nOrig
5f30: 2c 20 61 44 65 6c 74 61 2c 20 6e 44 65 6c 74 61  , aDelta, nDelta
5f40: 2c 20 61 4f 75 74 29 3b 0a 20 20 20 20 69 66 28  , aOut);.    if(
5f50: 20 6e 4f 75 74 32 21 3d 6e 4f 75 74 20 29 7b 0a   nOut2!=nOut ){.
5f60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
5f70: 65 65 28 61 4f 75 74 29 3b 0a 20 20 20 20 20 20  ee(aOut);.      
5f80: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
5f90: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 63  rror(context, "c
5fa0: 6f 72 72 75 70 74 20 66 6f 73 73 69 6c 20 64 65  orrupt fossil de
5fb0: 6c 74 61 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d  lta", -1);.    }
5fc0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
5fd0: 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28  te3_result_blob(
5fe0: 63 6f 6e 74 65 78 74 2c 20 61 4f 75 74 2c 20 6e  context, aOut, n
5ff0: 4f 75 74 2c 20 73 71 6c 69 74 65 33 5f 66 72 65  Out, sqlite3_fre
6000: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  e);.    }.  }.}.
6010: 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20  ../*.** Prepare 
6020: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
6030: 74 20 69 6e 20 62 75 66 66 65 72 20 7a 53 71 6c  t in buffer zSql
6040: 20 61 67 61 69 6e 73 74 20 64 61 74 61 62 61 73   against databas
6050: 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2a 20  e handle db..** 
6060: 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
6070: 65 74 20 2a 70 70 53 74 6d 74 20 74 6f 20 70 6f  et *ppStmt to po
6080: 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 73  int to the new s
6090: 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 72 65 74  tatement and ret
60a0: 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  urn.** SQLITE_OK
60b0: 2e 20 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  . .**.** Otherwi
60c0: 73 65 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  se, if an error 
60d0: 64 6f 65 73 20 6f 63 63 75 72 2c 20 73 65 74 20  does occur, set 
60e0: 2a 70 70 53 74 6d 74 20 74 6f 20 4e 55 4c 4c 20  *ppStmt to NULL 
60f0: 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 61 6e  and return.** an
6100: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
6110: 64 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79  de. Additionally
6120: 2c 20 73 65 74 20 6f 75 74 70 75 74 20 76 61 72  , set output var
6130: 69 61 62 6c 65 20 2a 70 7a 45 72 72 6d 73 67 20  iable *pzErrmsg 
6140: 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61  to.** point to a
6150: 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
6160: 6e 67 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ng an error mess
6170: 61 67 65 2e 20 49 74 20 69 73 20 74 68 65 20 72  age. It is the r
6180: 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a  esponsibility.**
6190: 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
61a0: 6f 20 28 65 76 65 6e 74 75 61 6c 6c 79 29 20 66  o (eventually) f
61b0: 72 65 65 20 74 68 69 73 20 62 75 66 66 65 72 20  ree this buffer 
61c0: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72  using sqlite3_fr
61d0: 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ee()..*/.static 
61e0: 69 6e 74 20 70 72 65 70 61 72 65 41 6e 64 43 6f  int prepareAndCo
61f0: 6c 6c 65 63 74 45 72 72 6f 72 28 0a 20 20 73 71  llectError(.  sq
6200: 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 73 71  lite3 *db, .  sq
6210: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53  lite3_stmt **ppS
6220: 74 6d 74 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a  tmt,.  char **pz
6230: 45 72 72 6d 73 67 2c 0a 20 20 63 6f 6e 73 74 20  Errmsg,.  const 
6240: 63 68 61 72 20 2a 7a 53 71 6c 0a 29 7b 0a 20 20  char *zSql.){.  
6250: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
6260: 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20  _prepare_v2(db, 
6270: 7a 53 71 6c 2c 20 2d 31 2c 20 70 70 53 74 6d 74  zSql, -1, ppStmt
6280: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
6290: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
62a0: 20 2a 70 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c   *pzErrmsg = sql
62b0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
62c0: 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
62d0: 67 28 64 62 29 29 3b 0a 20 20 20 20 2a 70 70 53  g(db));.    *ppS
62e0: 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  tmt = 0;.  }.  r
62f0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
6300: 2a 2a 20 52 65 73 65 74 20 74 68 65 20 53 51 4c  ** Reset the SQL
6310: 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65   statement passe
6320: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
6330: 72 67 75 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20  rgument. Return 
6340: 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20 74 68 65  a copy.** of the
6350: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
6360: 62 79 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74  by sqlite3_reset
6370: 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ()..**.** If an 
6380: 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
6390: 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 7a  ed, then set *pz
63a0: 45 72 72 6d 73 67 20 74 6f 20 70 6f 69 6e 74 20  Errmsg to point 
63b0: 74 6f 20 61 20 62 75 66 66 65 72 0a 2a 2a 20 63  to a buffer.** c
63c0: 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 65 72 72  ontaining an err
63d0: 6f 72 20 6d 65 73 73 61 67 65 2e 20 49 74 20 69  or message. It i
63e0: 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
63f0: 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
6400: 65 72 0a 2a 2a 20 74 6f 20 65 76 65 6e 74 75 61  er.** to eventua
6410: 6c 6c 79 20 66 72 65 65 20 74 68 69 73 20 62 75  lly free this bu
6420: 66 66 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74  ffer using sqlit
6430: 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74  e3_free()..*/.st
6440: 61 74 69 63 20 69 6e 74 20 72 65 73 65 74 41 6e  atic int resetAn
6450: 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 73 71  dCollectError(sq
6460: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
6470: 74 2c 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 6d  t, char **pzErrm
6480: 73 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  sg){.  int rc = 
6490: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
64a0: 74 6d 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  tmt);.  if( rc!=
64b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
64c0: 20 2a 70 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c   *pzErrmsg = sql
64d0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
64e0: 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
64f0: 67 28 73 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e  g(sqlite3_db_han
6500: 64 6c 65 28 70 53 74 6d 74 29 29 29 3b 0a 20 20  dle(pStmt)));.  
6510: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
6520: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 69  ../*.** Unless i
6530: 74 20 69 73 20 4e 55 4c 4c 2c 20 61 72 67 75 6d  t is NULL, argum
6540: 65 6e 74 20 7a 53 71 6c 20 70 6f 69 6e 74 73 20  ent zSql points 
6550: 74 6f 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f  to a buffer allo
6560: 63 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73  cated using.** s
6570: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 20 63 6f  qlite3_malloc co
6580: 6e 74 61 69 6e 69 6e 67 20 61 6e 20 53 51 4c 20  ntaining an SQL 
6590: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
65a0: 66 75 6e 63 74 69 6f 6e 20 70 72 65 70 61 72 65  function prepare
65b0: 73 20 74 68 65 20 53 51 4c 0a 2a 2a 20 73 74 61  s the SQL.** sta
65c0: 74 65 6d 65 6e 74 20 61 67 61 69 6e 73 74 20 64  tement against d
65d0: 61 74 61 62 61 73 65 20 64 62 20 61 6e 64 20 66  atabase db and f
65e0: 72 65 65 73 20 74 68 65 20 62 75 66 66 65 72 2e  rees the buffer.
65f0: 20 49 66 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a   If statement .*
6600: 2a 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 69 73  * compilation is
6610: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 70   successful, *pp
6620: 53 74 6d 74 20 69 73 20 73 65 74 20 74 6f 20 70  Stmt is set to p
6630: 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20  oint to the new 
6640: 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a 20 68 61  statement .** ha
6650: 6e 64 6c 65 20 61 6e 64 20 53 51 4c 49 54 45 5f  ndle and SQLITE_
6660: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
6670: 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
6680: 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  , if an error oc
6690: 63 75 72 73 2c 20 2a 70 70 53 74 6d 74 20 69 73  curs, *ppStmt is
66a0: 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   set to NULL and
66b0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a   an error code.*
66c0: 2a 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74  * returned. In t
66d0: 68 69 73 20 63 61 73 65 2c 20 2a 70 7a 45 72 72  his case, *pzErr
66e0: 6d 73 67 20 6d 61 79 20 61 6c 73 6f 20 62 65 20  msg may also be 
66f0: 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
6700: 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73  an error.** mess
6710: 61 67 65 2e 20 49 74 20 69 73 20 74 68 65 20 72  age. It is the r
6720: 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
6730: 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 66   the caller to f
6740: 72 65 65 20 74 68 69 73 20 65 72 72 6f 72 20 6d  ree this error m
6750: 65 73 73 61 67 65 0a 2a 2a 20 62 75 66 66 65 72  essage.** buffer
6760: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 66   using sqlite3_f
6770: 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ree()..**.** If 
6780: 61 72 67 75 6d 65 6e 74 20 7a 53 71 6c 20 69 73  argument zSql is
6790: 20 4e 55 4c 4c 2c 20 74 68 69 73 20 66 75 6e 63   NULL, this func
67a0: 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61  tion assumes tha
67b0: 74 20 61 6e 20 4f 4f 4d 20 68 61 73 20 6f 63 63  t an OOM has occ
67c0: 75 72 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68 69  urred..** In thi
67d0: 73 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f  s case SQLITE_NO
67e0: 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20  MEM is returned 
67f0: 61 6e 64 20 2a 70 70 53 74 6d 74 20 73 65 74 20  and *ppStmt set 
6800: 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  to NULL..*/.stat
6810: 69 63 20 69 6e 74 20 70 72 65 70 61 72 65 46 72  ic int prepareFr
6820: 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f  eeAndCollectErro
6830: 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r(.  sqlite3 *db
6840: 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  , .  sqlite3_stm
6850: 74 20 2a 2a 70 70 53 74 6d 74 2c 0a 20 20 63 68  t **ppStmt,.  ch
6860: 61 72 20 2a 2a 70 7a 45 72 72 6d 73 67 2c 0a 20  ar **pzErrmsg,. 
6870: 20 63 68 61 72 20 2a 7a 53 71 6c 0a 29 7b 0a 20   char *zSql.){. 
6880: 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
6890: 74 28 20 2a 70 7a 45 72 72 6d 73 67 3d 3d 30 20  t( *pzErrmsg==0 
68a0: 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  );.  if( zSql==0
68b0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
68c0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 2a  ITE_NOMEM;.    *
68d0: 70 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 65  ppStmt = 0;.  }e
68e0: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 72  lse{.    rc = pr
68f0: 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45  epareAndCollectE
6900: 72 72 6f 72 28 64 62 2c 20 70 70 53 74 6d 74 2c  rror(db, ppStmt,
6910: 20 70 7a 45 72 72 6d 73 67 2c 20 7a 53 71 6c 29   pzErrmsg, zSql)
6920: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
6930: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 0a 20 20  ee(zSql);.  }.  
6940: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
6950: 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 52 62 75  .** Free the Rbu
6960: 4f 62 6a 49 74 65 72 2e 61 7a 54 62 6c 43 6f 6c  ObjIter.azTblCol
6970: 5b 5d 20 61 6e 64 20 52 62 75 4f 62 6a 49 74 65  [] and RbuObjIte
6980: 72 2e 61 62 54 62 6c 50 6b 5b 5d 20 61 72 72 61  r.abTblPk[] arra
6990: 79 73 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  ys allocated.** 
69a0: 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61  by an earlier ca
69b0: 6c 6c 20 74 6f 20 72 62 75 4f 62 6a 49 74 65 72  ll to rbuObjIter
69c0: 43 61 63 68 65 54 61 62 6c 65 49 6e 66 6f 28 29  CacheTableInfo()
69d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
69e0: 20 72 62 75 4f 62 6a 49 74 65 72 46 72 65 65 43   rbuObjIterFreeC
69f0: 6f 6c 73 28 52 62 75 4f 62 6a 49 74 65 72 20 2a  ols(RbuObjIter *
6a00: 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b  pIter){.  int i;
6a10: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
6a20: 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69 2b  ter->nTblCol; i+
6a30: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  +){.    sqlite3_
6a40: 66 72 65 65 28 70 49 74 65 72 2d 3e 61 7a 54 62  free(pIter->azTb
6a50: 6c 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 73 71  lCol[i]);.    sq
6a60: 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72  lite3_free(pIter
6a70: 2d 3e 61 7a 54 62 6c 54 79 70 65 5b 69 5d 29 3b  ->azTblType[i]);
6a80: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
6a90: 72 65 65 28 70 49 74 65 72 2d 3e 61 7a 54 62 6c  ree(pIter->azTbl
6aa0: 43 6f 6c 29 3b 0a 20 20 70 49 74 65 72 2d 3e 61  Col);.  pIter->a
6ab0: 7a 54 62 6c 43 6f 6c 20 3d 20 30 3b 0a 20 20 70  zTblCol = 0;.  p
6ac0: 49 74 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65 20  Iter->azTblType 
6ad0: 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e 61 69  = 0;.  pIter->ai
6ae0: 53 72 63 4f 72 64 65 72 20 3d 20 30 3b 0a 20 20  SrcOrder = 0;.  
6af0: 70 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 20 3d  pIter->abTblPk =
6b00: 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e 61 62 4e   0;.  pIter->abN
6b10: 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 70 49  otNull = 0;.  pI
6b20: 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20 3d 20 30  ter->nTblCol = 0
6b30: 3b 0a 20 20 70 49 74 65 72 2d 3e 65 54 79 70 65  ;.  pIter->eType
6b40: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
6b50: 20 20 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 76      /* Invalid v
6b60: 61 6c 75 65 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a  alue */.}../*.**
6b70: 20 46 69 6e 61 6c 69 7a 65 20 61 6c 6c 20 73 74   Finalize all st
6b80: 61 74 65 6d 65 6e 74 73 20 61 6e 64 20 66 72 65  atements and fre
6b90: 65 20 61 6c 6c 20 61 6c 6c 6f 63 61 74 69 6f 6e  e all allocation
6ba0: 73 20 74 68 61 74 20 61 72 65 20 73 70 65 63 69  s that are speci
6bb0: 66 69 63 20 74 6f 0a 2a 2a 20 74 68 65 20 63 75  fic to.** the cu
6bc0: 72 72 65 6e 74 20 6f 62 6a 65 63 74 20 28 74 61  rrent object (ta
6bd0: 62 6c 65 2f 69 6e 64 65 78 20 70 61 69 72 29 2e  ble/index pair).
6be0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6bf0: 72 62 75 4f 62 6a 49 74 65 72 43 6c 65 61 72 53  rbuObjIterClearS
6c00: 74 61 74 65 6d 65 6e 74 73 28 52 62 75 4f 62 6a  tatements(RbuObj
6c10: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
6c20: 52 62 75 55 70 64 61 74 65 53 74 6d 74 20 2a 70  RbuUpdateStmt *p
6c30: 55 70 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66  Up;..  sqlite3_f
6c40: 69 6e 61 6c 69 7a 65 28 70 49 74 65 72 2d 3e 70  inalize(pIter->p
6c50: 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74  Select);.  sqlit
6c60: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 49 74 65  e3_finalize(pIte
6c70: 72 2d 3e 70 49 6e 73 65 72 74 29 3b 0a 20 20 73  r->pInsert);.  s
6c80: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
6c90: 70 49 74 65 72 2d 3e 70 44 65 6c 65 74 65 29 3b  pIter->pDelete);
6ca0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
6cb0: 69 7a 65 28 70 49 74 65 72 2d 3e 70 54 6d 70 49  ize(pIter->pTmpI
6cc0: 6e 73 65 72 74 29 3b 0a 20 20 70 55 70 20 3d 20  nsert);.  pUp = 
6cd0: 70 49 74 65 72 2d 3e 70 52 62 75 55 70 64 61 74  pIter->pRbuUpdat
6ce0: 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 55 70 20  e;.  while( pUp 
6cf0: 29 7b 0a 20 20 20 20 52 62 75 55 70 64 61 74 65  ){.    RbuUpdate
6d00: 53 74 6d 74 20 2a 70 54 6d 70 20 3d 20 70 55 70  Stmt *pTmp = pUp
6d10: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c  ->pNext;.    sql
6d20: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 55  ite3_finalize(pU
6d30: 70 2d 3e 70 55 70 64 61 74 65 29 3b 0a 20 20 20  p->pUpdate);.   
6d40: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 55   sqlite3_free(pU
6d50: 70 29 3b 0a 20 20 20 20 70 55 70 20 3d 20 70 54  p);.    pUp = pT
6d60: 6d 70 3b 0a 20 20 7d 0a 20 20 0a 20 20 70 49 74  mp;.  }.  .  pIt
6d70: 65 72 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b  er->pSelect = 0;
6d80: 0a 20 20 70 49 74 65 72 2d 3e 70 49 6e 73 65 72  .  pIter->pInser
6d90: 74 20 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e  t = 0;.  pIter->
6da0: 70 44 65 6c 65 74 65 20 3d 20 30 3b 0a 20 20 70  pDelete = 0;.  p
6db0: 49 74 65 72 2d 3e 70 52 62 75 55 70 64 61 74 65  Iter->pRbuUpdate
6dc0: 20 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e 70   = 0;.  pIter->p
6dd0: 54 6d 70 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20  TmpInsert = 0;. 
6de0: 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 20 3d 20 30   pIter->nCol = 0
6df0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e  ;.}../*.** Clean
6e00: 20 75 70 20 61 6e 79 20 72 65 73 6f 75 72 63 65   up any resource
6e10: 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 73 20 70  s allocated as p
6e20: 61 72 74 20 6f 66 20 74 68 65 20 69 74 65 72 61  art of the itera
6e30: 74 6f 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65  tor object passe
6e40: 64 0a 2a 2a 20 61 73 20 74 68 65 20 6f 6e 6c 79  d.** as the only
6e50: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
6e60: 61 74 69 63 20 76 6f 69 64 20 72 62 75 4f 62 6a  atic void rbuObj
6e70: 49 74 65 72 46 69 6e 61 6c 69 7a 65 28 52 62 75  IterFinalize(Rbu
6e80: 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 29 7b  ObjIter *pIter){
6e90: 0a 20 20 72 62 75 4f 62 6a 49 74 65 72 43 6c 65  .  rbuObjIterCle
6ea0: 61 72 53 74 61 74 65 6d 65 6e 74 73 28 70 49 74  arStatements(pIt
6eb0: 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  er);.  sqlite3_f
6ec0: 69 6e 61 6c 69 7a 65 28 70 49 74 65 72 2d 3e 70  inalize(pIter->p
6ed0: 54 62 6c 49 74 65 72 29 3b 0a 20 20 73 71 6c 69  TblIter);.  sqli
6ee0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 49 74  te3_finalize(pIt
6ef0: 65 72 2d 3e 70 49 64 78 49 74 65 72 29 3b 0a 20  er->pIdxIter);. 
6f00: 20 72 62 75 4f 62 6a 49 74 65 72 46 72 65 65 43   rbuObjIterFreeC
6f10: 6f 6c 73 28 70 49 74 65 72 29 3b 0a 20 20 6d 65  ols(pIter);.  me
6f20: 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73  mset(pIter, 0, s
6f30: 69 7a 65 6f 66 28 52 62 75 4f 62 6a 49 74 65 72  izeof(RbuObjIter
6f40: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76  ));.}../*.** Adv
6f50: 61 6e 63 65 20 74 68 65 20 69 74 65 72 61 74 6f  ance the iterato
6f60: 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 70 6f  r to the next po
6f70: 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  sition..**.** If
6f80: 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
6f90: 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
6fa0: 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
6fb0: 69 74 65 72 61 74 6f 72 20 69 73 20 6c 65 66 74  iterator is left
6fc0: 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f   .** pointing to
6fd0: 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2e   the next entry.
6fe0: 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 65   Otherwise, an e
6ff0: 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 6d 65  rror code and me
7000: 73 73 61 67 65 20 69 73 20 0a 2a 2a 20 6c 65 66  ssage is .** lef
7010: 74 20 69 6e 20 74 68 65 20 52 42 55 20 68 61 6e  t in the RBU han
7020: 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dle passed as th
7030: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
7040: 2e 20 41 20 63 6f 70 79 20 6f 66 20 74 68 65 20  . A copy of the 
7050: 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69  .** error code i
7060: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
7070: 74 61 74 69 63 20 69 6e 74 20 72 62 75 4f 62 6a  tatic int rbuObj
7080: 49 74 65 72 4e 65 78 74 28 73 71 6c 69 74 65 33  IterNext(sqlite3
7090: 72 62 75 20 2a 70 2c 20 52 62 75 4f 62 6a 49 74  rbu *p, RbuObjIt
70a0: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e  er *pIter){.  in
70b0: 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20  t rc = p->rc;.  
70c0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
70d0: 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 46 72 65  K ){..    /* Fre
70e0: 65 20 61 6e 79 20 53 51 4c 69 74 65 20 73 74 61  e any SQLite sta
70f0: 74 65 6d 65 6e 74 73 20 75 73 65 64 20 77 68 69  tements used whi
7100: 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68  le processing th
7110: 65 20 70 72 65 76 69 6f 75 73 20 6f 62 6a 65 63  e previous objec
7120: 74 20 2a 2f 20 0a 20 20 20 20 72 62 75 4f 62 6a  t */ .    rbuObj
7130: 49 74 65 72 43 6c 65 61 72 53 74 61 74 65 6d 65  IterClearStateme
7140: 6e 74 73 28 70 49 74 65 72 29 3b 0a 20 20 20 20  nts(pIter);.    
7150: 69 66 28 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d  if( pIter->zIdx=
7160: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
7170: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
7180: 3e 64 62 4d 61 69 6e 2c 0a 20 20 20 20 20 20 20  >dbMain,.       
7190: 20 20 20 22 44 52 4f 50 20 54 52 49 47 47 45 52     "DROP TRIGGER
71a0: 20 49 46 20 45 58 49 53 54 53 20 74 65 6d 70 2e   IF EXISTS temp.
71b0: 72 62 75 5f 69 6e 73 65 72 74 5f 74 72 3b 22 0a  rbu_insert_tr;".
71c0: 20 20 20 20 20 20 20 20 20 20 22 44 52 4f 50 20            "DROP 
71d0: 54 52 49 47 47 45 52 20 49 46 20 45 58 49 53 54  TRIGGER IF EXIST
71e0: 53 20 74 65 6d 70 2e 72 62 75 5f 75 70 64 61 74  S temp.rbu_updat
71f0: 65 31 5f 74 72 3b 22 0a 20 20 20 20 20 20 20 20  e1_tr;".        
7200: 20 20 22 44 52 4f 50 20 54 52 49 47 47 45 52 20    "DROP TRIGGER 
7210: 49 46 20 45 58 49 53 54 53 20 74 65 6d 70 2e 72  IF EXISTS temp.r
7220: 62 75 5f 75 70 64 61 74 65 32 5f 74 72 3b 22 0a  bu_update2_tr;".
7230: 20 20 20 20 20 20 20 20 20 20 22 44 52 4f 50 20            "DROP 
7240: 54 52 49 47 47 45 52 20 49 46 20 45 58 49 53 54  TRIGGER IF EXIST
7250: 53 20 74 65 6d 70 2e 72 62 75 5f 64 65 6c 65 74  S temp.rbu_delet
7260: 65 5f 74 72 3b 22 0a 20 20 20 20 20 20 20 20 20  e_tr;".         
7270: 20 2c 20 30 2c 20 30 2c 20 26 70 2d 3e 7a 45 72   , 0, 0, &p->zEr
7280: 72 6d 73 67 0a 20 20 20 20 20 20 29 3b 0a 20 20  rmsg.      );.  
7290: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d    }..    if( rc=
72a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
72b0: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62      if( pIter->b
72c0: 43 6c 65 61 6e 75 70 20 29 7b 0a 20 20 20 20 20  Cleanup ){.     
72d0: 20 20 20 72 62 75 4f 62 6a 49 74 65 72 46 72 65     rbuObjIterFre
72e0: 65 43 6f 6c 73 28 70 49 74 65 72 29 3b 0a 20 20  eCols(pIter);.  
72f0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62 43 6c        pIter->bCl
7300: 65 61 6e 75 70 20 3d 20 30 3b 0a 20 20 20 20 20  eanup = 0;.     
7310: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
7320: 73 74 65 70 28 70 49 74 65 72 2d 3e 70 54 62 6c  step(pIter->pTbl
7330: 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69  Iter);.        i
7340: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f  f( rc!=SQLITE_RO
7350: 57 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  W ){.          r
7360: 63 20 3d 20 72 65 73 65 74 41 6e 64 43 6f 6c 6c  c = resetAndColl
7370: 65 63 74 45 72 72 6f 72 28 70 49 74 65 72 2d 3e  ectError(pIter->
7380: 70 54 62 6c 49 74 65 72 2c 20 26 70 2d 3e 7a 45  pTblIter, &p->zE
7390: 72 72 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  rrmsg);.        
73a0: 20 20 70 49 74 65 72 2d 3e 7a 54 62 6c 20 3d 20    pIter->zTbl = 
73b0: 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
73c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  {.          pIte
73d0: 72 2d 3e 7a 54 62 6c 20 3d 20 28 63 6f 6e 73 74  r->zTbl = (const
73e0: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
73f0: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 49 74 65 72  olumn_text(pIter
7400: 2d 3e 70 54 62 6c 49 74 65 72 2c 20 30 29 3b 0a  ->pTblIter, 0);.
7410: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
7420: 3e 7a 44 61 74 61 54 62 6c 20 3d 20 28 63 6f 6e  >zDataTbl = (con
7430: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
7440: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 49 74  _column_text(pIt
7450: 65 72 2d 3e 70 54 62 6c 49 74 65 72 2c 31 29 3b  er->pTblIter,1);
7460: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
7470: 28 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c  (pIter->zDataTbl
7480: 20 26 26 20 70 49 74 65 72 2d 3e 7a 54 62 6c 29   && pIter->zTbl)
7490: 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53   ? SQLITE_OK : S
74a0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
74b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
74c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
74d0: 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d 30 20 29  pIter->zIdx==0 )
74e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
74f0: 74 65 33 5f 73 74 6d 74 20 2a 70 49 64 78 20 3d  te3_stmt *pIdx =
7500: 20 70 49 74 65 72 2d 3e 70 49 64 78 49 74 65 72   pIter->pIdxIter
7510: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
7520: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
7530: 78 74 28 70 49 64 78 2c 20 31 2c 20 70 49 74 65  xt(pIdx, 1, pIte
7540: 72 2d 3e 7a 54 62 6c 2c 20 2d 31 2c 20 53 51 4c  r->zTbl, -1, SQL
7550: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
7560: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
7570: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
7580: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
7590: 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
75a0: 70 49 74 65 72 2d 3e 70 49 64 78 49 74 65 72 29  pIter->pIdxIter)
75b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
75c0: 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  rc!=SQLITE_ROW )
75d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
75e0: 20 3d 20 72 65 73 65 74 41 6e 64 43 6f 6c 6c 65   = resetAndColle
75f0: 63 74 45 72 72 6f 72 28 70 49 74 65 72 2d 3e 70  ctError(pIter->p
7600: 49 64 78 49 74 65 72 2c 20 26 70 2d 3e 7a 45 72  IdxIter, &p->zEr
7610: 72 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20  rmsg);.         
7620: 20 20 20 70 49 74 65 72 2d 3e 62 43 6c 65 61 6e     pIter->bClean
7630: 75 70 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  up = 1;.        
7640: 20 20 20 20 70 49 74 65 72 2d 3e 7a 49 64 78 20      pIter->zIdx 
7650: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
7660: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
7670: 20 20 70 49 74 65 72 2d 3e 7a 49 64 78 20 3d 20    pIter->zIdx = 
7680: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
7690: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
76a0: 28 70 49 74 65 72 2d 3e 70 49 64 78 49 74 65 72  (pIter->pIdxIter
76b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
76c0: 20 20 70 49 74 65 72 2d 3e 69 54 6e 75 6d 20 3d    pIter->iTnum =
76d0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
76e0: 69 6e 74 28 70 49 74 65 72 2d 3e 70 49 64 78 49  int(pIter->pIdxI
76f0: 74 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ter, 1);.       
7700: 20 20 20 20 20 70 49 74 65 72 2d 3e 62 55 6e 69       pIter->bUni
7710: 71 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  que = sqlite3_co
7720: 6c 75 6d 6e 5f 69 6e 74 28 70 49 74 65 72 2d 3e  lumn_int(pIter->
7730: 70 49 64 78 49 74 65 72 2c 20 32 29 3b 0a 20 20  pIdxIter, 2);.  
7740: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
7750: 49 74 65 72 2d 3e 7a 49 64 78 20 3f 20 53 51 4c  Iter->zIdx ? SQL
7760: 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f  ITE_OK : SQLITE_
7770: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
7780: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
7790: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
77a0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
77b0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 62 75 4f 62  _OK ){.    rbuOb
77c0: 6a 49 74 65 72 46 69 6e 61 6c 69 7a 65 28 70 49  jIterFinalize(pI
77d0: 74 65 72 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20  ter);.    p->rc 
77e0: 3d 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = rc;.  }.  retu
77f0: 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
7800: 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
7810: 69 6f 6e 20 6f 66 20 74 68 65 20 72 62 75 5f 74  ion of the rbu_t
7820: 61 72 67 65 74 5f 6e 61 6d 65 28 29 20 53 51 4c  arget_name() SQL
7830: 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 69 73 20   function. This 
7840: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 63 63 65  function.** acce
7850: 70 74 73 20 6f 6e 65 20 6f 72 20 74 77 6f 20 61  pts one or two a
7860: 72 67 75 6d 65 6e 74 73 2e 20 54 68 65 20 66 69  rguments. The fi
7870: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
7880: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 61  the name of a ta
7890: 62 6c 65 20 2d 0a 2a 2a 20 74 68 65 20 6e 61 6d  ble -.** the nam
78a0: 65 20 6f 66 20 61 20 74 61 62 6c 65 20 69 6e 20  e of a table in 
78b0: 74 68 65 20 52 42 55 20 64 61 74 61 62 61 73 65  the RBU database
78c0: 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 2c 20 69  .  The second, i
78d0: 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2c  f it is present,
78e0: 20 69 73 20 31 0a 2a 2a 20 66 6f 72 20 61 20 76   is 1.** for a v
78f0: 69 65 77 20 6f 72 20 30 20 66 6f 72 20 61 20 74  iew or 0 for a t
7900: 61 62 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72  able. .**.** For
7910: 20 61 20 6e 6f 6e 2d 76 61 63 75 75 6d 20 52 42   a non-vacuum RB
7920: 55 20 68 61 6e 64 6c 65 2c 20 69 66 20 74 68 65  U handle, if the
7930: 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d 61 74 63   table name matc
7940: 68 65 73 20 74 68 65 20 70 61 74 74 65 72 6e 3a  hes the pattern:
7950: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 61 74 61 5b  .**.**     data[
7960: 30 2d 39 5d 5f 3c 6e 61 6d 65 3e 0a 2a 2a 0a 2a  0-9]_<name>.**.*
7970: 2a 20 77 68 65 72 65 20 3c 6e 61 6d 65 3e 20 69  * where <name> i
7980: 73 20 61 6e 79 20 73 65 71 75 65 6e 63 65 20 6f  s any sequence o
7990: 66 20 31 20 6f 72 20 6d 6f 72 65 20 63 68 61 72  f 1 or more char
79a0: 61 63 74 65 72 73 2c 20 3c 6e 61 6d 65 3e 20 69  acters, <name> i
79b0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f  s returned..** O
79c0: 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
79d0: 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 64   only argument d
79e0: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68  oes not match th
79f0: 65 20 61 62 6f 76 65 20 70 61 74 74 65 72 6e 2c  e above pattern,
7a00: 20 61 6e 20 53 51 4c 0a 2a 2a 20 4e 55 4c 4c 20   an SQL.** NULL 
7a10: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
7a20: 2a 2a 20 20 20 20 20 22 64 61 74 61 5f 74 31 22  **     "data_t1"
7a30: 20 20 20 20 20 2d 3e 20 22 74 31 22 0a 2a 2a 20       -> "t1".** 
7a40: 20 20 20 20 22 64 61 74 61 30 31 32 33 5f 74 32      "data0123_t2
7a50: 22 20 2d 3e 20 22 74 32 22 0a 2a 2a 20 20 20 20  " -> "t2".**    
7a60: 20 22 64 61 74 61 41 42 5f 74 33 22 20 20 20 2d   "dataAB_t3"   -
7a70: 3e 20 4e 55 4c 4c 0a 2a 2a 0a 2a 2a 20 46 6f 72  > NULL.**.** For
7a80: 20 61 6e 20 72 62 75 20 76 61 63 75 75 6d 20 68   an rbu vacuum h
7a90: 61 6e 64 6c 65 2c 20 61 20 63 6f 70 79 20 6f 66  andle, a copy of
7aa0: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
7ab0: 65 6e 74 20 69 73 20 72 65 74 75 72 6e 65 64 20  ent is returned 
7ac0: 69 66 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64  if.** the second
7ad0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 65 69 74   argument is eit
7ae0: 68 65 72 20 6d 69 73 73 69 6e 67 20 6f 72 20 30  her missing or 0
7af0: 20 28 6e 6f 74 20 61 20 76 69 65 77 29 2e 0a 2a   (not a view)..*
7b00: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62  /.static void rb
7b10: 75 54 61 72 67 65 74 4e 61 6d 65 46 75 6e 63 28  uTargetNameFunc(
7b20: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
7b30: 78 74 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20  xt *pCtx,.  int 
7b40: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
7b50: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
7b60: 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 20    sqlite3rbu *p 
7b70: 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  = sqlite3_user_d
7b80: 61 74 61 28 70 43 74 78 29 3b 0a 20 20 63 6f 6e  ata(pCtx);.  con
7b90: 73 74 20 63 68 61 72 20 2a 7a 49 6e 3b 0a 20 20  st char *zIn;.  
7ba0: 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20  assert( argc==1 
7bb0: 7c 7c 20 61 72 67 63 3d 3d 32 20 29 3b 0a 0a 20  || argc==2 );.. 
7bc0: 20 7a 49 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68   zIn = (const ch
7bd0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
7be0: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
7bf0: 0a 20 20 69 66 28 20 7a 49 6e 20 29 7b 0a 20 20  .  if( zIn ){.  
7c00: 20 20 69 66 28 20 72 62 75 49 73 56 61 63 75 75    if( rbuIsVacuu
7c10: 6d 28 70 29 20 29 7b 0a 20 20 20 20 20 20 69 66  m(p) ){.      if
7c20: 28 20 61 72 67 63 3d 3d 31 20 7c 7c 20 30 3d 3d  ( argc==1 || 0==
7c30: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
7c40: 74 28 61 72 67 76 5b 31 5d 29 20 29 7b 0a 20 20  t(argv[1]) ){.  
7c50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
7c60: 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20  sult_text(pCtx, 
7c70: 7a 49 6e 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  zIn, -1, SQLITE_
7c80: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d  STATIC);.      }
7c90: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7ca0: 20 20 69 66 28 20 73 74 72 6c 65 6e 28 7a 49 6e    if( strlen(zIn
7cb0: 29 3e 34 20 26 26 20 6d 65 6d 63 6d 70 28 22 64  )>4 && memcmp("d
7cc0: 61 74 61 22 2c 20 7a 49 6e 2c 20 34 29 3d 3d 30  ata", zIn, 4)==0
7cd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
7ce0: 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  i;.        for(i
7cf0: 3d 34 3b 20 7a 49 6e 5b 69 5d 3e 3d 27 30 27 20  =4; zIn[i]>='0' 
7d00: 26 26 20 7a 49 6e 5b 69 5d 3c 3d 27 39 27 3b 20  && zIn[i]<='9'; 
7d10: 69 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  i++);.        if
7d20: 28 20 7a 49 6e 5b 69 5d 3d 3d 27 5f 27 20 26 26  ( zIn[i]=='_' &&
7d30: 20 7a 49 6e 5b 69 2b 31 5d 20 29 7b 0a 20 20 20   zIn[i+1] ){.   
7d40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
7d50: 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c  esult_text(pCtx,
7d60: 20 26 7a 49 6e 5b 69 2b 31 5d 2c 20 2d 31 2c 20   &zIn[i+1], -1, 
7d70: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
7d80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7d90: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
7da0: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
7db0: 74 68 65 20 69 74 65 72 61 74 6f 72 20 73 74 72  the iterator str
7dc0: 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73  ucture passed as
7dd0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
7de0: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  ment..**.** If n
7df0: 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
7e00: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
7e10: 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 69 74  urned and the it
7e20: 65 72 61 74 6f 72 20 69 73 20 6c 65 66 74 20 0a  erator is left .
7e30: 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ** pointing to t
7e40: 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20  he first entry. 
7e50: 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 65 72  Otherwise, an er
7e60: 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 6d 65 73  ror code and mes
7e70: 73 61 67 65 20 69 73 20 0a 2a 2a 20 6c 65 66 74  sage is .** left
7e80: 20 69 6e 20 74 68 65 20 52 42 55 20 68 61 6e 64   in the RBU hand
7e90: 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  le passed as the
7ea0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
7eb0: 20 41 20 63 6f 70 79 20 6f 66 20 74 68 65 20 0a   A copy of the .
7ec0: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
7ed0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
7ee0: 61 74 69 63 20 69 6e 74 20 72 62 75 4f 62 6a 49  atic int rbuObjI
7ef0: 74 65 72 46 69 72 73 74 28 73 71 6c 69 74 65 33  terFirst(sqlite3
7f00: 72 62 75 20 2a 70 2c 20 52 62 75 4f 62 6a 49 74  rbu *p, RbuObjIt
7f10: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e  er *pIter){.  in
7f20: 74 20 72 63 3b 0a 20 20 6d 65 6d 73 65 74 28 70  t rc;.  memset(p
7f30: 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
7f40: 52 62 75 4f 62 6a 49 74 65 72 29 29 3b 0a 0a 20  RbuObjIter));.. 
7f50: 20 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65   rc = prepareFre
7f60: 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72  eAndCollectError
7f70: 28 70 2d 3e 64 62 52 62 75 2c 20 26 70 49 74 65  (p->dbRbu, &pIte
7f80: 72 2d 3e 70 54 62 6c 49 74 65 72 2c 20 26 70 2d  r->pTblIter, &p-
7f90: 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 73  >zErrmsg, .    s
7fa0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
7fb0: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 72 62        "SELECT rb
7fc0: 75 5f 74 61 72 67 65 74 5f 6e 61 6d 65 28 6e 61  u_target_name(na
7fd0: 6d 65 2c 20 74 79 70 65 3d 27 76 69 65 77 27 29  me, type='view')
7fe0: 20 41 53 20 74 61 72 67 65 74 2c 20 6e 61 6d 65   AS target, name
7ff0: 20 22 0a 20 20 20 20 20 20 22 46 52 4f 4d 20 73   ".      "FROM s
8000: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20  qlite_master ". 
8010: 20 20 20 20 20 22 57 48 45 52 45 20 74 79 70 65       "WHERE type
8020: 20 49 4e 20 28 27 74 61 62 6c 65 27 2c 20 27 76   IN ('table', 'v
8030: 69 65 77 27 29 20 41 4e 44 20 74 61 72 67 65 74  iew') AND target
8040: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 22 0a 20   IS NOT NULL ". 
8050: 20 20 20 20 20 22 20 25 73 20 22 0a 20 20 20 20       " %s ".    
8060: 20 20 22 4f 52 44 45 52 20 42 59 20 6e 61 6d 65    "ORDER BY name
8070: 22 0a 20 20 2c 20 72 62 75 49 73 56 61 63 75 75  ".  , rbuIsVacuu
8080: 6d 28 70 29 20 3f 20 22 41 4e 44 20 72 6f 6f 74  m(p) ? "AND root
8090: 70 61 67 65 21 3d 30 20 41 4e 44 20 72 6f 6f 74  page!=0 AND root
80a0: 70 61 67 65 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  page IS NOT NULL
80b0: 22 20 3a 20 22 22 29 29 3b 0a 0a 20 20 69 66 28  " : ""));..  if(
80c0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
80d0: 7b 0a 20 20 20 20 72 63 20 3d 20 70 72 65 70 61  {.    rc = prepa
80e0: 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f  reAndCollectErro
80f0: 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 49  r(p->dbMain, &pI
8100: 74 65 72 2d 3e 70 49 64 78 49 74 65 72 2c 20 26  ter->pIdxIter, &
8110: 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20  p->zErrmsg,.    
8120: 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65      "SELECT name
8130: 2c 20 72 6f 6f 74 70 61 67 65 2c 20 73 71 6c 20  , rootpage, sql 
8140: 49 53 20 4e 55 4c 4c 20 4f 52 20 73 75 62 73 74  IS NULL OR subst
8150: 72 28 38 2c 20 36 29 3d 3d 27 55 4e 49 51 55 45  r(8, 6)=='UNIQUE
8160: 27 20 22 0a 20 20 20 20 20 20 20 20 22 20 20 46  ' ".        "  F
8170: 52 4f 4d 20 6d 61 69 6e 2e 73 71 6c 69 74 65 5f  ROM main.sqlite_
8180: 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20 20  master ".       
8190: 20 22 20 20 57 48 45 52 45 20 74 79 70 65 3d 27   "  WHERE type='
81a0: 69 6e 64 65 78 27 20 41 4e 44 20 74 62 6c 5f 6e  index' AND tbl_n
81b0: 61 6d 65 20 3d 20 3f 22 0a 20 20 20 20 29 3b 0a  ame = ?".    );.
81c0: 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e 62 43    }..  pIter->bC
81d0: 6c 65 61 6e 75 70 20 3d 20 31 3b 0a 20 20 70 2d  leanup = 1;.  p-
81e0: 3e 72 63 20 3d 20 72 63 3b 0a 20 20 72 65 74 75  >rc = rc;.  retu
81f0: 72 6e 20 72 62 75 4f 62 6a 49 74 65 72 4e 65 78  rn rbuObjIterNex
8200: 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a  t(p, pIter);.}..
8210: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
8220: 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 22  wrapper around "
8230: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
8240: 7a 46 6d 74 2c 20 2e 2e 2e 29 22 2e 20 49 66 20  zFmt, ...)". If 
8250: 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 0a 2a  an OOM occurs,.*
8260: 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  * an error code 
8270: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  is stored in the
8280: 20 52 42 55 20 68 61 6e 64 6c 65 20 70 61 73 73   RBU handle pass
8290: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
82a0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
82b0: 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  If an error has 
82c0: 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
82d0: 20 28 70 2d 3e 72 63 20 69 73 20 61 6c 72 65 61   (p->rc is alrea
82e0: 64 79 20 73 65 74 20 74 6f 20 73 6f 6d 65 74 68  dy set to someth
82f0: 69 6e 67 20 6f 74 68 65 72 0a 2a 2a 20 74 68 61  ing other.** tha
8300: 6e 20 53 51 4c 49 54 45 5f 4f 4b 29 2c 20 74 68  n SQLITE_OK), th
8310: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
8320: 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 77 69   returns NULL wi
8330: 74 68 6f 75 74 20 6d 6f 64 69 66 79 69 6e 67 20  thout modifying 
8340: 74 68 65 0a 2a 2a 20 73 74 6f 72 65 64 20 65 72  the.** stored er
8350: 72 6f 72 20 63 6f 64 65 2e 20 49 6e 20 74 68 69  ror code. In thi
8360: 73 20 63 61 73 65 20 69 74 20 73 74 69 6c 6c 20  s case it still 
8370: 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f 66 72  calls sqlite3_fr
8380: 65 65 28 29 20 6f 6e 20 61 6e 79 20 0a 2a 2a 20  ee() on any .** 
8390: 70 72 69 6e 74 66 28 29 20 70 61 72 61 6d 65 74  printf() paramet
83a0: 65 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ers associated w
83b0: 69 74 68 20 25 7a 20 63 6f 6e 76 65 72 73 69 6f  ith %z conversio
83c0: 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ns..*/.static ch
83d0: 61 72 20 2a 72 62 75 4d 50 72 69 6e 74 66 28 73  ar *rbuMPrintf(s
83e0: 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 63 6f  qlite3rbu *p, co
83f0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20  nst char *zFmt, 
8400: 2e 2e 2e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 53  ...){.  char *zS
8410: 71 6c 20 3d 20 30 3b 0a 20 20 76 61 5f 6c 69 73  ql = 0;.  va_lis
8420: 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74  t ap;.  va_start
8430: 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 7a 53  (ap, zFmt);.  zS
8440: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70  ql = sqlite3_vmp
8450: 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b  rintf(zFmt, ap);
8460: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
8470: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
8480: 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 70 2d 3e  f( zSql==0 ) p->
8490: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
84a0: 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  M;.  }else{.    
84b0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
84c0: 6c 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 30  l);.    zSql = 0
84d0: 3b 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61  ;.  }.  va_end(a
84e0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 71  p);.  return zSq
84f0: 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75  l;.}../*.** Argu
8500: 6d 65 6e 74 20 7a 46 6d 74 20 69 73 20 61 20 73  ment zFmt is a s
8510: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 29  qlite3_mprintf()
8520: 20 73 74 79 6c 65 20 66 6f 72 6d 61 74 20 73 74   style format st
8530: 72 69 6e 67 2e 20 54 68 65 20 74 72 61 69 6c 69  ring. The traili
8540: 6e 67 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20  ng.** arguments 
8550: 61 72 65 20 74 68 65 20 75 73 75 61 6c 20 73 75  are the usual su
8560: 62 73 69 74 75 74 69 6f 6e 20 76 61 6c 75 65 73  bsitution values
8570: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
8580: 70 65 72 66 6f 72 6d 73 0a 2a 2a 20 74 68 65 20  performs.** the 
8590: 70 72 69 6e 74 66 28 29 20 73 74 79 6c 65 20 73  printf() style s
85a0: 75 62 73 74 69 74 75 74 69 6f 6e 73 20 61 6e 64  ubstitutions and
85b0: 20 65 78 65 63 75 74 65 73 20 74 68 65 20 72 65   executes the re
85c0: 73 75 6c 74 20 61 73 20 61 6e 20 53 51 4c 0a 2a  sult as an SQL.*
85d0: 2a 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 74  * statement on t
85e0: 68 65 20 52 42 55 20 68 61 6e 64 6c 65 73 20 64  he RBU handles d
85f0: 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  atabase..**.** I
8600: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
8610: 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  s, an error code
8620: 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61   and error messa
8630: 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ge is stored in 
8640: 74 68 65 0a 2a 2a 20 52 42 55 20 68 61 6e 64 6c  the.** RBU handl
8650: 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68  e. If an error h
8660: 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
8670: 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  red when this fu
8680: 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c  nction is.** cal
8690: 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
86a0: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
86b0: 74 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63  t rbuMPrintfExec
86c0: 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20  (sqlite3rbu *p, 
86d0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
86e0: 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20 2e  st char *zFmt, .
86f0: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
8700: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  p;.  char *zSql;
8710: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
8720: 7a 46 6d 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20  zFmt);.  zSql = 
8730: 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66  sqlite3_vmprintf
8740: 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20 69 66  (zFmt, ap);.  if
8750: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
8760: 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 53  OK ){.    if( zS
8770: 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ql==0 ){.      p
8780: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
8790: 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
87a0: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71        p->rc = sq
87b0: 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a  lite3_exec(db, z
87c0: 53 71 6c 2c 20 30 2c 20 30 2c 20 26 70 2d 3e 7a  Sql, 0, 0, &p->z
87d0: 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 7d 0a 20  Errmsg);.    }. 
87e0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
87f0: 65 28 7a 53 71 6c 29 3b 0a 20 20 76 61 5f 65 6e  e(zSql);.  va_en
8800: 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  d(ap);.  return 
8810: 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p->rc;.}../*.** 
8820: 41 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63  Attempt to alloc
8830: 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ate and return a
8840: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 7a 65   pointer to a ze
8850: 72 6f 65 64 20 62 6c 6f 63 6b 20 6f 66 20 6e 42  roed block of nB
8860: 79 74 65 20 0a 2a 2a 20 62 79 74 65 73 2e 20 0a  yte .** bytes. .
8870: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
8880: 72 20 28 69 2e 65 2e 20 61 6e 20 4f 4f 4d 20 63  r (i.e. an OOM c
8890: 6f 6e 64 69 74 69 6f 6e 29 20 6f 63 63 75 72 73  ondition) occurs
88a0: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e  , return NULL an
88b0: 64 20 6c 65 61 76 65 20 61 6e 20 0a 2a 2a 20 65  d leave an .** e
88c0: 72 72 6f 72 20 63 6f 64 65 20 69 6e 20 74 68 65  rror code in the
88d0: 20 72 62 75 20 68 61 6e 64 6c 65 20 70 61 73 73   rbu handle pass
88e0: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
88f0: 61 72 67 75 6d 65 6e 74 2e 20 4f 72 2c 20 69 66  argument. Or, if
8900: 20 61 6e 20 0a 2a 2a 20 65 72 72 6f 72 20 68 61   an .** error ha
8910: 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
8920: 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
8930: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
8940: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 0a 2a 2a   return NULL .**
8950: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 77 69 74   immediately wit
8960: 68 6f 75 74 20 61 74 74 65 6d 70 74 69 6e 67 20  hout attempting 
8970: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f  the allocation o
8980: 72 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20  r modifying the 
8990: 73 74 6f 72 65 64 0a 2a 2a 20 65 72 72 6f 72 20  stored.** error 
89a0: 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
89b0: 76 6f 69 64 20 2a 72 62 75 4d 61 6c 6c 6f 63 28  void *rbuMalloc(
89c0: 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 69  sqlite3rbu *p, i
89d0: 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 76 6f 69  nt nByte){.  voi
89e0: 64 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69  d *pRet = 0;.  i
89f0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
8a00: 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
8a10: 74 28 20 6e 42 79 74 65 3e 30 20 29 3b 0a 20 20  t( nByte>0 );.  
8a20: 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
8a30: 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29  _malloc64(nByte)
8a40: 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74 3d 3d  ;.    if( pRet==
8a50: 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63  0 ){.      p->rc
8a60: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
8a70: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8a80: 20 20 6d 65 6d 73 65 74 28 70 52 65 74 2c 20 30    memset(pRet, 0
8a90: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a  , nByte);.    }.
8aa0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
8ab0: 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  t;.}.../*.** All
8ac0: 6f 63 61 74 65 20 61 6e 64 20 7a 65 72 6f 20 74  ocate and zero t
8ad0: 68 65 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43  he pIter->azTblC
8ae0: 6f 6c 5b 5d 20 61 6e 64 20 61 62 54 62 6c 50 6b  ol[] and abTblPk
8af0: 5b 5d 20 61 72 72 61 79 73 20 73 6f 20 74 68 61  [] arrays so tha
8b00: 74 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 72 6f  t.** there is ro
8b10: 6f 6d 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20  om for at least 
8b20: 6e 43 6f 6c 20 65 6c 65 6d 65 6e 74 73 2e 20 49  nCol elements. I
8b30: 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c  f an OOM occurs,
8b40: 20 73 74 6f 72 65 20 61 6e 0a 2a 2a 20 65 72 72   store an.** err
8b50: 6f 72 20 63 6f 64 65 20 69 6e 20 74 68 65 20 52  or code in the R
8b60: 42 55 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64  BU handle passed
8b70: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
8b80: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
8b90: 63 20 76 6f 69 64 20 72 62 75 41 6c 6c 6f 63 61  c void rbuAlloca
8ba0: 74 65 49 74 65 72 41 72 72 61 79 73 28 73 71 6c  teIterArrays(sql
8bb0: 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62 75 4f  ite3rbu *p, RbuO
8bc0: 62 6a 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69  bjIter *pIter, i
8bd0: 6e 74 20 6e 43 6f 6c 29 7b 0a 20 20 69 6e 74 20  nt nCol){.  int 
8be0: 6e 42 79 74 65 20 3d 20 28 32 2a 73 69 7a 65 6f  nByte = (2*sizeo
8bf0: 66 28 63 68 61 72 2a 29 20 2b 20 73 69 7a 65 6f  f(char*) + sizeo
8c00: 66 28 69 6e 74 29 20 2b 20 33 2a 73 69 7a 65 6f  f(int) + 3*sizeo
8c10: 66 28 75 38 29 29 20 2a 20 6e 43 6f 6c 3b 0a 20  f(u8)) * nCol;. 
8c20: 20 63 68 61 72 20 2a 2a 61 7a 4e 65 77 3b 0a 0a   char **azNew;..
8c30: 20 20 61 7a 4e 65 77 20 3d 20 28 63 68 61 72 2a    azNew = (char*
8c40: 2a 29 72 62 75 4d 61 6c 6c 6f 63 28 70 2c 20 6e  *)rbuMalloc(p, n
8c50: 42 79 74 65 29 3b 0a 20 20 69 66 28 20 61 7a 4e  Byte);.  if( azN
8c60: 65 77 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  ew ){.    pIter-
8c70: 3e 61 7a 54 62 6c 43 6f 6c 20 3d 20 61 7a 4e 65  >azTblCol = azNe
8c80: 77 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 7a  w;.    pIter->az
8c90: 54 62 6c 54 79 70 65 20 3d 20 26 61 7a 4e 65 77  TblType = &azNew
8ca0: 5b 6e 43 6f 6c 5d 3b 0a 20 20 20 20 70 49 74 65  [nCol];.    pIte
8cb0: 72 2d 3e 61 69 53 72 63 4f 72 64 65 72 20 3d 20  r->aiSrcOrder = 
8cc0: 28 69 6e 74 2a 29 26 70 49 74 65 72 2d 3e 61 7a  (int*)&pIter->az
8cd0: 54 62 6c 54 79 70 65 5b 6e 43 6f 6c 5d 3b 0a 20  TblType[nCol];. 
8ce0: 20 20 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50     pIter->abTblP
8cf0: 6b 20 3d 20 28 75 38 2a 29 26 70 49 74 65 72 2d  k = (u8*)&pIter-
8d00: 3e 61 69 53 72 63 4f 72 64 65 72 5b 6e 43 6f 6c  >aiSrcOrder[nCol
8d10: 5d 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 62  ];.    pIter->ab
8d20: 4e 6f 74 4e 75 6c 6c 20 3d 20 28 75 38 2a 29 26  NotNull = (u8*)&
8d30: 70 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 6e  pIter->abTblPk[n
8d40: 43 6f 6c 5d 3b 0a 20 20 20 20 70 49 74 65 72 2d  Col];.    pIter-
8d50: 3e 61 62 49 6e 64 65 78 65 64 20 3d 20 28 75 38  >abIndexed = (u8
8d60: 2a 29 26 70 49 74 65 72 2d 3e 61 62 4e 6f 74 4e  *)&pIter->abNotN
8d70: 75 6c 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 7d 0a 7d  ull[nCol];.  }.}
8d80: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ../*.** The firs
8d90: 74 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20  t argument must 
8da0: 62 65 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  be a nul-termina
8db0: 74 65 64 20 73 74 72 69 6e 67 2e 20 54 68 69 73  ted string. This
8dc0: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 74   function.** ret
8dd0: 75 72 6e 73 20 61 20 63 6f 70 79 20 6f 66 20 74  urns a copy of t
8de0: 68 65 20 73 74 72 69 6e 67 20 69 6e 20 6d 65 6d  he string in mem
8df0: 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
8e00: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
8e10: 28 29 2e 0a 2a 2a 20 49 74 20 69 73 20 74 68 65  ()..** It is the
8e20: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
8e30: 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
8e40: 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
8e50: 20 74 68 69 73 20 6d 65 6d 6f 72 79 0a 2a 2a 20   this memory.** 
8e60: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72  using sqlite3_fr
8e70: 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ee()..**.** If a
8e80: 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20  n OOM condition 
8e90: 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77  is encountered w
8ea0: 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74  hen attempting t
8eb0: 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  o allocate memor
8ec0: 79 2c 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61 72  y,.** output var
8ed0: 69 61 62 6c 65 20 28 2a 70 52 63 29 20 69 73 20  iable (*pRc) is 
8ee0: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f  set to SQLITE_NO
8ef0: 4d 45 4d 20 62 65 66 6f 72 65 20 72 65 74 75 72  MEM before retur
8f00: 6e 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c  ning. Otherwise,
8f10: 0a 2a 2a 20 69 66 20 74 68 65 20 61 6c 6c 6f 63  .** if the alloc
8f20: 61 74 69 6f 6e 20 73 75 63 63 65 65 64 73 2c 20  ation succeeds, 
8f30: 28 2a 70 52 63 29 20 69 73 20 6c 65 66 74 20 75  (*pRc) is left u
8f40: 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61  nchanged..*/.sta
8f50: 74 69 63 20 63 68 61 72 20 2a 72 62 75 53 74 72  tic char *rbuStr
8f60: 6e 64 75 70 28 63 6f 6e 73 74 20 63 68 61 72 20  ndup(const char 
8f70: 2a 7a 53 74 72 2c 20 69 6e 74 20 2a 70 52 63 29  *zStr, int *pRc)
8f80: 7b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 20 3d  {.  char *zRet =
8f90: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 2a   0;..  assert( *
8fa0: 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  pRc==SQLITE_OK )
8fb0: 3b 0a 20 20 69 66 28 20 7a 53 74 72 20 29 7b 0a  ;.  if( zStr ){.
8fc0: 20 20 20 20 73 69 7a 65 5f 74 20 6e 43 6f 70 79      size_t nCopy
8fd0: 20 3d 20 73 74 72 6c 65 6e 28 7a 53 74 72 29 20   = strlen(zStr) 
8fe0: 2b 20 31 3b 0a 20 20 20 20 7a 52 65 74 20 3d 20  + 1;.    zRet = 
8ff0: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 6d  (char*)sqlite3_m
9000: 61 6c 6c 6f 63 36 34 28 6e 43 6f 70 79 29 3b 0a  alloc64(nCopy);.
9010: 20 20 20 20 69 66 28 20 7a 52 65 74 20 29 7b 0a      if( zRet ){.
9020: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 52 65        memcpy(zRe
9030: 74 2c 20 7a 53 74 72 2c 20 6e 43 6f 70 79 29 3b  t, zStr, nCopy);
9040: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9050: 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
9060: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
9070: 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b  ..  return zRet;
9080: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 61 6c 69  .}../*.** Finali
9090: 7a 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ze the statement
90a0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
90b0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
90c0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 71 6c  **.** If the sql
90d0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 29 20  ite3_finalize() 
90e0: 63 61 6c 6c 20 69 6e 64 69 63 61 74 65 73 20 74  call indicates t
90f0: 68 61 74 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  hat an error occ
9100: 75 72 73 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20  urs, and the.** 
9110: 72 62 75 20 68 61 6e 64 6c 65 20 65 72 72 6f 72  rbu handle error
9120: 20 63 6f 64 65 20 69 73 20 6e 6f 74 20 61 6c 72   code is not alr
9130: 65 61 64 79 20 73 65 74 2c 20 73 65 74 20 74 68  eady set, set th
9140: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  e error code and
9150: 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67   error.** messag
9160: 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a  e accordingly..*
9170: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62  /.static void rb
9180: 75 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65  uFinalize(sqlite
9190: 33 72 62 75 20 2a 70 2c 20 73 71 6c 69 74 65 33  3rbu *p, sqlite3
91a0: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20  _stmt *pStmt){. 
91b0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73   sqlite3 *db = s
91c0: 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c 65  qlite3_db_handle
91d0: 28 70 53 74 6d 74 29 3b 0a 20 20 69 6e 74 20 72  (pStmt);.  int r
91e0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  c = sqlite3_fina
91f0: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69  lize(pStmt);.  i
9200: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
9210: 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
9220: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72  E_OK ){.    p->r
9230: 63 20 3d 20 72 63 3b 0a 20 20 20 20 70 2d 3e 7a  c = rc;.    p->z
9240: 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33  Errmsg = sqlite3
9250: 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73  _mprintf("%s", s
9260: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
9270: 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 44 65  ));.  }.}../* De
9280: 74 65 72 6d 69 6e 65 20 74 68 65 20 74 79 70 65  termine the type
9290: 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a   of a table..**.
92a0: 2a 2a 20 20 20 70 65 54 79 70 65 20 69 73 20 6f  **   peType is o
92b0: 66 20 74 79 70 65 20 28 69 6e 74 2a 29 2c 20 61  f type (int*), a
92c0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
92d0: 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 20  utput parameter 
92e0: 6f 66 20 74 79 70 65 0a 2a 2a 20 20 20 28 69 6e  of type.**   (in
92f0: 74 29 2e 20 54 68 69 73 20 63 61 6c 6c 20 73 65  t). This call se
9300: 74 73 20 74 68 65 20 6f 75 74 70 75 74 20 70 61  ts the output pa
9310: 72 61 6d 65 74 65 72 20 61 73 20 66 6f 6c 6c 6f  rameter as follo
9320: 77 73 2c 20 64 65 70 65 6e 64 69 6e 67 0a 2a 2a  ws, depending.**
9330: 20 20 20 6f 6e 20 74 68 65 20 74 79 70 65 20 6f     on the type o
9340: 66 20 74 68 65 20 74 61 62 6c 65 20 73 70 65 63  f the table spec
9350: 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
9360: 65 72 73 20 64 62 4e 61 6d 65 20 61 6e 64 20 7a  ers dbName and z
9370: 54 62 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52  Tbl..**.**     R
9380: 42 55 5f 50 4b 5f 4e 4f 54 41 42 4c 45 3a 20 20  BU_PK_NOTABLE:  
9390: 20 20 20 20 20 4e 6f 20 73 75 63 68 20 74 61 62       No such tab
93a0: 6c 65 2e 0a 2a 2a 20 20 20 20 20 52 42 55 5f 50  le..**     RBU_P
93b0: 4b 5f 4e 4f 4e 45 3a 20 20 20 20 20 20 20 20 20  K_NONE:         
93c0: 20 54 61 62 6c 65 20 68 61 73 20 61 6e 20 69 6d   Table has an im
93d0: 70 6c 69 63 69 74 20 72 6f 77 69 64 2e 0a 2a 2a  plicit rowid..**
93e0: 20 20 20 20 20 52 42 55 5f 50 4b 5f 49 50 4b 3a       RBU_PK_IPK:
93f0: 20 20 20 20 20 20 20 20 20 20 20 54 61 62 6c 65             Table
9400: 20 68 61 73 20 61 6e 20 65 78 70 6c 69 63 69 74   has an explicit
9410: 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20   IPK column..** 
9420: 20 20 20 20 52 42 55 5f 50 4b 5f 45 58 54 45 52      RBU_PK_EXTER
9430: 4e 41 4c 3a 20 20 20 20 20 20 54 61 62 6c 65 20  NAL:      Table 
9440: 68 61 73 20 61 6e 20 65 78 74 65 72 6e 61 6c 20  has an external 
9450: 50 4b 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 20  PK index..**    
9460: 20 52 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54 5f   RBU_PK_WITHOUT_
9470: 52 4f 57 49 44 3a 20 54 61 62 6c 65 20 69 73 20  ROWID: Table is 
9480: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 2e 0a 2a  WITHOUT ROWID..*
9490: 2a 20 20 20 20 20 52 42 55 5f 50 4b 5f 56 54 41  *     RBU_PK_VTA
94a0: 42 3a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c  B:          Tabl
94b0: 65 20 69 73 20 61 20 76 69 72 74 75 61 6c 20 74  e is a virtual t
94c0: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 41 72  able..**.**   Ar
94d0: 67 75 6d 65 6e 74 20 2a 70 69 50 6b 20 69 73 20  gument *piPk is 
94e0: 61 6c 73 6f 20 6f 66 20 74 79 70 65 20 28 69 6e  also of type (in
94f0: 74 2a 29 2c 20 61 6e 64 20 61 6c 73 6f 20 70 6f  t*), and also po
9500: 69 6e 74 73 20 74 6f 20 61 6e 20 6f 75 74 70 75  ints to an outpu
9510: 74 0a 2a 2a 20 20 20 70 61 72 61 6d 65 74 65 72  t.**   parameter
9520: 2e 20 55 6e 6c 65 73 73 20 74 68 65 20 74 61 62  . Unless the tab
9530: 6c 65 20 68 61 73 20 61 6e 20 65 78 74 65 72 6e  le has an extern
9540: 61 6c 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  al primary key i
9550: 6e 64 65 78 20 0a 2a 2a 20 20 20 28 69 2e 65 2e  ndex .**   (i.e.
9560: 20 75 6e 6c 65 73 73 20 2a 70 65 54 79 70 65 20   unless *peType 
9570: 69 73 20 73 65 74 20 74 6f 20 33 29 2c 20 74 68  is set to 3), th
9580: 65 6e 20 2a 70 69 50 6b 20 69 73 20 73 65 74 20  en *piPk is set 
9590: 74 6f 20 7a 65 72 6f 2e 20 4f 72 2c 0a 2a 2a 20  to zero. Or,.** 
95a0: 20 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 64    if the table d
95b0: 6f 65 73 20 68 61 76 65 20 61 6e 20 65 78 74 65  oes have an exte
95c0: 72 6e 61 6c 20 70 72 69 6d 61 72 79 20 6b 65 79  rnal primary key
95d0: 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 2a 70 69   index, then *pi
95e0: 50 6b 0a 2a 2a 20 20 20 69 73 20 73 65 74 20 74  Pk.**   is set t
95f0: 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  o the root page 
9600: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 72  number of the pr
9610: 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20  imary key index 
9620: 62 65 66 6f 72 65 0a 2a 2a 20 20 20 72 65 74 75  before.**   retu
9630: 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 4c 47  rning..**.** ALG
9640: 4f 52 49 54 48 4d 3a 0a 2a 2a 0a 2a 2a 20 20 20  ORITHM:.**.**   
9650: 69 66 28 20 6e 6f 20 65 6e 74 72 79 20 65 78 69  if( no entry exi
9660: 73 74 73 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61  sts in sqlite_ma
9670: 73 74 65 72 20 29 7b 0a 2a 2a 20 20 20 20 20 72  ster ){.**     r
9680: 65 74 75 72 6e 20 52 42 55 5f 50 4b 5f 4e 4f 54  eturn RBU_PK_NOT
9690: 41 42 4c 45 0a 2a 2a 20 20 20 7d 65 6c 73 65 20  ABLE.**   }else 
96a0: 69 66 28 20 73 71 6c 20 66 6f 72 20 74 68 65 20  if( sql for the 
96b0: 65 6e 74 72 79 20 73 74 61 72 74 73 20 77 69 74  entry starts wit
96c0: 68 20 22 43 52 45 41 54 45 20 56 49 52 54 55 41  h "CREATE VIRTUA
96d0: 4c 22 20 29 7b 0a 2a 2a 20 20 20 20 20 72 65 74  L" ){.**     ret
96e0: 75 72 6e 20 52 42 55 5f 50 4b 5f 56 54 41 42 0a  urn RBU_PK_VTAB.
96f0: 2a 2a 20 20 20 7d 65 6c 73 65 20 69 66 28 20 22  **   }else if( "
9700: 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 6c 69 73  PRAGMA index_lis
9710: 74 28 29 22 20 66 6f 72 20 74 68 65 20 74 61 62  t()" for the tab
9720: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 22 70  le contains a "p
9730: 6b 22 20 69 6e 64 65 78 20 29 7b 0a 2a 2a 20 20  k" index ){.**  
9740: 20 20 20 69 66 28 20 74 68 65 20 69 6e 64 65 78     if( the index
9750: 20 74 68 61 74 20 69 73 20 74 68 65 20 70 6b 20   that is the pk 
9760: 65 78 69 73 74 73 20 69 6e 20 73 71 6c 69 74 65  exists in sqlite
9770: 5f 6d 61 73 74 65 72 20 29 7b 0a 2a 2a 20 20 20  _master ){.**   
9780: 20 20 20 20 2a 70 69 50 4b 20 3d 20 72 6f 6f 74      *piPK = root
9790: 70 61 67 65 20 6f 66 20 74 68 61 74 20 69 6e 64  page of that ind
97a0: 65 78 2e 0a 2a 2a 20 20 20 20 20 20 20 72 65 74  ex..**       ret
97b0: 75 72 6e 20 52 42 55 5f 50 4b 5f 45 58 54 45 52  urn RBU_PK_EXTER
97c0: 4e 41 4c 0a 2a 2a 20 20 20 20 20 7d 65 6c 73 65  NAL.**     }else
97d0: 7b 0a 2a 2a 20 20 20 20 20 20 20 72 65 74 75 72  {.**       retur
97e0: 6e 20 52 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54  n RBU_PK_WITHOUT
97f0: 5f 52 4f 57 49 44 0a 2a 2a 20 20 20 20 20 7d 0a  _ROWID.**     }.
9800: 2a 2a 20 20 20 7d 65 6c 73 65 20 69 66 28 20 22  **   }else if( "
9810: 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66  PRAGMA table_inf
9820: 6f 28 29 22 20 6c 69 73 74 73 20 6f 6e 65 20 6f  o()" lists one o
9830: 72 20 6d 6f 72 65 20 22 70 6b 22 20 63 6f 6c 75  r more "pk" colu
9840: 6d 6e 73 20 29 7b 0a 2a 2a 20 20 20 20 20 72 65  mns ){.**     re
9850: 74 75 72 6e 20 52 42 55 5f 50 4b 5f 49 50 4b 0a  turn RBU_PK_IPK.
9860: 2a 2a 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20  **   }else{.**  
9870: 20 20 20 72 65 74 75 72 6e 20 52 42 55 5f 50 4b     return RBU_PK
9880: 5f 4e 4f 4e 45 0a 2a 2a 20 20 20 7d 0a 2a 2f 0a  _NONE.**   }.*/.
9890: 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 54  static void rbuT
98a0: 61 62 6c 65 54 79 70 65 28 0a 20 20 73 71 6c 69  ableType(.  sqli
98b0: 74 65 33 72 62 75 20 2a 70 2c 0a 20 20 63 6f 6e  te3rbu *p,.  con
98c0: 73 74 20 63 68 61 72 20 2a 7a 54 61 62 2c 0a 20  st char *zTab,. 
98d0: 20 69 6e 74 20 2a 70 65 54 79 70 65 2c 0a 20 20   int *peType,.  
98e0: 69 6e 74 20 2a 70 69 54 6e 75 6d 2c 0a 20 20 69  int *piTnum,.  i
98f0: 6e 74 20 2a 70 69 50 6b 0a 29 7b 0a 20 20 2f 2a  nt *piPk.){.  /*
9900: 0a 20 20 2a 2a 20 30 29 20 53 45 4c 45 43 54 20  .  ** 0) SELECT 
9910: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 73 71  count(*) FROM sq
9920: 6c 69 74 65 5f 6d 61 73 74 65 72 20 77 68 65 72  lite_master wher
9930: 65 20 6e 61 6d 65 3d 25 51 20 41 4e 44 20 49 73  e name=%Q AND Is
9940: 56 69 72 74 75 61 6c 28 25 51 29 0a 20 20 2a 2a  Virtual(%Q).  **
9950: 20 31 29 20 50 52 41 47 4d 41 20 69 6e 64 65 78   1) PRAGMA index
9960: 5f 6c 69 73 74 20 3d 20 3f 0a 20 20 2a 2a 20 32  _list = ?.  ** 2
9970: 29 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  ) SELECT count(*
9980: 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  ) FROM sqlite_ma
9990: 73 74 65 72 20 77 68 65 72 65 20 6e 61 6d 65 3d  ster where name=
99a0: 25 51 20 0a 20 20 2a 2a 20 33 29 20 50 52 41 47  %Q .  ** 3) PRAG
99b0: 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 20 3d 20  MA table_info = 
99c0: 3f 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ?.  */.  sqlite3
99d0: 5f 73 74 6d 74 20 2a 61 53 74 6d 74 5b 34 5d 20  _stmt *aStmt[4] 
99e0: 3d 20 7b 30 2c 20 30 2c 20 30 2c 20 30 7d 3b 0a  = {0, 0, 0, 0};.
99f0: 0a 20 20 2a 70 65 54 79 70 65 20 3d 20 52 42 55  .  *peType = RBU
9a00: 5f 50 4b 5f 4e 4f 54 41 42 4c 45 3b 0a 20 20 2a  _PK_NOTABLE;.  *
9a10: 70 69 50 6b 20 3d 20 30 3b 0a 0a 20 20 61 73 73  piPk = 0;..  ass
9a20: 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
9a30: 54 45 5f 4f 4b 20 29 3b 0a 20 20 70 2d 3e 72 63  TE_OK );.  p->rc
9a40: 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e   = prepareFreeAn
9a50: 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d  dCollectError(p-
9a60: 3e 64 62 4d 61 69 6e 2c 20 26 61 53 74 6d 74 5b  >dbMain, &aStmt[
9a70: 30 5d 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c  0], &p->zErrmsg,
9a80: 20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70   .    sqlite3_mp
9a90: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
9aa0: 20 22 53 45 4c 45 43 54 20 28 73 71 6c 20 4c 49   "SELECT (sql LI
9ab0: 4b 45 20 27 63 72 65 61 74 65 20 76 69 72 74 75  KE 'create virtu
9ac0: 61 6c 25 25 27 29 2c 20 72 6f 6f 74 70 61 67 65  al%%'), rootpage
9ad0: 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 46  ".          "  F
9ae0: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
9af0: 72 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 57  r".          " W
9b00: 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 20 7a  HERE name=%Q", z
9b10: 54 61 62 0a 20 20 29 29 3b 0a 20 20 69 66 28 20  Tab.  ));.  if( 
9b20: 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
9b30: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 65 70   || sqlite3_step
9b40: 28 61 53 74 6d 74 5b 30 5d 29 21 3d 53 51 4c 49  (aStmt[0])!=SQLI
9b50: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 2f 2a  TE_ROW ){.    /*
9b60: 20 45 69 74 68 65 72 20 61 6e 20 65 72 72 6f 72   Either an error
9b70: 2c 20 6f 72 20 6e 6f 20 73 75 63 68 20 74 61 62  , or no such tab
9b80: 6c 65 2e 20 2a 2f 0a 20 20 20 20 67 6f 74 6f 20  le. */.    goto 
9b90: 72 62 75 54 61 62 6c 65 54 79 70 65 5f 65 6e 64  rbuTableType_end
9ba0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
9bb0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 61  te3_column_int(a
9bc0: 53 74 6d 74 5b 30 5d 2c 20 30 29 20 29 7b 0a 20  Stmt[0], 0) ){. 
9bd0: 20 20 20 2a 70 65 54 79 70 65 20 3d 20 52 42 55     *peType = RBU
9be0: 5f 50 4b 5f 56 54 41 42 3b 20 20 20 20 20 20 20  _PK_VTAB;       
9bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9c00: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
9c10: 2f 0a 20 20 20 20 67 6f 74 6f 20 72 62 75 54 61  /.    goto rbuTa
9c20: 62 6c 65 54 79 70 65 5f 65 6e 64 3b 0a 20 20 7d  bleType_end;.  }
9c30: 0a 20 20 2a 70 69 54 6e 75 6d 20 3d 20 73 71 6c  .  *piTnum = sql
9c40: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
9c50: 61 53 74 6d 74 5b 30 5d 2c 20 31 29 3b 0a 0a 20  aStmt[0], 1);.. 
9c60: 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65   p->rc = prepare
9c70: 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  FreeAndCollectEr
9c80: 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26  ror(p->dbMain, &
9c90: 61 53 74 6d 74 5b 31 5d 2c 20 26 70 2d 3e 7a 45  aStmt[1], &p->zE
9ca0: 72 72 6d 73 67 2c 20 0a 20 20 20 20 73 71 6c 69  rrmsg, .    sqli
9cb0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41  te3_mprintf("PRA
9cc0: 47 4d 41 20 69 6e 64 65 78 5f 6c 69 73 74 3d 25  GMA index_list=%
9cd0: 51 22 2c 7a 54 61 62 29 0a 20 20 29 3b 0a 20 20  Q",zTab).  );.  
9ce0: 69 66 28 20 70 2d 3e 72 63 20 29 20 67 6f 74 6f  if( p->rc ) goto
9cf0: 20 72 62 75 54 61 62 6c 65 54 79 70 65 5f 65 6e   rbuTableType_en
9d00: 64 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69  d;.  while( sqli
9d10: 74 65 33 5f 73 74 65 70 28 61 53 74 6d 74 5b 31  te3_step(aStmt[1
9d20: 5d 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  ])==SQLITE_ROW )
9d30: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a  {.    const u8 *
9d40: 7a 4f 72 69 67 20 3d 20 73 71 6c 69 74 65 33 5f  zOrig = sqlite3_
9d50: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 61 53 74 6d  column_text(aStm
9d60: 74 5b 31 5d 2c 20 33 29 3b 0a 20 20 20 20 63 6f  t[1], 3);.    co
9d70: 6e 73 74 20 75 38 20 2a 7a 49 64 78 20 3d 20 73  nst u8 *zIdx = s
9d80: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
9d90: 78 74 28 61 53 74 6d 74 5b 31 5d 2c 20 31 29 3b  xt(aStmt[1], 1);
9da0: 0a 20 20 20 20 69 66 28 20 7a 4f 72 69 67 20 26  .    if( zOrig &
9db0: 26 20 7a 49 64 78 20 26 26 20 7a 4f 72 69 67 5b  & zIdx && zOrig[
9dc0: 30 5d 3d 3d 27 70 27 20 29 7b 0a 20 20 20 20 20  0]=='p' ){.     
9dd0: 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65   p->rc = prepare
9de0: 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  FreeAndCollectEr
9df0: 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26  ror(p->dbMain, &
9e00: 61 53 74 6d 74 5b 32 5d 2c 20 26 70 2d 3e 7a 45  aStmt[2], &p->zE
9e10: 72 72 6d 73 67 2c 20 0a 20 20 20 20 20 20 20 20  rrmsg, .        
9e20: 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
9e30: 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  f(.            "
9e40: 53 45 4c 45 43 54 20 72 6f 6f 74 70 61 67 65 20  SELECT rootpage 
9e50: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
9e60: 65 72 20 57 48 45 52 45 20 6e 61 6d 65 20 3d 20  er WHERE name = 
9e70: 25 51 22 2c 20 7a 49 64 78 0a 20 20 20 20 20 20  %Q", zIdx.      
9e80: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ));.      if( p-
9e90: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
9ea0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
9eb0: 6c 69 74 65 33 5f 73 74 65 70 28 61 53 74 6d 74  lite3_step(aStmt
9ec0: 5b 32 5d 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  [2])==SQLITE_ROW
9ed0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   ){.          *p
9ee0: 69 50 6b 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  iPk = sqlite3_co
9ef0: 6c 75 6d 6e 5f 69 6e 74 28 61 53 74 6d 74 5b 32  lumn_int(aStmt[2
9f00: 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 0);.         
9f10: 20 2a 70 65 54 79 70 65 20 3d 20 52 42 55 5f 50   *peType = RBU_P
9f20: 4b 5f 45 58 54 45 52 4e 41 4c 3b 0a 20 20 20 20  K_EXTERNAL;.    
9f30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9f40: 20 20 20 20 20 2a 70 65 54 79 70 65 20 3d 20 52       *peType = R
9f50: 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54 5f 52 4f  BU_PK_WITHOUT_RO
9f60: 57 49 44 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  WID;.        }. 
9f70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
9f80: 6f 20 72 62 75 54 61 62 6c 65 54 79 70 65 5f 65  o rbuTableType_e
9f90: 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  nd;.    }.  }.. 
9fa0: 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65   p->rc = prepare
9fb0: 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  FreeAndCollectEr
9fc0: 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26  ror(p->dbMain, &
9fd0: 61 53 74 6d 74 5b 33 5d 2c 20 26 70 2d 3e 7a 45  aStmt[3], &p->zE
9fe0: 72 72 6d 73 67 2c 20 0a 20 20 20 20 73 71 6c 69  rrmsg, .    sqli
9ff0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41  te3_mprintf("PRA
a000: 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 3d 25  GMA table_info=%
a010: 51 22 2c 7a 54 61 62 29 0a 20 20 29 3b 0a 20 20  Q",zTab).  );.  
a020: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
a030: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 77 68 69 6c  E_OK ){.    whil
a040: 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  e( sqlite3_step(
a050: 61 53 74 6d 74 5b 33 5d 29 3d 3d 53 51 4c 49 54  aStmt[3])==SQLIT
a060: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 69  E_ROW ){.      i
a070: 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  f( sqlite3_colum
a080: 6e 5f 69 6e 74 28 61 53 74 6d 74 5b 33 5d 2c 35  n_int(aStmt[3],5
a090: 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  )>0 ){.        *
a0a0: 70 65 54 79 70 65 20 3d 20 52 42 55 5f 50 4b 5f  peType = RBU_PK_
a0b0: 49 50 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  IPK;            
a0c0: 20 20 20 20 2f 2a 20 65 78 70 6c 69 63 69 74 20      /* explicit 
a0d0: 49 50 4b 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  IPK column */.  
a0e0: 20 20 20 20 20 20 67 6f 74 6f 20 72 62 75 54 61        goto rbuTa
a0f0: 62 6c 65 54 79 70 65 5f 65 6e 64 3b 0a 20 20 20  bleType_end;.   
a100: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2a     }.    }.    *
a110: 70 65 54 79 70 65 20 3d 20 52 42 55 5f 50 4b 5f  peType = RBU_PK_
a120: 4e 4f 4e 45 3b 0a 20 20 7d 0a 0a 72 62 75 54 61  NONE;.  }..rbuTa
a130: 62 6c 65 54 79 70 65 5f 65 6e 64 3a 20 7b 0a 20  bleType_end: {. 
a140: 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20     unsigned int 
a150: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
a160: 69 3c 73 69 7a 65 6f 66 28 61 53 74 6d 74 29 2f  i<sizeof(aStmt)/
a170: 73 69 7a 65 6f 66 28 61 53 74 6d 74 5b 30 5d 29  sizeof(aStmt[0])
a180: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 62  ; i++){.      rb
a190: 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 61 53 74  uFinalize(p, aSt
a1a0: 6d 74 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  mt[i]);.    }.  
a1b0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
a1c0: 69 73 20 61 20 68 65 6c 70 65 72 20 66 75 6e 63  is a helper func
a1d0: 74 69 6f 6e 20 66 6f 72 20 72 62 75 4f 62 6a 49  tion for rbuObjI
a1e0: 74 65 72 43 61 63 68 65 54 61 62 6c 65 49 6e 66  terCacheTableInf
a1f0: 6f 28 29 2e 20 49 74 20 70 6f 70 75 6c 61 74 65  o(). It populate
a200: 73 0a 2a 2a 20 74 68 65 20 70 49 74 65 72 2d 3e  s.** the pIter->
a210: 61 62 49 6e 64 65 78 65 64 5b 5d 20 61 72 72 61  abIndexed[] arra
a220: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
a230: 64 20 72 62 75 4f 62 6a 49 74 65 72 43 61 63 68  d rbuObjIterCach
a240: 65 49 6e 64 65 78 65 64 43 6f 6c 73 28 73 71 6c  eIndexedCols(sql
a250: 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62 75 4f  ite3rbu *p, RbuO
a260: 62 6a 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  bjIter *pIter){.
a270: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
a280: 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 69 6e 74  pList = 0;.  int
a290: 20 62 49 6e 64 65 78 20 3d 20 30 3b 0a 0a 20 20   bIndex = 0;..  
a2a0: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
a2b0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 65 6d 63  E_OK ){.    memc
a2c0: 70 79 28 70 49 74 65 72 2d 3e 61 62 49 6e 64 65  py(pIter->abInde
a2d0: 78 65 64 2c 20 70 49 74 65 72 2d 3e 61 62 54 62  xed, pIter->abTb
a2e0: 6c 50 6b 2c 20 73 69 7a 65 6f 66 28 75 38 29 2a  lPk, sizeof(u8)*
a2f0: 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 29 3b  pIter->nTblCol);
a300: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65  .    p->rc = pre
a310: 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65  pareFreeAndColle
a320: 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69  ctError(p->dbMai
a330: 6e 2c 20 26 70 4c 69 73 74 2c 20 26 70 2d 3e 7a  n, &pList, &p->z
a340: 45 72 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20  Errmsg,.        
a350: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
a360: 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 69 6e 64  "PRAGMA main.ind
a370: 65 78 5f 6c 69 73 74 20 3d 20 25 51 22 2c 20 70  ex_list = %Q", p
a380: 49 74 65 72 2d 3e 7a 54 62 6c 29 0a 20 20 20 20  Iter->zTbl).    
a390: 29 3b 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d  );.  }..  pIter-
a3a0: 3e 6e 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 77  >nIndex = 0;.  w
a3b0: 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
a3c0: 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45  ITE_OK && SQLITE
a3d0: 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
a3e0: 65 70 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20  ep(pList) ){.   
a3f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
a400: 78 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  x = (const char*
a410: 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
a420: 74 65 78 74 28 70 4c 69 73 74 2c 20 31 29 3b 0a  text(pList, 1);.
a430: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
a440: 20 2a 70 58 49 6e 66 6f 20 3d 20 30 3b 0a 20 20   *pXInfo = 0;.  
a450: 20 20 69 66 28 20 7a 49 64 78 3d 3d 30 20 29 20    if( zIdx==0 ) 
a460: 62 72 65 61 6b 3b 0a 20 20 20 20 70 2d 3e 72 63  break;.    p->rc
a470: 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e   = prepareFreeAn
a480: 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d  dCollectError(p-
a490: 3e 64 62 4d 61 69 6e 2c 20 26 70 58 49 6e 66 6f  >dbMain, &pXInfo
a4a0: 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20  , &p->zErrmsg,. 
a4b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
a4c0: 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20 6d  printf("PRAGMA m
a4d0: 61 69 6e 2e 69 6e 64 65 78 5f 78 69 6e 66 6f 20  ain.index_xinfo 
a4e0: 3d 20 25 51 22 2c 20 7a 49 64 78 29 0a 20 20 20  = %Q", zIdx).   
a4f0: 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70   );.    while( p
a500: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
a510: 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  && SQLITE_ROW==s
a520: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 58 49 6e  qlite3_step(pXIn
a530: 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  fo) ){.      int
a540: 20 69 43 69 64 20 3d 20 73 71 6c 69 74 65 33 5f   iCid = sqlite3_
a550: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49 6e 66  column_int(pXInf
a560: 6f 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  o, 1);.      if(
a570: 20 69 43 69 64 3e 3d 30 20 29 20 70 49 74 65 72   iCid>=0 ) pIter
a580: 2d 3e 61 62 49 6e 64 65 78 65 64 5b 69 43 69 64  ->abIndexed[iCid
a590: 5d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  ] = 1;.    }.   
a5a0: 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20   rbuFinalize(p, 
a5b0: 70 58 49 6e 66 6f 29 3b 0a 20 20 20 20 62 49 6e  pXInfo);.    bIn
a5c0: 64 65 78 20 3d 20 31 3b 0a 20 20 20 20 70 49 74  dex = 1;.    pIt
a5d0: 65 72 2d 3e 6e 49 6e 64 65 78 2b 2b 3b 0a 20 20  er->nIndex++;.  
a5e0: 7d 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  }..  if( pIter->
a5f0: 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 57 49  eType==RBU_PK_WI
a600: 54 48 4f 55 54 5f 52 4f 57 49 44 20 29 7b 0a 20  THOUT_ROWID ){. 
a610: 20 20 20 2f 2a 20 22 50 52 41 47 4d 41 20 69 6e     /* "PRAGMA in
a620: 64 65 78 5f 6c 69 73 74 22 20 69 6e 63 6c 75 64  dex_list" includ
a630: 65 73 20 74 68 65 20 6d 61 69 6e 20 50 4b 20 62  es the main PK b
a640: 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 70 49 74  -tree */.    pIt
a650: 65 72 2d 3e 6e 49 6e 64 65 78 2d 2d 3b 0a 20 20  er->nIndex--;.  
a660: 7d 0a 0a 20 20 72 62 75 46 69 6e 61 6c 69 7a 65  }..  rbuFinalize
a670: 28 70 2c 20 70 4c 69 73 74 29 3b 0a 20 20 69 66  (p, pList);.  if
a680: 28 20 62 49 6e 64 65 78 3d 3d 30 20 29 20 70 49  ( bIndex==0 ) pI
a690: 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64 20 3d  ter->abIndexed =
a6a0: 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66   0;.}.../*.** If
a6b0: 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 61 6c   they are not al
a6c0: 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64 2c  ready populated,
a6d0: 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 70 49   populate the pI
a6e0: 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 5d 2c  ter->azTblCol[],
a6f0: 0a 2a 2a 20 70 49 74 65 72 2d 3e 61 62 54 62 6c  .** pIter->abTbl
a700: 50 6b 5b 5d 2c 20 70 49 74 65 72 2d 3e 6e 54 62  Pk[], pIter->nTb
a710: 6c 43 6f 6c 20 61 6e 64 20 70 49 74 65 72 2d 3e  lCol and pIter->
a720: 62 52 6f 77 69 64 20 76 61 72 69 61 62 6c 65 73  bRowid variables
a730: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 0a 2a 2a   according to.**
a740: 20 74 68 65 20 74 61 62 6c 65 20 28 6e 6f 74 20   the table (not 
a750: 69 6e 64 65 78 29 20 74 68 61 74 20 74 68 65 20  index) that the 
a760: 69 74 65 72 61 74 6f 72 20 63 75 72 72 65 6e 74  iterator current
a770: 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a  ly points to..**
a780: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
a790: 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66  E_OK if successf
a7a0: 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ul, or an SQLite
a7b0: 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65   error code othe
a7c0: 72 77 69 73 65 2e 20 49 66 0a 2a 2a 20 61 6e 20  rwise. If.** an 
a7d0: 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72  error does occur
a7e0: 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
a7f0: 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67  and error messag
a800: 65 20 61 72 65 20 61 6c 73 6f 20 6c 65 66 74 20  e are also left 
a810: 69 6e 20 0a 2a 2a 20 74 68 65 20 52 42 55 20 68  in .** the RBU h
a820: 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
a830: 20 69 6e 74 20 72 62 75 4f 62 6a 49 74 65 72 43   int rbuObjIterC
a840: 61 63 68 65 54 61 62 6c 65 49 6e 66 6f 28 73 71  acheTableInfo(sq
a850: 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62 75  lite3rbu *p, Rbu
a860: 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 29 7b  ObjIter *pIter){
a870: 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 61 7a  .  if( pIter->az
a880: 54 62 6c 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20  TblCol==0 ){.   
a890: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
a8a0: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Stmt = 0;.    in
a8b0: 74 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  t nCol = 0;.    
a8c0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
a8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a8e0: 20 66 6f 72 28 29 20 6c 6f 6f 70 20 69 74 65 72   for() loop iter
a8f0: 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
a900: 0a 20 20 20 20 69 6e 74 20 62 52 62 75 52 6f 77  .    int bRbuRow
a910: 69 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  id = 0;         
a920: 20 20 20 2f 2a 20 49 66 20 69 6e 70 75 74 20 74     /* If input t
a930: 61 62 6c 65 20 68 61 73 20 63 6f 6c 75 6d 6e 20  able has column 
a940: 22 72 62 75 5f 72 6f 77 69 64 22 20 2a 2f 0a 20  "rbu_rowid" */. 
a950: 20 20 20 69 6e 74 20 69 4f 72 64 65 72 20 3d 20     int iOrder = 
a960: 30 3b 0a 20 20 20 20 69 6e 74 20 69 54 6e 75 6d  0;.    int iTnum
a970: 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 46 69   = 0;..    /* Fi
a980: 67 75 72 65 20 6f 75 74 20 74 68 65 20 74 79 70  gure out the typ
a990: 65 20 6f 66 20 74 61 62 6c 65 20 74 68 69 73 20  e of table this 
a9a0: 73 74 65 70 20 77 69 6c 6c 20 64 65 61 6c 20 77  step will deal w
a9b0: 69 74 68 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ith. */.    asse
a9c0: 72 74 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65  rt( pIter->eType
a9d0: 3d 3d 30 20 29 3b 0a 20 20 20 20 72 62 75 54 61  ==0 );.    rbuTa
a9e0: 62 6c 65 54 79 70 65 28 70 2c 20 70 49 74 65 72  bleType(p, pIter
a9f0: 2d 3e 7a 54 62 6c 2c 20 26 70 49 74 65 72 2d 3e  ->zTbl, &pIter->
aa00: 65 54 79 70 65 2c 20 26 69 54 6e 75 6d 2c 20 26  eType, &iTnum, &
aa10: 70 49 74 65 72 2d 3e 69 50 6b 54 6e 75 6d 29 3b  pIter->iPkTnum);
aa20: 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  .    if( p->rc==
aa30: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49 74  SQLITE_OK && pIt
aa40: 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
aa50: 4b 5f 4e 4f 54 41 42 4c 45 20 29 7b 0a 20 20 20  K_NOTABLE ){.   
aa60: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
aa70: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 70  E_ERROR;.      p
aa80: 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69  ->zErrmsg = sqli
aa90: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20  te3_mprintf("no 
aaa0: 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c  such table: %s",
aab0: 20 70 49 74 65 72 2d 3e 7a 54 62 6c 29 3b 0a 20   pIter->zTbl);. 
aac0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
aad0: 72 63 20 29 20 72 65 74 75 72 6e 20 70 2d 3e 72  rc ) return p->r
aae0: 63 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  c;.    if( pIter
aaf0: 2d 3e 7a 49 64 78 3d 3d 30 20 29 20 70 49 74 65  ->zIdx==0 ) pIte
ab00: 72 2d 3e 69 54 6e 75 6d 20 3d 20 69 54 6e 75 6d  r->iTnum = iTnum
ab10: 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ;..    assert( p
ab20: 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55  Iter->eType==RBU
ab30: 5f 50 4b 5f 4e 4f 4e 45 20 7c 7c 20 70 49 74 65  _PK_NONE || pIte
ab40: 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
ab50: 5f 49 50 4b 20 0a 20 20 20 20 20 20 20 20 20 7c  _IPK .         |
ab60: 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  | pIter->eType==
ab70: 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20  RBU_PK_EXTERNAL 
ab80: 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  || pIter->eType=
ab90: 3d 52 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54 5f  =RBU_PK_WITHOUT_
aba0: 52 4f 57 49 44 0a 20 20 20 20 20 20 20 20 20 7c  ROWID.         |
abb0: 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  | pIter->eType==
abc0: 52 42 55 5f 50 4b 5f 56 54 41 42 0a 20 20 20 20  RBU_PK_VTAB.    
abd0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c  );..    /* Popul
abe0: 61 74 65 20 74 68 65 20 61 7a 54 62 6c 43 6f 6c  ate the azTblCol
abf0: 5b 5d 20 61 6e 64 20 6e 54 62 6c 43 6f 6c 20 76  [] and nTblCol v
ac00: 61 72 69 61 62 6c 65 73 20 62 61 73 65 64 20 6f  ariables based o
ac10: 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 73 0a 20 20  n the columns.  
ac20: 20 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e 70 75    ** of the inpu
ac30: 74 20 74 61 62 6c 65 2e 20 49 67 6e 6f 72 65 20  t table. Ignore 
ac40: 61 6e 79 20 69 6e 70 75 74 20 74 61 62 6c 65 20  any input table 
ac50: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 62 65 67  columns that beg
ac60: 69 6e 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 22  in with.    ** "
ac70: 72 62 75 5f 22 2e 20 20 2a 2f 0a 20 20 20 20 70  rbu_".  */.    p
ac80: 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46 72  ->rc = prepareFr
ac90: 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f  eeAndCollectErro
aca0: 72 28 70 2d 3e 64 62 52 62 75 2c 20 26 70 53 74  r(p->dbRbu, &pSt
acb0: 6d 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c  mt, &p->zErrmsg,
acc0: 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
acd0: 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43  3_mprintf("SELEC
ace0: 54 20 2a 20 46 52 4f 4d 20 27 25 71 27 22 2c 20  T * FROM '%q'", 
acf0: 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 29  pIter->zDataTbl)
ad00: 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
ad10: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
ad20: 20 29 7b 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d   ){.      nCol =
ad30: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
ad40: 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20  count(pStmt);.  
ad50: 20 20 20 20 72 62 75 41 6c 6c 6f 63 61 74 65 49      rbuAllocateI
ad60: 74 65 72 41 72 72 61 79 73 28 70 2c 20 70 49 74  terArrays(p, pIt
ad70: 65 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 7d  er, nCol);.    }
ad80: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d  .    for(i=0; p-
ad90: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
ada0: 26 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  & i<nCol; i++){.
adb0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
adc0: 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74   *zName = (const
add0: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
ade0: 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74  olumn_name(pStmt
adf0: 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
ae00: 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70  sqlite3_strnicmp
ae10: 28 22 72 62 75 5f 22 2c 20 7a 4e 61 6d 65 2c 20  ("rbu_", zName, 
ae20: 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  4) ){.        ch
ae30: 61 72 20 2a 7a 43 6f 70 79 20 3d 20 72 62 75 53  ar *zCopy = rbuS
ae40: 74 72 6e 64 75 70 28 7a 4e 61 6d 65 2c 20 26 70  trndup(zName, &p
ae50: 2d 3e 72 63 29 3b 0a 20 20 20 20 20 20 20 20 70  ->rc);.        p
ae60: 49 74 65 72 2d 3e 61 69 53 72 63 4f 72 64 65 72  Iter->aiSrcOrder
ae70: 5b 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 5d  [pIter->nTblCol]
ae80: 20 3d 20 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f   = pIter->nTblCo
ae90: 6c 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72  l;.        pIter
aea0: 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 70 49 74 65 72  ->azTblCol[pIter
aeb0: 2d 3e 6e 54 62 6c 43 6f 6c 2b 2b 5d 20 3d 20 7a  ->nTblCol++] = z
aec0: 43 6f 70 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Copy;.      }.  
aed0: 20 20 20 20 65 6c 73 65 20 69 66 28 20 30 3d 3d      else if( 0==
aee0: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
aef0: 22 72 62 75 5f 72 6f 77 69 64 22 2c 20 7a 4e 61  "rbu_rowid", zNa
af00: 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62  me) ){.        b
af10: 52 62 75 52 6f 77 69 64 20 3d 20 31 3b 0a 20 20  RbuRowid = 1;.  
af20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
af30: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
af40: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 70 53 74  (pStmt);.    pSt
af50: 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  mt = 0;..    if(
af60: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
af70: 4b 0a 20 20 20 20 20 26 26 20 72 62 75 49 73 56  K.     && rbuIsV
af80: 61 63 75 75 6d 28 70 29 3d 3d 30 0a 20 20 20 20  acuum(p)==0.    
af90: 20 26 26 20 62 52 62 75 52 6f 77 69 64 21 3d 28   && bRbuRowid!=(
afa0: 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
afb0: 55 5f 50 4b 5f 56 54 41 42 20 7c 7c 20 70 49 74  U_PK_VTAB || pIt
afc0: 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
afd0: 4b 5f 4e 4f 4e 45 29 0a 20 20 20 20 29 7b 0a 20  K_NONE).    ){. 
afe0: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c       p->rc = SQL
aff0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
b000: 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71   p->zErrmsg = sq
b010: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
b020: 20 20 20 20 20 20 20 20 20 22 74 61 62 6c 65 20           "table 
b030: 25 71 20 25 73 20 72 62 75 5f 72 6f 77 69 64 20  %q %s rbu_rowid 
b040: 63 6f 6c 75 6d 6e 22 2c 20 70 49 74 65 72 2d 3e  column", pIter->
b050: 7a 44 61 74 61 54 62 6c 2c 0a 20 20 20 20 20 20  zDataTbl,.      
b060: 20 20 20 20 28 62 52 62 75 52 6f 77 69 64 20 3f      (bRbuRowid ?
b070: 20 22 6d 61 79 20 6e 6f 74 20 68 61 76 65 22 20   "may not have" 
b080: 3a 20 22 72 65 71 75 69 72 65 73 22 29 0a 20 20  : "requires").  
b090: 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20      );.    }..  
b0a0: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
b0b0: 61 6c 6c 20 6e 6f 6e 2d 48 49 44 44 45 4e 20 63  all non-HIDDEN c
b0c0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 64 65  olumns in the de
b0d0: 73 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20  stination table 
b0e0: 61 72 65 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20  are also.    ** 
b0f0: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 69  present in the i
b100: 6e 70 75 74 20 74 61 62 6c 65 2e 20 50 6f 70 75  nput table. Popu
b110: 6c 61 74 65 20 74 68 65 20 61 62 54 62 6c 50 6b  late the abTblPk
b120: 5b 5d 2c 20 61 7a 54 62 6c 54 79 70 65 5b 5d 20  [], azTblType[] 
b130: 61 6e 64 0a 20 20 20 20 2a 2a 20 61 69 54 62 6c  and.    ** aiTbl
b140: 4f 72 64 65 72 5b 5d 20 61 72 72 61 79 73 20 61  Order[] arrays a
b150: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
b160: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
b170: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
b180: 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70  .      p->rc = p
b190: 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c  repareFreeAndCol
b1a0: 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d  lectError(p->dbM
b1b0: 61 69 6e 2c 20 26 70 53 74 6d 74 2c 20 26 70 2d  ain, &pStmt, &p-
b1c0: 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20  >zErrmsg, .     
b1d0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72       sqlite3_mpr
b1e0: 69 6e 74 66 28 22 50 52 41 47 4d 41 20 74 61 62  intf("PRAGMA tab
b1f0: 6c 65 5f 69 6e 66 6f 28 25 51 29 22 2c 20 70 49  le_info(%Q)", pI
b200: 74 65 72 2d 3e 7a 54 62 6c 29 0a 20 20 20 20 20  ter->zTbl).     
b210: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68   );.    }.    wh
b220: 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
b230: 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f  TE_OK && SQLITE_
b240: 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
b250: 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20  p(pStmt) ){.    
b260: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
b270: 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
b280: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
b290: 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29  n_text(pStmt, 1)
b2a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d  ;.      if( zNam
b2b0: 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b 20 20 2f  e==0 ) break;  /
b2c0: 2a 20 41 6e 20 4f 4f 4d 20 2d 20 66 69 6e 61 6c  * An OOM - final
b2d0: 69 7a 65 28 29 20 62 65 6c 6f 77 20 72 65 74 75  ize() below retu
b2e0: 72 6e 73 20 53 5f 4e 4f 4d 45 4d 20 2a 2f 0a 20  rns S_NOMEM */. 
b2f0: 20 20 20 20 20 66 6f 72 28 69 3d 69 4f 72 64 65       for(i=iOrde
b300: 72 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 54 62 6c  r; i<pIter->nTbl
b310: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
b320: 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70     if( 0==strcmp
b330: 28 7a 4e 61 6d 65 2c 20 70 49 74 65 72 2d 3e 61  (zName, pIter->a
b340: 7a 54 62 6c 43 6f 6c 5b 69 5d 29 20 29 20 62 72  zTblCol[i]) ) br
b350: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
b360: 20 20 20 69 66 28 20 69 3d 3d 70 49 74 65 72 2d     if( i==pIter-
b370: 3e 6e 54 62 6c 43 6f 6c 20 29 7b 0a 20 20 20 20  >nTblCol ){.    
b380: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
b390: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
b3a0: 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73    p->zErrmsg = s
b3b0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
b3c0: 63 6f 6c 75 6d 6e 20 6d 69 73 73 69 6e 67 20 66  column missing f
b3d0: 72 6f 6d 20 25 71 3a 20 25 73 22 2c 0a 20 20 20  rom %q: %s",.   
b3e0: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
b3f0: 7a 44 61 74 61 54 62 6c 2c 20 7a 4e 61 6d 65 0a  zDataTbl, zName.
b400: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
b410: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
b420: 69 6e 74 20 69 50 6b 20 3d 20 73 71 6c 69 74 65  int iPk = sqlite
b430: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
b440: 6d 74 2c 20 35 29 3b 0a 20 20 20 20 20 20 20 20  mt, 5);.        
b450: 69 6e 74 20 62 4e 6f 74 4e 75 6c 6c 20 3d 20 73  int bNotNull = s
b460: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
b470: 74 28 70 53 74 6d 74 2c 20 33 29 3b 0a 20 20 20  t(pStmt, 3);.   
b480: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
b490: 2a 7a 54 79 70 65 20 3d 20 28 63 6f 6e 73 74 20  *zType = (const 
b4a0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
b4b0: 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
b4c0: 20 32 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66   2);..        if
b4d0: 28 20 69 21 3d 69 4f 72 64 65 72 20 29 7b 0a 20  ( i!=iOrder ){. 
b4e0: 20 20 20 20 20 20 20 20 20 53 57 41 50 28 69 6e           SWAP(in
b4f0: 74 2c 20 70 49 74 65 72 2d 3e 61 69 53 72 63 4f  t, pIter->aiSrcO
b500: 72 64 65 72 5b 69 5d 2c 20 70 49 74 65 72 2d 3e  rder[i], pIter->
b510: 61 69 53 72 63 4f 72 64 65 72 5b 69 4f 72 64 65  aiSrcOrder[iOrde
b520: 72 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 53  r]);.          S
b530: 57 41 50 28 63 68 61 72 2a 2c 20 70 49 74 65 72  WAP(char*, pIter
b540: 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 2c 20 70  ->azTblCol[i], p
b550: 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69  Iter->azTblCol[i
b560: 4f 72 64 65 72 5d 29 3b 0a 20 20 20 20 20 20 20  Order]);.       
b570: 20 7d 0a 0a 20 20 20 20 20 20 20 20 70 49 74 65   }..        pIte
b580: 72 2d 3e 61 7a 54 62 6c 54 79 70 65 5b 69 4f 72  r->azTblType[iOr
b590: 64 65 72 5d 20 3d 20 72 62 75 53 74 72 6e 64 75  der] = rbuStrndu
b5a0: 70 28 7a 54 79 70 65 2c 20 26 70 2d 3e 72 63 29  p(zType, &p->rc)
b5b0: 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  ;.        pIter-
b5c0: 3e 61 62 54 62 6c 50 6b 5b 69 4f 72 64 65 72 5d  >abTblPk[iOrder]
b5d0: 20 3d 20 28 69 50 6b 21 3d 30 29 3b 0a 20 20 20   = (iPk!=0);.   
b5e0: 20 20 20 20 20 70 49 74 65 72 2d 3e 61 62 4e 6f       pIter->abNo
b5f0: 74 4e 75 6c 6c 5b 69 4f 72 64 65 72 5d 20 3d 20  tNull[iOrder] = 
b600: 28 75 38 29 62 4e 6f 74 4e 75 6c 6c 20 7c 7c 20  (u8)bNotNull || 
b610: 28 69 50 6b 21 3d 30 29 3b 0a 20 20 20 20 20 20  (iPk!=0);.      
b620: 20 20 69 4f 72 64 65 72 2b 2b 3b 0a 20 20 20 20    iOrder++;.    
b630: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72    }.    }..    r
b640: 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 53  buFinalize(p, pS
b650: 74 6d 74 29 3b 0a 20 20 20 20 72 62 75 4f 62 6a  tmt);.    rbuObj
b660: 49 74 65 72 43 61 63 68 65 49 6e 64 65 78 65 64  IterCacheIndexed
b670: 43 6f 6c 73 28 70 2c 20 70 49 74 65 72 29 3b 0a  Cols(p, pIter);.
b680: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
b690: 72 2d 3e 65 54 79 70 65 21 3d 52 42 55 5f 50 4b  r->eType!=RBU_PK
b6a0: 5f 56 54 41 42 20 7c 7c 20 70 49 74 65 72 2d 3e  _VTAB || pIter->
b6b0: 61 62 49 6e 64 65 78 65 64 3d 3d 30 20 29 3b 0a  abIndexed==0 );.
b6c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
b6d0: 72 2d 3e 65 54 79 70 65 21 3d 52 42 55 5f 50 4b  r->eType!=RBU_PK
b6e0: 5f 56 54 41 42 20 7c 7c 20 70 49 74 65 72 2d 3e  _VTAB || pIter->
b6f0: 6e 49 6e 64 65 78 3d 3d 30 20 29 3b 0a 20 20 7d  nIndex==0 );.  }
b700: 0a 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63  ..  return p->rc
b710: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
b720: 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 73 74 72 75  function constru
b730: 63 74 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20  cts and returns 
b740: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  a pointer to a n
b750: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 0a 2a  ul-terminated .*
b760: 2a 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e  * string contain
b770: 69 6e 67 20 73 6f 6d 65 20 53 51 4c 20 63 6c 61  ing some SQL cla
b780: 75 73 65 20 6f 72 20 6c 69 73 74 20 62 61 73 65  use or list base
b790: 64 20 6f 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  d on one or more
b7a0: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 63 6f 6c 75   of the .** colu
b7b0: 6d 6e 20 6e 61 6d 65 73 20 63 75 72 72 65 6e 74  mn names current
b7c0: 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ly stored in the
b7d0: 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c   pIter->azTblCol
b7e0: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  [] array..*/.sta
b7f0: 74 69 63 20 63 68 61 72 20 2a 72 62 75 4f 62 6a  tic char *rbuObj
b800: 49 74 65 72 47 65 74 43 6f 6c 6c 69 73 74 28 0a  IterGetCollist(.
b810: 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c    sqlite3rbu *p,
b820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b830: 20 20 2f 2a 20 52 42 55 20 6f 62 6a 65 63 74 20    /* RBU object 
b840: 2a 2f 0a 20 20 52 62 75 4f 62 6a 49 74 65 72 20  */.  RbuObjIter 
b850: 2a 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20  *pIter          
b860: 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 69       /* Object i
b870: 74 65 72 61 74 6f 72 20 66 6f 72 20 63 6f 6c 75  terator for colu
b880: 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 29 7b 0a 20  mn names */.){. 
b890: 20 63 68 61 72 20 2a 7a 4c 69 73 74 20 3d 20 30   char *zList = 0
b8a0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
b8b0: 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 69 6e 74  zSep = "";.  int
b8c0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
b8d0: 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b  <pIter->nTblCol;
b8e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74   i++){.    const
b8f0: 20 63 68 61 72 20 2a 7a 20 3d 20 70 49 74 65 72   char *z = pIter
b900: 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 3b 0a 20  ->azTblCol[i];. 
b910: 20 20 20 7a 4c 69 73 74 20 3d 20 72 62 75 4d 50     zList = rbuMP
b920: 72 69 6e 74 66 28 70 2c 20 22 25 7a 25 73 5c 22  rintf(p, "%z%s\"
b930: 25 77 5c 22 22 2c 20 7a 4c 69 73 74 2c 20 7a 53  %w\"", zList, zS
b940: 65 70 2c 20 7a 29 3b 0a 20 20 20 20 7a 53 65 70  ep, z);.    zSep
b950: 20 3d 20 22 2c 20 22 3b 0a 20 20 7d 0a 20 20 72   = ", ";.  }.  r
b960: 65 74 75 72 6e 20 7a 4c 69 73 74 3b 0a 7d 0a 0a  eturn zList;.}..
b970: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
b980: 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63  ion is used to c
b990: 72 65 61 74 65 20 61 20 53 45 4c 45 43 54 20 6c  reate a SELECT l
b9a0: 69 73 74 20 28 74 68 65 20 6c 69 73 74 20 6f 66  ist (the list of
b9b0: 20 53 51 4c 20 0a 2a 2a 20 65 78 70 72 65 73 73   SQL .** express
b9c0: 69 6f 6e 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77  ions that follow
b9d0: 73 20 61 20 53 45 4c 45 43 54 20 6b 65 79 77 6f  s a SELECT keywo
b9e0: 72 64 29 20 66 6f 72 20 61 20 53 45 4c 45 43 54  rd) for a SELECT
b9f0: 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a 20 75   statement .** u
ba00: 73 65 64 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  sed to read from
ba10: 20 61 6e 20 64 61 74 61 5f 78 78 78 20 6f 72 20   an data_xxx or 
ba20: 72 62 75 5f 74 6d 70 5f 78 78 78 20 74 61 62 6c  rbu_tmp_xxx tabl
ba30: 65 20 77 68 69 6c 65 20 75 70 64 61 74 69 6e 67  e while updating
ba40: 20 74 68 65 20 0a 2a 2a 20 69 6e 64 65 78 20 6f   the .** index o
ba50: 62 6a 65 63 74 20 63 75 72 72 65 6e 74 6c 79 20  bject currently 
ba60: 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65  indicated by the
ba70: 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74   iterator object
ba80: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 0a   passed as the .
ba90: 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  ** second argume
baa0: 6e 74 2e 20 41 20 22 50 52 41 47 4d 41 20 69 6e  nt. A "PRAGMA in
bab0: 64 65 78 5f 78 69 6e 66 6f 20 3d 20 3c 69 64 78  dex_xinfo = <idx
bac0: 6e 61 6d 65 3e 22 20 73 74 61 74 65 6d 65 6e 74  name>" statement
bad0: 20 69 73 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20   is used .** to 
bae0: 6f 62 74 61 69 6e 20 74 68 65 20 72 65 71 75 69  obtain the requi
baf0: 72 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  red information.
bb00: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  .**.** If the in
bb10: 64 65 78 20 69 73 20 6f 66 20 74 68 65 20 66 6f  dex is of the fo
bb20: 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a  llowing form:.**
bb30: 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44  .**   CREATE IND
bb40: 45 58 20 69 31 20 4f 4e 20 74 31 28 63 2c 20 62  EX i1 ON t1(c, b
bb50: 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 29   COLLATE nocase)
bb60: 3b 0a 2a 2a 0a 2a 2a 20 61 6e 64 20 22 74 31 22  ;.**.** and "t1"
bb70: 20 69 73 20 61 20 74 61 62 6c 65 20 77 69 74 68   is a table with
bb80: 20 61 6e 20 65 78 70 6c 69 63 69 74 20 49 4e 54   an explicit INT
bb90: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
bba0: 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 22 69 70 6b   column .** "ipk
bbb0: 22 2c 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ", the returned 
bbc0: 73 74 72 69 6e 67 20 69 73 3a 0a 2a 2a 0a 2a 2a  string is:.**.**
bbd0: 20 20 20 22 60 63 60 20 43 4f 4c 4c 41 54 45 20     "`c` COLLATE 
bbe0: 27 42 49 4e 41 52 59 27 2c 20 60 62 60 20 43 4f  'BINARY', `b` CO
bbf0: 4c 4c 41 54 45 20 27 4e 4f 43 41 53 45 27 2c 20  LLATE 'NOCASE', 
bc00: 60 69 70 6b 60 20 43 4f 4c 4c 41 54 45 20 27 42  `ipk` COLLATE 'B
bc10: 49 4e 41 52 59 27 22 0a 2a 2a 0a 2a 2a 20 41 73  INARY'".**.** As
bc20: 20 77 65 6c 6c 20 61 73 20 74 68 65 20 72 65 74   well as the ret
bc30: 75 72 6e 65 64 20 73 74 72 69 6e 67 2c 20 74 68  urned string, th
bc40: 72 65 65 20 6f 74 68 65 72 20 6d 61 6c 6c 6f 63  ree other malloc
bc50: 27 64 20 73 74 72 69 6e 67 73 20 61 72 65 20 0a  'd strings are .
bc60: 2a 2a 20 72 65 74 75 72 6e 65 64 20 76 69 61 20  ** returned via 
bc70: 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72  output parameter
bc80: 73 2e 20 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  s. As follows:.*
bc90: 2a 0a 2a 2a 20 20 20 70 7a 49 6d 70 6f 73 74 65  *.**   pzImposte
bca0: 72 43 6f 6c 73 3a 20 2e 2e 2e 0a 2a 2a 20 20 20  rCols: ....**   
bcb0: 70 7a 49 6d 70 6f 73 74 65 72 50 6b 3a 20 2e 2e  pzImposterPk: ..
bcc0: 2e 0a 2a 2a 20 20 20 70 7a 57 68 65 72 65 3a 20  ..**   pzWhere: 
bcd0: 2e 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ....*/.static ch
bce0: 61 72 20 2a 72 62 75 4f 62 6a 49 74 65 72 47 65  ar *rbuObjIterGe
bcf0: 74 49 6e 64 65 78 43 6f 6c 73 28 0a 20 20 73 71  tIndexCols(.  sq
bd00: 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 20 20 20  lite3rbu *p,    
bd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bd20: 20 52 42 55 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   RBU object */. 
bd30: 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74   RbuObjIter *pIt
bd40: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
bd50: 20 2f 2a 20 4f 62 6a 65 63 74 20 69 74 65 72 61   /* Object itera
bd60: 74 6f 72 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 6e  tor for column n
bd70: 61 6d 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ames */.  char *
bd80: 2a 70 7a 49 6d 70 6f 73 74 65 72 43 6f 6c 73 2c  *pzImposterCols,
bd90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
bda0: 3a 20 43 6f 6c 75 6d 6e 73 20 66 6f 72 20 69 6d  : Columns for im
bdb0: 70 6f 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a  poster table */.
bdc0: 20 20 63 68 61 72 20 2a 2a 70 7a 49 6d 70 6f 73    char **pzImpos
bdd0: 74 65 72 50 6b 2c 20 20 20 20 20 20 20 20 20 20  terPk,          
bde0: 20 20 2f 2a 20 4f 55 54 3a 20 49 6d 70 6f 73 74    /* OUT: Impost
bdf0: 65 72 20 50 4b 20 63 6c 61 75 73 65 20 2a 2f 0a  er PK clause */.
be00: 20 20 63 68 61 72 20 2a 2a 70 7a 57 68 65 72 65    char **pzWhere
be10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
be20: 20 20 2f 2a 20 4f 55 54 3a 20 57 48 45 52 45 20    /* OUT: WHERE 
be30: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
be40: 2a 70 6e 42 69 6e 64 20 20 20 20 20 20 20 20 20  *pnBind         
be50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
be60: 55 54 3a 20 54 72 62 75 6c 20 6e 75 6d 62 65 72  UT: Trbul number
be70: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 29   of columns */.)
be80: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e  {.  int rc = p->
be90: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
bea0: 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
beb0: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 3b 20  e */.  int rc2; 
bec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bed0: 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
bee0: 33 5f 66 69 6e 61 6c 69 7a 65 28 29 20 72 65 74  3_finalize() ret
bef0: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68  urn code */.  ch
bf00: 61 72 20 2a 7a 52 65 74 20 3d 20 30 3b 20 20 20  ar *zRet = 0;   
bf10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bf20: 20 53 74 72 69 6e 67 20 74 6f 20 72 65 74 75 72   String to retur
bf30: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 49 6d  n */.  char *zIm
bf40: 70 43 6f 6c 73 20 3d 20 30 3b 20 20 20 20 20 20  pCols = 0;      
bf50: 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67         /* String
bf60: 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a   to return via *
bf70: 70 7a 49 6d 70 6f 73 74 65 72 43 6f 6c 73 20 2a  pzImposterCols *
bf80: 2f 0a 20 20 63 68 61 72 20 2a 7a 49 6d 70 50 4b  /.  char *zImpPK
bf90: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
bfa0: 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 74 6f      /* String to
bfb0: 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70 7a 49   return via *pzI
bfc0: 6d 70 6f 73 74 65 72 50 4b 20 2a 2f 0a 20 20 63  mposterPK */.  c
bfd0: 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b  har *zWhere = 0;
bfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bff0: 2a 20 53 74 72 69 6e 67 20 74 6f 20 72 65 74 75  * String to retu
c000: 72 6e 20 76 69 61 20 2a 70 7a 57 68 65 72 65 20  rn via *pzWhere 
c010: 2a 2f 0a 20 20 69 6e 74 20 6e 42 69 6e 64 20 3d  */.  int nBind =
c020: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
c030: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
c040: 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70 6e 42   return via *pnB
c050: 69 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ind */.  const c
c060: 68 61 72 20 2a 7a 43 6f 6d 20 3d 20 22 22 3b 20  har *zCom = ""; 
c070: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
c080: 74 6f 20 22 2c 20 22 20 6c 61 74 65 72 20 6f 6e  to ", " later on
c090: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
c0a0: 20 2a 7a 41 6e 64 20 3d 20 22 22 3b 20 20 20 20   *zAnd = "";    
c0b0: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
c0c0: 22 20 41 4e 44 20 22 20 6c 61 74 65 72 20 6f 6e  " AND " later on
c0d0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
c0e0: 6d 74 20 2a 70 58 49 6e 66 6f 20 3d 20 30 3b 20  mt *pXInfo = 0; 
c0f0: 20 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20        /* PRAGMA 
c100: 69 6e 64 65 78 5f 78 69 6e 66 6f 20 3d 20 3f 20  index_xinfo = ? 
c110: 2a 2f 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  */..  if( rc==SQ
c120: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
c130: 73 73 65 72 74 28 20 70 2d 3e 7a 45 72 72 6d 73  ssert( p->zErrms
c140: 67 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  g==0 );.    rc =
c150: 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43   prepareFreeAndC
c160: 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64  ollectError(p->d
c170: 62 4d 61 69 6e 2c 20 26 70 58 49 6e 66 6f 2c 20  bMain, &pXInfo, 
c180: 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20  &p->zErrmsg,.   
c190: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72       sqlite3_mpr
c1a0: 69 6e 74 66 28 22 50 52 41 47 4d 41 20 6d 61 69  intf("PRAGMA mai
c1b0: 6e 2e 69 6e 64 65 78 5f 78 69 6e 66 6f 20 3d 20  n.index_xinfo = 
c1c0: 25 51 22 2c 20 70 49 74 65 72 2d 3e 7a 49 64 78  %Q", pIter->zIdx
c1d0: 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20  ).    );.  }..  
c1e0: 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
c1f0: 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52  E_OK && SQLITE_R
c200: 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
c210: 28 70 58 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  (pXInfo) ){.    
c220: 69 6e 74 20 69 43 69 64 20 3d 20 73 71 6c 69 74  int iCid = sqlit
c230: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58  e3_column_int(pX
c240: 49 6e 66 6f 2c 20 31 29 3b 0a 20 20 20 20 69 6e  Info, 1);.    in
c250: 74 20 62 44 65 73 63 20 3d 20 73 71 6c 69 74 65  t bDesc = sqlite
c260: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49  3_column_int(pXI
c270: 6e 66 6f 2c 20 33 29 3b 0a 20 20 20 20 63 6f 6e  nfo, 3);.    con
c280: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 61 74  st char *zCollat
c290: 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  e = (const char*
c2a0: 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
c2b0: 74 65 78 74 28 70 58 49 6e 66 6f 2c 20 34 29 3b  text(pXInfo, 4);
c2c0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
c2d0: 2a 7a 43 6f 6c 3b 0a 20 20 20 20 63 6f 6e 73 74  *zCol;.    const
c2e0: 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 0a 20   char *zType;.. 
c2f0: 20 20 20 69 66 28 20 69 43 69 64 3c 30 20 29 7b     if( iCid<0 ){
c300: 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 74  .      /* An int
c310: 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79  eger primary key
c320: 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 68  . If the table h
c330: 61 73 20 61 6e 20 65 78 70 6c 69 63 69 74 20 49  as an explicit I
c340: 50 4b 2c 20 75 73 65 0a 20 20 20 20 20 20 2a 2a  PK, use.      **
c350: 20 69 74 73 20 6e 61 6d 65 2e 20 4f 74 68 65 72   its name. Other
c360: 77 69 73 65 2c 20 75 73 65 20 22 72 62 75 5f 72  wise, use "rbu_r
c370: 6f 77 69 64 22 2e 20 20 2a 2f 0a 20 20 20 20 20  owid".  */.     
c380: 20 69 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70   if( pIter->eTyp
c390: 65 3d 3d 52 42 55 5f 50 4b 5f 49 50 4b 20 29 7b  e==RBU_PK_IPK ){
c3a0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
c3b0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
c3c0: 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b   pIter->abTblPk[
c3d0: 69 5d 3d 3d 30 3b 20 69 2b 2b 29 3b 0a 20 20 20  i]==0; i++);.   
c3e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 70       assert( i<p
c3f0: 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20 29 3b  Iter->nTblCol );
c400: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  .        zCol = 
c410: 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b  pIter->azTblCol[
c420: 69 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  i];.      }else 
c430: 69 66 28 20 72 62 75 49 73 56 61 63 75 75 6d 28  if( rbuIsVacuum(
c440: 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43  p) ){.        zC
c450: 6f 6c 20 3d 20 22 5f 72 6f 77 69 64 5f 22 3b 0a  ol = "_rowid_";.
c460: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
c470: 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 62 75       zCol = "rbu
c480: 5f 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d  _rowid";.      }
c490: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
c4a0: 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 7d 65  INTEGER";.    }e
c4b0: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 43 6f 6c 20  lse{.      zCol 
c4c0: 3d 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f  = pIter->azTblCo
c4d0: 6c 5b 69 43 69 64 5d 3b 0a 20 20 20 20 20 20 7a  l[iCid];.      z
c4e0: 54 79 70 65 20 3d 20 70 49 74 65 72 2d 3e 61 7a  Type = pIter->az
c4f0: 54 62 6c 54 79 70 65 5b 69 43 69 64 5d 3b 0a 20  TblType[iCid];. 
c500: 20 20 20 7d 0a 0a 20 20 20 20 7a 52 65 74 20 3d     }..    zRet =
c510: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
c520: 28 22 25 7a 25 73 5c 22 25 77 5c 22 20 43 4f 4c  ("%z%s\"%w\" COL
c530: 4c 41 54 45 20 25 51 22 2c 20 7a 52 65 74 2c 20  LATE %Q", zRet, 
c540: 7a 43 6f 6d 2c 20 7a 43 6f 6c 2c 20 7a 43 6f 6c  zCom, zCol, zCol
c550: 6c 61 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  late);.    if( p
c560: 49 74 65 72 2d 3e 62 55 6e 69 71 75 65 3d 3d 30  Iter->bUnique==0
c570: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   || sqlite3_colu
c580: 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20 35  mn_int(pXInfo, 5
c590: 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ) ){.      const
c5a0: 20 63 68 61 72 20 2a 7a 4f 72 64 65 72 20 3d 20   char *zOrder = 
c5b0: 28 62 44 65 73 63 20 3f 20 22 20 44 45 53 43 22  (bDesc ? " DESC"
c5c0: 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 7a 49   : "");.      zI
c5d0: 6d 70 50 4b 20 3d 20 73 71 6c 69 74 65 33 5f 6d  mpPK = sqlite3_m
c5e0: 70 72 69 6e 74 66 28 22 25 7a 25 73 5c 22 72 62  printf("%z%s\"rb
c5f0: 75 5f 69 6d 70 5f 25 64 25 77 5c 22 25 73 22 2c  u_imp_%d%w\"%s",
c600: 20 0a 20 20 20 20 20 20 20 20 20 20 7a 49 6d 70   .          zImp
c610: 50 4b 2c 20 7a 43 6f 6d 2c 20 6e 42 69 6e 64 2c  PK, zCom, nBind,
c620: 20 7a 43 6f 6c 2c 20 7a 4f 72 64 65 72 0a 20 20   zCol, zOrder.  
c630: 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20      );.    }.   
c640: 20 7a 49 6d 70 43 6f 6c 73 20 3d 20 73 71 6c 69   zImpCols = sqli
c650: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 25  te3_mprintf("%z%
c660: 73 5c 22 72 62 75 5f 69 6d 70 5f 25 64 25 77 5c  s\"rbu_imp_%d%w\
c670: 22 20 25 73 20 43 4f 4c 4c 41 54 45 20 25 51 22  " %s COLLATE %Q"
c680: 2c 20 0a 20 20 20 20 20 20 20 20 7a 49 6d 70 43  , .        zImpC
c690: 6f 6c 73 2c 20 7a 43 6f 6d 2c 20 6e 42 69 6e 64  ols, zCom, nBind
c6a0: 2c 20 7a 43 6f 6c 2c 20 7a 54 79 70 65 2c 20 7a  , zCol, zType, z
c6b0: 43 6f 6c 6c 61 74 65 0a 20 20 20 20 29 3b 0a 20  Collate.    );. 
c6c0: 20 20 20 7a 57 68 65 72 65 20 3d 20 73 71 6c 69     zWhere = sqli
c6d0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
c6e0: 20 20 20 20 20 22 25 7a 25 73 5c 22 72 62 75 5f       "%z%s\"rbu_
c6f0: 69 6d 70 5f 25 64 25 77 5c 22 20 49 53 20 3f 22  imp_%d%w\" IS ?"
c700: 2c 20 7a 57 68 65 72 65 2c 20 7a 41 6e 64 2c 20  , zWhere, zAnd, 
c710: 6e 42 69 6e 64 2c 20 7a 43 6f 6c 0a 20 20 20 20  nBind, zCol.    
c720: 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 65 74 3d  );.    if( zRet=
c730: 3d 30 20 7c 7c 20 7a 49 6d 70 50 4b 3d 3d 30 20  =0 || zImpPK==0 
c740: 7c 7c 20 7a 49 6d 70 43 6f 6c 73 3d 3d 30 20 7c  || zImpCols==0 |
c750: 7c 20 7a 57 68 65 72 65 3d 3d 30 20 29 20 72 63  | zWhere==0 ) rc
c760: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
c770: 0a 20 20 20 20 7a 43 6f 6d 20 3d 20 22 2c 20 22  .    zCom = ", "
c780: 3b 0a 20 20 20 20 7a 41 6e 64 20 3d 20 22 20 41  ;.    zAnd = " A
c790: 4e 44 20 22 3b 0a 20 20 20 20 6e 42 69 6e 64 2b  ND ";.    nBind+
c7a0: 2b 3b 0a 20 20 7d 0a 0a 20 20 72 63 32 20 3d 20  +;.  }..  rc2 = 
c7b0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
c7c0: 28 70 58 49 6e 66 6f 29 3b 0a 20 20 69 66 28 20  (pXInfo);.  if( 
c7d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
c7e0: 72 63 20 3d 20 72 63 32 3b 0a 0a 20 20 69 66 28  rc = rc2;..  if(
c7f0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
c800: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
c810: 65 65 28 7a 52 65 74 29 3b 0a 20 20 20 20 73 71  ee(zRet);.    sq
c820: 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6d 70 43  lite3_free(zImpC
c830: 6f 6c 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ols);.    sqlite
c840: 33 5f 66 72 65 65 28 7a 49 6d 70 50 4b 29 3b 0a  3_free(zImpPK);.
c850: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
c860: 28 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 7a 52  (zWhere);.    zR
c870: 65 74 20 3d 20 30 3b 0a 20 20 20 20 7a 49 6d 70  et = 0;.    zImp
c880: 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 20 20 7a 49  Cols = 0;.    zI
c890: 6d 70 50 4b 20 3d 20 30 3b 0a 20 20 20 20 7a 57  mpPK = 0;.    zW
c8a0: 68 65 72 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d  here = 0;.    p-
c8b0: 3e 72 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 0a 20  >rc = rc;.  }.. 
c8c0: 20 2a 70 7a 49 6d 70 6f 73 74 65 72 43 6f 6c 73   *pzImposterCols
c8d0: 20 3d 20 7a 49 6d 70 43 6f 6c 73 3b 0a 20 20 2a   = zImpCols;.  *
c8e0: 70 7a 49 6d 70 6f 73 74 65 72 50 6b 20 3d 20 7a  pzImposterPk = z
c8f0: 49 6d 70 50 4b 3b 0a 20 20 2a 70 7a 57 68 65 72  ImpPK;.  *pzWher
c900: 65 20 3d 20 7a 57 68 65 72 65 3b 0a 20 20 2a 70  e = zWhere;.  *p
c910: 6e 42 69 6e 64 20 3d 20 6e 42 69 6e 64 3b 0a 20  nBind = nBind;. 
c920: 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a   return zRet;.}.
c930: 0a 2f 2a 0a 2a 2a 20 41 73 73 75 6d 69 6e 67 20  ./*.** Assuming 
c940: 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
c950: 65 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 22 61  e columns are "a
c960: 22 2c 20 22 62 22 20 61 6e 64 20 22 63 22 2c 20  ", "b" and "c", 
c970: 61 6e 64 20 74 68 65 20 7a 4f 62 6a 0a 2a 2a 20  and the zObj.** 
c980: 70 61 72 61 6d 74 65 72 20 69 73 20 70 61 73 73  paramter is pass
c990: 65 64 20 22 6f 6c 64 22 2c 20 72 65 74 75 72 6e  ed "old", return
c9a0: 20 61 20 73 74 72 69 6e 67 20 6f 66 20 74 68 65   a string of the
c9b0: 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   form:.**.**    
c9c0: 20 22 6f 6c 64 2e 61 2c 20 6f 6c 64 2e 62 2c 20   "old.a, old.b, 
c9d0: 6f 6c 64 2e 62 22 0a 2a 2a 0a 2a 2a 20 57 69 74  old.b".**.** Wit
c9e0: 68 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  h the column nam
c9f0: 65 73 20 65 73 63 61 70 65 64 2e 0a 2a 2a 0a 2a  es escaped..**.*
ca00: 2a 20 46 6f 72 20 74 61 62 6c 65 73 20 77 69 74  * For tables wit
ca10: 68 20 69 6d 70 6c 69 63 69 74 20 72 6f 77 69 64  h implicit rowid
ca20: 73 20 2d 20 52 42 55 5f 50 4b 5f 45 58 54 45 52  s - RBU_PK_EXTER
ca30: 4e 41 4c 20 61 6e 64 20 52 42 55 5f 50 4b 5f 4e  NAL and RBU_PK_N
ca40: 4f 4e 45 2c 20 61 70 70 65 6e 64 0a 2a 2a 20 74  ONE, append.** t
ca50: 68 65 20 74 65 78 74 20 22 2c 20 6f 6c 64 2e 5f  he text ", old._
ca60: 72 6f 77 69 64 5f 22 20 74 6f 20 74 68 65 20 72  rowid_" to the r
ca70: 65 74 75 72 6e 65 64 20 76 61 6c 75 65 2e 0a 2a  eturned value..*
ca80: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 72  /.static char *r
ca90: 62 75 4f 62 6a 49 74 65 72 47 65 74 4f 6c 64 6c  buObjIterGetOldl
caa0: 69 73 74 28 0a 20 20 73 71 6c 69 74 65 33 72 62  ist(.  sqlite3rb
cab0: 75 20 2a 70 2c 20 0a 20 20 52 62 75 4f 62 6a 49  u *p, .  RbuObjI
cac0: 74 65 72 20 2a 70 49 74 65 72 2c 0a 20 20 63 6f  ter *pIter,.  co
cad0: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a 0a 29  nst char *zObj.)
cae0: 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 69 73 74 20  {.  char *zList 
caf0: 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  = 0;.  if( p->rc
cb00: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
cb10: 49 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64 20  Iter->abIndexed 
cb20: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
cb30: 72 20 2a 7a 53 20 3d 20 22 22 3b 0a 20 20 20 20  r *zS = "";.    
cb40: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
cb50: 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 54 62  =0; i<pIter->nTb
cb60: 6c 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lCol; i++){.    
cb70: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 61 62 49    if( pIter->abI
cb80: 6e 64 65 78 65 64 5b 69 5d 20 29 7b 0a 20 20 20  ndexed[i] ){.   
cb90: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
cba0: 2a 7a 43 6f 6c 20 3d 20 70 49 74 65 72 2d 3e 61  *zCol = pIter->a
cbb0: 7a 54 62 6c 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20  zTblCol[i];.    
cbc0: 20 20 20 20 7a 4c 69 73 74 20 3d 20 73 71 6c 69      zList = sqli
cbd0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 25  te3_mprintf("%z%
cbe0: 73 25 73 2e 5c 22 25 77 5c 22 22 2c 20 7a 4c 69  s%s.\"%w\"", zLi
cbf0: 73 74 2c 20 7a 53 2c 20 7a 4f 62 6a 2c 20 7a 43  st, zS, zObj, zC
cc00: 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ol);.      }else
cc10: 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 73 74 20  {.        zList 
cc20: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
cc30: 66 28 22 25 7a 25 73 4e 55 4c 4c 22 2c 20 7a 4c  f("%z%sNULL", zL
cc40: 69 73 74 2c 20 7a 53 29 3b 0a 20 20 20 20 20 20  ist, zS);.      
cc50: 7d 0a 20 20 20 20 20 20 7a 53 20 3d 20 22 2c 20  }.      zS = ", 
cc60: 22 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69  ";.      if( zLi
cc70: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  st==0 ){.       
cc80: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
cc90: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 62  NOMEM;.        b
cca0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
ccb0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20    }..    /* For 
ccc0: 61 20 74 61 62 6c 65 20 77 69 74 68 20 69 6d 70  a table with imp
ccd0: 6c 69 63 69 74 20 72 6f 77 69 64 73 2c 20 61 70  licit rowids, ap
cce0: 70 65 6e 64 20 22 6f 6c 64 2e 5f 72 6f 77 69 64  pend "old._rowid
ccf0: 5f 22 20 74 6f 20 74 68 65 20 6c 69 73 74 2e 20  _" to the list. 
cd00: 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  */.    if( pIter
cd10: 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
cd20: 45 58 54 45 52 4e 41 4c 20 7c 7c 20 70 49 74 65  EXTERNAL || pIte
cd30: 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
cd40: 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 7a  _NONE ){.      z
cd50: 4c 69 73 74 20 3d 20 72 62 75 4d 50 72 69 6e 74  List = rbuMPrint
cd60: 66 28 70 2c 20 22 25 7a 2c 20 25 73 2e 5f 72 6f  f(p, "%z, %s._ro
cd70: 77 69 64 5f 22 2c 20 7a 4c 69 73 74 2c 20 7a 4f  wid_", zList, zO
cd80: 62 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  bj);.    }.  }. 
cd90: 20 72 65 74 75 72 6e 20 7a 4c 69 73 74 3b 0a 7d   return zList;.}
cda0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
cdb0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  n expression tha
cdc0: 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e  t can be used in
cdd0: 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20   a WHERE clause 
cde0: 74 6f 20 6d 61 74 63 68 20 74 68 65 0a 2a 2a 20  to match the.** 
cdf0: 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 66 20 74  primary key of t
ce00: 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
ce10: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
ce20: 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 3a 0a  f the table is:.
ce30: 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54  **.**   CREATE T
ce40: 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63 2c  ABLE t1(a, b, c,
ce50: 20 50 52 49 4d 41 52 59 20 4b 45 59 28 62 2c 20   PRIMARY KEY(b, 
ce60: 63 29 29 3b 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  c));.**.** Retur
ce70: 6e 20 74 68 65 20 73 74 72 69 6e 67 3a 0a 2a 2a  n the string:.**
ce80: 0a 2a 2a 20 20 20 22 62 20 3d 20 3f 31 20 41 4e  .**   "b = ?1 AN
ce90: 44 20 63 20 3d 20 3f 32 22 0a 2a 2f 0a 73 74 61  D c = ?2".*/.sta
cea0: 74 69 63 20 63 68 61 72 20 2a 72 62 75 4f 62 6a  tic char *rbuObj
ceb0: 49 74 65 72 47 65 74 57 68 65 72 65 28 0a 20 20  IterGetWhere(.  
cec0: 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 0a  sqlite3rbu *p, .
ced0: 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49    RbuObjIter *pI
cee0: 74 65 72 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a  ter.){.  char *z
cef0: 4c 69 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  List = 0;.  if( 
cf00: 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
cf10: 55 5f 50 4b 5f 56 54 41 42 20 7c 7c 20 70 49 74  U_PK_VTAB || pIt
cf20: 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
cf30: 4b 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 7a 4c  K_NONE ){.    zL
cf40: 69 73 74 20 3d 20 72 62 75 4d 50 72 69 6e 74 66  ist = rbuMPrintf
cf50: 28 70 2c 20 22 5f 72 6f 77 69 64 5f 20 3d 20 3f  (p, "_rowid_ = ?
cf60: 25 64 22 2c 20 70 49 74 65 72 2d 3e 6e 54 62 6c  %d", pIter->nTbl
cf70: 43 6f 6c 2b 31 29 3b 0a 20 20 7d 65 6c 73 65 20  Col+1);.  }else 
cf80: 69 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65  if( pIter->eType
cf90: 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41  ==RBU_PK_EXTERNA
cfa0: 4c 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  L ){.    const c
cfb0: 68 61 72 20 2a 7a 53 65 70 20 3d 20 22 22 3b 0a  har *zSep = "";.
cfc0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
cfd0: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d  or(i=0; i<pIter-
cfe0: 3e 6e 54 62 6c 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nTblCol; i++){.
cff0: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
d000: 3e 61 62 54 62 6c 50 6b 5b 69 5d 20 29 7b 0a 20  >abTblPk[i] ){. 
d010: 20 20 20 20 20 20 20 7a 4c 69 73 74 20 3d 20 72         zList = r
d020: 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a  buMPrintf(p, "%z
d030: 25 73 63 25 64 3d 3f 25 64 22 2c 20 7a 4c 69 73  %sc%d=?%d", zLis
d040: 74 2c 20 7a 53 65 70 2c 20 69 2c 20 69 2b 31 29  t, zSep, i, i+1)
d050: 3b 0a 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d  ;.        zSep =
d060: 20 22 20 41 4e 44 20 22 3b 0a 20 20 20 20 20 20   " AND ";.      
d070: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4c 69 73  }.    }.    zLis
d080: 74 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70  t = rbuMPrintf(p
d090: 2c 20 0a 20 20 20 20 20 20 20 20 22 5f 72 6f 77  , .        "_row
d0a0: 69 64 5f 20 3d 20 28 53 45 4c 45 43 54 20 69 64  id_ = (SELECT id
d0b0: 20 46 52 4f 4d 20 72 62 75 5f 69 6d 70 6f 73 74   FROM rbu_impost
d0c0: 65 72 32 20 57 48 45 52 45 20 25 7a 29 22 2c 20  er2 WHERE %z)", 
d0d0: 7a 4c 69 73 74 0a 20 20 20 20 29 3b 0a 0a 20 20  zList.    );..  
d0e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74  }else{.    const
d0f0: 20 63 68 61 72 20 2a 7a 53 65 70 20 3d 20 22 22   char *zSep = ""
d100: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
d110: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65   for(i=0; i<pIte
d120: 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69 2b 2b 29  r->nTblCol; i++)
d130: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  {.      if( pIte
d140: 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 5d 20 29 7b  r->abTblPk[i] ){
d150: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
d160: 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 70 49 74 65  har *zCol = pIte
d170: 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 3b 0a  r->azTblCol[i];.
d180: 20 20 20 20 20 20 20 20 7a 4c 69 73 74 20 3d 20          zList = 
d190: 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25  rbuMPrintf(p, "%
d1a0: 7a 25 73 5c 22 25 77 5c 22 3d 3f 25 64 22 2c 20  z%s\"%w\"=?%d", 
d1b0: 7a 4c 69 73 74 2c 20 7a 53 65 70 2c 20 7a 43 6f  zList, zSep, zCo
d1c0: 6c 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20  l, i+1);.       
d1d0: 20 7a 53 65 70 20 3d 20 22 20 41 4e 44 20 22 3b   zSep = " AND ";
d1e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
d1f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4c 69 73   }.  return zLis
d200: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  t;.}../*.** The 
d210: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
d220: 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75   iterating throu
d230: 67 68 20 74 68 65 20 6b 65 79 73 20 66 6f 72 20  gh the keys for 
d240: 74 68 65 20 63 75 72 72 65 6e 74 20 6f 62 6a 65  the current obje
d250: 63 74 0a 2a 2a 20 28 70 2d 3e 6f 62 6a 69 74 65  ct.** (p->objite
d260: 72 2e 70 53 65 6c 65 63 74 29 20 63 75 72 72 65  r.pSelect) curre
d270: 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 61  ntly points to a
d280: 20 76 61 6c 69 64 20 72 6f 77 2e 20 48 6f 77 65   valid row. Howe
d290: 76 65 72 2c 20 74 68 65 72 65 0a 2a 2a 20 69 73  ver, there.** is
d2a0: 20 73 6f 6d 65 74 68 69 6e 67 20 77 72 6f 6e 67   something wrong
d2b0: 20 77 69 74 68 20 74 68 65 20 72 62 75 5f 63 6f   with the rbu_co
d2c0: 6e 74 72 6f 6c 20 76 61 6c 75 65 20 69 6e 20 74  ntrol value in t
d2d0: 68 65 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 76  he rbu_control v
d2e0: 61 6c 75 65 0a 2a 2a 20 73 74 6f 72 65 64 20 69  alue.** stored i
d2f0: 6e 20 74 68 65 20 28 70 2d 3e 6e 43 6f 6c 2b 31  n the (p->nCol+1
d300: 29 27 74 68 20 63 6f 6c 75 6d 6e 2e 20 53 65 74  )'th column. Set
d310: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
d320: 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67  and error messag
d330: 65 0a 2a 2a 20 6f 66 20 74 68 65 20 52 42 55 20  e.** of the RBU 
d340: 68 61 6e 64 6c 65 20 74 6f 20 73 6f 6d 65 74 68  handle to someth
d350: 69 6e 67 20 72 65 66 6c 65 63 74 69 6e 67 20 74  ing reflecting t
d360: 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  his..*/.static v
d370: 6f 69 64 20 72 62 75 42 61 64 43 6f 6e 74 72 6f  oid rbuBadContro
d380: 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 72 62  lError(sqlite3rb
d390: 75 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d  u *p){.  p->rc =
d3a0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
d3b0: 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71   p->zErrmsg = sq
d3c0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 69  lite3_mprintf("i
d3d0: 6e 76 61 6c 69 64 20 72 62 75 5f 63 6f 6e 74 72  nvalid rbu_contr
d3e0: 6f 6c 20 76 61 6c 75 65 22 29 3b 0a 7d 0a 0a 0a  ol value");.}...
d3f0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6e  /*.** Return a n
d400: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
d410: 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ring containing 
d420: 74 68 65 20 63 6f 6d 6d 61 20 73 65 70 61 72 61  the comma separa
d430: 74 65 64 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 61  ted list of.** a
d440: 73 73 69 67 6e 6d 65 6e 74 73 20 74 68 61 74 20  ssignments that 
d450: 73 68 6f 75 6c 64 20 62 65 20 69 6e 63 6c 75 64  should be includ
d460: 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ed following the
d470: 20 22 53 45 54 22 20 6b 65 79 77 6f 72 64 20 6f   "SET" keyword o
d480: 66 0a 2a 2a 20 61 6e 20 55 50 44 41 54 45 20 73  f.** an UPDATE s
d490: 74 61 74 65 6d 65 6e 74 20 75 73 65 64 20 74 6f  tatement used to
d4a0: 20 75 70 64 61 74 65 20 74 68 65 20 74 61 62 6c   update the tabl
d4b0: 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 74 68  e object that th
d4c0: 65 20 69 74 65 72 61 74 6f 72 0a 2a 2a 20 70 61  e iterator.** pa
d4d0: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
d4e0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 63 75 72 72  nd argument curr
d4f0: 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ently points to 
d500: 69 66 20 74 68 65 20 72 62 75 5f 63 6f 6e 74 72  if the rbu_contr
d510: 6f 6c 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20  ol.** column of 
d520: 74 68 65 20 64 61 74 61 5f 78 78 78 20 74 61 62  the data_xxx tab
d530: 6c 65 20 65 6e 74 72 79 20 69 73 20 73 65 74 20  le entry is set 
d540: 74 6f 20 7a 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20  to zMask..**.** 
d550: 54 68 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74  The memory for t
d560: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
d570: 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ng is obtained f
d580: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
d590: 6f 63 28 29 2e 0a 2a 2a 20 49 74 20 69 73 20 74  oc()..** It is t
d5a0: 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
d5b0: 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
d5c0: 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  to eventually fr
d5d0: 65 65 20 69 74 20 75 73 69 6e 67 0a 2a 2a 20 73  ee it using.** s
d5e0: 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 20 0a  qlite3_free(). .
d5f0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20  **.** If an OOM 
d600: 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
d610: 65 72 65 64 20 77 68 65 6e 20 61 6c 6c 6f 63 61  ered when alloca
d620: 74 69 6e 67 20 73 70 61 63 65 20 66 6f 72 20 74  ting space for t
d630: 68 65 20 6e 65 77 0a 2a 2a 20 73 74 72 69 6e 67  he new.** string
d640: 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
d650: 69 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72  is left in the r
d660: 62 75 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64  bu handle passed
d670: 20 61 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   as the first.**
d680: 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 4e 55   argument and NU
d690: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  LL is returned. 
d6a0: 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  Or, if an error 
d6b0: 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75  has already occu
d6c0: 72 72 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69  rred.** when thi
d6d0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
d6e0: 6c 6c 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65  lled, NULL is re
d6f0: 74 75 72 6e 65 64 20 69 6d 6d 65 64 69 61 74 65  turned immediate
d700: 6c 79 2c 20 77 69 74 68 6f 75 74 0a 2a 2a 20 61  ly, without.** a
d710: 74 74 65 6d 70 74 69 6e 67 20 74 68 65 20 61 6c  ttempting the al
d720: 6c 6f 63 61 74 69 6f 6e 20 6f 72 20 6d 6f 64 69  location or modi
d730: 66 79 69 6e 67 20 74 68 65 20 73 74 6f 72 65 64  fying the stored
d740: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
d750: 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 62 75  static char *rbu
d760: 4f 62 6a 49 74 65 72 47 65 74 53 65 74 6c 69 73  ObjIterGetSetlis
d770: 74 28 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20  t(.  sqlite3rbu 
d780: 2a 70 2c 0a 20 20 52 62 75 4f 62 6a 49 74 65 72  *p,.  RbuObjIter
d790: 20 2a 70 49 74 65 72 2c 0a 20 20 63 6f 6e 73 74   *pIter,.  const
d7a0: 20 63 68 61 72 20 2a 7a 4d 61 73 6b 0a 29 7b 0a   char *zMask.){.
d7b0: 20 20 63 68 61 72 20 2a 7a 4c 69 73 74 20 3d 20    char *zList = 
d7c0: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  0;.  if( p->rc==
d7d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d7e0: 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 69 66 28   int i;..    if(
d7f0: 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4d 61   (int)strlen(zMa
d800: 73 6b 29 21 3d 70 49 74 65 72 2d 3e 6e 54 62 6c  sk)!=pIter->nTbl
d810: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 72 62 75  Col ){.      rbu
d820: 42 61 64 43 6f 6e 74 72 6f 6c 45 72 72 6f 72 28  BadControlError(
d830: 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  p);.    }else{. 
d840: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
d850: 2a 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20  *zSep = "";.    
d860: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74    for(i=0; i<pIt
d870: 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69 2b 2b  er->nTblCol; i++
d880: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
d890: 63 20 3d 20 7a 4d 61 73 6b 5b 70 49 74 65 72 2d  c = zMask[pIter-
d8a0: 3e 61 69 53 72 63 4f 72 64 65 72 5b 69 5d 5d 3b  >aiSrcOrder[i]];
d8b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d  .        if( c==
d8c0: 27 78 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  'x' ){.         
d8d0: 20 7a 4c 69 73 74 20 3d 20 72 62 75 4d 50 72 69   zList = rbuMPri
d8e0: 6e 74 66 28 70 2c 20 22 25 7a 25 73 5c 22 25 77  ntf(p, "%z%s\"%w
d8f0: 5c 22 3d 3f 25 64 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 69 2b 31 0a 20 20 20  lCol[i], i+1.   
d930: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
d940: 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 20 22 3b      zSep = ", ";
d950: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d960: 20 20 20 65 6c 73 65 20 69 66 28 20 63 3d 3d 27     else if( c=='
d970: 64 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  d' ){.          
d980: 7a 4c 69 73 74 20 3d 20 72 62 75 4d 50 72 69 6e  zList = rbuMPrin
d990: 74 66 28 70 2c 20 22 25 7a 25 73 5c 22 25 77 5c  tf(p, "%z%s\"%w\
d9a0: 22 3d 72 62 75 5f 64 65 6c 74 61 28 5c 22 25 77  "=rbu_delta(\"%w
d9b0: 5c 22 2c 20 3f 25 64 29 22 2c 20 0a 20 20 20 20  \", ?%d)", .    
d9c0: 20 20 20 20 20 20 20 20 20 20 7a 4c 69 73 74 2c            zList,
d9d0: 20 7a 53 65 70 2c 20 70 49 74 65 72 2d 3e 61 7a   zSep, pIter->az
d9e0: 54 62 6c 43 6f 6c 5b 69 5d 2c 20 70 49 74 65 72  TblCol[i], pIter
d9f0: 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 2c 20 69  ->azTblCol[i], i
da00: 2b 31 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  +1.          );.
da10: 20 20 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d            zSep =
da20: 20 22 2c 20 22 3b 0a 20 20 20 20 20 20 20 20 7d   ", ";.        }
da30: 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66  .        else if
da40: 28 20 63 3d 3d 27 66 27 20 29 7b 0a 20 20 20 20  ( c=='f' ){.    
da50: 20 20 20 20 20 20 7a 4c 69 73 74 20 3d 20 72 62        zList = rb
da60: 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 25  uMPrintf(p, "%z%
da70: 73 5c 22 25 77 5c 22 3d 72 62 75 5f 66 6f 73 73  s\"%w\"=rbu_foss
da80: 69 6c 5f 64 65 6c 74 61 28 5c 22 25 77 5c 22 2c  il_delta(\"%w\",
da90: 20 3f 25 64 29 22 2c 20 0a 20 20 20 20 20 20 20   ?%d)", .       
daa0: 20 20 20 20 20 20 20 7a 4c 69 73 74 2c 20 7a 53         zList, zS
dab0: 65 70 2c 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c  ep, pIter->azTbl
dac0: 43 6f 6c 5b 69 5d 2c 20 70 49 74 65 72 2d 3e 61  Col[i], pIter->a
dad0: 7a 54 62 6c 43 6f 6c 5b 69 5d 2c 20 69 2b 31 0a  zTblCol[i], i+1.
dae0: 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
daf0: 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 2c         zSep = ",
db00: 20 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   ";.        }.  
db10: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
db20: 20 20 72 65 74 75 72 6e 20 7a 4c 69 73 74 3b 0a    return zList;.
db30: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
db40: 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  a nul-terminated
db50: 20 73 74 72 69 6e 67 20 63 6f 6e 73 69 73 74 69   string consisti
db60: 6e 67 20 6f 66 20 6e 42 79 74 65 20 63 6f 6d 6d  ng of nByte comm
db70: 61 20 73 65 70 61 72 61 74 65 64 0a 2a 2a 20 22  a separated.** "
db80: 3f 22 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  ?" expressions. 
db90: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
dba0: 6e 42 79 74 65 20 69 73 20 33 2c 20 72 65 74 75  nByte is 3, retu
dbb0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a  rn a pointer to.
dbc0: 2a 2a 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  ** a buffer cont
dbd0: 61 69 6e 69 6e 67 20 74 68 65 20 73 74 72 69 6e  aining the strin
dbe0: 67 20 22 3f 2c 3f 2c 3f 22 2e 0a 2a 2a 0a 2a 2a  g "?,?,?"..**.**
dbf0: 20 54 68 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20   The memory for 
dc00: 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  the returned str
dc10: 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ing is obtained 
dc20: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
dc30: 6c 6f 63 28 29 2e 0a 2a 2a 20 49 74 20 69 73 20  loc()..** It is 
dc40: 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
dc50: 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
dc60: 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   to eventually f
dc70: 72 65 65 20 69 74 20 75 73 69 6e 67 0a 2a 2a 20  ree it using.** 
dc80: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 20  sqlite3_free(). 
dc90: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d  .**.** If an OOM
dca0: 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
dcb0: 74 65 72 65 64 20 77 68 65 6e 20 61 6c 6c 6f 63  tered when alloc
dcc0: 61 74 69 6e 67 20 73 70 61 63 65 20 66 6f 72 20  ating space for 
dcd0: 74 68 65 20 6e 65 77 0a 2a 2a 20 73 74 72 69 6e  the new.** strin
dce0: 67 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  g, an error code
dcf0: 20 69 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20   is left in the 
dd00: 72 62 75 20 68 61 6e 64 6c 65 20 70 61 73 73 65  rbu handle passe
dd10: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 0a 2a  d as the first.*
dd20: 2a 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 4e  * argument and N
dd30: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
dd40: 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72   Or, if an error
dd50: 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
dd60: 75 72 72 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68  urred.** when th
dd70: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
dd80: 61 6c 6c 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72  alled, NULL is r
dd90: 65 74 75 72 6e 65 64 20 69 6d 6d 65 64 69 61 74  eturned immediat
dda0: 65 6c 79 2c 20 77 69 74 68 6f 75 74 0a 2a 2a 20  ely, without.** 
ddb0: 61 74 74 65 6d 70 74 69 6e 67 20 74 68 65 20 61  attempting the a
ddc0: 6c 6c 6f 63 61 74 69 6f 6e 20 6f 72 20 6d 6f 64  llocation or mod
ddd0: 69 66 79 69 6e 67 20 74 68 65 20 73 74 6f 72 65  ifying the store
dde0: 64 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  d error code..*/
ddf0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 62  .static char *rb
de00: 75 4f 62 6a 49 74 65 72 47 65 74 42 69 6e 64 6c  uObjIterGetBindl
de10: 69 73 74 28 73 71 6c 69 74 65 33 72 62 75 20 2a  ist(sqlite3rbu *
de20: 70 2c 20 69 6e 74 20 6e 42 69 6e 64 29 7b 0a 20  p, int nBind){. 
de30: 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20 30 3b   char *zRet = 0;
de40: 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 6e  .  int nByte = n
de50: 42 69 6e 64 2a 32 20 2b 20 31 3b 0a 0a 20 20 7a  Bind*2 + 1;..  z
de60: 52 65 74 20 3d 20 28 63 68 61 72 2a 29 72 62 75  Ret = (char*)rbu
de70: 4d 61 6c 6c 6f 63 28 70 2c 20 6e 42 79 74 65 29  Malloc(p, nByte)
de80: 3b 0a 20 20 69 66 28 20 7a 52 65 74 20 29 7b 0a  ;.  if( zRet ){.
de90: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
dea0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 69 6e 64 3b  or(i=0; i<nBind;
deb0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 52 65   i++){.      zRe
dec0: 74 5b 69 2a 32 5d 20 3d 20 27 3f 27 3b 0a 20 20  t[i*2] = '?';.  
ded0: 20 20 20 20 7a 52 65 74 5b 69 2a 32 2b 31 5d 20      zRet[i*2+1] 
dee0: 3d 20 28 69 2b 31 3d 3d 6e 42 69 6e 64 29 20 3f  = (i+1==nBind) ?
def0: 20 27 5c 30 27 20 3a 20 27 2c 27 3b 0a 20 20 20   '\0' : ',';.   
df00: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
df10: 7a 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  zRet;.}../*.** T
df20: 68 65 20 69 74 65 72 61 74 6f 72 20 63 75 72 72  he iterator curr
df30: 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ently points to 
df40: 61 20 74 61 62 6c 65 20 28 6e 6f 74 20 69 6e 64  a table (not ind
df50: 65 78 29 20 6f 66 20 74 79 70 65 20 0a 2a 2a 20  ex) of type .** 
df60: 52 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54 5f 52  RBU_PK_WITHOUT_R
df70: 4f 57 49 44 2e 20 54 68 69 73 20 66 75 6e 63 74  OWID. This funct
df80: 69 6f 6e 20 63 72 65 61 74 65 73 20 74 68 65 20  ion creates the 
df90: 50 52 49 4d 41 52 59 20 4b 45 59 20 0a 2a 2a 20  PRIMARY KEY .** 
dfa0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 66 6f 72 20  declaration for 
dfb0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
dfc0: 67 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65  g imposter table
dfd0: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a  . For example,.*
dfe0: 2a 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f  * if the iterato
dff0: 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 74 61  r points to a ta
e000: 62 6c 65 20 63 72 65 61 74 65 64 20 61 73 3a 0a  ble created as:.
e010: 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54  **.**   CREATE T
e020: 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63 2c  ABLE t1(a, b, c,
e030: 20 50 52 49 4d 41 52 59 20 4b 45 59 28 62 2c 20   PRIMARY KEY(b, 
e040: 61 20 44 45 53 43 29 29 20 57 49 54 48 4f 55 54  a DESC)) WITHOUT
e050: 20 52 4f 57 49 44 0a 2a 2a 0a 2a 2a 20 74 68 69   ROWID.**.** thi
e060: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
e070: 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 52 49 4d  ns:.**.**   PRIM
e080: 41 52 59 20 4b 45 59 28 22 62 22 2c 20 22 61 22  ARY KEY("b", "a"
e090: 20 44 45 53 43 29 0a 2a 2f 0a 73 74 61 74 69 63   DESC).*/.static
e0a0: 20 63 68 61 72 20 2a 72 62 75 57 69 74 68 6f 75   char *rbuWithou
e0b0: 74 52 6f 77 69 64 50 4b 28 73 71 6c 69 74 65 33  tRowidPK(sqlite3
e0c0: 72 62 75 20 2a 70 2c 20 52 62 75 4f 62 6a 49 74  rbu *p, RbuObjIt
e0d0: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 63 68  er *pIter){.  ch
e0e0: 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 61 73 73  ar *z = 0;.  ass
e0f0: 65 72 74 28 20 70 49 74 65 72 2d 3e 7a 49 64 78  ert( pIter->zIdx
e100: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ==0 );.  if( p->
e110: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
e120: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
e130: 2a 7a 53 65 70 20 3d 20 22 50 52 49 4d 41 52 59  *zSep = "PRIMARY
e140: 20 4b 45 59 28 22 3b 0a 20 20 20 20 73 71 6c 69   KEY(";.    sqli
e150: 74 65 33 5f 73 74 6d 74 20 2a 70 58 4c 69 73 74  te3_stmt *pXList
e160: 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 50 52 41   = 0;     /* PRA
e170: 47 4d 41 20 69 6e 64 65 78 5f 6c 69 73 74 20 3d  GMA index_list =
e180: 20 28 70 49 74 65 72 2d 3e 7a 54 62 6c 29 20 2a   (pIter->zTbl) *
e190: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  /.    sqlite3_st
e1a0: 6d 74 20 2a 70 58 49 6e 66 6f 20 3d 20 30 3b 20  mt *pXInfo = 0; 
e1b0: 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 69 6e      /* PRAGMA in
e1c0: 64 65 78 5f 78 69 6e 66 6f 20 3d 20 3c 70 6b 2d  dex_xinfo = <pk-
e1d0: 69 6e 64 65 78 3e 20 2a 2f 0a 20 20 20 0a 20 20  index> */.   .  
e1e0: 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72    p->rc = prepar
e1f0: 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45  eFreeAndCollectE
e200: 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  rror(p->dbMain, 
e210: 26 70 58 4c 69 73 74 2c 20 26 70 2d 3e 7a 45 72  &pXList, &p->zEr
e220: 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 73 71  rmsg,.        sq
e230: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50  lite3_mprintf("P
e240: 52 41 47 4d 41 20 6d 61 69 6e 2e 69 6e 64 65 78  RAGMA main.index
e250: 5f 6c 69 73 74 20 3d 20 25 51 22 2c 20 70 49 74  _list = %Q", pIt
e260: 65 72 2d 3e 7a 54 62 6c 29 0a 20 20 20 20 29 3b  er->zTbl).    );
e270: 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72  .    while( p->r
e280: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
e290: 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
e2a0: 74 65 33 5f 73 74 65 70 28 70 58 4c 69 73 74 29  te3_step(pXList)
e2b0: 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
e2c0: 63 68 61 72 20 2a 7a 4f 72 69 67 20 3d 20 28 63  char *zOrig = (c
e2d0: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
e2e0: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
e2f0: 58 4c 69 73 74 2c 33 29 3b 0a 20 20 20 20 20 20  XList,3);.      
e300: 69 66 28 20 7a 4f 72 69 67 20 26 26 20 73 74 72  if( zOrig && str
e310: 63 6d 70 28 7a 4f 72 69 67 2c 20 22 70 6b 22 29  cmp(zOrig, "pk")
e320: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==0 ){.        c
e330: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 20  onst char *zIdx 
e340: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
e350: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
e360: 78 74 28 70 58 4c 69 73 74 2c 31 29 3b 0a 20 20  xt(pXList,1);.  
e370: 20 20 20 20 20 20 69 66 28 20 7a 49 64 78 20 29        if( zIdx )
e380: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72  {.          p->r
e390: 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41  c = prepareFreeA
e3a0: 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70  ndCollectError(p
e3b0: 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 58 49 6e 66  ->dbMain, &pXInf
e3c0: 6f 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a  o, &p->zErrmsg,.
e3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
e3e0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50  lite3_mprintf("P
e3f0: 52 41 47 4d 41 20 6d 61 69 6e 2e 69 6e 64 65 78  RAGMA main.index
e400: 5f 78 69 6e 66 6f 20 3d 20 25 51 22 2c 20 7a 49  _xinfo = %Q", zI
e410: 64 78 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b  dx).          );
e420: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e430: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
e440: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 62 75 46  }.    }.    rbuF
e450: 69 6e 61 6c 69 7a 65 28 70 2c 20 70 58 4c 69 73  inalize(p, pXLis
e460: 74 29 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20  t);..    while( 
e470: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
e480: 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d   && SQLITE_ROW==
e490: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 58 49  sqlite3_step(pXI
e4a0: 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 69 66  nfo) ){.      if
e4b0: 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
e4c0: 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20 35 29 20  _int(pXInfo, 5) 
e4d0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 69 6e  ){.        /* in
e4e0: 74 20 69 43 69 64 20 3d 20 73 71 6c 69 74 65 33  t iCid = sqlite3
e4f0: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49 6e  _column_int(pXIn
e500: 66 6f 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20  fo, 0); */.     
e510: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
e520: 43 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  Col = (const cha
e530: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
e540: 6e 5f 74 65 78 74 28 70 58 49 6e 66 6f 2c 20 32  n_text(pXInfo, 2
e550: 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  );.        const
e560: 20 63 68 61 72 20 2a 7a 44 65 73 63 20 3d 20 73   char *zDesc = s
e570: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
e580: 74 28 70 58 49 6e 66 6f 2c 20 33 29 20 3f 20 22  t(pXInfo, 3) ? "
e590: 20 44 45 53 43 22 20 3a 20 22 22 3b 0a 20 20 20   DESC" : "";.   
e5a0: 20 20 20 20 20 7a 20 3d 20 72 62 75 4d 50 72 69       z = rbuMPri
e5b0: 6e 74 66 28 70 2c 20 22 25 7a 25 73 5c 22 25 77  ntf(p, "%z%s\"%w
e5c0: 5c 22 25 73 22 2c 20 7a 2c 20 7a 53 65 70 2c 20  \"%s", z, zSep, 
e5d0: 7a 43 6f 6c 2c 20 7a 44 65 73 63 29 3b 0a 20 20  zCol, zDesc);.  
e5e0: 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 20        zSep = ", 
e5f0: 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ";.      }.    }
e600: 0a 20 20 20 20 7a 20 3d 20 72 62 75 4d 50 72 69  .    z = rbuMPri
e610: 6e 74 66 28 70 2c 20 22 25 7a 29 22 2c 20 7a 29  ntf(p, "%z)", z)
e620: 3b 0a 20 20 20 20 72 62 75 46 69 6e 61 6c 69 7a  ;.    rbuFinaliz
e630: 65 28 70 2c 20 70 58 49 6e 66 6f 29 3b 0a 20 20  e(p, pXInfo);.  
e640: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a  }.  return z;.}.
e650: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
e660: 74 69 6f 6e 20 63 72 65 61 74 65 73 20 74 68 65  tion creates the
e670: 20 73 65 63 6f 6e 64 20 69 6d 70 6f 73 74 65 72   second imposter
e680: 20 74 61 62 6c 65 20 75 73 65 64 20 77 68 65 6e   table used when
e690: 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 61   writing to.** a
e6a0: 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 77 68   table b-tree wh
e6b0: 65 72 65 20 74 68 65 20 74 61 62 6c 65 20 68 61  ere the table ha
e6c0: 73 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 70 72  s an external pr
e6d0: 69 6d 61 72 79 20 6b 65 79 2e 20 49 66 20 74 68  imary key. If th
e6e0: 65 0a 2a 2a 20 69 74 65 72 61 74 6f 72 20 70 61  e.** iterator pa
e6f0: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
e700: 6e 64 20 61 72 67 75 6d 65 6e 74 20 64 6f 65 73  nd argument does
e710: 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 70   not currently p
e720: 6f 69 6e 74 20 74 6f 0a 2a 2a 20 61 20 74 61 62  oint to.** a tab
e730: 6c 65 20 28 6e 6f 74 20 69 6e 64 65 78 29 20 77  le (not index) w
e740: 69 74 68 20 61 6e 20 65 78 74 65 72 6e 61 6c 20  ith an external 
e750: 70 72 69 6d 61 72 79 20 6b 65 79 2c 20 74 68 69  primary key, thi
e760: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 0a  s function is a.
e770: 2a 2a 20 6e 6f 2d 6f 70 2e 20 0a 2a 2a 0a 2a 2a  ** no-op. .**.**
e780: 20 41 73 73 75 6d 69 6e 67 20 74 68 65 20 69 74   Assuming the it
e790: 65 72 61 74 6f 72 20 64 6f 65 73 20 70 6f 69 6e  erator does poin
e7a0: 74 20 74 6f 20 61 20 74 61 62 6c 65 20 77 69 74  t to a table wit
e7b0: 68 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 50 4b  h an external PK
e7c0: 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
e7d0: 6f 6e 20 63 72 65 61 74 65 73 20 61 20 57 49 54  on creates a WIT
e7e0: 48 4f 55 54 20 52 4f 57 49 44 20 69 6d 70 6f 73  HOUT ROWID impos
e7f0: 74 65 72 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  ter table named 
e800: 22 72 62 75 5f 69 6d 70 6f 73 74 65 72 32 22 0a  "rbu_imposter2".
e810: 2a 2a 20 75 73 65 64 20 74 6f 20 61 63 63 65 73  ** used to acces
e820: 73 20 74 68 61 74 20 50 4b 20 69 6e 64 65 78 2e  s that PK index.
e830: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
e840: 20 74 68 65 20 74 61 72 67 65 74 20 74 61 62 6c   the target tabl
e850: 65 20 69 73 0a 2a 2a 20 64 65 63 6c 61 72 65 64  e is.** declared
e860: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
e870: 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
e880: 45 20 74 31 28 61 2c 20 62 20 54 45 58 54 2c 20  E t1(a, b TEXT, 
e890: 63 20 52 45 41 4c 2c 20 50 52 49 4d 41 52 59 20  c REAL, PRIMARY 
e8a0: 4b 45 59 28 62 2c 20 63 29 29 3b 0a 2a 2a 0a 2a  KEY(b, c));.**.*
e8b0: 2a 20 74 68 65 6e 20 74 68 65 20 69 6d 70 6f 73  * then the impos
e8c0: 74 65 72 20 74 61 62 6c 65 20 73 63 68 65 6d 61  ter table schema
e8d0: 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45   is:.**.**   CRE
e8e0: 41 54 45 20 54 41 42 4c 45 20 72 62 75 5f 69 6d  ATE TABLE rbu_im
e8f0: 70 6f 73 74 65 72 32 28 63 31 20 54 45 58 54 2c  poster2(c1 TEXT,
e900: 20 63 32 20 52 45 41 4c 2c 20 69 64 20 49 4e 54   c2 REAL, id INT
e910: 45 47 45 52 29 20 57 49 54 48 4f 55 54 20 52 4f  EGER) WITHOUT RO
e920: 57 49 44 3b 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  WID;.**.*/.stati
e930: 63 20 76 6f 69 64 20 72 62 75 43 72 65 61 74 65  c void rbuCreate
e940: 49 6d 70 6f 73 74 65 72 54 61 62 6c 65 32 28 73  ImposterTable2(s
e950: 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62  qlite3rbu *p, Rb
e960: 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 29  uObjIter *pIter)
e970: 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
e980: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49 74 65  QLITE_OK && pIte
e990: 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
e9a0: 5f 45 58 54 45 52 4e 41 4c 20 29 7b 0a 20 20 20  _EXTERNAL ){.   
e9b0: 20 69 6e 74 20 74 6e 75 6d 20 3d 20 70 49 74 65   int tnum = pIte
e9c0: 72 2d 3e 69 50 6b 54 6e 75 6d 3b 20 20 20 20 2f  r->iPkTnum;    /
e9d0: 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 50  * Root page of P
e9e0: 4b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 73  K index */.    s
e9f0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 51 75  qlite3_stmt *pQu
ea00: 65 72 79 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ery = 0;     /* 
ea10: 53 45 4c 45 43 54 20 6e 61 6d 65 20 2e 2e 2e 20  SELECT name ... 
ea20: 57 48 45 52 45 20 72 6f 6f 74 70 61 67 65 20 3d  WHERE rootpage =
ea30: 20 24 74 6e 75 6d 20 2a 2f 0a 20 20 20 20 63 6f   $tnum */.    co
ea40: 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 20 3d  nst char *zIdx =
ea50: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e   0;         /* N
ea60: 61 6d 65 20 6f 66 20 50 4b 20 69 6e 64 65 78 20  ame of PK index 
ea70: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  */.    sqlite3_s
ea80: 74 6d 74 20 2a 70 58 49 6e 66 6f 20 3d 20 30 3b  tmt *pXInfo = 0;
ea90: 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 6d       /* PRAGMA m
eaa0: 61 69 6e 2e 69 6e 64 65 78 5f 78 69 6e 66 6f 20  ain.index_xinfo 
eab0: 3d 20 24 7a 49 64 78 20 2a 2f 0a 20 20 20 20 63  = $zIdx */.    c
eac0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d 6d  onst char *zComm
ead0: 61 20 3d 20 22 22 3b 0a 20 20 20 20 63 68 61 72  a = "";.    char
eae0: 20 2a 7a 43 6f 6c 73 20 3d 20 30 3b 20 20 20 20   *zCols = 0;    
eaf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
eb00: 64 20 74 6f 20 62 75 69 6c 64 20 75 70 20 6c 69  d to build up li
eb10: 73 74 20 6f 66 20 74 61 62 6c 65 20 63 6f 6c 73  st of table cols
eb20: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 50   */.    char *zP
eb30: 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  k = 0;          
eb40: 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
eb50: 20 62 75 69 6c 64 20 75 70 20 74 61 62 6c 65 20   build up table 
eb60: 50 4b 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a  PK declaration *
eb70: 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65  /..    /* Figure
eb80: 20 6f 75 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   out the name of
eb90: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
eba0: 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20 63   index for the c
ebb0: 75 72 72 65 6e 74 20 74 61 62 6c 65 2e 0a 20 20  urrent table..  
ebc0: 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 65 65    ** This is nee
ebd0: 64 65 64 20 66 6f 72 20 74 68 65 20 61 72 67 75  ded for the argu
ebe0: 6d 65 6e 74 20 74 6f 20 22 50 52 41 47 4d 41 20  ment to "PRAGMA 
ebf0: 69 6e 64 65 78 5f 78 69 6e 66 6f 22 2e 20 53 65  index_xinfo". Se
ec00: 74 0a 20 20 20 20 2a 2a 20 7a 49 64 78 20 74 6f  t.    ** zIdx to
ec10: 20 70 6f 69 6e 74 20 74 6f 20 61 20 6e 75 6c 2d   point to a nul-
ec20: 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
ec30: 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69  g containing thi
ec40: 73 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 70  s name. */.    p
ec50: 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 41 6e  ->rc = prepareAn
ec60: 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d  dCollectError(p-
ec70: 3e 64 62 4d 61 69 6e 2c 20 26 70 51 75 65 72 79  >dbMain, &pQuery
ec80: 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a  , &p->zErrmsg, .
ec90: 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
eca0: 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65  name FROM sqlite
ecb0: 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20 72 6f  _master WHERE ro
ecc0: 6f 74 70 61 67 65 20 3d 20 3f 22 0a 20 20 20 20  otpage = ?".    
ecd0: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
ece0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
ecf0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
ed00: 64 5f 69 6e 74 28 70 51 75 65 72 79 2c 20 31 2c  d_int(pQuery, 1,
ed10: 20 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20 69 66   tnum);.      if
ed20: 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ( SQLITE_ROW==sq
ed30: 6c 69 74 65 33 5f 73 74 65 70 28 70 51 75 65 72  lite3_step(pQuer
ed40: 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 49  y) ){.        zI
ed50: 64 78 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  dx = (const char
ed60: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
ed70: 5f 74 65 78 74 28 70 51 75 65 72 79 2c 20 30 29  _text(pQuery, 0)
ed80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
ed90: 20 20 20 20 69 66 28 20 7a 49 64 78 20 29 7b 0a      if( zIdx ){.
eda0: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72        p->rc = pr
edb0: 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c  epareFreeAndColl
edc0: 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61  ectError(p->dbMa
edd0: 69 6e 2c 20 26 70 58 49 6e 66 6f 2c 20 26 70 2d  in, &pXInfo, &p-
ede0: 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20 20 20  >zErrmsg,.      
edf0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69      sqlite3_mpri
ee00: 6e 74 66 28 22 50 52 41 47 4d 41 20 6d 61 69 6e  ntf("PRAGMA main
ee10: 2e 69 6e 64 65 78 5f 78 69 6e 66 6f 20 3d 20 25  .index_xinfo = %
ee20: 51 22 2c 20 7a 49 64 78 29 0a 20 20 20 20 20 20  Q", zIdx).      
ee30: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 62 75  );.    }.    rbu
ee40: 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 51 75 65  Finalize(p, pQue
ee50: 72 79 29 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28  ry);..    while(
ee60: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
ee70: 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d  K && SQLITE_ROW=
ee80: 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 58  =sqlite3_step(pX
ee90: 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 69  Info) ){.      i
eea0: 6e 74 20 62 4b 65 79 20 3d 20 73 71 6c 69 74 65  nt bKey = sqlite
eeb0: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49  3_column_int(pXI
eec0: 6e 66 6f 2c 20 35 29 3b 0a 20 20 20 20 20 20 69  nfo, 5);.      i
eed0: 66 28 20 62 4b 65 79 20 29 7b 0a 20 20 20 20 20  f( bKey ){.     
eee0: 20 20 20 69 6e 74 20 69 43 69 64 20 3d 20 73 71     int iCid = sq
eef0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
ef00: 28 70 58 49 6e 66 6f 2c 20 31 29 3b 0a 20 20 20  (pXInfo, 1);.   
ef10: 20 20 20 20 20 69 6e 74 20 62 44 65 73 63 20 3d       int bDesc =
ef20: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
ef30: 69 6e 74 28 70 58 49 6e 66 6f 2c 20 33 29 3b 0a  int(pXInfo, 3);.
ef40: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
ef50: 61 72 20 2a 7a 43 6f 6c 6c 61 74 65 20 3d 20 28  ar *zCollate = (
ef60: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
ef70: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
ef80: 70 58 49 6e 66 6f 2c 20 34 29 3b 0a 20 20 20 20  pXInfo, 4);.    
ef90: 20 20 20 20 7a 43 6f 6c 73 20 3d 20 72 62 75 4d      zCols = rbuM
efa0: 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 25 73 63  Printf(p, "%z%sc
efb0: 25 64 20 25 73 20 43 4f 4c 4c 41 54 45 20 25 51  %d %s COLLATE %Q
efc0: 22 2c 20 7a 43 6f 6c 73 2c 20 7a 43 6f 6d 6d 61  ", zCols, zComma
efd0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  , .            i
efe0: 43 69 64 2c 20 70 49 74 65 72 2d 3e 61 7a 54 62  Cid, pIter->azTb
eff0: 6c 54 79 70 65 5b 69 43 69 64 5d 2c 20 7a 43 6f  lType[iCid], zCo
f000: 6c 6c 61 74 65 0a 20 20 20 20 20 20 20 20 29 3b  llate.        );
f010: 0a 20 20 20 20 20 20 20 20 7a 50 6b 20 3d 20 72  .        zPk = r
f020: 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a  buMPrintf(p, "%z
f030: 25 73 63 25 64 25 73 22 2c 20 7a 50 6b 2c 20 7a  %sc%d%s", zPk, z
f040: 43 6f 6d 6d 61 2c 20 69 43 69 64 2c 20 62 44 65  Comma, iCid, bDe
f050: 73 63 3f 22 20 44 45 53 43 22 3a 22 22 29 3b 0a  sc?" DESC":"");.
f060: 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d 61 20 3d          zComma =
f070: 20 22 2c 20 22 3b 0a 20 20 20 20 20 20 7d 0a 20   ", ";.      }. 
f080: 20 20 20 7d 0a 20 20 20 20 7a 43 6f 6c 73 20 3d     }.    zCols =
f090: 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22   rbuMPrintf(p, "
f0a0: 25 7a 2c 20 69 64 20 49 4e 54 45 47 45 52 22 2c  %z, id INTEGER",
f0b0: 20 7a 43 6f 6c 73 29 3b 0a 20 20 20 20 72 62 75   zCols);.    rbu
f0c0: 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 58 49 6e  Finalize(p, pXIn
f0d0: 66 6f 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  fo);..    sqlite
f0e0: 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
f0f0: 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
f100: 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 4d 61  MPOSTER, p->dbMa
f110: 69 6e 2c 20 22 6d 61 69 6e 22 2c 20 31 2c 20 74  in, "main", 1, t
f120: 6e 75 6d 29 3b 0a 20 20 20 20 72 62 75 4d 50 72  num);.    rbuMPr
f130: 69 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64  intfExec(p, p->d
f140: 62 4d 61 69 6e 2c 0a 20 20 20 20 20 20 20 20 22  bMain,.        "
f150: 43 52 45 41 54 45 20 54 41 42 4c 45 20 72 62 75  CREATE TABLE rbu
f160: 5f 69 6d 70 6f 73 74 65 72 32 28 25 7a 2c 20 50  _imposter2(%z, P
f170: 52 49 4d 41 52 59 20 4b 45 59 28 25 7a 29 29 20  RIMARY KEY(%z)) 
f180: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 22 2c 20  WITHOUT ROWID", 
f190: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 73 2c 20  .        zCols, 
f1a0: 7a 50 6b 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  zPk.    );.    s
f1b0: 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
f1c0: 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
f1d0: 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d  TRL_IMPOSTER, p-
f1e0: 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c  >dbMain, "main",
f1f0: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   0, 0);.  }.}../
f200: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
f210: 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
f220: 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20  urred when this 
f230: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
f240: 65 64 2c 20 69 74 20 0a 2a 2a 20 69 6d 6d 65 64  ed, it .** immed
f250: 69 61 74 65 6c 79 20 72 65 74 75 72 6e 73 20 7a  iately returns z
f260: 65 72 6f 20 28 77 69 74 68 6f 75 74 20 64 6f 69  ero (without doi
f270: 6e 67 20 61 6e 79 20 77 6f 72 6b 29 2e 20 4f 72  ng any work). Or
f280: 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a  , if an error.**
f290: 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74   occurs during t
f2a0: 68 65 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  he execution of 
f2b0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 69  this function, i
f2c0: 74 20 73 65 74 73 20 74 68 65 20 65 72 72 6f 72  t sets the error
f2d0: 20 63 6f 64 65 0a 2a 2a 20 69 6e 20 74 68 65 20   code.** in the 
f2e0: 73 71 6c 69 74 65 33 72 62 75 20 6f 62 6a 65 63  sqlite3rbu objec
f2f0: 74 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74  t indicated by t
f300: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
f310: 74 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a 2a  t and returns.**
f320: 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   zero..**.** The
f330: 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
f340: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
f350: 72 67 75 6d 65 6e 74 20 69 73 20 67 75 61 72 61  rgument is guara
f360: 6e 74 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74  nteed to point t
f370: 6f 0a 2a 2a 20 61 20 74 61 62 6c 65 20 28 6e 6f  o.** a table (no
f380: 74 20 61 6e 20 69 6e 64 65 78 29 20 77 68 65 6e  t an index) when
f390: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
f3a0: 73 20 63 61 6c 6c 65 64 2e 20 54 68 69 73 20 66  s called. This f
f3b0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 74 74 65 6d  unction.** attem
f3c0: 70 74 73 20 74 6f 20 63 72 65 61 74 65 20 61 6e  pts to create an
f3d0: 79 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65  y imposter table
f3e0: 20 72 65 71 75 69 72 65 64 20 74 6f 20 77 72 69   required to wri
f3f0: 74 65 20 74 6f 20 74 68 65 20 6d 61 69 6e 0a 2a  te to the main.*
f400: 2a 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 6f  * table b-tree o
f410: 66 20 74 68 65 20 74 61 62 6c 65 20 62 65 66 6f  f the table befo
f420: 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 4e 6f  re returning. No
f430: 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  n-zero is return
f440: 65 64 20 69 66 0a 2a 2a 20 61 6e 20 69 6d 70 6f  ed if.** an impo
f450: 73 74 65 72 20 74 61 62 6c 65 20 61 72 65 20 63  ster table are c
f460: 72 65 61 74 65 64 2c 20 6f 72 20 7a 65 72 6f 20  reated, or zero 
f470: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
f480: 20 41 6e 20 69 6d 70 6f 73 74 65 72 20 74 61 62   An imposter tab
f490: 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20 69  le is required i
f4a0: 6e 20 61 6c 6c 20 63 61 73 65 73 20 65 78 63 65  n all cases exce
f4b0: 70 74 20 52 42 55 5f 50 4b 5f 56 54 41 42 2e 20  pt RBU_PK_VTAB. 
f4c0: 4f 6e 6c 79 0a 2a 2a 20 76 69 72 74 75 61 6c 20  Only.** virtual 
f4d0: 74 61 62 6c 65 73 20 61 72 65 20 77 72 69 74 74  tables are writt
f4e0: 65 6e 20 74 6f 20 64 69 72 65 63 74 6c 79 2e 20  en to directly. 
f4f0: 54 68 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62  The imposter tab
f500: 6c 65 20 68 61 73 20 74 68 65 20 0a 2a 2a 20 73  le has the .** s
f510: 61 6d 65 20 73 63 68 65 6d 61 20 61 73 20 74 68  ame schema as th
f520: 65 20 61 63 74 75 61 6c 20 74 61 72 67 65 74 20  e actual target 
f530: 74 61 62 6c 65 20 28 6c 65 73 73 20 61 6e 79 20  table (less any 
f540: 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
f550: 74 73 29 2e 20 0a 2a 2a 20 4d 6f 72 65 20 70 72  ts). .** More pr
f560: 65 63 69 73 65 6c 79 2c 20 74 68 65 20 22 73 61  ecisely, the "sa
f570: 6d 65 20 73 63 68 65 6d 61 22 20 6d 65 61 6e 73  me schema" means
f580: 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e   the same column
f590: 73 2c 20 74 79 70 65 73 2c 20 0a 2a 2a 20 63 6f  s, types, .** co
f5a0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
f5b0: 73 2e 20 46 6f 72 20 74 61 62 6c 65 73 20 74 68  s. For tables th
f5c0: 61 74 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 61  at do not have a
f5d0: 6e 20 65 78 74 65 72 6e 61 6c 20 50 52 49 4d 41  n external PRIMA
f5e0: 52 59 0a 2a 2a 20 4b 45 59 2c 20 69 74 20 61 6c  RY.** KEY, it al
f5f0: 73 6f 20 6d 65 61 6e 73 20 74 68 65 20 73 61 6d  so means the sam
f600: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 64 65  e PRIMARY KEY de
f610: 63 6c 61 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  claration..*/.st
f620: 61 74 69 63 20 76 6f 69 64 20 72 62 75 43 72 65  atic void rbuCre
f630: 61 74 65 49 6d 70 6f 73 74 65 72 54 61 62 6c 65  ateImposterTable
f640: 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20  (sqlite3rbu *p, 
f650: 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65  RbuObjIter *pIte
f660: 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  r){.  if( p->rc=
f670: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49  =SQLITE_OK && pI
f680: 74 65 72 2d 3e 65 54 79 70 65 21 3d 52 42 55 5f  ter->eType!=RBU_
f690: 50 4b 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 69  PK_VTAB ){.    i
f6a0: 6e 74 20 74 6e 75 6d 20 3d 20 70 49 74 65 72 2d  nt tnum = pIter-
f6b0: 3e 69 54 6e 75 6d 3b 0a 20 20 20 20 63 6f 6e 73  >iTnum;.    cons
f6c0: 74 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 61 20 3d  t char *zComma =
f6d0: 20 22 22 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a   "";.    char *z
f6e0: 53 71 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  Sql = 0;.    int
f6f0: 20 69 43 6f 6c 3b 0a 20 20 20 20 73 71 6c 69 74   iCol;.    sqlit
f700: 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
f710: 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
f720: 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 4d  IMPOSTER, p->dbM
f730: 61 69 6e 2c 20 22 6d 61 69 6e 22 2c 20 30 2c 20  ain, "main", 0, 
f740: 31 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 43 6f  1);..    for(iCo
f750: 6c 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  l=0; p->rc==SQLI
f760: 54 45 5f 4f 4b 20 26 26 20 69 43 6f 6c 3c 70 49  TE_OK && iCol<pI
f770: 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69 43  ter->nTblCol; iC
f780: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e  ol++){.      con
f790: 73 74 20 63 68 61 72 20 2a 7a 50 6b 20 3d 20 22  st char *zPk = "
f7a0: 22 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ";.      const c
f7b0: 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 70 49 74 65  har *zCol = pIte
f7c0: 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 43 6f 6c  r->azTblCol[iCol
f7d0: 5d 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ];.      const c
f7e0: 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 30 3b 0a  har *zColl = 0;.
f7f0: 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  .      p->rc = s
f800: 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c  qlite3_table_col
f810: 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20  umn_metadata(.  
f820: 20 20 20 20 20 20 20 20 70 2d 3e 64 62 4d 61 69          p->dbMai
f830: 6e 2c 20 22 6d 61 69 6e 22 2c 20 70 49 74 65 72  n, "main", pIter
f840: 2d 3e 7a 54 62 6c 2c 20 7a 43 6f 6c 2c 20 30 2c  ->zTbl, zCol, 0,
f850: 20 26 7a 43 6f 6c 6c 2c 20 30 2c 20 30 2c 20 30   &zColl, 0, 0, 0
f860: 0a 20 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20  .      );..     
f870: 20 69 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70   if( pIter->eTyp
f880: 65 3d 3d 52 42 55 5f 50 4b 5f 49 50 4b 20 26 26  e==RBU_PK_IPK &&
f890: 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b   pIter->abTblPk[
f8a0: 69 43 6f 6c 5d 20 29 7b 0a 20 20 20 20 20 20 20  iCol] ){.       
f8b0: 20 2f 2a 20 49 66 20 74 68 65 20 74 61 72 67 65   /* If the targe
f8c0: 74 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 69  t table column i
f8d0: 73 20 61 6e 20 22 49 4e 54 45 47 45 52 20 50 52  s an "INTEGER PR
f8e0: 49 4d 41 52 59 20 4b 45 59 22 2c 20 61 64 64 0a  IMARY KEY", add.
f8f0: 20 20 20 20 20 20 20 20 2a 2a 20 22 50 52 49 4d          ** "PRIM
f900: 41 52 59 20 4b 45 59 22 20 74 6f 20 74 68 65 20  ARY KEY" to the 
f910: 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20 63  imposter table c
f920: 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f  olumn declaratio
f930: 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 50  n. */.        zP
f940: 6b 20 3d 20 22 50 52 49 4d 41 52 59 20 4b 45 59  k = "PRIMARY KEY
f950: 20 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   ";.      }.    
f960: 20 20 7a 53 71 6c 20 3d 20 72 62 75 4d 50 72 69    zSql = rbuMPri
f970: 6e 74 66 28 70 2c 20 22 25 7a 25 73 5c 22 25 77  ntf(p, "%z%s\"%w
f980: 5c 22 20 25 73 20 25 73 43 4f 4c 4c 41 54 45 20  \" %s %sCOLLATE 
f990: 25 51 25 73 22 2c 20 0a 20 20 20 20 20 20 20 20  %Q%s", .        
f9a0: 20 20 7a 53 71 6c 2c 20 7a 43 6f 6d 6d 61 2c 20    zSql, zComma, 
f9b0: 7a 43 6f 6c 2c 20 70 49 74 65 72 2d 3e 61 7a 54  zCol, pIter->azT
f9c0: 62 6c 54 79 70 65 5b 69 43 6f 6c 5d 2c 20 7a 50  blType[iCol], zP
f9d0: 6b 2c 20 7a 43 6f 6c 6c 2c 0a 20 20 20 20 20 20  k, zColl,.      
f9e0: 20 20 20 20 28 70 49 74 65 72 2d 3e 61 62 4e 6f      (pIter->abNo
f9f0: 74 4e 75 6c 6c 5b 69 43 6f 6c 5d 20 3f 20 22 20  tNull[iCol] ? " 
fa00: 4e 4f 54 20 4e 55 4c 4c 22 20 3a 20 22 22 29 0a  NOT NULL" : "").
fa10: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7a        );.      z
fa20: 43 6f 6d 6d 61 20 3d 20 22 2c 20 22 3b 0a 20 20  Comma = ", ";.  
fa30: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49 74    }..    if( pIt
fa40: 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
fa50: 4b 5f 57 49 54 48 4f 55 54 5f 52 4f 57 49 44 20  K_WITHOUT_ROWID 
fa60: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
fa70: 50 6b 20 3d 20 72 62 75 57 69 74 68 6f 75 74 52  Pk = rbuWithoutR
fa80: 6f 77 69 64 50 4b 28 70 2c 20 70 49 74 65 72 29  owidPK(p, pIter)
fa90: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 6b 20  ;.      if( zPk 
faa0: 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20  ){.        zSql 
fab0: 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20  = rbuMPrintf(p, 
fac0: 22 25 7a 2c 20 25 7a 22 2c 20 7a 53 71 6c 2c 20  "%z, %z", zSql, 
fad0: 7a 50 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  zPk);.      }.  
fae0: 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33    }..    sqlite3
faf0: 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
fb00: 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d  LITE_TESTCTRL_IM
fb10: 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 4d 61 69  POSTER, p->dbMai
fb20: 6e 2c 20 22 6d 61 69 6e 22 2c 20 31 2c 20 74 6e  n, "main", 1, tn
fb30: 75 6d 29 3b 0a 20 20 20 20 72 62 75 4d 50 72 69  um);.    rbuMPri
fb40: 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64 62  ntfExec(p, p->db
fb50: 4d 61 69 6e 2c 20 22 43 52 45 41 54 45 20 54 41  Main, "CREATE TA
fb60: 42 4c 45 20 5c 22 72 62 75 5f 69 6d 70 5f 25 77  BLE \"rbu_imp_%w
fb70: 5c 22 28 25 7a 29 25 73 22 2c 20 0a 20 20 20 20  \"(%z)%s", .    
fb80: 20 20 20 20 70 49 74 65 72 2d 3e 7a 54 62 6c 2c      pIter->zTbl,
fb90: 20 7a 53 71 6c 2c 20 0a 20 20 20 20 20 20 20 20   zSql, .        
fba0: 28 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52  (pIter->eType==R
fbb0: 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54 5f 52 4f  BU_PK_WITHOUT_RO
fbc0: 57 49 44 20 3f 20 22 20 57 49 54 48 4f 55 54 20  WID ? " WITHOUT 
fbd0: 52 4f 57 49 44 22 20 3a 20 22 22 29 0a 20 20 20  ROWID" : "").   
fbe0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
fbf0: 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
fc00: 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50  ITE_TESTCTRL_IMP
fc10: 4f 53 54 45 52 2c 20 70 2d 3e 64 62 4d 61 69 6e  OSTER, p->dbMain
fc20: 2c 20 22 6d 61 69 6e 22 2c 20 30 2c 20 30 29 3b  , "main", 0, 0);
fc30: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  .  }.}../*.** Pr
fc40: 65 70 61 72 65 20 61 20 73 74 61 74 65 6d 65 6e  epare a statemen
fc50: 74 20 75 73 65 64 20 74 6f 20 69 6e 73 65 72 74  t used to insert
fc60: 20 72 6f 77 73 20 69 6e 74 6f 20 74 68 65 20 22   rows into the "
fc70: 72 62 75 5f 74 6d 70 5f 78 78 78 22 20 74 61 62  rbu_tmp_xxx" tab
fc80: 6c 65 2e 0a 2a 2a 20 53 70 65 63 69 66 69 63 61  le..** Specifica
fc90: 6c 6c 79 20 61 20 73 74 61 74 65 6d 65 6e 74 20  lly a statement 
fca0: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
fcb0: 2a 2a 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  **     INSERT IN
fcc0: 54 4f 20 72 62 75 5f 74 6d 70 5f 78 78 78 20 56  TO rbu_tmp_xxx V
fcd0: 41 4c 55 45 53 28 3f 2c 20 3f 2c 20 3f 20 2e 2e  ALUES(?, ?, ? ..
fce0: 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75  .);.**.** The nu
fcf0: 6d 62 65 72 20 6f 66 20 62 6f 75 6e 64 20 76 61  mber of bound va
fd00: 72 69 61 62 6c 65 73 20 69 73 20 65 71 75 61 6c  riables is equal
fd10: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
fd20: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 0a 2a 2a 20  f columns in.** 
fd30: 74 68 65 20 74 61 72 67 65 74 20 74 61 62 6c 65  the target table
fd40: 2c 20 70 6c 75 73 20 6f 6e 65 20 28 66 6f 72 20  , plus one (for 
fd50: 74 68 65 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20  the rbu_control 
fd60: 63 6f 6c 75 6d 6e 29 2c 20 70 6c 75 73 20 6f 6e  column), plus on
fd70: 65 20 6d 6f 72 65 20 0a 2a 2a 20 28 66 6f 72 20  e more .** (for 
fd80: 74 68 65 20 72 62 75 5f 72 6f 77 69 64 20 63 6f  the rbu_rowid co
fd90: 6c 75 6d 6e 29 20 69 66 20 74 68 65 20 74 61 72  lumn) if the tar
fda0: 67 65 74 20 74 61 62 6c 65 20 69 73 20 61 6e 20  get table is an 
fdb0: 69 6d 70 6c 69 63 69 74 20 49 50 4b 20 6f 72 20  implicit IPK or 
fdc0: 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c  .** virtual tabl
fdd0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
fde0: 64 20 72 62 75 4f 62 6a 49 74 65 72 50 72 65 70  d rbuObjIterPrep
fdf0: 61 72 65 54 6d 70 49 6e 73 65 72 74 28 0a 20 20  areTmpInsert(.  
fe00: 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 0a  sqlite3rbu *p, .
fe10: 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49    RbuObjIter *pI
fe20: 74 65 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  ter,.  const cha
fe30: 72 20 2a 7a 43 6f 6c 6c 69 73 74 2c 0a 20 20 63  r *zCollist,.  c
fe40: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 62 75 52  onst char *zRbuR
fe50: 6f 77 69 64 0a 29 7b 0a 20 20 69 6e 74 20 62 52  owid.){.  int bR
fe60: 62 75 52 6f 77 69 64 20 3d 20 28 70 49 74 65 72  buRowid = (pIter
fe70: 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
fe80: 45 58 54 45 52 4e 41 4c 20 7c 7c 20 70 49 74 65  EXTERNAL || pIte
fe90: 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
fea0: 5f 4e 4f 4e 45 29 3b 0a 20 20 63 68 61 72 20 2a  _NONE);.  char *
feb0: 7a 42 69 6e 64 20 3d 20 72 62 75 4f 62 6a 49 74  zBind = rbuObjIt
fec0: 65 72 47 65 74 42 69 6e 64 6c 69 73 74 28 70 2c  erGetBindlist(p,
fed0: 20 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20   pIter->nTblCol 
fee0: 2b 20 31 20 2b 20 62 52 62 75 52 6f 77 69 64 29  + 1 + bRbuRowid)
fef0: 3b 0a 20 20 69 66 28 20 7a 42 69 6e 64 20 29 7b  ;.  if( zBind ){
ff00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
ff10: 65 72 2d 3e 70 54 6d 70 49 6e 73 65 72 74 3d 3d  er->pTmpInsert==
ff20: 30 20 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  0 );.    p->rc =
ff30: 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43   prepareFreeAndC
ff40: 6f 6c 6c 65 63 74 45 72 72 6f 72 28 0a 20 20 20  ollectError(.   
ff50: 20 20 20 20 20 70 2d 3e 64 62 52 62 75 2c 20 26       p->dbRbu, &
ff60: 70 49 74 65 72 2d 3e 70 54 6d 70 49 6e 73 65 72  pIter->pTmpInser
ff70: 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20  t, &p->zErrmsg, 
ff80: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
ff90: 0a 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 45  .          "INSE
ffa0: 52 54 20 49 4e 54 4f 20 25 73 2e 27 72 62 75 5f  RT INTO %s.'rbu_
ffb0: 74 6d 70 5f 25 71 27 28 72 62 75 5f 63 6f 6e 74  tmp_%q'(rbu_cont
ffc0: 72 6f 6c 2c 25 73 25 73 29 20 56 41 4c 55 45 53  rol,%s%s) VALUES
ffd0: 28 25 7a 29 22 2c 20 0a 20 20 20 20 20 20 20 20  (%z)", .        
ffe0: 20 20 70 2d 3e 7a 53 74 61 74 65 44 62 2c 20 70    p->zStateDb, p
fff0: 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 2c 20  Iter->zDataTbl, 
10000 7a 43 6f 6c 6c 69 73 74 2c 20 7a 52 62 75 52 6f  zCollist, zRbuRo
10010 77 69 64 2c 20 7a 42 69 6e 64 0a 20 20 20 20 29  wid, zBind.    )
10020 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
10030 20 76 6f 69 64 20 72 62 75 54 6d 70 49 6e 73 65   void rbuTmpInse
10040 72 74 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  rtFunc(.  sqlite
10050 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
10060 20 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20   .  int nVal,.  
10070 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
10080 61 70 56 61 6c 0a 29 7b 0a 20 20 73 71 6c 69 74  apVal.){.  sqlit
10090 65 33 72 62 75 20 2a 70 20 3d 20 73 71 6c 69 74  e3rbu *p = sqlit
100a0 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74  e3_user_data(pCt
100b0 78 29 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  x);.  int rc = S
100c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
100d0 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  i;..  assert( sq
100e0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
100f0 61 70 56 61 6c 5b 30 5d 29 21 3d 30 0a 20 20 20  apVal[0])!=0.   
10100 20 20 20 7c 7c 20 70 2d 3e 6f 62 6a 69 74 65 72     || p->objiter
10110 2e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45  .eType==RBU_PK_E
10120 58 54 45 52 4e 41 4c 20 0a 20 20 20 20 20 20 7c  XTERNAL .      |
10130 7c 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 65 54 79  | p->objiter.eTy
10140 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20  pe==RBU_PK_NONE 
10150 0a 20 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  .  );.  if( sqli
10160 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70  te3_value_int(ap
10170 56 61 6c 5b 30 5d 29 21 3d 30 20 29 7b 0a 20 20  Val[0])!=0 ){.  
10180 20 20 70 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74    p->nPhaseOneSt
10190 65 70 20 2b 3d 20 70 2d 3e 6f 62 6a 69 74 65 72  ep += p->objiter
101a0 2e 6e 49 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20  .nIndex;.  }..  
101b0 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
101c0 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 56 61 6c  ITE_OK && i<nVal
101d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d  ; i++){.    rc =
101e0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61   sqlite3_bind_va
101f0 6c 75 65 28 70 2d 3e 6f 62 6a 69 74 65 72 2e 70  lue(p->objiter.p
10200 54 6d 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20  TmpInsert, i+1, 
10210 61 70 56 61 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20  apVal[i]);.  }. 
10220 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
10230 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
10240 33 5f 73 74 65 70 28 70 2d 3e 6f 62 6a 69 74 65  3_step(p->objite
10250 72 2e 70 54 6d 70 49 6e 73 65 72 74 29 3b 0a 20  r.pTmpInsert);. 
10260 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
10270 72 65 73 65 74 28 70 2d 3e 6f 62 6a 69 74 65 72  reset(p->objiter
10280 2e 70 54 6d 70 49 6e 73 65 72 74 29 3b 0a 20 20  .pTmpInsert);.  
10290 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  }..  if( rc!=SQL
102a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
102b0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
102c0 6f 72 5f 63 6f 64 65 28 70 43 74 78 2c 20 72 63  or_code(pCtx, rc
102d0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
102e0 45 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  Ensure that the 
102f0 53 51 4c 69 74 65 20 73 74 61 74 65 6d 65 6e 74  SQLite statement
10300 20 68 61 6e 64 6c 65 73 20 72 65 71 75 69 72 65   handles require
10310 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  d to update the 
10320 0a 2a 2a 20 74 61 72 67 65 74 20 64 61 74 61 62  .** target datab
10330 61 73 65 20 6f 62 6a 65 63 74 20 63 75 72 72 65  ase object curre
10340 6e 74 6c 79 20 69 6e 64 69 63 61 74 65 64 20 62  ntly indicated b
10350 79 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70  y the iterator p
10360 61 73 73 65 64 20 0a 2a 2a 20 61 73 20 74 68 65  assed .** as the
10370 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
10380 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a   are available..
10390 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62  */.static int rb
103a0 75 4f 62 6a 49 74 65 72 50 72 65 70 61 72 65 41  uObjIterPrepareA
103b0 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 72 62 75  ll(.  sqlite3rbu
103c0 20 2a 70 2c 20 0a 20 20 52 62 75 4f 62 6a 49 74   *p, .  RbuObjIt
103d0 65 72 20 2a 70 49 74 65 72 2c 0a 20 20 69 6e 74  er *pIter,.  int
103e0 20 6e 4f 66 66 73 65 74 20 20 20 20 20 20 20 20   nOffset        
103f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10400 41 64 64 20 22 4c 49 4d 49 54 20 2d 31 20 4f 46  Add "LIMIT -1 OF
10410 46 53 45 54 20 24 6e 4f 66 66 73 65 74 22 20 74  FSET $nOffset" t
10420 6f 20 53 45 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20  o SELECT */.){. 
10430 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
10440 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29 3b 0a 20  bCleanup==0 );. 
10450 20 69 66 28 20 70 49 74 65 72 2d 3e 70 53 65 6c   if( pIter->pSel
10460 65 63 74 3d 3d 30 20 26 26 20 72 62 75 4f 62 6a  ect==0 && rbuObj
10470 49 74 65 72 43 61 63 68 65 54 61 62 6c 65 49 6e  IterCacheTableIn
10480 66 6f 28 70 2c 20 70 49 74 65 72 29 3d 3d 53 51  fo(p, pIter)==SQ
10490 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63  LITE_OK ){.    c
104a0 6f 6e 73 74 20 69 6e 74 20 74 6e 75 6d 20 3d 20  onst int tnum = 
104b0 70 49 74 65 72 2d 3e 69 54 6e 75 6d 3b 0a 20 20  pIter->iTnum;.  
104c0 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 69 73 74    char *zCollist
104d0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
104e0 2f 2a 20 4c 69 73 74 20 6f 66 20 69 6e 64 65 78  /* List of index
104f0 65 64 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  ed columns */.  
10500 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70    char **pz = &p
10510 2d 3e 7a 45 72 72 6d 73 67 3b 0a 20 20 20 20 63  ->zErrmsg;.    c
10520 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 20  onst char *zIdx 
10530 3d 20 70 49 74 65 72 2d 3e 7a 49 64 78 3b 0a 20  = pIter->zIdx;. 
10540 20 20 20 63 68 61 72 20 2a 7a 4c 69 6d 69 74 20     char *zLimit 
10550 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 6e 4f  = 0;..    if( nO
10560 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 7a  ffset ){.      z
10570 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 5f  Limit = sqlite3_
10580 6d 70 72 69 6e 74 66 28 22 20 4c 49 4d 49 54 20  mprintf(" LIMIT 
10590 2d 31 20 4f 46 46 53 45 54 20 25 64 22 2c 20 6e  -1 OFFSET %d", n
105a0 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 69  Offset);.      i
105b0 66 28 20 21 7a 4c 69 6d 69 74 20 29 20 70 2d 3e  f( !zLimit ) p->
105c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
105d0 4d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  M;.    }..    if
105e0 28 20 7a 49 64 78 20 29 7b 0a 20 20 20 20 20 20  ( zIdx ){.      
105f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c  const char *zTbl
10600 20 3d 20 70 49 74 65 72 2d 3e 7a 54 62 6c 3b 0a   = pIter->zTbl;.
10610 20 20 20 20 20 20 63 68 61 72 20 2a 7a 49 6d 70        char *zImp
10620 6f 73 74 65 72 43 6f 6c 73 20 3d 20 30 3b 20 20  osterCols = 0;  
10630 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 66 6f 72    /* Columns for
10640 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20   imposter table 
10650 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  */.      char *z
10660 49 6d 70 6f 73 74 65 72 50 4b 20 3d 20 30 3b 20  ImposterPK = 0; 
10670 20 20 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20       /* Primary 
10680 6b 65 79 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  key declaration 
10690 66 6f 72 20 69 6d 70 6f 73 74 65 72 20 2a 2f 0a  for imposter */.
106a0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 57 68 65        char *zWhe
106b0 72 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  re = 0;         
106c0 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73    /* WHERE claus
106d0 65 20 6f 6e 20 50 4b 20 63 6f 6c 75 6d 6e 73 20  e on PK columns 
106e0 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  */.      char *z
106f0 42 69 6e 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  Bind = 0;.      
10700 69 6e 74 20 6e 42 69 6e 64 20 3d 20 30 3b 0a 0a  int nBind = 0;..
10710 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
10720 74 65 72 2d 3e 65 54 79 70 65 21 3d 52 42 55 5f  ter->eType!=RBU_
10730 50 4b 5f 56 54 41 42 20 29 3b 0a 20 20 20 20 20  PK_VTAB );.     
10740 20 7a 43 6f 6c 6c 69 73 74 20 3d 20 72 62 75 4f   zCollist = rbuO
10750 62 6a 49 74 65 72 47 65 74 49 6e 64 65 78 43 6f  bjIterGetIndexCo
10760 6c 73 28 0a 20 20 20 20 20 20 20 20 20 20 70 2c  ls(.          p,
10770 20 70 49 74 65 72 2c 20 26 7a 49 6d 70 6f 73 74   pIter, &zImpost
10780 65 72 43 6f 6c 73 2c 20 26 7a 49 6d 70 6f 73 74  erCols, &zImpost
10790 65 72 50 4b 2c 20 26 7a 57 68 65 72 65 2c 20 26  erPK, &zWhere, &
107a0 6e 42 69 6e 64 0a 20 20 20 20 20 20 29 3b 0a 20  nBind.      );. 
107b0 20 20 20 20 20 7a 42 69 6e 64 20 3d 20 72 62 75       zBind = rbu
107c0 4f 62 6a 49 74 65 72 47 65 74 42 69 6e 64 6c 69  ObjIterGetBindli
107d0 73 74 28 70 2c 20 6e 42 69 6e 64 29 3b 0a 0a 20  st(p, nBind);.. 
107e0 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74       /* Create t
107f0 68 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  he imposter tabl
10800 65 20 75 73 65 64 20 74 6f 20 77 72 69 74 65 20  e used to write 
10810 74 6f 20 74 68 69 73 20 69 6e 64 65 78 2e 20 2a  to this index. *
10820 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  /.      sqlite3_
10830 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
10840 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50  ITE_TESTCTRL_IMP
10850 4f 53 54 45 52 2c 20 70 2d 3e 64 62 4d 61 69 6e  OSTER, p->dbMain
10860 2c 20 22 6d 61 69 6e 22 2c 20 30 2c 20 31 29 3b  , "main", 0, 1);
10870 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74  .      sqlite3_t
10880 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
10890 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f  TE_TESTCTRL_IMPO
108a0 53 54 45 52 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c  STER, p->dbMain,
108b0 20 22 6d 61 69 6e 22 2c 20 31 2c 74 6e 75 6d 29   "main", 1,tnum)
108c0 3b 0a 20 20 20 20 20 20 72 62 75 4d 50 72 69 6e  ;.      rbuMPrin
108d0 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64 62 4d  tfExec(p, p->dbM
108e0 61 69 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 22  ain,.          "
108f0 43 52 45 41 54 45 20 54 41 42 4c 45 20 5c 22 72  CREATE TABLE \"r
10900 62 75 5f 69 6d 70 5f 25 77 5c 22 28 20 25 73 2c  bu_imp_%w\"( %s,
10910 20 50 52 49 4d 41 52 59 20 4b 45 59 28 20 25 73   PRIMARY KEY( %s
10920 20 29 20 29 20 57 49 54 48 4f 55 54 20 52 4f 57   ) ) WITHOUT ROW
10930 49 44 22 2c 0a 20 20 20 20 20 20 20 20 20 20 7a  ID",.          z
10940 54 62 6c 2c 20 7a 49 6d 70 6f 73 74 65 72 43 6f  Tbl, zImposterCo
10950 6c 73 2c 20 7a 49 6d 70 6f 73 74 65 72 50 4b 0a  ls, zImposterPK.
10960 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73        );.      s
10970 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
10980 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
10990 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d  TRL_IMPOSTER, p-
109a0 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c  >dbMain, "main",
109b0 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 2f   0, 0);..      /
109c0 2a 20 43 72 65 61 74 65 20 74 68 65 20 73 74 61  * Create the sta
109d0 74 65 6d 65 6e 74 20 74 6f 20 69 6e 73 65 72 74  tement to insert
109e0 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 2a   index entries *
109f0 2f 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e  /.      pIter->n
10a00 43 6f 6c 20 3d 20 6e 42 69 6e 64 3b 0a 20 20 20  Col = nBind;.   
10a10 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
10a20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10a30 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61     p->rc = prepa
10a40 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74  reFreeAndCollect
10a50 45 72 72 6f 72 28 0a 20 20 20 20 20 20 20 20 20  Error(.         
10a60 20 20 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70     p->dbMain, &p
10a70 49 74 65 72 2d 3e 70 49 6e 73 65 72 74 2c 20 26  Iter->pInsert, &
10a80 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20  p->zErrmsg,.    
10a90 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70        sqlite3_mp
10aa0 72 69 6e 74 66 28 22 49 4e 53 45 52 54 20 49 4e  rintf("INSERT IN
10ab0 54 4f 20 5c 22 72 62 75 5f 69 6d 70 5f 25 77 5c  TO \"rbu_imp_%w\
10ac0 22 20 56 41 4c 55 45 53 28 25 73 29 22 2c 20 7a  " VALUES(%s)", z
10ad0 54 62 6c 2c 20 7a 42 69 6e 64 29 0a 20 20 20 20  Tbl, zBind).    
10ae0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a      );.      }..
10af0 20 20 20 20 20 20 2f 2a 20 41 6e 64 20 74 6f 20        /* And to 
10b00 64 65 6c 65 74 65 20 69 6e 64 65 78 20 65 6e 74  delete index ent
10b10 72 69 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 66  ries */.      if
10b20 28 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 29  ( rbuIsVacuum(p)
10b30 3d 3d 30 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51  ==0 && p->rc==SQ
10b40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10b50 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61     p->rc = prepa
10b60 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74  reFreeAndCollect
10b70 45 72 72 6f 72 28 0a 20 20 20 20 20 20 20 20 20  Error(.         
10b80 20 20 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70     p->dbMain, &p
10b90 49 74 65 72 2d 3e 70 44 65 6c 65 74 65 2c 20 26  Iter->pDelete, &
10ba0 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20  p->zErrmsg,.    
10bb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70        sqlite3_mp
10bc0 72 69 6e 74 66 28 22 44 45 4c 45 54 45 20 46 52  rintf("DELETE FR
10bd0 4f 4d 20 5c 22 72 62 75 5f 69 6d 70 5f 25 77 5c  OM \"rbu_imp_%w\
10be0 22 20 57 48 45 52 45 20 25 73 22 2c 20 7a 54 62  " WHERE %s", zTb
10bf0 6c 2c 20 7a 57 68 65 72 65 29 0a 20 20 20 20 20  l, zWhere).     
10c00 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20     );.      }.. 
10c10 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74       /* Create t
10c20 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
10c30 65 6e 74 20 74 6f 20 72 65 61 64 20 6b 65 79 73  ent to read keys
10c40 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72   in sorted order
10c50 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d   */.      if( p-
10c60 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
10c70 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
10c80 7a 53 71 6c 3b 0a 20 20 20 20 20 20 20 20 69 66  zSql;.        if
10c90 28 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 29  ( rbuIsVacuum(p)
10ca0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 53   ){.          zS
10cb0 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
10cc0 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
10cd0 20 20 20 20 22 53 45 4c 45 43 54 20 25 73 2c 20      "SELECT %s, 
10ce0 30 20 41 53 20 72 62 75 5f 63 6f 6e 74 72 6f 6c  0 AS rbu_control
10cf0 20 46 52 4f 4d 20 27 25 71 27 20 4f 52 44 45 52   FROM '%q' ORDER
10d00 20 42 59 20 25 73 25 73 22 2c 0a 20 20 20 20 20   BY %s%s",.     
10d10 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73           zCollis
10d20 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  t, .            
10d30 20 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62    pIter->zDataTb
10d40 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
10d50 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a 4c 69 6d 69   zCollist, zLimi
10d60 74 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  t.          );. 
10d70 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20         }else..  
10d80 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
10d90 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45  >eType==RBU_PK_E
10da0 58 54 45 52 4e 41 4c 20 7c 7c 20 70 49 74 65 72  XTERNAL || pIter
10db0 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
10dc0 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  NONE ){.        
10dd0 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
10de0 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
10df0 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
10e00 25 73 2c 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20  %s, rbu_control 
10e10 46 52 4f 4d 20 25 73 2e 27 72 62 75 5f 74 6d 70  FROM %s.'rbu_tmp
10e20 5f 25 71 27 20 4f 52 44 45 52 20 42 59 20 25 73  _%q' ORDER BY %s
10e30 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
10e40 20 20 20 7a 43 6f 6c 6c 69 73 74 2c 20 70 2d 3e     zCollist, p->
10e50 7a 53 74 61 74 65 44 62 2c 20 70 49 74 65 72 2d  zStateDb, pIter-
10e60 3e 7a 44 61 74 61 54 62 6c 2c 0a 20 20 20 20 20  >zDataTbl,.     
10e70 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73           zCollis
10e80 74 2c 20 7a 4c 69 6d 69 74 0a 20 20 20 20 20 20  t, zLimit.      
10e90 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d      );.        }
10ea0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
10eb0 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
10ec0 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
10ed0 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 25 73        "SELECT %s
10ee0 2c 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 46 52  , rbu_control FR
10ef0 4f 4d 20 25 73 2e 27 72 62 75 5f 74 6d 70 5f 25  OM %s.'rbu_tmp_%
10f00 71 27 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  q' ".           
10f10 20 20 20 22 55 4e 49 4f 4e 20 41 4c 4c 20 22 0a     "UNION ALL ".
10f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53                "S
10f30 45 4c 45 43 54 20 25 73 2c 20 72 62 75 5f 63 6f  ELECT %s, rbu_co
10f40 6e 74 72 6f 6c 20 46 52 4f 4d 20 27 25 71 27 20  ntrol FROM '%q' 
10f50 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
10f60 22 57 48 45 52 45 20 74 79 70 65 6f 66 28 72 62  "WHERE typeof(rb
10f70 75 5f 63 6f 6e 74 72 6f 6c 29 3d 27 69 6e 74 65  u_control)='inte
10f80 67 65 72 27 20 41 4e 44 20 72 62 75 5f 63 6f 6e  ger' AND rbu_con
10f90 74 72 6f 6c 21 3d 31 20 22 0a 20 20 20 20 20 20  trol!=1 ".      
10fa0 20 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42          "ORDER B
10fb0 59 20 25 73 25 73 22 2c 0a 20 20 20 20 20 20 20  Y %s%s",.       
10fc0 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74 2c         zCollist,
10fd0 20 70 2d 3e 7a 53 74 61 74 65 44 62 2c 20 70 49   p->zStateDb, pI
10fe0 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 0a  ter->zDataTbl, .
10ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43                zC
11000 6f 6c 6c 69 73 74 2c 20 70 49 74 65 72 2d 3e 7a  ollist, pIter->z
11010 44 61 74 61 54 62 6c 2c 20 0a 20 20 20 20 20 20  DataTbl, .      
11020 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74          zCollist
11030 2c 20 7a 4c 69 6d 69 74 0a 20 20 20 20 20 20 20  , zLimit.       
11040 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a     );.        }.
11050 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
11060 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f  prepareFreeAndCo
11070 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62  llectError(p->db
11080 52 62 75 2c 20 26 70 49 74 65 72 2d 3e 70 53 65  Rbu, &pIter->pSe
11090 6c 65 63 74 2c 20 70 7a 2c 20 7a 53 71 6c 29 3b  lect, pz, zSql);
110a0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
110b0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6d  sqlite3_free(zIm
110c0 70 6f 73 74 65 72 43 6f 6c 73 29 3b 0a 20 20 20  posterCols);.   
110d0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
110e0 7a 49 6d 70 6f 73 74 65 72 50 4b 29 3b 0a 20 20  zImposterPK);.  
110f0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
11100 28 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20  (zWhere);.      
11110 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 69  sqlite3_free(zBi
11120 6e 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  nd);.    }else{.
11130 20 20 20 20 20 20 69 6e 74 20 62 52 62 75 52 6f        int bRbuRo
11140 77 69 64 20 3d 20 28 70 49 74 65 72 2d 3e 65 54  wid = (pIter->eT
11150 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 56 54 41 42  ype==RBU_PK_VTAB
11160 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
11170 20 20 20 20 20 20 7c 7c 28 70 49 74 65 72 2d 3e        ||(pIter->
11180 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f  eType==RBU_PK_NO
11190 4e 45 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  NE).            
111a0 20 20 20 20 20 20 20 20 7c 7c 28 70 49 74 65 72          ||(pIter
111b0 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
111c0 45 58 54 45 52 4e 41 4c 20 26 26 20 72 62 75 49  EXTERNAL && rbuI
111d0 73 56 61 63 75 75 6d 28 70 29 29 3b 0a 20 20 20  sVacuum(p));.   
111e0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
111f0 54 62 6c 20 3d 20 70 49 74 65 72 2d 3e 7a 54 62  Tbl = pIter->zTb
11200 6c 3b 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c  l;       /* Tabl
11210 65 20 74 68 69 73 20 73 74 65 70 20 61 70 70 6c  e this step appl
11220 69 65 73 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20  ies to */.      
11230 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 72 69  const char *zWri
11240 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
11250 20 20 20 20 20 20 2f 2a 20 49 6d 70 6f 73 74 65        /* Imposte
11260 72 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a  r table name */.
11270 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42 69  .      char *zBi
11280 6e 64 69 6e 67 73 20 3d 20 72 62 75 4f 62 6a 49  ndings = rbuObjI
11290 74 65 72 47 65 74 42 69 6e 64 6c 69 73 74 28 70  terGetBindlist(p
112a0 2c 20 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c  , pIter->nTblCol
112b0 20 2b 20 62 52 62 75 52 6f 77 69 64 29 3b 0a 20   + bRbuRowid);. 
112c0 20 20 20 20 20 63 68 61 72 20 2a 7a 57 68 65 72       char *zWher
112d0 65 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 47 65  e = rbuObjIterGe
112e0 74 57 68 65 72 65 28 70 2c 20 70 49 74 65 72 29  tWhere(p, pIter)
112f0 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4f  ;.      char *zO
11300 6c 64 6c 69 73 74 20 3d 20 72 62 75 4f 62 6a 49  ldlist = rbuObjI
11310 74 65 72 47 65 74 4f 6c 64 6c 69 73 74 28 70 2c  terGetOldlist(p,
11320 20 70 49 74 65 72 2c 20 22 6f 6c 64 22 29 3b 0a   pIter, "old");.
11330 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77        char *zNew
11340 6c 69 73 74 20 3d 20 72 62 75 4f 62 6a 49 74 65  list = rbuObjIte
11350 72 47 65 74 4f 6c 64 6c 69 73 74 28 70 2c 20 70  rGetOldlist(p, p
11360 49 74 65 72 2c 20 22 6e 65 77 22 29 3b 0a 0a 20  Iter, "new");.. 
11370 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74 20 3d 20       zCollist = 
11380 72 62 75 4f 62 6a 49 74 65 72 47 65 74 43 6f 6c  rbuObjIterGetCol
11390 6c 69 73 74 28 70 2c 20 70 49 74 65 72 29 3b 0a  list(p, pIter);.
113a0 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 43 6f        pIter->nCo
113b0 6c 20 3d 20 70 49 74 65 72 2d 3e 6e 54 62 6c 43  l = pIter->nTblC
113c0 6f 6c 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72  ol;..      /* Cr
113d0 65 61 74 65 20 74 68 65 20 69 6d 70 6f 73 74 65  eate the imposte
113e0 72 20 74 61 62 6c 65 20 6f 72 20 74 61 62 6c 65  r table or table
113f0 73 20 28 69 66 20 72 65 71 75 69 72 65 64 29 2e  s (if required).
11400 20 2a 2f 0a 20 20 20 20 20 20 72 62 75 43 72 65   */.      rbuCre
11410 61 74 65 49 6d 70 6f 73 74 65 72 54 61 62 6c 65  ateImposterTable
11420 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
11430 20 20 72 62 75 43 72 65 61 74 65 49 6d 70 6f 73    rbuCreateImpos
11440 74 65 72 54 61 62 6c 65 32 28 70 2c 20 70 49 74  terTable2(p, pIt
11450 65 72 29 3b 0a 20 20 20 20 20 20 7a 57 72 69 74  er);.      zWrit
11460 65 20 3d 20 28 70 49 74 65 72 2d 3e 65 54 79 70  e = (pIter->eTyp
11470 65 3d 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20 3f  e==RBU_PK_VTAB ?
11480 20 22 22 20 3a 20 22 72 62 75 5f 69 6d 70 5f 22   "" : "rbu_imp_"
11490 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65  );..      /* Cre
114a0 61 74 65 20 74 68 65 20 49 4e 53 45 52 54 20 73  ate the INSERT s
114b0 74 61 74 65 6d 65 6e 74 20 74 6f 20 77 72 69 74  tatement to writ
114c0 65 20 74 6f 20 74 68 65 20 74 61 72 67 65 74 20  e to the target 
114d0 50 4b 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20  PK b-tree */.   
114e0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
114f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
11500 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61     p->rc = prepa
11510 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74  reFreeAndCollect
11520 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c  Error(p->dbMain,
11530 20 26 70 49 74 65 72 2d 3e 70 49 6e 73 65 72 74   &pIter->pInsert
11540 2c 20 70 7a 2c 0a 20 20 20 20 20 20 20 20 20 20  , pz,.          
11550 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
11560 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  f(.             
11570 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5c 22   "INSERT INTO \"
11580 25 73 25 77 5c 22 28 25 73 25 73 29 20 56 41 4c  %s%w\"(%s%s) VAL
11590 55 45 53 28 25 73 29 22 2c 20 0a 20 20 20 20 20  UES(%s)", .     
115a0 20 20 20 20 20 20 20 20 20 7a 57 72 69 74 65 2c           zWrite,
115b0 20 7a 54 62 6c 2c 20 7a 43 6f 6c 6c 69 73 74 2c   zTbl, zCollist,
115c0 20 28 62 52 62 75 52 6f 77 69 64 20 3f 20 22 2c   (bRbuRowid ? ",
115d0 20 5f 72 6f 77 69 64 5f 22 20 3a 20 22 22 29 2c   _rowid_" : ""),
115e0 20 7a 42 69 6e 64 69 6e 67 73 0a 20 20 20 20 20   zBindings.     
115f0 20 20 20 20 20 20 20 29 0a 20 20 20 20 20 20 20         ).       
11600 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   );.      }..   
11610 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65     /* Create the
11620 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
11630 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  t to write to th
11640 65 20 74 61 72 67 65 74 20 50 4b 20 62 2d 74 72  e target PK b-tr
11650 65 65 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65 63  ee..      ** Bec
11660 61 75 73 65 20 69 74 20 6f 6e 6c 79 20 70 65 72  ause it only per
11670 66 6f 72 6d 73 20 49 4e 53 45 52 54 20 6f 70 65  forms INSERT ope
11680 72 61 74 69 6f 6e 73 2c 20 74 68 69 73 20 69 73  rations, this is
11690 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 66 6f   not required fo
116a0 72 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 72 62  r.      ** an rb
116b0 75 20 76 61 63 75 75 6d 20 68 61 6e 64 6c 65 2e  u vacuum handle.
116c0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72    */.      if( r
116d0 62 75 49 73 56 61 63 75 75 6d 28 70 29 3d 3d 30  buIsVacuum(p)==0
116e0 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   && p->rc==SQLIT
116f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
11700 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46  p->rc = prepareF
11710 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  reeAndCollectErr
11720 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70  or(p->dbMain, &p
11730 49 74 65 72 2d 3e 70 44 65 6c 65 74 65 2c 20 70  Iter->pDelete, p
11740 7a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  z,.            s
11750 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
11760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 44                "D
11770 45 4c 45 54 45 20 46 52 4f 4d 20 5c 22 25 73 25  ELETE FROM \"%s%
11780 77 5c 22 20 57 48 45 52 45 20 25 73 22 2c 20 7a  w\" WHERE %s", z
11790 57 72 69 74 65 2c 20 7a 54 62 6c 2c 20 7a 57 68  Write, zTbl, zWh
117a0 65 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ere.            
117b0 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
117c0 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
117d0 72 62 75 49 73 56 61 63 75 75 6d 28 70 29 3d 3d  rbuIsVacuum(p)==
117e0 30 20 26 26 20 70 49 74 65 72 2d 3e 61 62 49 6e  0 && pIter->abIn
117f0 64 65 78 65 64 20 29 7b 0a 20 20 20 20 20 20 20  dexed ){.       
11800 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 62   const char *zRb
11810 75 52 6f 77 69 64 20 3d 20 22 22 3b 0a 20 20 20  uRowid = "";.   
11820 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
11830 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45 58  eType==RBU_PK_EX
11840 54 45 52 4e 41 4c 20 7c 7c 20 70 49 74 65 72 2d  TERNAL || pIter-
11850 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e  >eType==RBU_PK_N
11860 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ONE ){.         
11870 20 7a 52 62 75 52 6f 77 69 64 20 3d 20 22 2c 20   zRbuRowid = ", 
11880 72 62 75 5f 72 6f 77 69 64 22 3b 0a 20 20 20 20  rbu_rowid";.    
11890 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
118a0 2a 20 43 72 65 61 74 65 20 74 68 65 20 72 62 75  * Create the rbu
118b0 5f 74 6d 70 5f 78 78 78 20 74 61 62 6c 65 20 61  _tmp_xxx table a
118c0 6e 64 20 74 68 65 20 74 72 69 67 67 65 72 73 20  nd the triggers 
118d0 74 6f 20 70 6f 70 75 6c 61 74 65 20 69 74 2e 20  to populate it. 
118e0 2a 2f 0a 20 20 20 20 20 20 20 20 72 62 75 4d 50  */.        rbuMP
118f0 72 69 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e  rintfExec(p, p->
11900 64 62 52 62 75 2c 0a 20 20 20 20 20 20 20 20 20  dbRbu,.         
11910 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
11920 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 25   IF NOT EXISTS %
11930 73 2e 27 72 62 75 5f 74 6d 70 5f 25 71 27 20 41  s.'rbu_tmp_%q' A
11940 53 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  S ".            
11950 22 53 45 4c 45 43 54 20 2a 25 73 20 46 52 4f 4d  "SELECT *%s FROM
11960 20 27 25 71 27 20 57 48 45 52 45 20 30 3b 22 0a   '%q' WHERE 0;".
11970 20 20 20 20 20 20 20 20 20 20 20 20 2c 20 70 2d              , p-
11980 3e 7a 53 74 61 74 65 44 62 2c 20 70 49 74 65 72  >zStateDb, pIter
11990 2d 3e 7a 44 61 74 61 54 62 6c 0a 20 20 20 20 20  ->zDataTbl.     
119a0 20 20 20 20 20 20 20 2c 20 28 70 49 74 65 72 2d         , (pIter-
119b0 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45  >eType==RBU_PK_E
119c0 58 54 45 52 4e 41 4c 20 3f 20 22 2c 20 30 20 41  XTERNAL ? ", 0 A
119d0 53 20 72 62 75 5f 72 6f 77 69 64 22 20 3a 20 22  S rbu_rowid" : "
119e0 22 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 2c  ").            ,
119f0 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c   pIter->zDataTbl
11a00 0a 20 20 20 20 20 20 20 20 29 3b 0a 0a 20 20 20  .        );..   
11a10 20 20 20 20 20 72 62 75 4d 50 72 69 6e 74 66 45       rbuMPrintfE
11a20 78 65 63 28 70 2c 20 70 2d 3e 64 62 4d 61 69 6e  xec(p, p->dbMain
11a30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43  ,.            "C
11a40 52 45 41 54 45 20 54 45 4d 50 20 54 52 49 47 47  REATE TEMP TRIGG
11a50 45 52 20 72 62 75 5f 64 65 6c 65 74 65 5f 74 72  ER rbu_delete_tr
11a60 20 42 45 46 4f 52 45 20 44 45 4c 45 54 45 20 4f   BEFORE DELETE O
11a70 4e 20 5c 22 25 73 25 77 5c 22 20 22 0a 20 20 20  N \"%s%w\" ".   
11a80 20 20 20 20 20 20 20 20 20 22 42 45 47 49 4e 20           "BEGIN 
11a90 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 20  ".            " 
11aa0 20 53 45 4c 45 43 54 20 72 62 75 5f 74 6d 70 5f   SELECT rbu_tmp_
11ab0 69 6e 73 65 72 74 28 33 2c 20 25 73 29 3b 22 0a  insert(3, %s);".
11ac0 20 20 20 20 20 20 20 20 20 20 20 20 22 45 4e 44              "END
11ad0 3b 22 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  ;"..            
11ae0 22 43 52 45 41 54 45 20 54 45 4d 50 20 54 52 49  "CREATE TEMP TRI
11af0 47 47 45 52 20 72 62 75 5f 75 70 64 61 74 65 31  GGER rbu_update1
11b00 5f 74 72 20 42 45 46 4f 52 45 20 55 50 44 41 54  _tr BEFORE UPDAT
11b10 45 20 4f 4e 20 5c 22 25 73 25 77 5c 22 20 22 0a  E ON \"%s%w\" ".
11b20 20 20 20 20 20 20 20 20 20 20 20 20 22 42 45 47              "BEG
11b30 49 4e 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  IN ".           
11b40 20 22 20 20 53 45 4c 45 43 54 20 72 62 75 5f 74   "  SELECT rbu_t
11b50 6d 70 5f 69 6e 73 65 72 74 28 33 2c 20 25 73 29  mp_insert(3, %s)
11b60 3b 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  ;".            "
11b70 45 4e 44 3b 22 0a 0a 20 20 20 20 20 20 20 20 20  END;"..         
11b80 20 20 20 22 43 52 45 41 54 45 20 54 45 4d 50 20     "CREATE TEMP 
11b90 54 52 49 47 47 45 52 20 72 62 75 5f 75 70 64 61  TRIGGER rbu_upda
11ba0 74 65 32 5f 74 72 20 41 46 54 45 52 20 55 50 44  te2_tr AFTER UPD
11bb0 41 54 45 20 4f 4e 20 5c 22 25 73 25 77 5c 22 20  ATE ON \"%s%w\" 
11bc0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 42  ".            "B
11bd0 45 47 49 4e 20 22 0a 20 20 20 20 20 20 20 20 20  EGIN ".         
11be0 20 20 20 22 20 20 53 45 4c 45 43 54 20 72 62 75     "  SELECT rbu
11bf0 5f 74 6d 70 5f 69 6e 73 65 72 74 28 34 2c 20 25  _tmp_insert(4, %
11c00 73 29 3b 22 0a 20 20 20 20 20 20 20 20 20 20 20  s);".           
11c10 20 22 45 4e 44 3b 22 2c 0a 20 20 20 20 20 20 20   "END;",.       
11c20 20 20 20 20 20 7a 57 72 69 74 65 2c 20 7a 54 62       zWrite, zTb
11c30 6c 2c 20 7a 4f 6c 64 6c 69 73 74 2c 0a 20 20 20  l, zOldlist,.   
11c40 20 20 20 20 20 20 20 20 20 7a 57 72 69 74 65 2c           zWrite,
11c50 20 7a 54 62 6c 2c 20 7a 4f 6c 64 6c 69 73 74 2c   zTbl, zOldlist,
11c60 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 57 72  .            zWr
11c70 69 74 65 2c 20 7a 54 62 6c 2c 20 7a 4e 65 77 6c  ite, zTbl, zNewl
11c80 69 73 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 0a  ist.        );..
11c90 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
11ca0 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
11cb0 5f 45 58 54 45 52 4e 41 4c 20 7c 7c 20 70 49 74  _EXTERNAL || pIt
11cc0 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
11cd0 4b 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  K_NONE ){.      
11ce0 20 20 20 20 72 62 75 4d 50 72 69 6e 74 66 45 78      rbuMPrintfEx
11cf0 65 63 28 70 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c  ec(p, p->dbMain,
11d00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
11d10 43 52 45 41 54 45 20 54 45 4d 50 20 54 52 49 47  CREATE TEMP TRIG
11d20 47 45 52 20 72 62 75 5f 69 6e 73 65 72 74 5f 74  GER rbu_insert_t
11d30 72 20 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f  r AFTER INSERT O
11d40 4e 20 5c 22 25 73 25 77 5c 22 20 22 0a 20 20 20  N \"%s%w\" ".   
11d50 20 20 20 20 20 20 20 20 20 20 20 22 42 45 47 49             "BEGI
11d60 4e 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  N ".            
11d70 20 20 22 20 20 53 45 4c 45 43 54 20 72 62 75 5f    "  SELECT rbu_
11d80 74 6d 70 5f 69 6e 73 65 72 74 28 30 2c 20 25 73  tmp_insert(0, %s
11d90 29 3b 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  );".            
11da0 20 20 22 45 4e 44 3b 22 2c 0a 20 20 20 20 20 20    "END;",.      
11db0 20 20 20 20 20 20 20 20 7a 57 72 69 74 65 2c 20          zWrite, 
11dc0 7a 54 62 6c 2c 20 7a 4e 65 77 6c 69 73 74 0a 20  zTbl, zNewlist. 
11dd0 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
11de0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72      }..        r
11df0 62 75 4f 62 6a 49 74 65 72 50 72 65 70 61 72 65  buObjIterPrepare
11e00 54 6d 70 49 6e 73 65 72 74 28 70 2c 20 70 49 74  TmpInsert(p, pIt
11e10 65 72 2c 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a 52  er, zCollist, zR
11e20 62 75 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  buRowid);.      
11e30 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61  }..      /* Crea
11e40 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  te the SELECT st
11e50 61 74 65 6d 65 6e 74 20 74 6f 20 72 65 61 64 20  atement to read 
11e60 6b 65 79 73 20 66 72 6f 6d 20 64 61 74 61 5f 78  keys from data_x
11e70 78 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  xx */.      if( 
11e80 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
11e90 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
11ea0 74 20 63 68 61 72 20 2a 7a 52 62 75 52 6f 77 69  t char *zRbuRowi
11eb0 64 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20  d = "";.        
11ec0 69 66 28 20 62 52 62 75 52 6f 77 69 64 20 29 7b  if( bRbuRowid ){
11ed0 0a 20 20 20 20 20 20 20 20 20 20 7a 52 62 75 52  .          zRbuR
11ee0 6f 77 69 64 20 3d 20 72 62 75 49 73 56 61 63 75  owid = rbuIsVacu
11ef0 75 6d 28 70 29 20 3f 20 22 2c 5f 72 6f 77 69 64  um(p) ? ",_rowid
11f00 5f 20 22 20 3a 20 22 2c 72 62 75 5f 72 6f 77 69  _ " : ",rbu_rowi
11f10 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  d";.        }.  
11f20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72        p->rc = pr
11f30 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c  epareFreeAndColl
11f40 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 52 62  ectError(p->dbRb
11f50 75 2c 20 26 70 49 74 65 72 2d 3e 70 53 65 6c 65  u, &pIter->pSele
11f60 63 74 2c 20 70 7a 2c 0a 20 20 20 20 20 20 20 20  ct, pz,.        
11f70 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69      sqlite3_mpri
11f80 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20  ntf(.           
11f90 20 20 20 22 53 45 4c 45 43 54 20 25 73 2c 25 73     "SELECT %s,%s
11fa0 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 25 73 20 46   rbu_control%s F
11fb0 52 4f 4d 20 27 25 71 27 25 73 22 2c 20 0a 20 20  ROM '%q'%s", .  
11fc0 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
11fd0 6c 69 73 74 2c 20 0a 20 20 20 20 20 20 20 20 20  list, .         
11fe0 20 20 20 20 20 28 72 62 75 49 73 56 61 63 75 75       (rbuIsVacuu
11ff0 6d 28 70 29 20 3f 20 22 30 20 41 53 20 22 20 3a  m(p) ? "0 AS " :
12000 20 22 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20   ""),.          
12010 20 20 20 20 7a 52 62 75 52 6f 77 69 64 2c 0a 20      zRbuRowid,. 
12020 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
12030 65 72 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 7a 4c  er->zDataTbl, zL
12040 69 6d 69 74 0a 20 20 20 20 20 20 20 20 20 20 20  imit.           
12050 20 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20   ).        );.  
12060 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c      }..      sql
12070 69 74 65 33 5f 66 72 65 65 28 7a 57 68 65 72 65  ite3_free(zWhere
12080 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12090 5f 66 72 65 65 28 7a 4f 6c 64 6c 69 73 74 29 3b  _free(zOldlist);
120a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
120b0 72 65 65 28 7a 4e 65 77 6c 69 73 74 29 3b 0a 20  ree(zNewlist);. 
120c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
120d0 65 28 7a 42 69 6e 64 69 6e 67 73 29 3b 0a 20 20  e(zBindings);.  
120e0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
120f0 66 72 65 65 28 7a 43 6f 6c 6c 69 73 74 29 3b 0a  free(zCollist);.
12100 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
12110 28 7a 4c 69 6d 69 74 29 3b 0a 20 20 7d 0a 20 20  (zLimit);.  }.  
12120 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b  .  return p->rc;
12130 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f 75  .}../*.** Set ou
12140 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a 70  tput variable *p
12150 70 53 74 6d 74 20 74 6f 20 70 6f 69 6e 74 20 74  pStmt to point t
12160 6f 20 61 6e 20 55 50 44 41 54 45 20 73 74 61 74  o an UPDATE stat
12170 65 6d 65 6e 74 20 74 68 61 74 20 6d 61 79 0a 2a  ement that may.*
12180 2a 20 62 65 20 75 73 65 64 20 74 6f 20 75 70 64  * be used to upd
12190 61 74 65 20 74 68 65 20 69 6d 70 6f 73 74 65 72  ate the imposter
121a0 20 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20 6d   table for the m
121b0 61 69 6e 20 74 61 62 6c 65 20 62 2d 74 72 65 65  ain table b-tree
121c0 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65   of the.** table
121d0 20 6f 62 6a 65 63 74 20 74 68 61 74 20 70 49 74   object that pIt
121e0 65 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  er currently poi
121f0 6e 74 73 20 74 6f 2c 20 61 73 73 75 6d 69 6e 67  nts to, assuming
12200 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 72 62   that the .** rb
12210 75 5f 63 6f 6e 74 72 6f 6c 20 63 6f 6c 75 6d 6e  u_control column
12220 20 6f 66 20 74 68 65 20 64 61 74 61 5f 78 79 7a   of the data_xyz
12230 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20   table contains 
12240 7a 4d 61 73 6b 2e 0a 2a 2a 20 0a 2a 2a 20 49 66  zMask..** .** If
12250 20 74 68 65 20 7a 4d 61 73 6b 20 73 74 72 69 6e   the zMask strin
12260 67 20 64 6f 65 73 20 6e 6f 74 20 73 70 65 63 69  g does not speci
12270 66 79 20 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 74  fy any columns t
12280 6f 20 75 70 64 61 74 65 2c 20 74 68 65 6e 20 74  o update, then t
12290 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 6e  his.** is not an
122a0 20 65 72 72 6f 72 2e 20 4f 75 74 70 75 74 20 76   error. Output v
122b0 61 72 69 61 62 6c 65 20 2a 70 70 53 74 6d 74 20  ariable *ppStmt 
122c0 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69  is set to NULL i
122d0 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a  n this case..*/.
122e0 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 47 65  static int rbuGe
122f0 74 55 70 64 61 74 65 53 74 6d 74 28 0a 20 20 73  tUpdateStmt(.  s
12300 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 20 20  qlite3rbu *p,   
12310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12320 2a 20 52 42 55 20 68 61 6e 64 6c 65 20 2a 2f 0a  * RBU handle */.
12330 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49    RbuObjIter *pI
12340 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ter,            
12350 20 20 2f 2a 20 4f 62 6a 65 63 74 20 69 74 65 72    /* Object iter
12360 61 74 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ator */.  const 
12370 63 68 61 72 20 2a 7a 4d 61 73 6b 2c 20 20 20 20  char *zMask,    
12380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 62 75            /* rbu
12390 5f 63 6f 6e 74 72 6f 6c 20 76 61 6c 75 65 20 28  _control value (
123a0 27 78 2e 78 2e 27 29 20 2a 2f 0a 20 20 73 71 6c  'x.x.') */.  sql
123b0 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74  ite3_stmt **ppSt
123c0 6d 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  mt           /* 
123d0 4f 55 54 3a 20 55 50 44 41 54 45 20 73 74 61 74  OUT: UPDATE stat
123e0 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 2a 2f 0a  ement handle */.
123f0 29 7b 0a 20 20 52 62 75 55 70 64 61 74 65 53 74  ){.  RbuUpdateSt
12400 6d 74 20 2a 2a 70 70 3b 0a 20 20 52 62 75 55 70  mt **pp;.  RbuUp
12410 64 61 74 65 53 74 6d 74 20 2a 70 55 70 20 3d 20  dateStmt *pUp = 
12420 30 3b 0a 20 20 69 6e 74 20 6e 55 70 20 3d 20 30  0;.  int nUp = 0
12430 3b 0a 0a 20 20 2f 2a 20 49 6e 20 63 61 73 65 20  ;..  /* In case 
12440 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
12450 2a 2f 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20 30  */.  *ppStmt = 0
12460 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66  ;..  /* Search f
12470 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73  or an existing s
12480 74 61 74 65 6d 65 6e 74 2e 20 49 66 20 6f 6e 65  tatement. If one
12490 20 69 73 20 66 6f 75 6e 64 2c 20 73 68 69 66 74   is found, shift
124a0 20 69 74 20 74 6f 20 74 68 65 20 66 72 6f 6e 74   it to the front
124b0 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 4c 52 55  .  ** of the LRU
124c0 20 71 75 65 75 65 20 61 6e 64 20 72 65 74 75 72   queue and retur
124d0 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 4f  n immediately. O
124e0 74 68 65 72 77 69 73 65 2c 20 6c 65 61 76 65 20  therwise, leave 
124f0 6e 55 70 20 70 6f 69 6e 74 69 6e 67 0a 20 20 2a  nUp pointing.  *
12500 2a 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  * to the number 
12510 6f 66 20 73 74 61 74 65 6d 65 6e 74 73 20 63 75  of statements cu
12520 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 63  rrently in the c
12530 61 63 68 65 20 61 6e 64 20 70 55 70 20 74 6f 20  ache and pUp to 
12540 74 68 65 0a 20 20 2a 2a 20 6c 61 73 74 20 6f 62  the.  ** last ob
12550 6a 65 63 74 20 69 6e 20 74 68 65 20 6c 69 73 74  ject in the list
12560 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 70 70 3d 26  .  */.  for(pp=&
12570 70 49 74 65 72 2d 3e 70 52 62 75 55 70 64 61 74  pIter->pRbuUpdat
12580 65 3b 20 2a 70 70 3b 20 70 70 3d 26 28 28 2a 70  e; *pp; pp=&((*p
12590 70 29 2d 3e 70 4e 65 78 74 29 29 7b 0a 20 20 20  p)->pNext)){.   
125a0 20 70 55 70 20 3d 20 2a 70 70 3b 0a 20 20 20 20   pUp = *pp;.    
125b0 69 66 28 20 73 74 72 63 6d 70 28 70 55 70 2d 3e  if( strcmp(pUp->
125c0 7a 4d 61 73 6b 2c 20 7a 4d 61 73 6b 29 3d 3d 30  zMask, zMask)==0
125d0 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20   ){.      *pp = 
125e0 70 55 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pUp->pNext;.    
125f0 20 20 70 55 70 2d 3e 70 4e 65 78 74 20 3d 20 70    pUp->pNext = p
12600 49 74 65 72 2d 3e 70 52 62 75 55 70 64 61 74 65  Iter->pRbuUpdate
12610 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70  ;.      pIter->p
12620 52 62 75 55 70 64 61 74 65 20 3d 20 70 55 70 3b  RbuUpdate = pUp;
12630 0a 20 20 20 20 20 20 2a 70 70 53 74 6d 74 20 3d  .      *ppStmt =
12640 20 70 55 70 2d 3e 70 55 70 64 61 74 65 3b 20 0a   pUp->pUpdate; .
12650 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
12660 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
12670 20 20 6e 55 70 2b 2b 3b 0a 20 20 7d 0a 20 20 61    nUp++;.  }.  a
12680 73 73 65 72 74 28 20 70 55 70 3d 3d 30 20 7c 7c  ssert( pUp==0 ||
12690 20 70 55 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29   pUp->pNext==0 )
126a0 3b 0a 0a 20 20 69 66 28 20 6e 55 70 3e 3d 53 51  ;..  if( nUp>=SQ
126b0 4c 49 54 45 5f 52 42 55 5f 55 50 44 41 54 45 5f  LITE_RBU_UPDATE_
126c0 43 41 43 48 45 53 49 5a 45 20 29 7b 0a 20 20 20  CACHESIZE ){.   
126d0 20 66 6f 72 28 70 70 3d 26 70 49 74 65 72 2d 3e   for(pp=&pIter->
126e0 70 52 62 75 55 70 64 61 74 65 3b 20 2a 70 70 21  pRbuUpdate; *pp!
126f0 3d 70 55 70 3b 20 70 70 3d 26 28 28 2a 70 70 29  =pUp; pp=&((*pp)
12700 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20 20 2a  ->pNext));.    *
12710 70 70 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  pp = 0;.    sqli
12720 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 55 70  te3_finalize(pUp
12730 2d 3e 70 55 70 64 61 74 65 29 3b 0a 20 20 20 20  ->pUpdate);.    
12740 70 55 70 2d 3e 70 55 70 64 61 74 65 20 3d 20 30  pUp->pUpdate = 0
12750 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
12760 55 70 20 3d 20 28 52 62 75 55 70 64 61 74 65 53  Up = (RbuUpdateS
12770 74 6d 74 2a 29 72 62 75 4d 61 6c 6c 6f 63 28 70  tmt*)rbuMalloc(p
12780 2c 20 73 69 7a 65 6f 66 28 52 62 75 55 70 64 61  , sizeof(RbuUpda
12790 74 65 53 74 6d 74 29 2b 70 49 74 65 72 2d 3e 6e  teStmt)+pIter->n
127a0 54 62 6c 43 6f 6c 2b 31 29 3b 0a 20 20 7d 0a 0a  TblCol+1);.  }..
127b0 20 20 69 66 28 20 70 55 70 20 29 7b 0a 20 20 20    if( pUp ){.   
127c0 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20   char *zWhere = 
127d0 72 62 75 4f 62 6a 49 74 65 72 47 65 74 57 68 65  rbuObjIterGetWhe
127e0 72 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  re(p, pIter);.  
127f0 20 20 63 68 61 72 20 2a 7a 53 65 74 20 3d 20 72    char *zSet = r
12800 62 75 4f 62 6a 49 74 65 72 47 65 74 53 65 74 6c  buObjIterGetSetl
12810 69 73 74 28 70 2c 20 70 49 74 65 72 2c 20 7a 4d  ist(p, pIter, zM
12820 61 73 6b 29 3b 0a 20 20 20 20 63 68 61 72 20 2a  ask);.    char *
12830 7a 55 70 64 61 74 65 20 3d 20 30 3b 0a 0a 20 20  zUpdate = 0;..  
12840 20 20 70 55 70 2d 3e 7a 4d 61 73 6b 20 3d 20 28    pUp->zMask = (
12850 63 68 61 72 2a 29 26 70 55 70 5b 31 5d 3b 0a 20  char*)&pUp[1];. 
12860 20 20 20 6d 65 6d 63 70 79 28 70 55 70 2d 3e 7a     memcpy(pUp->z
12870 4d 61 73 6b 2c 20 7a 4d 61 73 6b 2c 20 70 49 74  Mask, zMask, pIt
12880 65 72 2d 3e 6e 54 62 6c 43 6f 6c 29 3b 0a 20 20  er->nTblCol);.  
12890 20 20 70 55 70 2d 3e 70 4e 65 78 74 20 3d 20 70    pUp->pNext = p
128a0 49 74 65 72 2d 3e 70 52 62 75 55 70 64 61 74 65  Iter->pRbuUpdate
128b0 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 52 62  ;.    pIter->pRb
128c0 75 55 70 64 61 74 65 20 3d 20 70 55 70 3b 0a 0a  uUpdate = pUp;..
128d0 20 20 20 20 69 66 28 20 7a 53 65 74 20 29 7b 0a      if( zSet ){.
128e0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
128f0 20 2a 7a 50 72 65 66 69 78 20 3d 20 22 22 3b 0a   *zPrefix = "";.
12900 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
12910 2d 3e 65 54 79 70 65 21 3d 52 42 55 5f 50 4b 5f  ->eType!=RBU_PK_
12920 56 54 41 42 20 29 20 7a 50 72 65 66 69 78 20 3d  VTAB ) zPrefix =
12930 20 22 72 62 75 5f 69 6d 70 5f 22 3b 0a 20 20 20   "rbu_imp_";.   
12940 20 20 20 7a 55 70 64 61 74 65 20 3d 20 73 71 6c     zUpdate = sql
12950 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 55 50  ite3_mprintf("UP
12960 44 41 54 45 20 5c 22 25 73 25 77 5c 22 20 53 45  DATE \"%s%w\" SE
12970 54 20 25 73 20 57 48 45 52 45 20 25 73 22 2c 20  T %s WHERE %s", 
12980 0a 20 20 20 20 20 20 20 20 20 20 7a 50 72 65 66  .          zPref
12990 69 78 2c 20 70 49 74 65 72 2d 3e 7a 54 62 6c 2c  ix, pIter->zTbl,
129a0 20 7a 53 65 74 2c 20 7a 57 68 65 72 65 0a 20 20   zSet, zWhere.  
129b0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e      );.      p->
129c0 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65  rc = prepareFree
129d0 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
129e0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 64 62  .          p->db
129f0 4d 61 69 6e 2c 20 26 70 55 70 2d 3e 70 55 70 64  Main, &pUp->pUpd
12a00 61 74 65 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  ate, &p->zErrmsg
12a10 2c 20 7a 55 70 64 61 74 65 0a 20 20 20 20 20 20  , zUpdate.      
12a20 29 3b 0a 20 20 20 20 20 20 2a 70 70 53 74 6d 74  );.      *ppStmt
12a30 20 3d 20 70 55 70 2d 3e 70 55 70 64 61 74 65 3b   = pUp->pUpdate;
12a40 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
12a50 65 33 5f 66 72 65 65 28 7a 57 68 65 72 65 29 3b  e3_free(zWhere);
12a60 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
12a70 65 28 7a 53 65 74 29 3b 0a 20 20 7d 0a 0a 20 20  e(zSet);.  }..  
12a80 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a  return p->rc;.}.
12a90 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 20  .static sqlite3 
12aa0 2a 72 62 75 4f 70 65 6e 44 62 68 61 6e 64 6c 65  *rbuOpenDbhandle
12ab0 28 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a  (.  sqlite3rbu *
12ac0 70 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  p, .  const char
12ad0 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20   *zName, .  int 
12ae0 62 55 73 65 56 66 73 0a 29 7b 0a 20 20 73 71 6c  bUseVfs.){.  sql
12af0 69 74 65 33 20 2a 64 62 20 3d 20 30 3b 0a 20 20  ite3 *db = 0;.  
12b00 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
12b10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73  E_OK ){.    cons
12b20 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 53 51  t int flags = SQ
12b30 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
12b40 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
12b50 43 52 45 41 54 45 7c 53 51 4c 49 54 45 5f 4f 50  CREATE|SQLITE_OP
12b60 45 4e 5f 55 52 49 3b 0a 20 20 20 20 70 2d 3e 72  EN_URI;.    p->r
12b70 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  c = sqlite3_open
12b80 5f 76 32 28 7a 4e 61 6d 65 2c 20 26 64 62 2c 20  _v2(zName, &db, 
12b90 66 6c 61 67 73 2c 20 62 55 73 65 56 66 73 20 3f  flags, bUseVfs ?
12ba0 20 70 2d 3e 7a 56 66 73 4e 61 6d 65 20 3a 20 30   p->zVfsName : 0
12bb0 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
12bc0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72   ){.      p->zEr
12bd0 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rmsg = sqlite3_m
12be0 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c  printf("%s", sql
12bf0 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29  ite3_errmsg(db))
12c00 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
12c10 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20 20 20  close(db);.     
12c20 20 64 62 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20   db = 0;.    }. 
12c30 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 3b 0a   }.  return db;.
12c40 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e  }../*.** Free an
12c50 20 52 62 75 53 74 61 74 65 20 6f 62 6a 65 63 74   RbuState object
12c60 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 72 62   allocated by rb
12c70 75 4c 6f 61 64 53 74 61 74 65 28 29 2e 0a 2a 2f  uLoadState()..*/
12c80 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
12c90 46 72 65 65 53 74 61 74 65 28 52 62 75 53 74 61  FreeState(RbuSta
12ca0 74 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  te *p){.  if( p 
12cb0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
12cc0 72 65 65 28 70 2d 3e 7a 54 62 6c 29 3b 0a 20 20  ree(p->zTbl);.  
12cd0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
12ce0 2d 3e 7a 44 61 74 61 54 62 6c 29 3b 0a 20 20 20  ->zDataTbl);.   
12cf0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
12d00 3e 7a 49 64 78 29 3b 0a 20 20 20 20 73 71 6c 69  >zIdx);.    sqli
12d10 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d  te3_free(p);.  }
12d20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
12d30 74 65 20 61 6e 20 52 62 75 53 74 61 74 65 20 6f  te an RbuState o
12d40 62 6a 65 63 74 20 61 6e 64 20 6c 6f 61 64 20 74  bject and load t
12d50 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
12d60 68 65 20 72 62 75 5f 73 74 61 74 65 20 0a 2a 2a  he rbu_state .**
12d70 20 74 61 62 6c 65 20 69 6e 74 6f 20 69 74 2e 20   table into it. 
12d80 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
12d90 20 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a 65   to the new obje
12da0 63 74 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a  ct. It is the .*
12db0 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  * responsibility
12dc0 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
12dd0 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  o eventually fre
12de0 65 20 74 68 65 20 6f 62 6a 65 63 74 20 75 73 69  e the object usi
12df0 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 72  ng.** sqlite3_fr
12e00 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ee()..**.** If a
12e10 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
12e20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 63  leave an error c
12e30 6f 64 65 20 61 6e 64 20 6d 65 73 73 61 67 65 20  ode and message 
12e40 69 6e 20 74 68 65 20 72 62 75 20 68 61 6e 64 6c  in the rbu handl
12e50 65 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 20  e.** and return 
12e60 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  NULL..*/.static 
12e70 52 62 75 53 74 61 74 65 20 2a 72 62 75 4c 6f 61  RbuState *rbuLoa
12e80 64 53 74 61 74 65 28 73 71 6c 69 74 65 33 72 62  dState(sqlite3rb
12e90 75 20 2a 70 29 7b 0a 20 20 52 62 75 53 74 61 74  u *p){.  RbuStat
12ea0 65 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 73  e *pRet = 0;.  s
12eb0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
12ec0 6d 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  mt = 0;.  int rc
12ed0 3b 0a 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20  ;.  int rc2;..  
12ee0 70 52 65 74 20 3d 20 28 52 62 75 53 74 61 74 65  pRet = (RbuState
12ef0 2a 29 72 62 75 4d 61 6c 6c 6f 63 28 70 2c 20 73  *)rbuMalloc(p, s
12f00 69 7a 65 6f 66 28 52 62 75 53 74 61 74 65 29 29  izeof(RbuState))
12f10 3b 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20  ;.  if( pRet==0 
12f20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72  ) return 0;..  r
12f30 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41  c = prepareFreeA
12f40 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70  ndCollectError(p
12f50 2d 3e 64 62 52 62 75 2c 20 26 70 53 74 6d 74 2c  ->dbRbu, &pStmt,
12f60 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20   &p->zErrmsg, . 
12f70 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72       sqlite3_mpr
12f80 69 6e 74 66 28 22 53 45 4c 45 43 54 20 6b 2c 20  intf("SELECT k, 
12f90 76 20 46 52 4f 4d 20 25 73 2e 72 62 75 5f 73 74  v FROM %s.rbu_st
12fa0 61 74 65 22 2c 20 70 2d 3e 7a 53 74 61 74 65 44  ate", p->zStateD
12fb0 62 29 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28  b).  );.  while(
12fc0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
12fd0 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  & SQLITE_ROW==sq
12fe0 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
12ff0 29 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28  ) ){.    switch(
13000 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
13010 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 20 29 7b  int(pStmt, 0) ){
13020 0a 20 20 20 20 20 20 63 61 73 65 20 52 42 55 5f  .      case RBU_
13030 53 54 41 54 45 5f 53 54 41 47 45 3a 0a 20 20 20  STATE_STAGE:.   
13040 20 20 20 20 20 70 52 65 74 2d 3e 65 53 74 61 67       pRet->eStag
13050 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  e = sqlite3_colu
13060 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31 29  mn_int(pStmt, 1)
13070 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 52  ;.        if( pR
13080 65 74 2d 3e 65 53 74 61 67 65 21 3d 52 42 55 5f  et->eStage!=RBU_
13090 53 54 41 47 45 5f 4f 41 4c 0a 20 20 20 20 20 20  STAGE_OAL.      
130a0 20 20 20 26 26 20 70 52 65 74 2d 3e 65 53 74 61     && pRet->eSta
130b0 67 65 21 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f  ge!=RBU_STAGE_MO
130c0 56 45 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  VE.         && p
130d0 52 65 74 2d 3e 65 53 74 61 67 65 21 3d 52 42 55  Ret->eStage!=RBU
130e0 5f 53 54 41 47 45 5f 43 4b 50 54 0a 20 20 20 20  _STAGE_CKPT.    
130f0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
13100 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
13110 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20  CORRUPT;.       
13120 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
13130 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 52 42  ;..      case RB
13140 55 5f 53 54 41 54 45 5f 54 42 4c 3a 0a 20 20 20  U_STATE_TBL:.   
13150 20 20 20 20 20 70 52 65 74 2d 3e 7a 54 62 6c 20       pRet->zTbl 
13160 3d 20 72 62 75 53 74 72 6e 64 75 70 28 28 63 68  = rbuStrndup((ch
13170 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
13180 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31  mn_text(pStmt, 1
13190 29 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20  ), &rc);.       
131a0 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63   break;..      c
131b0 61 73 65 20 52 42 55 5f 53 54 41 54 45 5f 49 44  ase RBU_STATE_ID
131c0 58 3a 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d  X:.        pRet-
131d0 3e 7a 49 64 78 20 3d 20 72 62 75 53 74 72 6e 64  >zIdx = rbuStrnd
131e0 75 70 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65  up((char*)sqlite
131f0 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
13200 74 6d 74 2c 20 31 29 2c 20 26 72 63 29 3b 0a 20  tmt, 1), &rc);. 
13210 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20         break;.. 
13220 20 20 20 20 20 63 61 73 65 20 52 42 55 5f 53 54       case RBU_ST
13230 41 54 45 5f 52 4f 57 3a 0a 20 20 20 20 20 20 20  ATE_ROW:.       
13240 20 70 52 65 74 2d 3e 6e 52 6f 77 20 3d 20 73 71   pRet->nRow = sq
13250 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
13260 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20  (pStmt, 1);.    
13270 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
13280 20 20 63 61 73 65 20 52 42 55 5f 53 54 41 54 45    case RBU_STATE
13290 5f 50 52 4f 47 52 45 53 53 3a 0a 20 20 20 20 20  _PROGRESS:.     
132a0 20 20 20 70 52 65 74 2d 3e 6e 50 72 6f 67 72 65     pRet->nProgre
132b0 73 73 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ss = sqlite3_col
132c0 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  umn_int64(pStmt,
132d0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65   1);.        bre
132e0 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20  ak;..      case 
132f0 52 42 55 5f 53 54 41 54 45 5f 43 4b 50 54 3a 0a  RBU_STATE_CKPT:.
13300 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 69 57          pRet->iW
13310 61 6c 43 6b 73 75 6d 20 3d 20 73 71 6c 69 74 65  alCksum = sqlite
13320 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
13330 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  Stmt, 1);.      
13340 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
13350 63 61 73 65 20 52 42 55 5f 53 54 41 54 45 5f 43  case RBU_STATE_C
13360 4f 4f 4b 49 45 3a 0a 20 20 20 20 20 20 20 20 70  OOKIE:.        p
13370 52 65 74 2d 3e 69 43 6f 6f 6b 69 65 20 3d 20 28  Ret->iCookie = (
13380 75 33 32 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  u32)sqlite3_colu
13390 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  mn_int64(pStmt, 
133a0 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  1);.        brea
133b0 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 52  k;..      case R
133c0 42 55 5f 53 54 41 54 45 5f 4f 41 4c 53 5a 3a 0a  BU_STATE_OALSZ:.
133d0 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 69 4f          pRet->iO
133e0 61 6c 53 7a 20 3d 20 28 75 33 32 29 73 71 6c 69  alSz = (u32)sqli
133f0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
13400 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20  (pStmt, 1);.    
13410 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
13420 20 20 63 61 73 65 20 52 42 55 5f 53 54 41 54 45    case RBU_STATE
13430 5f 50 48 41 53 45 4f 4e 45 53 54 45 50 3a 0a 20  _PHASEONESTEP:. 
13440 20 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 50 68         pRet->nPh
13450 61 73 65 4f 6e 65 53 74 65 70 20 3d 20 73 71 6c  aseOneStep = sql
13460 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
13470 34 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20  4(pStmt, 1);.   
13480 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
13490 20 20 20 63 61 73 65 20 52 42 55 5f 53 54 41 54     case RBU_STAT
134a0 45 5f 44 41 54 41 54 42 4c 3a 0a 20 20 20 20 20  E_DATATBL:.     
134b0 20 20 20 70 52 65 74 2d 3e 7a 44 61 74 61 54 62     pRet->zDataTb
134c0 6c 20 3d 20 72 62 75 53 74 72 6e 64 75 70 28 28  l = rbuStrndup((
134d0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
134e0 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
134f0 20 31 29 2c 20 26 72 63 29 3b 0a 20 20 20 20 20   1), &rc);.     
13500 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20     break;..     
13510 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
13520 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
13530 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 62  RRUPT;.        b
13540 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
13550 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f    rc2 = sqlite3_
13560 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
13570 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
13580 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b  E_OK ) rc = rc2;
13590 0a 0a 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a  ..  p->rc = rc;.
135a0 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
135b0 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  .../*.** Open th
135c0 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
135d0 65 20 61 6e 64 20 61 74 74 61 63 68 20 74 68 65  e and attach the
135e0 20 52 42 55 20 64 61 74 61 62 61 73 65 20 61 73   RBU database as
135f0 20 22 72 62 75 22 2e 20 49 66 20 61 6e 0a 2a 2a   "rbu". If an.**
13600 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c   error occurs, l
13610 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  eave an error co
13620 64 65 20 61 6e 64 20 6d 65 73 73 61 67 65 20 69  de and message i
13630 6e 20 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65  n the RBU handle
13640 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
13650 20 72 62 75 4f 70 65 6e 44 61 74 61 62 61 73 65   rbuOpenDatabase
13660 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20  (sqlite3rbu *p, 
13670 69 6e 74 20 2a 70 62 52 65 74 72 79 29 7b 0a 20  int *pbRetry){. 
13680 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 20 7c   assert( p->rc |
13690 7c 20 28 70 2d 3e 64 62 4d 61 69 6e 3d 3d 30 20  | (p->dbMain==0 
136a0 26 26 20 70 2d 3e 64 62 52 62 75 3d 3d 30 29 20  && p->dbRbu==0) 
136b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
136c0 72 63 20 7c 7c 20 72 62 75 49 73 56 61 63 75 75  rc || rbuIsVacuu
136d0 6d 28 70 29 20 7c 7c 20 70 2d 3e 7a 54 61 72 67  m(p) || p->zTarg
136e0 65 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 4f  et!=0 );..  /* O
136f0 70 65 6e 20 74 68 65 20 52 42 55 20 64 61 74 61  pen the RBU data
13700 62 61 73 65 20 2a 2f 0a 20 20 70 2d 3e 64 62 52  base */.  p->dbR
13710 62 75 20 3d 20 72 62 75 4f 70 65 6e 44 62 68 61  bu = rbuOpenDbha
13720 6e 64 6c 65 28 70 2c 20 70 2d 3e 7a 52 62 75 2c  ndle(p, p->zRbu,
13730 20 31 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72   1);..  if( p->r
13740 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
13750 72 62 75 49 73 56 61 63 75 75 6d 28 70 29 20 29  rbuIsVacuum(p) )
13760 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  {.    sqlite3_fi
13770 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62  le_control(p->db
13780 52 62 75 2c 20 22 6d 61 69 6e 22 2c 20 53 51 4c  Rbu, "main", SQL
13790 49 54 45 5f 46 43 4e 54 4c 5f 52 42 55 43 4e 54  ITE_FCNTL_RBUCNT
137a0 2c 20 28 76 6f 69 64 2a 29 70 29 3b 0a 20 20 20  , (void*)p);.   
137b0 20 69 66 28 20 70 2d 3e 7a 53 74 61 74 65 3d 3d   if( p->zState==
137c0 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  0 ){.      const
137d0 20 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 73   char *zFile = s
137e0 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61  qlite3_db_filena
137f0 6d 65 28 70 2d 3e 64 62 52 62 75 2c 20 22 6d 61  me(p->dbRbu, "ma
13800 69 6e 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e 7a  in");.      p->z
13810 53 74 61 74 65 20 3d 20 72 62 75 4d 50 72 69 6e  State = rbuMPrin
13820 74 66 28 70 2c 20 22 66 69 6c 65 3a 2f 2f 25 73  tf(p, "file://%s
13830 2d 76 61 63 75 75 6d 3f 6d 6f 64 65 6f 66 3d 25  -vacuum?modeof=%
13840 73 22 2c 20 7a 46 69 6c 65 2c 20 7a 46 69 6c 65  s", zFile, zFile
13850 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
13860 2f 2a 20 49 66 20 75 73 69 6e 67 20 73 65 70 61  /* If using sepa
13870 72 61 74 65 20 52 42 55 20 61 6e 64 20 73 74 61  rate RBU and sta
13880 74 65 20 64 61 74 61 62 61 73 65 73 2c 20 61 74  te databases, at
13890 74 61 63 68 20 74 68 65 20 73 74 61 74 65 20 64  tach the state d
138a0 61 74 61 62 61 73 65 20 74 6f 0a 20 20 2a 2a 20  atabase to.  ** 
138b0 74 68 65 20 52 42 55 20 64 62 20 68 61 6e 64 6c  the RBU db handl
138c0 65 20 6e 6f 77 2e 20 20 2a 2f 0a 20 20 69 66 28  e now.  */.  if(
138d0 20 70 2d 3e 7a 53 74 61 74 65 20 29 7b 0a 20 20   p->zState ){.  
138e0 20 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63    rbuMPrintfExec
138f0 28 70 2c 20 70 2d 3e 64 62 52 62 75 2c 20 22 41  (p, p->dbRbu, "A
13900 54 54 41 43 48 20 25 51 20 41 53 20 73 74 61 74  TTACH %Q AS stat
13910 22 2c 20 70 2d 3e 7a 53 74 61 74 65 29 3b 0a 20  ", p->zState);. 
13920 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 7a 53 74     memcpy(p->zSt
13930 61 74 65 44 62 2c 20 22 73 74 61 74 22 2c 20 34  ateDb, "stat", 4
13940 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
13950 6d 65 6d 63 70 79 28 70 2d 3e 7a 53 74 61 74 65  memcpy(p->zState
13960 44 62 2c 20 22 6d 61 69 6e 22 2c 20 34 29 3b 0a  Db, "main", 4);.
13970 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20 69 66 28    }..#if 0.  if(
13980 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
13990 4b 20 26 26 20 72 62 75 49 73 56 61 63 75 75 6d  K && rbuIsVacuum
139a0 28 70 29 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  (p) ){.    p->rc
139b0 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
139c0 70 2d 3e 64 62 52 62 75 2c 20 22 42 45 47 49 4e  p->dbRbu, "BEGIN
139d0 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  ", 0, 0, 0);.  }
139e0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
139f0 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c 72 65   it has not alre
13a00 61 64 79 20 62 65 65 6e 20 63 72 65 61 74 65 64  ady been created
13a10 2c 20 63 72 65 61 74 65 20 74 68 65 20 72 62 75  , create the rbu
13a20 5f 73 74 61 74 65 20 74 61 62 6c 65 20 2a 2f 0a  _state table */.
13a30 20 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63    rbuMPrintfExec
13a40 28 70 2c 20 70 2d 3e 64 62 52 62 75 2c 20 52 42  (p, p->dbRbu, RB
13a50 55 5f 43 52 45 41 54 45 5f 53 54 41 54 45 2c 20  U_CREATE_STATE, 
13a60 70 2d 3e 7a 53 74 61 74 65 44 62 29 3b 0a 0a 23  p->zStateDb);..#
13a70 69 66 20 30 0a 20 20 69 66 28 20 72 62 75 49 73  if 0.  if( rbuIs
13a80 56 61 63 75 75 6d 28 70 29 20 29 7b 0a 20 20 20  Vacuum(p) ){.   
13a90 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
13aa0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
13ab0 6e 74 20 72 63 32 3b 0a 20 20 20 20 20 20 69 6e  nt rc2;.      in
13ac0 74 20 62 4f 6b 20 3d 20 30 3b 0a 20 20 20 20 20  t bOk = 0;.     
13ad0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
13ae0 43 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Cnt = 0;.      p
13af0 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 41 6e  ->rc = prepareAn
13b00 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d  dCollectError(p-
13b10 3e 64 62 52 62 75 2c 20 26 70 43 6e 74 2c 20 26  >dbRbu, &pCnt, &
13b20 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20  p->zErrmsg,.    
13b30 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f        "SELECT co
13b40 75 6e 74 28 2a 29 20 46 52 4f 4d 20 73 74 61 74  unt(*) FROM stat
13b50 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a  .sqlite_master".
13b60 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69        );.      i
13b70 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
13b80 5f 4f 4b 20 0a 20 20 20 20 20 20 20 26 26 20 73  _OK .       && s
13b90 71 6c 69 74 65 33 5f 73 74 65 70 28 70 43 6e 74  qlite3_step(pCnt
13ba0 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 0a 20 20  )==SQLITE_ROW.  
13bb0 20 20 20 20 20 26 26 20 31 3d 3d 73 71 6c 69 74       && 1==sqlit
13bc0 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 43  e3_column_int(pC
13bd0 6e 74 2c 20 30 29 0a 20 20 20 20 20 20 29 7b 0a  nt, 0).      ){.
13be0 20 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 31 3b          bOk = 1;
13bf0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
13c00 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e  c2 = sqlite3_fin
13c10 61 6c 69 7a 65 28 70 43 6e 74 29 3b 0a 20 20 20  alize(pCnt);.   
13c20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
13c30 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63 20  LITE_OK ) p->rc 
13c40 3d 20 72 63 32 3b 0a 0a 20 20 20 20 20 20 69 66  = rc2;..      if
13c50 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
13c60 4f 4b 20 26 26 20 62 4f 6b 3d 3d 30 20 29 7b 0a  OK && bOk==0 ){.
13c70 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
13c80 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
13c90 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67        p->zErrmsg
13ca0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
13cb0 74 66 28 22 69 6e 76 61 6c 69 64 20 73 74 61 74  tf("invalid stat
13cc0 65 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20  e database");.  
13cd0 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 20      }.    .     
13ce0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
13cf0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
13d00 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
13d10 5f 65 78 65 63 28 70 2d 3e 64 62 52 62 75 2c 20  _exec(p->dbRbu, 
13d20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20  "COMMIT", 0, 0, 
13d30 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
13d40 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
13d50 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
13d60 45 5f 4f 4b 20 26 26 20 72 62 75 49 73 56 61 63  E_OK && rbuIsVac
13d70 75 75 6d 28 70 29 20 29 7b 0a 20 20 20 20 69 6e  uum(p) ){.    in
13d80 74 20 62 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20  t bOpen = 0;.   
13d90 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 70 2d 3e   int rc;.    p->
13da0 6e 52 62 75 20 3d 20 30 3b 0a 20 20 20 20 70 2d  nRbu = 0;.    p-
13db0 3e 70 52 62 75 46 64 20 3d 20 30 3b 0a 20 20 20  >pRbuFd = 0;.   
13dc0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
13dd0 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62  le_control(p->db
13de0 52 62 75 2c 20 22 6d 61 69 6e 22 2c 20 53 51 4c  Rbu, "main", SQL
13df0 49 54 45 5f 46 43 4e 54 4c 5f 52 42 55 43 4e 54  ITE_FCNTL_RBUCNT
13e00 2c 20 28 76 6f 69 64 2a 29 70 29 3b 0a 20 20 20  , (void*)p);.   
13e10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13e20 4e 4f 54 46 4f 55 4e 44 20 29 20 70 2d 3e 72 63  NOTFOUND ) p->rc
13e30 20 3d 20 72 63 3b 0a 20 20 20 20 69 66 28 20 70   = rc;.    if( p
13e40 2d 3e 65 53 74 61 67 65 3e 3d 52 42 55 5f 53 54  ->eStage>=RBU_ST
13e50 41 47 45 5f 4d 4f 56 45 20 29 7b 0a 20 20 20 20  AGE_MOVE ){.    
13e60 20 20 62 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20    bOpen = 1;.   
13e70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 52 62   }else{.      Rb
13e80 75 53 74 61 74 65 20 2a 70 53 74 61 74 65 20 3d  uState *pState =
13e90 20 72 62 75 4c 6f 61 64 53 74 61 74 65 28 70 29   rbuLoadState(p)
13ea0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 74 61  ;.      if( pSta
13eb0 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 62 4f  te ){.        bO
13ec0 70 65 6e 20 3d 20 28 70 53 74 61 74 65 2d 3e 65  pen = (pState->e
13ed0 53 74 61 67 65 3e 3d 52 42 55 5f 53 54 41 47 45  Stage>=RBU_STAGE
13ee0 5f 4d 4f 56 45 29 3b 0a 20 20 20 20 20 20 20 20  _MOVE);.        
13ef0 72 62 75 46 72 65 65 53 74 61 74 65 28 70 53 74  rbuFreeState(pSt
13f00 61 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ate);.      }.  
13f10 20 20 7d 0a 20 20 20 20 69 66 28 20 62 4f 70 65    }.    if( bOpe
13f20 6e 20 29 20 70 2d 3e 64 62 4d 61 69 6e 20 3d 20  n ) p->dbMain = 
13f30 72 62 75 4f 70 65 6e 44 62 68 61 6e 64 6c 65 28  rbuOpenDbhandle(
13f40 70 2c 20 70 2d 3e 7a 52 62 75 2c 20 70 2d 3e 6e  p, p->zRbu, p->n
13f50 52 62 75 3c 3d 31 29 3b 0a 20 20 7d 0a 0a 20 20  Rbu<=1);.  }..  
13f60 70 2d 3e 65 53 74 61 67 65 20 3d 20 30 3b 0a 20  p->eStage = 0;. 
13f70 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
13f80 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 64 62 4d 61  TE_OK && p->dbMa
13f90 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  in==0 ){.    if(
13fa0 20 21 72 62 75 49 73 56 61 63 75 75 6d 28 70 29   !rbuIsVacuum(p)
13fb0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 64 62 4d   ){.      p->dbM
13fc0 61 69 6e 20 3d 20 72 62 75 4f 70 65 6e 44 62 68  ain = rbuOpenDbh
13fd0 61 6e 64 6c 65 28 70 2c 20 70 2d 3e 7a 54 61 72  andle(p, p->zTar
13fe0 67 65 74 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c  get, 1);.    }el
13ff0 73 65 20 69 66 28 20 70 2d 3e 70 52 62 75 46 64  se if( p->pRbuFd
14000 2d 3e 70 57 61 6c 46 64 20 29 7b 0a 20 20 20 20  ->pWalFd ){.    
14010 20 20 69 66 28 20 70 62 52 65 74 72 79 20 29 7b    if( pbRetry ){
14020 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 52 62 75  .        p->pRbu
14030 46 64 2d 3e 62 4e 6f 6c 6f 63 6b 20 3d 20 30 3b  Fd->bNolock = 0;
14040 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14050 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 52 62 75 29  _close(p->dbRbu)
14060 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
14070 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 4d 61 69  3_close(p->dbMai
14080 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 64  n);.        p->d
14090 62 4d 61 69 6e 20 3d 20 30 3b 0a 20 20 20 20 20  bMain = 0;.     
140a0 20 20 20 70 2d 3e 64 62 52 62 75 20 3d 20 30 3b     p->dbRbu = 0;
140b0 0a 20 20 20 20 20 20 20 20 2a 70 62 52 65 74 72  .        *pbRetr
140c0 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  y = 1;.        r
140d0 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
140e0 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c       p->rc = SQL
140f0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
14100 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71   p->zErrmsg = sq
14110 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 63  lite3_mprintf("c
14120 61 6e 6e 6f 74 20 76 61 63 75 75 6d 20 77 61 6c  annot vacuum wal
14130 20 6d 6f 64 65 20 64 61 74 61 62 61 73 65 22 29   mode database")
14140 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
14150 20 20 20 63 68 61 72 20 2a 7a 54 61 72 67 65 74     char *zTarget
14160 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45  ;.      char *zE
14170 78 74 72 61 20 3d 20 30 3b 0a 20 20 20 20 20 20  xtra = 0;.      
14180 69 66 28 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 52  if( strlen(p->zR
14190 62 75 29 3e 3d 35 20 26 26 20 30 3d 3d 6d 65 6d  bu)>=5 && 0==mem
141a0 63 6d 70 28 22 66 69 6c 65 3a 22 2c 20 70 2d 3e  cmp("file:", p->
141b0 7a 52 62 75 2c 20 35 29 20 29 7b 0a 20 20 20 20  zRbu, 5) ){.    
141c0 20 20 20 20 7a 45 78 74 72 61 20 3d 20 26 70 2d      zExtra = &p-
141d0 3e 7a 52 62 75 5b 35 5d 3b 0a 20 20 20 20 20 20  >zRbu[5];.      
141e0 20 20 77 68 69 6c 65 28 20 2a 7a 45 78 74 72 61    while( *zExtra
141f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
14200 28 20 2a 7a 45 78 74 72 61 2b 2b 3d 3d 27 3f 27  ( *zExtra++=='?'
14210 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
14220 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
14230 2a 7a 45 78 74 72 61 3d 3d 27 5c 30 27 20 29 20  *zExtra=='\0' ) 
14240 7a 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 20 20  zExtra = 0;.    
14250 20 20 7d 0a 0a 20 20 20 20 20 20 7a 54 61 72 67    }..      zTarg
14260 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  et = sqlite3_mpr
14270 69 6e 74 66 28 22 66 69 6c 65 3a 25 73 2d 76 61  intf("file:%s-va
14280 63 74 6d 70 3f 72 62 75 5f 6d 65 6d 6f 72 79 3d  ctmp?rbu_memory=
14290 31 25 73 25 73 22 2c 20 0a 20 20 20 20 20 20 20  1%s%s", .       
142a0 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 66 69     sqlite3_db_fi
142b0 6c 65 6e 61 6d 65 28 70 2d 3e 64 62 52 62 75 2c  lename(p->dbRbu,
142c0 20 22 6d 61 69 6e 22 29 2c 0a 20 20 20 20 20 20   "main"),.      
142d0 20 20 20 20 28 7a 45 78 74 72 61 3d 3d 30 20 3f      (zExtra==0 ?
142e0 20 22 22 20 3a 20 22 26 22 29 2c 20 28 7a 45 78   "" : "&"), (zEx
142f0 74 72 61 3d 3d 30 20 3f 20 22 22 20 3a 20 7a 45  tra==0 ? "" : zE
14300 78 74 72 61 29 0a 20 20 20 20 20 20 29 3b 0a 0a  xtra).      );..
14310 20 20 20 20 20 20 69 66 28 20 7a 54 61 72 67 65        if( zTarge
14320 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
14330 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
14340 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 72 65  OMEM;.        re
14350 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
14360 20 20 20 20 70 2d 3e 64 62 4d 61 69 6e 20 3d 20      p->dbMain = 
14370 72 62 75 4f 70 65 6e 44 62 68 61 6e 64 6c 65 28  rbuOpenDbhandle(
14380 70 2c 20 7a 54 61 72 67 65 74 2c 20 70 2d 3e 6e  p, zTarget, p->n
14390 52 62 75 3c 3d 31 29 3b 0a 20 20 20 20 20 20 73  Rbu<=1);.      s
143a0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 61 72  qlite3_free(zTar
143b0 67 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  get);.    }.  }.
143c0 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
143d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
143e0 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63  ->rc = sqlite3_c
143f0 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70  reate_function(p
14400 2d 3e 64 62 4d 61 69 6e 2c 20 0a 20 20 20 20 20  ->dbMain, .     
14410 20 20 20 22 72 62 75 5f 74 6d 70 5f 69 6e 73 65     "rbu_tmp_inse
14420 72 74 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  rt", -1, SQLITE_
14430 55 54 46 38 2c 20 28 76 6f 69 64 2a 29 70 2c 20  UTF8, (void*)p, 
14440 72 62 75 54 6d 70 49 6e 73 65 72 74 46 75 6e 63  rbuTmpInsertFunc
14450 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20  , 0, 0.    );.  
14460 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  }..  if( p->rc==
14470 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14480 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
14490 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
144a0 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 0a 20 20 20  (p->dbMain, .   
144b0 20 20 20 20 20 22 72 62 75 5f 66 6f 73 73 69 6c       "rbu_fossil
144c0 5f 64 65 6c 74 61 22 2c 20 32 2c 20 53 51 4c 49  _delta", 2, SQLI
144d0 54 45 5f 55 54 46 38 2c 20 30 2c 20 72 62 75 46  TE_UTF8, 0, rbuF
144e0 6f 73 73 69 6c 44 65 6c 74 61 46 75 6e 63 2c 20  ossilDeltaFunc, 
144f0 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  0, 0.    );.  }.
14500 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
14510 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
14520 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63  ->rc = sqlite3_c
14530 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70  reate_function(p
14540 2d 3e 64 62 52 62 75 2c 20 0a 20 20 20 20 20 20  ->dbRbu, .      
14550 20 20 22 72 62 75 5f 74 61 72 67 65 74 5f 6e 61    "rbu_target_na
14560 6d 65 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  me", -1, SQLITE_
14570 55 54 46 38 2c 20 28 76 6f 69 64 2a 29 70 2c 20  UTF8, (void*)p, 
14580 72 62 75 54 61 72 67 65 74 4e 61 6d 65 46 75 6e  rbuTargetNameFun
14590 63 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20  c, 0, 0.    );. 
145a0 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   }..  if( p->rc=
145b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
145c0 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
145d0 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70  3_file_control(p
145e0 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22  ->dbMain, "main"
145f0 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 52  , SQLITE_FCNTL_R
14600 42 55 2c 20 28 76 6f 69 64 2a 29 70 29 3b 0a 20  BU, (void*)p);. 
14610 20 7d 0a 20 20 72 62 75 4d 50 72 69 6e 74 66 45   }.  rbuMPrintfE
14620 78 65 63 28 70 2c 20 70 2d 3e 64 62 4d 61 69 6e  xec(p, p->dbMain
14630 2c 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  , "SELECT * FROM
14640 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 29   sqlite_master")
14650 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  ;..  /* Mark the
14660 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6a   database file j
14670 75 73 74 20 6f 70 65 6e 65 64 20 61 73 20 61 6e  ust opened as an
14680 20 52 42 55 20 74 61 72 67 65 74 20 64 61 74 61   RBU target data
14690 62 61 73 65 2e 20 49 66 20 0a 20 20 2a 2a 20 74  base. If .  ** t
146a0 68 69 73 20 63 61 6c 6c 20 72 65 74 75 72 6e 73  his call returns
146b0 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
146c0 2c 20 74 68 65 6e 20 74 68 65 20 52 42 55 20 76  , then the RBU v
146d0 66 73 20 69 73 20 6e 6f 74 20 69 6e 20 75 73 65  fs is not in use
146e0 2e 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 61  ..  ** This is a
146f0 6e 20 65 72 72 6f 72 2e 20 20 2a 2f 0a 20 20 69  n error.  */.  i
14700 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
14710 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  _OK ){.    p->rc
14720 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
14730 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62 4d 61 69  control(p->dbMai
14740 6e 2c 20 22 6d 61 69 6e 22 2c 20 53 51 4c 49 54  n, "main", SQLIT
14750 45 5f 46 43 4e 54 4c 5f 52 42 55 2c 20 28 76 6f  E_FCNTL_RBU, (vo
14760 69 64 2a 29 70 29 3b 0a 20 20 7d 0a 0a 20 20 69  id*)p);.  }..  i
14770 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
14780 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20  _NOTFOUND ){.   
14790 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
147a0 45 52 52 4f 52 3b 0a 20 20 20 20 70 2d 3e 7a 45  ERROR;.    p->zE
147b0 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrmsg = sqlite3_
147c0 6d 70 72 69 6e 74 66 28 22 72 62 75 20 76 66 73  mprintf("rbu vfs
147d0 20 6e 6f 74 20 66 6f 75 6e 64 22 29 3b 0a 20 20   not found");.  
147e0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
147f0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 63 6f 70  routine is a cop
14800 79 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  y of the sqlite3
14810 46 69 6c 65 53 75 66 66 69 78 33 28 29 20 72 6f  FileSuffix3() ro
14820 75 74 69 6e 65 20 66 72 6f 6d 20 74 68 65 20 63  utine from the c
14830 6f 72 65 2e 0a 2a 2a 20 49 74 20 69 73 20 61 20  ore..** It is a 
14840 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 53 51 4c  no-op unless SQL
14850 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e  ITE_ENABLE_8_3_N
14860 41 4d 45 53 20 69 73 20 64 65 66 69 6e 65 64 2e  AMES is defined.
14870 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  .**.** If SQLITE
14880 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45  _ENABLE_8_3_NAME
14890 53 20 69 73 20 73 65 74 20 61 74 20 63 6f 6d 70  S is set at comp
148a0 69 6c 65 2d 74 69 6d 65 20 61 6e 64 20 69 66 20  ile-time and if 
148b0 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
148c0 66 69 6c 65 6e 61 6d 65 20 69 6e 20 7a 42 61 73  filename in zBas
148d0 65 46 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 55  eFilename is a U
148e0 52 49 20 77 69 74 68 20 74 68 65 20 22 38 5f 33  RI with the "8_3
148f0 5f 6e 61 6d 65 73 3d 31 22 20 70 61 72 61 6d 65  _names=1" parame
14900 74 65 72 20 61 6e 64 0a 2a 2a 20 69 66 20 66 69  ter and.** if fi
14910 6c 65 6e 61 6d 65 20 69 6e 20 7a 5b 5d 20 68 61  lename in z[] ha
14920 73 20 61 20 73 75 66 66 69 78 20 28 61 2e 6b 2e  s a suffix (a.k.
14930 61 2e 20 22 65 78 74 65 6e 73 69 6f 6e 22 29 20  a. "extension") 
14940 74 68 61 74 20 69 73 20 6c 6f 6e 67 65 72 20 74  that is longer t
14950 68 61 6e 0a 2a 2a 20 74 68 72 65 65 20 63 68 61  han.** three cha
14960 72 61 63 74 65 72 73 2c 20 74 68 65 6e 20 73 68  racters, then sh
14970 6f 72 74 65 6e 20 74 68 65 20 73 75 66 66 69 78  orten the suffix
14980 20 6f 6e 20 7a 5b 5d 20 74 6f 20 62 65 20 74 68   on z[] to be th
14990 65 20 6c 61 73 74 20 74 68 72 65 65 0a 2a 2a 20  e last three.** 
149a0 63 68 61 72 61 63 74 65 72 73 20 6f 66 20 74 68  characters of th
149b0 65 20 6f 72 69 67 69 6e 61 6c 20 73 75 66 66 69  e original suffi
149c0 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  x..**.** If SQLI
149d0 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41  TE_ENABLE_8_3_NA
149e0 4d 45 53 20 69 73 20 73 65 74 20 74 6f 20 32 20  MES is set to 2 
149f0 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c  at compile-time,
14a00 20 74 68 65 6e 20 61 6c 77 61 79 73 0a 2a 2a 20   then always.** 
14a10 64 6f 20 74 68 65 20 73 75 66 66 69 78 20 73 68  do the suffix sh
14a20 6f 72 74 65 6e 69 6e 67 20 72 65 67 61 72 64 6c  ortening regardl
14a30 65 73 73 20 6f 66 20 55 52 49 20 70 61 72 61 6d  ess of URI param
14a40 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d  eter..**.** Exam
14a50 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ples:.**.**     
14a60 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20  test.db-journal 
14a70 20 20 20 3d 3e 20 20 20 74 65 73 74 2e 6e 61 6c     =>   test.nal
14a80 0a 2a 2a 20 20 20 20 20 74 65 73 74 2e 64 62 2d  .**     test.db-
14a90 77 61 6c 20 20 20 20 20 20 20 20 3d 3e 20 20 20  wal        =>   
14aa0 74 65 73 74 2e 77 61 6c 0a 2a 2a 20 20 20 20 20  test.wal.**     
14ab0 74 65 73 74 2e 64 62 2d 73 68 6d 20 20 20 20 20  test.db-shm     
14ac0 20 20 20 3d 3e 20 20 20 74 65 73 74 2e 73 68 6d     =>   test.shm
14ad0 0a 2a 2a 20 20 20 20 20 74 65 73 74 2e 64 62 2d  .**     test.db-
14ae0 6d 6a 37 66 33 33 31 39 66 61 20 3d 3e 20 20 20  mj7f3319fa =>   
14af0 74 65 73 74 2e 39 66 61 0a 2a 2f 0a 73 74 61 74  test.9fa.*/.stat
14b00 69 63 20 76 6f 69 64 20 72 62 75 46 69 6c 65 53  ic void rbuFileS
14b10 75 66 66 69 78 33 28 63 6f 6e 73 74 20 63 68 61  uffix3(const cha
14b20 72 20 2a 7a 42 61 73 65 2c 20 63 68 61 72 20 2a  r *zBase, char *
14b30 7a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  z){.#ifdef SQLIT
14b40 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d  E_ENABLE_8_3_NAM
14b50 45 53 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  ES.#if SQLITE_EN
14b60 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 3c 32  ABLE_8_3_NAMES<2
14b70 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75  .  if( sqlite3_u
14b80 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 42 61 73 65  ri_boolean(zBase
14b90 2c 20 22 38 5f 33 5f 6e 61 6d 65 73 22 2c 20 30  , "8_3_names", 0
14ba0 29 20 29 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20  ) ).#endif.  {. 
14bb0 20 20 20 69 6e 74 20 69 2c 20 73 7a 3b 0a 20 20     int i, sz;.  
14bc0 20 20 73 7a 20 3d 20 28 69 6e 74 29 73 74 72 6c    sz = (int)strl
14bd0 65 6e 28 7a 29 26 30 78 66 66 66 66 66 66 3b 0a  en(z)&0xffffff;.
14be0 20 20 20 20 66 6f 72 28 69 3d 73 7a 2d 31 3b 20      for(i=sz-1; 
14bf0 69 3e 30 20 26 26 20 7a 5b 69 5d 21 3d 27 2f 27  i>0 && z[i]!='/'
14c00 20 26 26 20 7a 5b 69 5d 21 3d 27 2e 27 3b 20 69   && z[i]!='.'; i
14c10 2d 2d 29 7b 7d 0a 20 20 20 20 69 66 28 20 7a 5b  --){}.    if( z[
14c20 69 5d 3d 3d 27 2e 27 20 26 26 20 73 7a 3e 69 2b  i]=='.' && sz>i+
14c30 34 20 29 20 6d 65 6d 6d 6f 76 65 28 26 7a 5b 69  4 ) memmove(&z[i
14c40 2b 31 5d 2c 20 26 7a 5b 73 7a 2d 33 5d 2c 20 34  +1], &z[sz-3], 4
14c50 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  );.  }.#endif.}.
14c60 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
14c70 65 20 63 75 72 72 65 6e 74 20 77 61 6c 2d 69 6e  e current wal-in
14c80 64 65 78 20 68 65 61 64 65 72 20 63 68 65 63 6b  dex header check
14c90 73 75 6d 20 66 6f 72 20 74 68 65 20 74 61 72 67  sum for the targ
14ca0 65 74 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  et database .** 
14cb0 61 73 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65  as a 64-bit inte
14cc0 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ger..**.** The c
14cd0 68 65 63 6b 73 75 6d 20 69 73 20 73 74 6f 72 65  hecksum is store
14ce0 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 70 61   in the first pa
14cf0 67 65 20 6f 66 20 78 53 68 6d 4d 61 70 20 6d 65  ge of xShmMap me
14d00 6d 6f 72 79 20 61 73 20 61 6e 20 38 2d 62 79 74  mory as an 8-byt
14d10 65 20 0a 2a 2a 20 62 6c 6f 62 20 73 74 61 72 74  e .** blob start
14d20 69 6e 67 20 61 74 20 62 79 74 65 20 6f 66 66 73  ing at byte offs
14d30 65 74 20 34 30 2e 0a 2a 2f 0a 73 74 61 74 69 63  et 40..*/.static
14d40 20 69 36 34 20 72 62 75 53 68 6d 43 68 65 63 6b   i64 rbuShmCheck
14d50 73 75 6d 28 73 71 6c 69 74 65 33 72 62 75 20 2a  sum(sqlite3rbu *
14d60 70 29 7b 0a 20 20 69 36 34 20 69 52 65 74 20 3d  p){.  i64 iRet =
14d70 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   0;.  if( p->rc=
14d80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14d90 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
14da0 70 44 62 20 3d 20 70 2d 3e 70 54 61 72 67 65 74  pDb = p->pTarget
14db0 46 64 2d 3e 70 52 65 61 6c 3b 0a 20 20 20 20 75  Fd->pReal;.    u
14dc0 33 32 20 76 6f 6c 61 74 69 6c 65 20 2a 70 74 72  32 volatile *ptr
14dd0 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 44  ;.    p->rc = pD
14de0 62 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68  b->pMethods->xSh
14df0 6d 4d 61 70 28 70 44 62 2c 20 30 2c 20 33 32 2a  mMap(pDb, 0, 32*
14e00 31 30 32 34 2c 20 30 2c 20 28 76 6f 69 64 20 76  1024, 0, (void v
14e10 6f 6c 61 74 69 6c 65 2a 2a 29 26 70 74 72 29 3b  olatile**)&ptr);
14e20 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  .    if( p->rc==
14e30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14e40 20 20 20 69 52 65 74 20 3d 20 28 28 69 36 34 29     iRet = ((i64)
14e50 70 74 72 5b 31 30 5d 20 3c 3c 20 33 32 29 20 2b  ptr[10] << 32) +
14e60 20 70 74 72 5b 31 31 5d 3b 0a 20 20 20 20 7d 0a   ptr[11];.    }.
14e70 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65    }.  return iRe
14e80 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t;.}../*.** This
14e90 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
14ea0 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 69  led as part of i
14eb0 6e 69 74 69 61 6c 69 7a 69 6e 67 20 6f 72 20 72  nitializing or r
14ec0 65 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 6e  einitializing an
14ed0 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  .** incremental 
14ee0 63 68 65 63 6b 70 6f 69 6e 74 2e 20 0a 2a 2a 0a  checkpoint. .**.
14ef0 2a 2a 20 49 74 20 70 6f 70 75 6c 61 74 65 73 20  ** It populates 
14f00 74 68 65 20 73 71 6c 69 74 65 33 72 62 75 2e 61  the sqlite3rbu.a
14f10 46 72 61 6d 65 5b 5d 20 61 72 72 61 79 20 77 69  Frame[] array wi
14f20 74 68 20 74 68 65 20 73 65 74 20 6f 66 20 0a 2a  th the set of .*
14f30 2a 20 28 77 61 6c 20 66 72 61 6d 65 20 2d 3e 20  * (wal frame -> 
14f40 64 62 20 70 61 67 65 29 20 63 6f 70 79 20 6f 70  db page) copy op
14f50 65 72 61 74 69 6f 6e 73 20 72 65 71 75 69 72 65  erations require
14f60 64 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20  d to checkpoint 
14f70 74 68 65 20 0a 2a 2a 20 63 75 72 72 65 6e 74 20  the .** current 
14f80 77 61 6c 20 66 69 6c 65 2c 20 61 6e 64 20 6f 62  wal file, and ob
14f90 74 61 69 6e 73 20 74 68 65 20 73 65 74 20 6f 66  tains the set of
14fa0 20 73 68 6d 20 6c 6f 63 6b 73 20 72 65 71 75 69   shm locks requi
14fb0 72 65 64 20 74 6f 20 73 61 66 65 6c 79 20 0a 2a  red to safely .*
14fc0 2a 20 70 65 72 66 6f 72 6d 20 74 68 65 20 63 6f  * perform the co
14fd0 70 79 20 6f 70 65 72 61 74 69 6f 6e 73 20 64 69  py operations di
14fe0 72 65 63 74 6c 79 20 6f 6e 20 74 68 65 20 66 69  rectly on the fi
14ff0 6c 65 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a  le-system..**.**
15000 20 49 66 20 61 72 67 75 6d 65 6e 74 20 70 53 74   If argument pSt
15010 61 74 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  ate is not NULL,
15020 20 74 68 65 6e 20 74 68 65 20 69 6e 63 72 65 6d   then the increm
15030 65 6e 74 61 6c 20 63 68 65 63 6b 70 6f 69 6e 74  ental checkpoint
15040 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20 72 65 73   is.** being res
15050 75 6d 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  umed. In this ca
15060 73 65 2c 20 69 66 20 74 68 65 20 63 68 65 63 6b  se, if the check
15070 73 75 6d 20 6f 66 20 74 68 65 20 77 61 6c 2d 69  sum of the wal-i
15080 6e 64 65 78 2d 68 65 61 64 65 72 0a 2a 2a 20 66  ndex-header.** f
15090 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65 72  ollowing recover
150a0 79 20 69 73 20 6e 6f 74 20 74 68 65 20 73 61 6d  y is not the sam
150b0 65 20 61 73 20 74 68 65 20 63 68 65 63 6b 73 75  e as the checksu
150c0 6d 20 73 61 76 65 64 20 69 6e 20 74 68 65 20 52  m saved in the R
150d0 62 75 53 74 61 74 65 0a 2a 2a 20 6f 62 6a 65 63  buState.** objec
150e0 74 2c 20 74 68 65 6e 20 74 68 65 20 72 62 75 20  t, then the rbu 
150f0 68 61 6e 64 6c 65 20 69 73 20 73 65 74 20 74 6f  handle is set to
15100 20 44 4f 4e 45 20 73 74 61 74 65 2e 20 54 68 69   DONE state. Thi
15110 73 20 6f 63 63 75 72 73 20 69 66 20 73 6f 6d 65  s occurs if some
15120 0a 2a 2a 20 6f 74 68 65 72 20 63 6c 69 65 6e 74  .** other client
15130 20 61 70 70 65 6e 64 73 20 61 20 74 72 61 6e 73   appends a trans
15140 61 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 77 61  action to the wa
15150 6c 20 66 69 6c 65 20 69 6e 20 74 68 65 20 6d 69  l file in the mi
15160 64 64 6c 65 20 6f 66 0a 2a 2a 20 61 6e 20 69 6e  ddle of.** an in
15170 63 72 65 6d 65 6e 74 61 6c 20 63 68 65 63 6b 70  cremental checkp
15180 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oint..*/.static 
15190 76 6f 69 64 20 72 62 75 53 65 74 75 70 43 68 65  void rbuSetupChe
151a0 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 72  ckpoint(sqlite3r
151b0 62 75 20 2a 70 2c 20 52 62 75 53 74 61 74 65 20  bu *p, RbuState 
151c0 2a 70 53 74 61 74 65 29 7b 0a 0a 20 20 2f 2a 20  *pState){..  /* 
151d0 49 66 20 70 53 74 61 74 65 20 69 73 20 4e 55 4c  If pState is NUL
151e0 4c 2c 20 74 68 65 6e 20 74 68 65 20 77 61 6c 20  L, then the wal 
151f0 66 69 6c 65 20 6d 61 79 20 6e 6f 74 20 68 61 76  file may not hav
15200 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 61 6e  e been opened an
15210 64 0a 20 20 2a 2a 20 72 65 63 6f 76 65 72 65 64  d.  ** recovered
15220 2e 20 52 75 6e 6e 69 6e 67 20 61 20 72 65 61 64  . Running a read
15230 2d 73 74 61 74 65 6d 65 6e 74 20 68 65 72 65 20  -statement here 
15240 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 64  to ensure that d
15250 6f 69 6e 67 20 73 6f 0a 20 20 2a 2a 20 64 6f 65  oing so.  ** doe
15260 73 20 6e 6f 74 20 69 6e 74 65 72 66 65 72 65 20  s not interfere 
15270 77 69 74 68 20 74 68 65 20 22 63 61 70 74 75 72  with the "captur
15280 65 22 20 70 72 6f 63 65 73 73 20 62 65 6c 6f 77  e" process below
15290 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 74 61  .  */.  if( pSta
152a0 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  te==0 ){.    p->
152b0 65 53 74 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  eStage = 0;.    
152c0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
152d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
152e0 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78  >rc = sqlite3_ex
152f0 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 53  ec(p->dbMain, "S
15300 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c  ELECT * FROM sql
15310 69 74 65 5f 6d 61 73 74 65 72 22 2c 20 30 2c 20  ite_master", 0, 
15320 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 0);.    }.  }
15330 0a 0a 20 20 2f 2a 20 41 73 73 75 6d 69 6e 67 20  ..  /* Assuming 
15340 6e 6f 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  no error has occ
15350 75 72 72 65 64 2c 20 72 75 6e 20 61 20 22 72 65  urred, run a "re
15360 73 74 61 72 74 22 20 63 68 65 63 6b 70 6f 69 6e  start" checkpoin
15370 74 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20  t with the.  ** 
15380 73 71 6c 69 74 65 33 72 62 75 2e 65 53 74 61 67  sqlite3rbu.eStag
15390 65 20 76 61 72 69 61 62 6c 65 20 73 65 74 20 74  e variable set t
153a0 6f 20 43 41 50 54 55 52 45 2e 20 54 68 69 73 20  o CAPTURE. This 
153b0 74 75 72 6e 73 20 6f 6e 20 74 68 65 20 66 6f 6c  turns on the fol
153c0 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 73 70 65 63  lowing.  ** spec
153d0 69 61 6c 20 62 65 68 61 76 69 6f 75 72 20 69 6e  ial behaviour in
153e0 20 74 68 65 20 72 62 75 20 56 46 53 3a 0a 20 20   the rbu VFS:.  
153f0 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 49 66 20 74  **.  **   * If t
15400 68 65 20 65 78 63 6c 75 73 69 76 65 20 73 68 6d  he exclusive shm
15410 20 57 52 49 54 45 52 20 6f 72 20 52 45 41 44 30   WRITER or READ0
15420 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20   lock cannot be 
15430 6f 62 74 61 69 6e 65 64 2c 0a 20 20 2a 2a 20 20  obtained,.  **  
15440 20 20 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e     the checkpoin
15450 74 20 66 61 69 6c 73 20 77 69 74 68 20 53 51 4c  t fails with SQL
15460 49 54 45 5f 42 55 53 59 20 28 6e 6f 72 6d 61 6c  ITE_BUSY (normal
15470 6c 79 20 53 51 4c 69 74 65 20 77 6f 75 6c 64 0a  ly SQLite would.
15480 20 20 2a 2a 20 20 20 20 20 70 72 6f 63 65 65 64    **     proceed
15490 20 77 69 74 68 20 72 75 6e 6e 69 6e 67 20 61 20   with running a 
154a0 70 61 73 73 69 76 65 20 63 68 65 63 6b 70 6f 69  passive checkpoi
154b0 6e 74 20 69 6e 73 74 65 61 64 20 6f 66 20 66 61  nt instead of fa
154c0 69 6c 69 6e 67 29 2e 0a 20 20 2a 2a 0a 20 20 2a  iling)..  **.  *
154d0 2a 20 20 20 2a 20 41 74 74 65 6d 70 74 73 20 74  *   * Attempts t
154e0 6f 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  o read from the 
154f0 2a 2d 77 61 6c 20 66 69 6c 65 20 6f 72 20 77 72  *-wal file or wr
15500 69 74 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  ite to the datab
15510 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 20 20  ase file.  **   
15520 20 20 64 6f 20 6e 6f 74 20 70 65 72 66 6f 72 6d    do not perform
15530 20 61 6e 79 20 49 4f 2e 20 49 6e 73 74 65 61 64   any IO. Instead
15540 2c 20 74 68 65 20 66 72 61 6d 65 2f 70 61 67 65  , the frame/page
15550 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 74 68   combinations th
15560 61 74 0a 20 20 2a 2a 20 20 20 20 20 77 6f 75 6c  at.  **     woul
15570 64 20 62 65 20 72 65 61 64 2f 77 72 69 74 74 65  d be read/writte
15580 6e 20 61 72 65 20 72 65 63 6f 72 64 65 64 20 69  n are recorded i
15590 6e 20 74 68 65 20 73 71 6c 69 74 65 33 72 62 75  n the sqlite3rbu
155a0 2e 61 46 72 61 6d 65 5b 5d 0a 20 20 2a 2a 20 20  .aFrame[].  **  
155b0 20 20 20 61 72 72 61 79 2e 0a 20 20 2a 2a 0a 20     array..  **. 
155c0 20 2a 2a 20 20 20 2a 20 43 61 6c 6c 73 20 74 6f   **   * Calls to
155d0 20 78 53 68 6d 4c 6f 63 6b 28 55 4e 4c 4f 43 4b   xShmLock(UNLOCK
155e0 29 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  ) to release the
155f0 20 65 78 63 6c 75 73 69 76 65 20 73 68 6d 20 57   exclusive shm W
15600 52 49 54 45 52 2c 20 0a 20 20 2a 2a 20 20 20 20  RITER, .  **    
15610 20 52 45 41 44 30 20 61 6e 64 20 43 48 45 43 4b   READ0 and CHECK
15620 50 4f 49 4e 54 20 6c 6f 63 6b 73 20 74 61 6b 65  POINT locks take
15630 6e 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  n as part of the
15640 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 72 65 0a   checkpoint are.
15650 20 20 2a 2a 20 20 20 20 20 6e 6f 2d 6f 70 73 2e    **     no-ops.
15660 20 54 68 65 73 65 20 6c 6f 63 6b 73 20 77 69 6c   These locks wil
15670 6c 20 6e 6f 74 20 62 65 20 72 65 6c 65 61 73 65  l not be release
15680 64 20 75 6e 74 69 6c 20 74 68 65 20 63 6f 6e 6e  d until the conn
15690 65 63 74 69 6f 6e 0a 20 20 2a 2a 20 20 20 20 20  ection.  **     
156a0 69 73 20 63 6c 6f 73 65 64 2e 0a 20 20 2a 2a 0a  is closed..  **.
156b0 20 20 2a 2a 20 20 20 2a 20 41 74 74 65 6d 70 74    **   * Attempt
156c0 69 6e 67 20 74 6f 20 78 53 79 6e 63 28 29 20 74  ing to xSync() t
156d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
156e0 20 63 61 75 73 65 73 20 61 6e 20 53 51 4c 49 54   causes an SQLIT
156f0 45 5f 49 4e 54 45 52 4e 41 4c 20 0a 20 20 2a 2a  E_INTERNAL .  **
15700 20 20 20 20 20 65 72 72 6f 72 2e 0a 20 20 2a 2a       error..  **
15710 0a 20 20 2a 2a 20 41 73 20 61 20 72 65 73 75 6c  .  ** As a resul
15720 74 2c 20 75 6e 6c 65 73 73 20 61 6e 20 65 72 72  t, unless an err
15730 6f 72 20 28 69 2e 65 2e 20 4f 4f 4d 20 6f 72 20  or (i.e. OOM or 
15740 53 51 4c 49 54 45 5f 42 55 53 59 29 20 6f 63 63  SQLITE_BUSY) occ
15750 75 72 73 2c 20 74 68 65 0a 20 20 2a 2a 20 63 68  urs, the.  ** ch
15760 65 63 6b 70 6f 69 6e 74 20 62 65 6c 6f 77 20 66  eckpoint below f
15770 61 69 6c 73 20 77 69 74 68 20 53 51 4c 49 54 45  ails with SQLITE
15780 5f 49 4e 54 45 52 4e 41 4c 2c 20 61 6e 64 20 6c  _INTERNAL, and l
15790 65 61 76 65 73 20 74 68 65 20 61 46 72 61 6d 65  eaves the aFrame
157a0 5b 5d 0a 20 20 2a 2a 20 61 72 72 61 79 20 70 6f  [].  ** array po
157b0 70 75 6c 61 74 65 64 20 77 69 74 68 20 61 20 73  pulated with a s
157c0 65 74 20 6f 66 20 28 66 72 61 6d 65 20 2d 3e 20  et of (frame -> 
157d0 70 61 67 65 29 20 6d 61 70 70 69 6e 67 73 2e 20  page) mappings. 
157e0 42 65 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a  Because the .  *
157f0 2a 20 57 52 49 54 45 52 2c 20 43 48 45 43 4b 50  * WRITER, CHECKP
15800 4f 49 4e 54 20 61 6e 64 20 52 45 41 44 30 20 6c  OINT and READ0 l
15810 6f 63 6b 73 20 61 72 65 20 73 74 69 6c 6c 20 68  ocks are still h
15820 65 6c 64 2c 20 69 74 20 69 73 20 73 61 66 65 20  eld, it is safe 
15830 74 6f 20 63 6f 70 79 20 0a 20 20 2a 2a 20 64 61  to copy .  ** da
15840 74 61 20 66 72 6f 6d 20 74 68 65 20 77 61 6c 20  ta from the wal 
15850 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 20 64 61  file into the da
15860 74 61 62 61 73 65 20 66 69 6c 65 20 61 63 63 6f  tabase file acco
15870 72 64 69 6e 67 20 74 6f 20 74 68 65 20 0a 20 20  rding to the .  
15880 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  ** contents of a
15890 46 72 61 6d 65 5b 5d 2e 0a 20 20 2a 2f 0a 20 20  Frame[]..  */.  
158a0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
158b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
158c0 72 63 32 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61  rc2;.    p->eSta
158d0 67 65 20 3d 20 52 42 55 5f 53 54 41 47 45 5f 43  ge = RBU_STAGE_C
158e0 41 50 54 55 52 45 3b 0a 20 20 20 20 72 63 32 20  APTURE;.    rc2 
158f0 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  = sqlite3_exec(p
15900 2d 3e 64 62 4d 61 69 6e 2c 20 22 50 52 41 47 4d  ->dbMain, "PRAGM
15910 41 20 6d 61 69 6e 2e 77 61 6c 5f 63 68 65 63 6b  A main.wal_check
15920 70 6f 69 6e 74 3d 72 65 73 74 61 72 74 22 2c 20  point=restart", 
15930 30 2c 20 30 2c 30 29 3b 0a 20 20 20 20 69 66 28  0, 0,0);.    if(
15940 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 49 4e 54   rc2!=SQLITE_INT
15950 45 52 4e 41 4c 20 29 20 70 2d 3e 72 63 20 3d 20  ERNAL ) p->rc = 
15960 72 63 32 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  rc2;.  }..  if( 
15970 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
15980 20 26 26 20 70 2d 3e 6e 46 72 61 6d 65 3e 30 20   && p->nFrame>0 
15990 29 7b 0a 20 20 20 20 70 2d 3e 65 53 74 61 67 65  ){.    p->eStage
159a0 20 3d 20 52 42 55 5f 53 54 41 47 45 5f 43 4b 50   = RBU_STAGE_CKP
159b0 54 3b 0a 20 20 20 20 70 2d 3e 6e 53 74 65 70 20  T;.    p->nStep 
159c0 3d 20 28 70 53 74 61 74 65 20 3f 20 70 53 74 61  = (pState ? pSta
159d0 74 65 2d 3e 6e 52 6f 77 20 3a 20 30 29 3b 0a 20  te->nRow : 0);. 
159e0 20 20 20 70 2d 3e 61 42 75 66 20 3d 20 72 62 75     p->aBuf = rbu
159f0 4d 61 6c 6c 6f 63 28 70 2c 20 70 2d 3e 70 67 73  Malloc(p, p->pgs
15a00 7a 29 3b 0a 20 20 20 20 70 2d 3e 69 57 61 6c 43  z);.    p->iWalC
15a10 6b 73 75 6d 20 3d 20 72 62 75 53 68 6d 43 68 65  ksum = rbuShmChe
15a20 63 6b 73 75 6d 28 70 29 3b 0a 20 20 7d 0a 0a 20  cksum(p);.  }.. 
15a30 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
15a40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
15a50 20 70 2d 3e 6e 46 72 61 6d 65 3d 3d 30 20 7c 7c   p->nFrame==0 ||
15a60 20 28 70 53 74 61 74 65 20 26 26 20 70 53 74 61   (pState && pSta
15a70 74 65 2d 3e 69 57 61 6c 43 6b 73 75 6d 21 3d 70  te->iWalCksum!=p
15a80 2d 3e 69 57 61 6c 43 6b 73 75 6d 29 20 29 7b 0a  ->iWalCksum) ){.
15a90 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
15aa0 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20  LITE_DONE;.     
15ab0 20 70 2d 3e 65 53 74 61 67 65 20 3d 20 52 42 55   p->eStage = RBU
15ac0 5f 53 54 41 47 45 5f 44 4f 4e 45 3b 0a 20 20 20  _STAGE_DONE;.   
15ad0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
15ae0 74 20 6e 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20  t nSectorSize;. 
15af0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c       sqlite3_fil
15b00 65 20 2a 70 44 62 20 3d 20 70 2d 3e 70 54 61 72  e *pDb = p->pTar
15b10 67 65 74 46 64 2d 3e 70 52 65 61 6c 3b 0a 20 20  getFd->pReal;.  
15b20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
15b30 20 2a 70 57 61 6c 20 3d 20 70 2d 3e 70 54 61 72   *pWal = p->pTar
15b40 67 65 74 46 64 2d 3e 70 57 61 6c 46 64 2d 3e 70  getFd->pWalFd->p
15b50 52 65 61 6c 3b 0a 20 20 20 20 20 20 61 73 73 65  Real;.      asse
15b60 72 74 28 20 70 2d 3e 6e 50 61 67 65 50 65 72 53  rt( p->nPagePerS
15b70 65 63 74 6f 72 3d 3d 30 20 29 3b 0a 20 20 20 20  ector==0 );.    
15b80 20 20 6e 53 65 63 74 6f 72 53 69 7a 65 20 3d 20    nSectorSize = 
15b90 70 44 62 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  pDb->pMethods->x
15ba0 53 65 63 74 6f 72 53 69 7a 65 28 70 44 62 29 3b  SectorSize(pDb);
15bb0 0a 20 20 20 20 20 20 69 66 28 20 6e 53 65 63 74  .      if( nSect
15bc0 6f 72 53 69 7a 65 3e 70 2d 3e 70 67 73 7a 20 29  orSize>p->pgsz )
15bd0 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 50 61  {.        p->nPa
15be0 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20 6e 53  gePerSector = nS
15bf0 65 63 74 6f 72 53 69 7a 65 20 2f 20 70 2d 3e 70  ectorSize / p->p
15c00 67 73 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  gsz;.      }else
15c10 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 50 61  {.        p->nPa
15c20 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20 31 3b  gePerSector = 1;
15c30 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
15c40 2f 2a 20 43 61 6c 6c 20 78 53 79 6e 63 28 29 20  /* Call xSync() 
15c50 6f 6e 20 74 68 65 20 77 61 6c 20 66 69 6c 65 2e  on the wal file.
15c60 20 54 68 69 73 20 63 61 75 73 65 73 20 53 51 4c   This causes SQL
15c70 69 74 65 20 74 6f 20 73 79 6e 63 20 74 68 65 20  ite to sync the 
15c80 0a 20 20 20 20 20 20 2a 2a 20 64 69 72 65 63 74  .      ** direct
15c90 6f 72 79 20 69 6e 20 77 68 69 63 68 20 74 68 65  ory in which the
15ca0 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65   target database
15cb0 20 61 6e 64 20 74 68 65 20 77 61 6c 20 66 69 6c   and the wal fil
15cc0 65 20 72 65 73 69 64 65 2c 20 69 6e 20 0a 20 20  e reside, in .  
15cd0 20 20 20 20 2a 2a 20 63 61 73 65 20 69 74 20 68      ** case it h
15ce0 61 73 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63  as not been sync
15cf0 65 64 20 73 69 6e 63 65 20 74 68 65 20 72 65 6e  ed since the ren
15d00 61 6d 65 28 29 20 63 61 6c 6c 20 69 6e 20 0a 20  ame() call in . 
15d10 20 20 20 20 20 2a 2a 20 72 62 75 4d 6f 76 65 4f       ** rbuMoveO
15d20 61 6c 46 69 6c 65 28 29 2e 20 2a 2f 0a 20 20 20  alFile(). */.   
15d30 20 20 20 70 2d 3e 72 63 20 3d 20 70 57 61 6c 2d     p->rc = pWal-
15d40 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 79 6e 63  >pMethods->xSync
15d50 28 70 57 61 6c 2c 20 53 51 4c 49 54 45 5f 53 59  (pWal, SQLITE_SY
15d60 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 20 20  NC_NORMAL);.    
15d70 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  }.  }.}../*.** C
15d80 61 6c 6c 65 64 20 77 68 65 6e 20 69 41 6d 74 20  alled when iAmt 
15d90 62 79 74 65 73 20 61 72 65 20 72 65 61 64 20 66  bytes are read f
15da0 72 6f 6d 20 6f 66 66 73 65 74 20 69 4f 66 66 20  rom offset iOff 
15db0 6f 66 20 74 68 65 20 77 61 6c 20 66 69 6c 65 20  of the wal file 
15dc0 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 72 62 75  while.** the rbu
15dd0 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 20 63 61   object is in ca
15de0 70 74 75 72 65 20 6d 6f 64 65 2e 20 52 65 63 6f  pture mode. Reco
15df0 72 64 20 74 68 65 20 66 72 61 6d 65 20 6e 75 6d  rd the frame num
15e00 62 65 72 20 6f 66 20 74 68 65 20 66 72 61 6d 65  ber of the frame
15e10 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20 69  .** being read i
15e20 6e 20 74 68 65 20 61 46 72 61 6d 65 5b 5d 20 61  n the aFrame[] a
15e30 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rray..*/.static 
15e40 69 6e 74 20 72 62 75 43 61 70 74 75 72 65 57 61  int rbuCaptureWa
15e50 6c 52 65 61 64 28 73 71 6c 69 74 65 33 72 62 75  lRead(sqlite3rbu
15e60 20 2a 70 52 62 75 2c 20 69 36 34 20 69 4f 66 66   *pRbu, i64 iOff
15e70 2c 20 69 6e 74 20 69 41 6d 74 29 7b 0a 20 20 63  , int iAmt){.  c
15e80 6f 6e 73 74 20 75 33 32 20 6d 52 65 71 20 3d 20  onst u32 mReq = 
15e90 28 31 3c 3c 57 41 4c 5f 4c 4f 43 4b 5f 57 52 49  (1<<WAL_LOCK_WRI
15ea0 54 45 29 7c 28 31 3c 3c 57 41 4c 5f 4c 4f 43 4b  TE)|(1<<WAL_LOCK
15eb0 5f 43 4b 50 54 29 7c 28 31 3c 3c 57 41 4c 5f 4c  _CKPT)|(1<<WAL_L
15ec0 4f 43 4b 5f 52 45 41 44 30 29 3b 0a 20 20 75 33  OCK_READ0);.  u3
15ed0 32 20 69 46 72 61 6d 65 3b 0a 0a 20 20 69 66 28  2 iFrame;..  if(
15ee0 20 70 52 62 75 2d 3e 6d 4c 6f 63 6b 21 3d 6d 52   pRbu->mLock!=mR
15ef0 65 71 20 29 7b 0a 20 20 20 20 70 52 62 75 2d 3e  eq ){.    pRbu->
15f00 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
15f10 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
15f20 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20  ITE_INTERNAL;.  
15f30 7d 0a 0a 20 20 70 52 62 75 2d 3e 70 67 73 7a 20  }..  pRbu->pgsz 
15f40 3d 20 69 41 6d 74 3b 0a 20 20 69 66 28 20 70 52  = iAmt;.  if( pR
15f50 62 75 2d 3e 6e 46 72 61 6d 65 3d 3d 70 52 62 75  bu->nFrame==pRbu
15f60 2d 3e 6e 46 72 61 6d 65 41 6c 6c 6f 63 20 29 7b  ->nFrameAlloc ){
15f70 0a 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20  .    int nNew = 
15f80 28 70 52 62 75 2d 3e 6e 46 72 61 6d 65 41 6c 6c  (pRbu->nFrameAll
15f90 6f 63 20 3f 20 70 52 62 75 2d 3e 6e 46 72 61 6d  oc ? pRbu->nFram
15fa0 65 41 6c 6c 6f 63 20 3a 20 36 34 29 20 2a 20 32  eAlloc : 64) * 2
15fb0 3b 0a 20 20 20 20 52 62 75 46 72 61 6d 65 20 2a  ;.    RbuFrame *
15fc0 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d  aNew;.    aNew =
15fd0 20 28 52 62 75 46 72 61 6d 65 2a 29 73 71 6c 69   (RbuFrame*)sqli
15fe0 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 52  te3_realloc64(pR
15ff0 62 75 2d 3e 61 46 72 61 6d 65 2c 20 6e 4e 65 77  bu->aFrame, nNew
16000 20 2a 20 73 69 7a 65 6f 66 28 52 62 75 46 72 61   * sizeof(RbuFra
16010 6d 65 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e  me));.    if( aN
16020 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ew==0 ) return S
16030 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
16040 20 70 52 62 75 2d 3e 61 46 72 61 6d 65 20 3d 20   pRbu->aFrame = 
16050 61 4e 65 77 3b 0a 20 20 20 20 70 52 62 75 2d 3e  aNew;.    pRbu->
16060 6e 46 72 61 6d 65 41 6c 6c 6f 63 20 3d 20 6e 4e  nFrameAlloc = nN
16070 65 77 3b 0a 20 20 7d 0a 0a 20 20 69 46 72 61 6d  ew;.  }..  iFram
16080 65 20 3d 20 28 75 33 32 29 28 28 69 4f 66 66 2d  e = (u32)((iOff-
16090 33 32 29 20 2f 20 28 69 36 34 29 28 69 41 6d 74  32) / (i64)(iAmt
160a0 2b 32 34 29 29 20 2b 20 31 3b 0a 20 20 69 66 28  +24)) + 1;.  if(
160b0 20 70 52 62 75 2d 3e 69 4d 61 78 46 72 61 6d 65   pRbu->iMaxFrame
160c0 3c 69 46 72 61 6d 65 20 29 20 70 52 62 75 2d 3e  <iFrame ) pRbu->
160d0 69 4d 61 78 46 72 61 6d 65 20 3d 20 69 46 72 61  iMaxFrame = iFra
160e0 6d 65 3b 0a 20 20 70 52 62 75 2d 3e 61 46 72 61  me;.  pRbu->aFra
160f0 6d 65 5b 70 52 62 75 2d 3e 6e 46 72 61 6d 65 5d  me[pRbu->nFrame]
16100 2e 69 57 61 6c 46 72 61 6d 65 20 3d 20 69 46 72  .iWalFrame = iFr
16110 61 6d 65 3b 0a 20 20 70 52 62 75 2d 3e 61 46 72  ame;.  pRbu->aFr
16120 61 6d 65 5b 70 52 62 75 2d 3e 6e 46 72 61 6d 65  ame[pRbu->nFrame
16130 5d 2e 69 44 62 50 61 67 65 20 3d 20 30 3b 0a 20  ].iDbPage = 0;. 
16140 20 70 52 62 75 2d 3e 6e 46 72 61 6d 65 2b 2b 3b   pRbu->nFrame++;
16150 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
16160 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61  _OK;.}../*.** Ca
16170 6c 6c 65 64 20 77 68 65 6e 20 61 20 70 61 67 65  lled when a page
16180 20 6f 66 20 64 61 74 61 20 69 73 20 77 72 69 74   of data is writ
16190 74 65 6e 20 74 6f 20 6f 66 66 73 65 74 20 69 4f  ten to offset iO
161a0 66 66 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ff of the databa
161b0 73 65 0a 2a 2a 20 66 69 6c 65 20 77 68 69 6c 65  se.** file while
161c0 20 74 68 65 20 72 62 75 20 68 61 6e 64 6c 65 20   the rbu handle 
161d0 69 73 20 69 6e 20 63 61 70 74 75 72 65 20 6d 6f  is in capture mo
161e0 64 65 2e 20 52 65 63 6f 72 64 20 74 68 65 20 70  de. Record the p
161f0 61 67 65 20 6e 75 6d 62 65 72 20 0a 2a 2a 20 6f  age number .** o
16200 66 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67  f the page being
16210 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65 20   written in the 
16220 61 46 72 61 6d 65 5b 5d 20 61 72 72 61 79 2e 0a  aFrame[] array..
16230 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62  */.static int rb
16240 75 43 61 70 74 75 72 65 44 62 57 72 69 74 65 28  uCaptureDbWrite(
16250 73 71 6c 69 74 65 33 72 62 75 20 2a 70 52 62 75  sqlite3rbu *pRbu
16260 2c 20 69 36 34 20 69 4f 66 66 29 7b 0a 20 20 70  , i64 iOff){.  p
16270 52 62 75 2d 3e 61 46 72 61 6d 65 5b 70 52 62 75  Rbu->aFrame[pRbu
16280 2d 3e 6e 46 72 61 6d 65 2d 31 5d 2e 69 44 62 50  ->nFrame-1].iDbP
16290 61 67 65 20 3d 20 28 75 33 32 29 28 69 4f 66 66  age = (u32)(iOff
162a0 20 2f 20 70 52 62 75 2d 3e 70 67 73 7a 29 20 2b   / pRbu->pgsz) +
162b0 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   1;.  return SQL
162c0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
162d0 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   This is called 
162e0 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 69 6e  as part of an in
162f0 63 72 65 6d 65 6e 74 61 6c 20 63 68 65 63 6b 70  cremental checkp
16300 6f 69 6e 74 20 6f 70 65 72 61 74 69 6f 6e 2e 20  oint operation. 
16310 43 6f 70 79 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  Copy.** a single
16320 20 66 72 61 6d 65 20 6f 66 20 64 61 74 61 20 66   frame of data f
16330 72 6f 6d 20 74 68 65 20 77 61 6c 20 66 69 6c 65  rom the wal file
16340 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
16350 73 65 20 66 69 6c 65 2c 20 61 73 0a 2a 2a 20 69  se file, as.** i
16360 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20  ndicated by the 
16370 52 62 75 46 72 61 6d 65 20 6f 62 6a 65 63 74 2e  RbuFrame object.
16380 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
16390 72 62 75 43 68 65 63 6b 70 6f 69 6e 74 46 72 61  rbuCheckpointFra
163a0 6d 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  me(sqlite3rbu *p
163b0 2c 20 52 62 75 46 72 61 6d 65 20 2a 70 46 72 61  , RbuFrame *pFra
163c0 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66  me){.  sqlite3_f
163d0 69 6c 65 20 2a 70 57 61 6c 20 3d 20 70 2d 3e 70  ile *pWal = p->p
163e0 54 61 72 67 65 74 46 64 2d 3e 70 57 61 6c 46 64  TargetFd->pWalFd
163f0 2d 3e 70 52 65 61 6c 3b 0a 20 20 73 71 6c 69 74  ->pReal;.  sqlit
16400 65 33 5f 66 69 6c 65 20 2a 70 44 62 20 3d 20 70  e3_file *pDb = p
16410 2d 3e 70 54 61 72 67 65 74 46 64 2d 3e 70 52 65  ->pTargetFd->pRe
16420 61 6c 3b 0a 20 20 69 36 34 20 69 4f 66 66 3b 0a  al;.  i64 iOff;.
16430 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
16440 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
16450 20 69 4f 66 66 20 3d 20 28 69 36 34 29 28 70 46   iOff = (i64)(pF
16460 72 61 6d 65 2d 3e 69 57 61 6c 46 72 61 6d 65 2d  rame->iWalFrame-
16470 31 29 20 2a 20 28 70 2d 3e 70 67 73 7a 20 2b 20  1) * (p->pgsz + 
16480 32 34 29 20 2b 20 33 32 20 2b 20 32 34 3b 0a 20  24) + 32 + 24;. 
16490 20 70 2d 3e 72 63 20 3d 20 70 57 61 6c 2d 3e 70   p->rc = pWal->p
164a0 4d 65 74 68 6f 64 73 2d 3e 78 52 65 61 64 28 70  Methods->xRead(p
164b0 57 61 6c 2c 20 70 2d 3e 61 42 75 66 2c 20 70 2d  Wal, p->aBuf, p-
164c0 3e 70 67 73 7a 2c 20 69 4f 66 66 29 3b 0a 20 20  >pgsz, iOff);.  
164d0 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75  if( p->rc ) retu
164e0 72 6e 3b 0a 0a 20 20 69 4f 66 66 20 3d 20 28 69  rn;..  iOff = (i
164f0 36 34 29 28 70 46 72 61 6d 65 2d 3e 69 44 62 50  64)(pFrame->iDbP
16500 61 67 65 2d 31 29 20 2a 20 70 2d 3e 70 67 73 7a  age-1) * p->pgsz
16510 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 70 44 62 2d  ;.  p->rc = pDb-
16520 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 57 72 69 74  >pMethods->xWrit
16530 65 28 70 44 62 2c 20 70 2d 3e 61 42 75 66 2c 20  e(pDb, p->aBuf, 
16540 70 2d 3e 70 67 73 7a 2c 20 69 4f 66 66 29 3b 0a  p->pgsz, iOff);.
16550 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 61 6b 65 20 61  }.../*.** Take a
16560 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
16570 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
16580 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
16590 20 76 6f 69 64 20 72 62 75 4c 6f 63 6b 44 61 74   void rbuLockDat
165a0 61 62 61 73 65 28 73 71 6c 69 74 65 33 72 62 75  abase(sqlite3rbu
165b0 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f   *p){.  sqlite3_
165c0 66 69 6c 65 20 2a 70 52 65 61 6c 20 3d 20 70 2d  file *pReal = p-
165d0 3e 70 54 61 72 67 65 74 46 64 2d 3e 70 52 65 61  >pTargetFd->pRea
165e0 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  l;.  assert( p->
165f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
16600 0a 20 20 70 2d 3e 72 63 20 3d 20 70 52 65 61 6c  .  p->rc = pReal
16610 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 4c 6f 63  ->pMethods->xLoc
16620 6b 28 70 52 65 61 6c 2c 20 53 51 4c 49 54 45 5f  k(pReal, SQLITE_
16630 4c 4f 43 4b 5f 53 48 41 52 45 44 29 3b 0a 20 20  LOCK_SHARED);.  
16640 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
16650 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72  E_OK ){.    p->r
16660 63 20 3d 20 70 52 65 61 6c 2d 3e 70 4d 65 74 68  c = pReal->pMeth
16670 6f 64 73 2d 3e 78 4c 6f 63 6b 28 70 52 65 61 6c  ods->xLock(pReal
16680 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 45 58  , SQLITE_LOCK_EX
16690 43 4c 55 53 49 56 45 29 3b 0a 20 20 7d 0a 7d 0a  CLUSIVE);.  }.}.
166a0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49  .#if defined(_WI
166b0 4e 33 32 5f 57 43 45 29 0a 73 74 61 74 69 63 20  N32_WCE).static 
166c0 4c 50 57 53 54 52 20 72 62 75 57 69 6e 55 74 66  LPWSTR rbuWinUtf
166d0 38 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74  8ToUnicode(const
166e0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
166f0 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a  ){.  int nChar;.
16700 20 20 4c 50 57 53 54 52 20 7a 57 69 64 65 46 69    LPWSTR zWideFi
16710 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e 43 68 61 72  lename;..  nChar
16720 20 3d 20 4d 75 6c 74 69 42 79 74 65 54 6f 57 69   = MultiByteToWi
16730 64 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20  deChar(CP_UTF8, 
16740 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31  0, zFilename, -1
16750 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 69 66  , NULL, 0);.  if
16760 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20  ( nChar==0 ){.  
16770 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
16780 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 20    zWideFilename 
16790 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
167a0 36 34 28 20 6e 43 68 61 72 2a 73 69 7a 65 6f 66  64( nChar*sizeof
167b0 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 5b 30  (zWideFilename[0
167c0 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 57 69 64  ]) );.  if( zWid
167d0 65 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a  eFilename==0 ){.
167e0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
167f0 7d 0a 20 20 6d 65 6d 73 65 74 28 7a 57 69 64 65  }.  memset(zWide
16800 46 69 6c 65 6e 61 6d 65 2c 20 30 2c 20 6e 43 68  Filename, 0, nCh
16810 61 72 2a 73 69 7a 65 6f 66 28 7a 57 69 64 65 46  ar*sizeof(zWideF
16820 69 6c 65 6e 61 6d 65 5b 30 5d 29 29 3b 0a 20 20  ilename[0]));.  
16830 6e 43 68 61 72 20 3d 20 4d 75 6c 74 69 42 79 74  nChar = MultiByt
16840 65 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55  eToWideChar(CP_U
16850 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d  TF8, 0, zFilenam
16860 65 2c 20 2d 31 2c 20 7a 57 69 64 65 46 69 6c 65  e, -1, zWideFile
16870 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
16880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16890 20 20 20 20 20 20 6e 43 68 61 72 29 3b 0a 20 20        nChar);.  
168a0 69 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a  if( nChar==0 ){.
168b0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
168c0 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 3b  (zWideFilename);
168d0 0a 20 20 20 20 7a 57 69 64 65 46 69 6c 65 6e 61  .    zWideFilena
168e0 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  me = 0;.  }.  re
168f0 74 75 72 6e 20 7a 57 69 64 65 46 69 6c 65 6e 61  turn zWideFilena
16900 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  me;.}.#endif../*
16910 0a 2a 2a 20 54 68 65 20 52 42 55 20 68 61 6e 64  .** The RBU hand
16920 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  le is currently 
16930 69 6e 20 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c  in RBU_STAGE_OAL
16940 20 73 74 61 74 65 2c 20 77 69 74 68 20 61 20 53   state, with a S
16950 48 41 52 45 44 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e  HARED lock.** on
16960 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
16970 6c 65 2e 20 54 68 69 73 20 70 72 6f 63 20 6d 6f  le. This proc mo
16980 76 65 73 20 74 68 65 20 2a 2d 6f 61 6c 20 66 69  ves the *-oal fi
16990 6c 65 20 74 6f 20 74 68 65 20 2a 2d 77 61 6c 20  le to the *-wal 
169a0 70 61 74 68 2c 0a 2a 2a 20 74 68 65 6e 20 72 65  path,.** then re
169b0 6f 70 65 6e 73 20 74 68 65 20 64 61 74 61 62 61  opens the databa
169c0 73 65 20 66 69 6c 65 20 28 74 68 69 73 20 74 69  se file (this ti
169d0 6d 65 20 69 6e 20 76 61 6e 69 6c 6c 61 2c 20 6e  me in vanilla, n
169e0 6f 6e 2d 6f 61 6c 2c 20 57 41 4c 20 6d 6f 64 65  on-oal, WAL mode
169f0 29 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  )..** If an erro
16a00 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20  r occurs, leave 
16a10 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  an error code an
16a20 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  d error message 
16a30 69 6e 20 74 68 65 20 72 62 75 20 0a 2a 2a 20 68  in the rbu .** h
16a40 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
16a50 20 76 6f 69 64 20 72 62 75 4d 6f 76 65 4f 61 6c   void rbuMoveOal
16a60 46 69 6c 65 28 73 71 6c 69 74 65 33 72 62 75 20  File(sqlite3rbu 
16a70 2a 70 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *p){.  const cha
16a80 72 20 2a 7a 42 61 73 65 20 3d 20 73 71 6c 69 74  r *zBase = sqlit
16a90 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28 70  e3_db_filename(p
16aa0 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22  ->dbMain, "main"
16ab0 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  );.  const char 
16ac0 2a 7a 4d 6f 76 65 20 3d 20 7a 42 61 73 65 3b 0a  *zMove = zBase;.
16ad0 20 20 63 68 61 72 20 2a 7a 4f 61 6c 3b 0a 20 20    char *zOal;.  
16ae0 63 68 61 72 20 2a 7a 57 61 6c 3b 0a 0a 20 20 69  char *zWal;..  i
16af0 66 28 20 72 62 75 49 73 56 61 63 75 75 6d 28 70  f( rbuIsVacuum(p
16b00 29 20 29 7b 0a 20 20 20 20 7a 4d 6f 76 65 20 3d  ) ){.    zMove =
16b10 20 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65   sqlite3_db_file
16b20 6e 61 6d 65 28 70 2d 3e 64 62 52 62 75 2c 20 22  name(p->dbRbu, "
16b30 6d 61 69 6e 22 29 3b 0a 20 20 7d 0a 20 20 7a 4f  main");.  }.  zO
16b40 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  al = sqlite3_mpr
16b50 69 6e 74 66 28 22 25 73 2d 6f 61 6c 22 2c 20 7a  intf("%s-oal", z
16b60 4d 6f 76 65 29 3b 0a 20 20 7a 57 61 6c 20 3d 20  Move);.  zWal = 
16b70 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
16b80 22 25 73 2d 77 61 6c 22 2c 20 7a 4d 6f 76 65 29  "%s-wal", zMove)
16b90 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
16ba0 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47  eStage==RBU_STAG
16bb0 45 5f 4d 4f 56 45 20 29 3b 0a 20 20 61 73 73 65  E_MOVE );.  asse
16bc0 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
16bd0 45 5f 4f 4b 20 26 26 20 70 2d 3e 7a 45 72 72 6d  E_OK && p->zErrm
16be0 73 67 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a  sg==0 );.  if( z
16bf0 57 61 6c 3d 3d 30 20 7c 7c 20 7a 4f 61 6c 3d 3d  Wal==0 || zOal==
16c00 30 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  0 ){.    p->rc =
16c10 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
16c20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d   }else{.    /* M
16c30 6f 76 65 20 74 68 65 20 2a 2d 6f 61 6c 20 66 69  ove the *-oal fi
16c40 6c 65 20 74 6f 20 2a 2d 77 61 6c 2e 20 41 74 20  le to *-wal. At 
16c50 74 68 69 73 20 70 6f 69 6e 74 20 63 6f 6e 6e 65  this point conne
16c60 63 74 69 6f 6e 20 70 2d 3e 64 62 20 69 73 0a 20  ction p->db is. 
16c70 20 20 20 2a 2a 20 68 6f 6c 64 69 6e 67 20 61 20     ** holding a 
16c80 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SHARED lock on t
16c90 68 65 20 74 61 72 67 65 74 20 64 61 74 61 62 61  he target databa
16ca0 73 65 20 66 69 6c 65 20 28 62 65 63 61 75 73 65  se file (because
16cb0 20 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 69 6e   it is.    ** in
16cc0 20 57 41 4c 20 6d 6f 64 65 29 2e 20 53 6f 20 6e   WAL mode). So n
16cd0 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  o other connecti
16ce0 6f 6e 20 6d 61 79 20 62 65 20 77 72 69 74 69 6e  on may be writin
16cf0 67 20 74 68 65 20 64 62 2e 20 0a 20 20 20 20 2a  g the db. .    *
16d00 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 6f 72 64 65  *.    ** In orde
16d10 72 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  r to ensure that
16d20 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64 61   there are no da
16d30 74 61 62 61 73 65 20 72 65 61 64 65 72 73 2c 20  tabase readers, 
16d40 61 6e 20 45 58 43 4c 55 53 49 56 45 0a 20 20 20  an EXCLUSIVE.   
16d50 20 2a 2a 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61   ** lock is obta
16d60 69 6e 65 64 20 68 65 72 65 20 62 65 66 6f 72 65  ined here before
16d70 20 74 68 65 20 2a 2d 6f 61 6c 20 69 73 20 6d 6f   the *-oal is mo
16d80 76 65 64 20 74 6f 20 2a 2d 77 61 6c 2e 0a 20 20  ved to *-wal..  
16d90 20 20 2a 2f 0a 20 20 20 20 72 62 75 4c 6f 63 6b    */.    rbuLock
16da0 44 61 74 61 62 61 73 65 28 70 29 3b 0a 20 20 20  Database(p);.   
16db0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
16dc0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
16dd0 62 75 46 69 6c 65 53 75 66 66 69 78 33 28 7a 42  buFileSuffix3(zB
16de0 61 73 65 2c 20 7a 57 61 6c 29 3b 0a 20 20 20 20  ase, zWal);.    
16df0 20 20 72 62 75 46 69 6c 65 53 75 66 66 69 78 33    rbuFileSuffix3
16e00 28 7a 42 61 73 65 2c 20 7a 4f 61 6c 29 3b 0a 0a  (zBase, zOal);..
16e10 20 20 20 20 20 20 2f 2a 20 52 65 2d 6f 70 65 6e        /* Re-open
16e20 20 74 68 65 20 64 61 74 61 62 61 73 65 73 2e 20   the databases. 
16e30 2a 2f 0a 20 20 20 20 20 20 72 62 75 4f 62 6a 49  */.      rbuObjI
16e40 74 65 72 46 69 6e 61 6c 69 7a 65 28 26 70 2d 3e  terFinalize(&p->
16e50 6f 62 6a 69 74 65 72 29 3b 0a 20 20 20 20 20 20  objiter);.      
16e60 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d  sqlite3_close(p-
16e70 3e 64 62 52 62 75 29 3b 0a 20 20 20 20 20 20 73  >dbRbu);.      s
16e80 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e  qlite3_close(p->
16e90 64 62 4d 61 69 6e 29 3b 0a 20 20 20 20 20 20 70  dbMain);.      p
16ea0 2d 3e 64 62 4d 61 69 6e 20 3d 20 30 3b 0a 20 20  ->dbMain = 0;.  
16eb0 20 20 20 20 70 2d 3e 64 62 52 62 75 20 3d 20 30      p->dbRbu = 0
16ec0 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  ;..#if defined(_
16ed0 57 49 4e 33 32 5f 57 43 45 29 0a 20 20 20 20 20  WIN32_WCE).     
16ee0 20 7b 0a 20 20 20 20 20 20 20 20 4c 50 57 53 54   {.        LPWST
16ef0 52 20 7a 57 69 64 65 4f 61 6c 3b 0a 20 20 20 20  R zWideOal;.    
16f00 20 20 20 20 4c 50 57 53 54 52 20 7a 57 69 64 65      LPWSTR zWide
16f10 57 61 6c 3b 0a 0a 20 20 20 20 20 20 20 20 7a 57  Wal;..        zW
16f20 69 64 65 4f 61 6c 20 3d 20 72 62 75 57 69 6e 55  ideOal = rbuWinU
16f30 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 4f 61  tf8ToUnicode(zOa
16f40 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  l);.        if( 
16f50 7a 57 69 64 65 4f 61 6c 20 29 7b 0a 20 20 20 20  zWideOal ){.    
16f60 20 20 20 20 20 20 7a 57 69 64 65 57 61 6c 20 3d        zWideWal =
16f70 20 72 62 75 57 69 6e 55 74 66 38 54 6f 55 6e 69   rbuWinUtf8ToUni
16f80 63 6f 64 65 28 7a 57 61 6c 29 3b 0a 20 20 20 20  code(zWal);.    
16f90 20 20 20 20 20 20 69 66 28 20 7a 57 69 64 65 57        if( zWideW
16fa0 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  al ){.          
16fb0 20 20 69 66 28 20 4d 6f 76 65 46 69 6c 65 57 28    if( MoveFileW(
16fc0 7a 57 69 64 65 4f 61 6c 2c 20 7a 57 69 64 65 57  zWideOal, zWideW
16fd0 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  al) ){.         
16fe0 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c       p->rc = SQL
16ff0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
17000 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17010 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
17020 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
17030 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
17040 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17050 5f 66 72 65 65 28 7a 57 69 64 65 57 61 6c 29 3b  _free(zWideWal);
17060 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
17070 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
17080 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45  >rc = SQLITE_IOE
17090 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  RR_NOMEM;.      
170a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
170b0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69  sqlite3_free(zWi
170c0 64 65 4f 61 6c 29 3b 0a 20 20 20 20 20 20 20 20  deOal);.        
170d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
170e0 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
170f0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
17100 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
17110 65 6c 73 65 0a 20 20 20 20 20 20 70 2d 3e 72 63  else.      p->rc
17120 20 3d 20 72 65 6e 61 6d 65 28 7a 4f 61 6c 2c 20   = rename(zOal, 
17130 7a 57 61 6c 29 20 3f 20 53 51 4c 49 54 45 5f 49  zWal) ? SQLITE_I
17140 4f 45 52 52 20 3a 20 53 51 4c 49 54 45 5f 4f 4b  OERR : SQLITE_OK
17150 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  ;.#endif..      
17160 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
17170 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
17180 72 62 75 4f 70 65 6e 44 61 74 61 62 61 73 65 28  rbuOpenDatabase(
17190 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72  p, 0);.        r
171a0 62 75 53 65 74 75 70 43 68 65 63 6b 70 6f 69 6e  buSetupCheckpoin
171b0 74 28 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  t(p, 0);.      }
171c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71  .    }.  }..  sq
171d0 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 61 6c 29  lite3_free(zWal)
171e0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
171f0 28 7a 4f 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (zOal);.}../*.**
17200 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
17210 65 6d 65 6e 74 20 69 74 65 72 61 74 69 6e 67 20  ement iterating 
17220 74 68 72 6f 75 67 68 20 74 68 65 20 6b 65 79 73  through the keys
17230 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
17240 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 70 2d 3e 6f   object.** (p->o
17250 62 6a 69 74 65 72 2e 70 53 65 6c 65 63 74 29 20  bjiter.pSelect) 
17260 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
17270 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 2e   to a valid row.
17280 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   This function.*
17290 2a 20 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65  * determines the
172a0 20 74 79 70 65 20 6f 66 20 6f 70 65 72 61 74 69   type of operati
172b0 6f 6e 20 72 65 71 75 65 73 74 65 64 20 62 79 20  on requested by 
172c0 74 68 69 73 20 72 6f 77 20 61 6e 64 20 72 65 74  this row and ret
172d0 75 72 6e 73 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74  urns.** one of t
172e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c  he following val
172f0 75 65 73 20 74 6f 20 69 6e 64 69 63 61 74 65 20  ues to indicate 
17300 74 68 65 20 72 65 73 75 6c 74 3a 0a 2a 2a 0a 2a  the result:.**.*
17310 2a 20 20 20 20 20 2a 20 52 42 55 5f 49 4e 53 45  *     * RBU_INSE
17320 52 54 0a 2a 2a 20 20 20 20 20 2a 20 52 42 55 5f  RT.**     * RBU_
17330 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20 2a 20  DELETE.**     * 
17340 52 42 55 5f 49 44 58 5f 44 45 4c 45 54 45 0a 2a  RBU_IDX_DELETE.*
17350 2a 20 20 20 20 20 2a 20 52 42 55 5f 55 50 44 41  *     * RBU_UPDA
17360 54 45 0a 2a 2a 0a 2a 2a 20 49 66 20 52 42 55 5f  TE.**.** If RBU_
17370 55 50 44 41 54 45 20 69 73 20 72 65 74 75 72 6e  UPDATE is return
17380 65 64 2c 20 74 68 65 6e 20 6f 75 74 70 75 74 20  ed, then output 
17390 76 61 72 69 61 62 6c 65 20 2a 70 7a 4d 61 73 6b  variable *pzMask
173a0 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 70 6f   is set to.** po
173b0 69 6e 74 20 74 6f 20 74 68 65 20 74 65 78 74 20  int to the text 
173c0 76 61 6c 75 65 20 69 6e 64 69 63 61 74 69 6e 67  value indicating
173d0 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20   the columns to 
173e0 75 70 64 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  update..**.** If
173f0 20 74 68 65 20 72 62 75 5f 63 6f 6e 74 72 6f 6c   the rbu_control
17400 20 66 69 65 6c 64 20 63 6f 6e 74 61 69 6e 73 20   field contains 
17410 61 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65  an invalid value
17420 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
17430 61 6e 64 0a 2a 2a 20 6d 65 73 73 61 67 65 20 61  and.** message a
17440 72 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 52  re left in the R
17450 42 55 20 68 61 6e 64 6c 65 20 61 6e 64 20 7a 65  BU handle and ze
17460 72 6f 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  ro returned..*/.
17470 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 53 74  static int rbuSt
17480 65 70 54 79 70 65 28 73 71 6c 69 74 65 33 72 62  epType(sqlite3rb
17490 75 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  u *p, const char
174a0 20 2a 2a 70 7a 4d 61 73 6b 29 7b 0a 20 20 69 6e   **pzMask){.  in
174b0 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6f 62 6a 69  t iCol = p->obji
174c0 74 65 72 2e 6e 43 6f 6c 3b 20 20 20 20 20 2f 2a  ter.nCol;     /*
174d0 20 49 6e 64 65 78 20 6f 66 20 72 62 75 5f 63 6f   Index of rbu_co
174e0 6e 74 72 6f 6c 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  ntrol column */.
174f0 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 20 20    int res = 0;  
17500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17510 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
17520 65 20 2a 2f 0a 0a 20 20 73 77 69 74 63 68 28 20  e */..  switch( 
17530 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
17540 79 70 65 28 70 2d 3e 6f 62 6a 69 74 65 72 2e 70  ype(p->objiter.p
17550 53 65 6c 65 63 74 2c 20 69 43 6f 6c 29 20 29 7b  Select, iCol) ){
17560 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
17570 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
17580 20 20 69 6e 74 20 69 56 61 6c 20 3d 20 73 71 6c    int iVal = sql
17590 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
175a0 70 2d 3e 6f 62 6a 69 74 65 72 2e 70 53 65 6c 65  p->objiter.pSele
175b0 63 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20  ct, iCol);.     
175c0 20 73 77 69 74 63 68 28 20 69 56 61 6c 20 29 7b   switch( iVal ){
175d0 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 30 3a  .        case 0:
175e0 20 72 65 73 20 3d 20 52 42 55 5f 49 4e 53 45 52   res = RBU_INSER
175f0 54 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  T;     break;.  
17600 20 20 20 20 20 20 63 61 73 65 20 31 3a 20 72 65        case 1: re
17610 73 20 3d 20 52 42 55 5f 44 45 4c 45 54 45 3b 20  s = RBU_DELETE; 
17620 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
17630 20 20 20 63 61 73 65 20 32 3a 20 72 65 73 20 3d     case 2: res =
17640 20 52 42 55 5f 52 45 50 4c 41 43 45 3b 20 20 20   RBU_REPLACE;   
17650 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
17660 63 61 73 65 20 33 3a 20 72 65 73 20 3d 20 52 42  case 3: res = RB
17670 55 5f 49 44 58 5f 44 45 4c 45 54 45 3b 20 62 72  U_IDX_DELETE; br
17680 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
17690 65 20 34 3a 20 72 65 73 20 3d 20 52 42 55 5f 49  e 4: res = RBU_I
176a0 44 58 5f 49 4e 53 45 52 54 3b 20 62 72 65 61 6b  DX_INSERT; break
176b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
176c0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
176d0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
176e0 58 54 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73  XT: {.      cons
176f0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
17700 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  *z = sqlite3_col
17710 75 6d 6e 5f 74 65 78 74 28 70 2d 3e 6f 62 6a 69  umn_text(p->obji
17720 74 65 72 2e 70 53 65 6c 65 63 74 2c 20 69 43 6f  ter.pSelect, iCo
17730 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 3d  l);.      if( z=
17740 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  =0 ){.        p-
17750 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
17760 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EM;.      }else{
17770 0a 20 20 20 20 20 20 20 20 2a 70 7a 4d 61 73 6b  .        *pzMask
17780 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
17790 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  z;.      }.     
177a0 20 72 65 73 20 3d 20 52 42 55 5f 55 50 44 41 54   res = RBU_UPDAT
177b0 45 3b 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  E;..      break;
177c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 65 66 61  .    }..    defa
177d0 75 6c 74 3a 0a 20 20 20 20 20 20 62 72 65 61 6b  ult:.      break
177e0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 65 73  ;.  }..  if( res
177f0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 62 75 42 61  ==0 ){.    rbuBa
17800 64 43 6f 6e 74 72 6f 6c 45 72 72 6f 72 28 70 29  dControlError(p)
17810 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
17820 65 73 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  es;.}..#ifdef SQ
17830 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
17840 20 41 73 73 65 72 74 20 74 68 61 74 20 63 6f 6c   Assert that col
17850 75 6d 6e 20 69 43 6f 6c 20 6f 66 20 73 74 61 74  umn iCol of stat
17860 65 6d 65 6e 74 20 70 53 74 6d 74 20 69 73 20 6e  ement pStmt is n
17870 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73  amed zName..*/.s
17880 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
17890 74 43 6f 6c 75 6d 6e 4e 61 6d 65 28 73 71 6c 69  tColumnName(sqli
178a0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 2c  te3_stmt *pStmt,
178b0 20 69 6e 74 20 69 43 6f 6c 2c 20 63 6f 6e 73 74   int iCol, const
178c0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
178d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
178e0 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
178f0 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69  mn_name(pStmt, i
17900 43 6f 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Col);.  assert( 
17910 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63  0==sqlite3_stric
17920 6d 70 28 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 20  mp(zName, zCol) 
17930 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
17940 69 6e 65 20 61 73 73 65 72 74 43 6f 6c 75 6d 6e  ine assertColumn
17950 4e 61 6d 65 28 78 2c 79 2c 7a 29 0a 23 65 6e 64  Name(x,y,z).#end
17960 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  if../*.** Argume
17970 6e 74 20 65 54 79 70 65 20 6d 75 73 74 20 62 65  nt eType must be
17980 20 6f 6e 65 20 6f 66 20 52 42 55 5f 49 4e 53 45   one of RBU_INSE
17990 52 54 2c 20 52 42 55 5f 44 45 4c 45 54 45 2c 20  RT, RBU_DELETE, 
179a0 52 42 55 5f 49 44 58 5f 49 4e 53 45 52 54 20 6f  RBU_IDX_INSERT o
179b0 72 0a 2a 2a 20 52 42 55 5f 49 44 58 5f 44 45 4c  r.** RBU_IDX_DEL
179c0 45 54 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ETE. This functi
179d0 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20  on performs the 
179e0 77 6f 72 6b 20 6f 66 20 61 20 73 69 6e 67 6c 65  work of a single
179f0 0a 2a 2a 20 73 71 6c 69 74 65 33 72 62 75 5f 73  .** sqlite3rbu_s
17a00 74 65 70 28 29 20 63 61 6c 6c 20 66 6f 72 20 74  tep() call for t
17a10 68 65 20 74 79 70 65 20 6f 66 20 6f 70 65 72 61  he type of opera
17a20 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20 62  tion specified b
17a30 79 20 65 54 79 70 65 2e 0a 2a 2f 0a 73 74 61 74  y eType..*/.stat
17a40 69 63 20 76 6f 69 64 20 72 62 75 53 74 65 70 4f  ic void rbuStepO
17a50 6e 65 4f 70 28 73 71 6c 69 74 65 33 72 62 75 20  neOp(sqlite3rbu 
17a60 2a 70 2c 20 69 6e 74 20 65 54 79 70 65 29 7b 0a  *p, int eType){.
17a70 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49    RbuObjIter *pI
17a80 74 65 72 20 3d 20 26 70 2d 3e 6f 62 6a 69 74 65  ter = &p->objite
17a90 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  r;.  sqlite3_val
17aa0 75 65 20 2a 70 56 61 6c 3b 0a 20 20 73 71 6c 69  ue *pVal;.  sqli
17ab0 74 65 33 5f 73 74 6d 74 20 2a 70 57 72 69 74 65  te3_stmt *pWrite
17ac0 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61  r;.  int i;..  a
17ad0 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
17ae0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73  LITE_OK );.  ass
17af0 65 72 74 28 20 65 54 79 70 65 21 3d 52 42 55 5f  ert( eType!=RBU_
17b00 44 45 4c 45 54 45 20 7c 7c 20 70 49 74 65 72 2d  DELETE || pIter-
17b10 3e 7a 49 64 78 3d 3d 30 20 29 3b 0a 20 20 61 73  >zIdx==0 );.  as
17b20 73 65 72 74 28 20 65 54 79 70 65 3d 3d 52 42 55  sert( eType==RBU
17b30 5f 44 45 4c 45 54 45 20 7c 7c 20 65 54 79 70 65  _DELETE || eType
17b40 3d 3d 52 42 55 5f 49 44 58 5f 44 45 4c 45 54 45  ==RBU_IDX_DELETE
17b50 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  .       || eType
17b60 3d 3d 52 42 55 5f 49 4e 53 45 52 54 20 7c 7c 20  ==RBU_INSERT || 
17b70 65 54 79 70 65 3d 3d 52 42 55 5f 49 44 58 5f 49  eType==RBU_IDX_I
17b80 4e 53 45 52 54 0a 20 20 29 3b 0a 0a 20 20 2f 2a  NSERT.  );..  /*
17b90 20 49 66 20 74 68 69 73 20 69 73 20 61 20 64 65   If this is a de
17ba0 6c 65 74 65 2c 20 64 65 63 72 65 6d 65 6e 74 20  lete, decrement 
17bb0 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20 62 79  nPhaseOneStep by
17bc0 20 6e 49 6e 64 65 78 2e 20 49 66 20 74 68 65 20   nIndex. If the 
17bd0 44 45 4c 45 54 45 0a 20 20 2a 2a 20 73 74 61 74  DELETE.  ** stat
17be0 65 6d 65 6e 74 20 62 65 6c 6f 77 20 64 6f 65 73  ement below does
17bf0 20 61 63 74 75 61 6c 6c 79 20 64 65 6c 65 74 65   actually delete
17c00 20 61 20 72 6f 77 2c 20 6e 50 68 61 73 65 4f 6e   a row, nPhaseOn
17c10 65 53 74 65 70 20 77 69 6c 6c 20 62 65 0a 20 20  eStep will be.  
17c20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62  ** incremented b
17c30 79 20 74 68 65 20 73 61 6d 65 20 61 6d 6f 75 6e  y the same amoun
17c40 74 20 77 68 65 6e 20 53 51 4c 20 66 75 6e 63 74  t when SQL funct
17c50 69 6f 6e 20 72 62 75 5f 74 6d 70 5f 69 6e 73 65  ion rbu_tmp_inse
17c60 72 74 28 29 0a 20 20 2a 2a 20 69 73 20 69 6e 76  rt().  ** is inv
17c70 6f 6b 65 64 20 62 79 20 74 68 65 20 74 72 69 67  oked by the trig
17c80 67 65 72 2e 20 20 2a 2f 0a 20 20 69 66 28 20 65  ger.  */.  if( e
17c90 54 79 70 65 3d 3d 52 42 55 5f 44 45 4c 45 54 45  Type==RBU_DELETE
17ca0 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 50 68 61 73   ){.    p->nPhas
17cb0 65 4f 6e 65 53 74 65 70 20 2d 3d 20 70 2d 3e 6f  eOneStep -= p->o
17cc0 62 6a 69 74 65 72 2e 6e 49 6e 64 65 78 3b 0a 20  bjiter.nIndex;. 
17cd0 20 7d 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d   }..  if( eType=
17ce0 3d 52 42 55 5f 49 44 58 5f 44 45 4c 45 54 45 20  =RBU_IDX_DELETE 
17cf0 7c 7c 20 65 54 79 70 65 3d 3d 52 42 55 5f 44 45  || eType==RBU_DE
17d00 4c 45 54 45 20 29 7b 0a 20 20 20 20 70 57 72 69  LETE ){.    pWri
17d10 74 65 72 20 3d 20 70 49 74 65 72 2d 3e 70 44 65  ter = pIter->pDe
17d20 6c 65 74 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  lete;.  }else{. 
17d30 20 20 20 70 57 72 69 74 65 72 20 3d 20 70 49 74     pWriter = pIt
17d40 65 72 2d 3e 70 49 6e 73 65 72 74 3b 0a 20 20 7d  er->pInsert;.  }
17d50 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ..  for(i=0; i<p
17d60 49 74 65 72 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  Iter->nCol; i++)
17d70 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  {.    /* If this
17d80 20 69 73 20 61 6e 20 49 4e 53 45 52 54 20 69 6e   is an INSERT in
17d90 74 6f 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65  to a table b-tre
17da0 65 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20  e and the table 
17db0 68 61 73 20 61 6e 0a 20 20 20 20 2a 2a 20 65 78  has an.    ** ex
17dc0 70 6c 69 63 69 74 20 49 4e 54 45 47 45 52 20 50  plicit INTEGER P
17dd0 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 68 65 63  RIMARY KEY, chec
17de0 6b 20 74 68 61 74 20 74 68 69 73 20 69 73 20 6e  k that this is n
17df0 6f 74 20 61 6e 20 61 74 74 65 6d 70 74 0a 20 20  ot an attempt.  
17e00 20 20 2a 2a 20 74 6f 20 77 72 69 74 65 20 61 20    ** to write a 
17e10 4e 55 4c 4c 20 69 6e 74 6f 20 74 68 65 20 49 50  NULL into the IP
17e20 4b 20 63 6f 6c 75 6d 6e 2e 20 54 68 61 74 20 69  K column. That i
17e30 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e  s not permitted.
17e40 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 54 79    */.    if( eTy
17e50 70 65 3d 3d 52 42 55 5f 49 4e 53 45 52 54 20 0a  pe==RBU_INSERT .
17e60 20 20 20 20 20 26 26 20 70 49 74 65 72 2d 3e 7a       && pIter->z
17e70 49 64 78 3d 3d 30 20 26 26 20 70 49 74 65 72 2d  Idx==0 && pIter-
17e80 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 49  >eType==RBU_PK_I
17e90 50 4b 20 26 26 20 70 49 74 65 72 2d 3e 61 62 54  PK && pIter->abT
17ea0 62 6c 50 6b 5b 69 5d 20 0a 20 20 20 20 20 26 26  blPk[i] .     &&
17eb0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
17ec0 74 79 70 65 28 70 49 74 65 72 2d 3e 70 53 65 6c  type(pIter->pSel
17ed0 65 63 74 2c 20 69 29 3d 3d 53 51 4c 49 54 45 5f  ect, i)==SQLITE_
17ee0 4e 55 4c 4c 0a 20 20 20 20 29 7b 0a 20 20 20 20  NULL.    ){.    
17ef0 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
17f00 5f 4d 49 53 4d 41 54 43 48 3b 0a 20 20 20 20 20  _MISMATCH;.     
17f10 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71   p->zErrmsg = sq
17f20 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 64  lite3_mprintf("d
17f30 61 74 61 74 79 70 65 20 6d 69 73 6d 61 74 63 68  atatype mismatch
17f40 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
17f50 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
17f60 20 65 54 79 70 65 3d 3d 52 42 55 5f 44 45 4c 45   eType==RBU_DELE
17f70 54 45 20 26 26 20 70 49 74 65 72 2d 3e 61 62 54  TE && pIter->abT
17f80 62 6c 50 6b 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20  blPk[i]==0 ){.  
17f90 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
17fa0 20 20 7d 0a 0a 20 20 20 20 70 56 61 6c 20 3d 20    }..    pVal = 
17fb0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76  sqlite3_column_v
17fc0 61 6c 75 65 28 70 49 74 65 72 2d 3e 70 53 65 6c  alue(pIter->pSel
17fd0 65 63 74 2c 20 69 29 3b 0a 20 20 20 20 70 2d 3e  ect, i);.    p->
17fe0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  rc = sqlite3_bin
17ff0 64 5f 76 61 6c 75 65 28 70 57 72 69 74 65 72 2c  d_value(pWriter,
18000 20 69 2b 31 2c 20 70 56 61 6c 29 3b 0a 20 20 20   i+1, pVal);.   
18010 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74   if( p->rc ) ret
18020 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  urn;.  }.  if( p
18030 49 74 65 72 2d 3e 7a 49 64 78 3d 3d 30 20 29 7b  Iter->zIdx==0 ){
18040 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
18050 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 56 54  eType==RBU_PK_VT
18060 41 42 20 0a 20 20 20 20 20 7c 7c 20 70 49 74 65  AB .     || pIte
18070 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
18080 5f 4e 4f 4e 45 20 0a 20 20 20 20 20 7c 7c 20 28  _NONE .     || (
18090 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
180a0 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 26 26  U_PK_EXTERNAL &&
180b0 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 29 29   rbuIsVacuum(p))
180c0 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f   .    ){.      /
180d0 2a 20 46 6f 72 20 61 20 76 69 72 74 75 61 6c 20  * For a virtual 
180e0 74 61 62 6c 65 2c 20 6f 72 20 61 20 74 61 62 6c  table, or a tabl
180f0 65 20 77 69 74 68 20 6e 6f 20 70 72 69 6d 61 72  e with no primar
18100 79 20 6b 65 79 2c 20 74 68 65 20 0a 20 20 20 20  y key, the .    
18110 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74    ** SELECT stat
18120 65 6d 65 6e 74 20 69 73 3a 0a 20 20 20 20 20 20  ement is:.      
18130 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 53 45  **.      **   SE
18140 4c 45 43 54 20 3c 63 6f 6c 73 3e 2c 20 72 62 75  LECT <cols>, rbu
18150 5f 63 6f 6e 74 72 6f 6c 2c 20 72 62 75 5f 72 6f  _control, rbu_ro
18160 77 69 64 20 46 52 4f 4d 20 2e 2e 2e 2e 0a 20 20  wid FROM .....  
18170 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
18180 48 65 6e 63 65 20 63 6f 6c 75 6d 6e 5f 76 61 6c  Hence column_val
18190 75 65 28 70 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31  ue(pIter->nCol+1
181a0 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  )..      */.    
181b0 20 20 61 73 73 65 72 74 43 6f 6c 75 6d 6e 4e 61    assertColumnNa
181c0 6d 65 28 70 49 74 65 72 2d 3e 70 53 65 6c 65 63  me(pIter->pSelec
181d0 74 2c 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31  t, pIter->nCol+1
181e0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 72 62 75  , .          rbu
181f0 49 73 56 61 63 75 75 6d 28 70 29 20 3f 20 22 72  IsVacuum(p) ? "r
18200 6f 77 69 64 22 20 3a 20 22 72 62 75 5f 72 6f 77  owid" : "rbu_row
18210 69 64 22 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  id".      );.   
18220 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65     pVal = sqlite
18230 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70  3_column_value(p
18240 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 2c 20 70  Iter->pSelect, p
18250 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31 29 3b 0a 20  Iter->nCol+1);. 
18260 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c       p->rc = sql
18270 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28  ite3_bind_value(
18280 70 57 72 69 74 65 72 2c 20 70 49 74 65 72 2d 3e  pWriter, pIter->
18290 6e 43 6f 6c 2b 31 2c 20 70 56 61 6c 29 3b 0a 20  nCol+1, pVal);. 
182a0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
182b0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
182c0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
182d0 74 65 70 28 70 57 72 69 74 65 72 29 3b 0a 20 20  tep(pWriter);.  
182e0 20 20 70 2d 3e 72 63 20 3d 20 72 65 73 65 74 41    p->rc = resetA
182f0 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70  ndCollectError(p
18300 57 72 69 74 65 72 2c 20 26 70 2d 3e 7a 45 72 72  Writer, &p->zErr
18310 6d 73 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  msg);.  }.}../*.
18320 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
18330 20 64 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 66   does the work f
18340 6f 72 20 61 6e 20 73 71 6c 69 74 65 33 72 62 75  or an sqlite3rbu
18350 5f 73 74 65 70 28 29 20 63 61 6c 6c 2e 0a 2a 2a  _step() call..**
18360 0a 2a 2a 20 54 68 65 20 6f 62 6a 65 63 74 2d 69  .** The object-i
18370 74 65 72 61 74 6f 72 20 28 70 2d 3e 6f 62 6a 69  terator (p->obji
18380 74 65 72 29 20 63 75 72 72 65 6e 74 6c 79 20 70  ter) currently p
18390 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 69 64  oints to a valid
183a0 20 6f 62 6a 65 63 74 2c 0a 2a 2a 20 61 6e 64 20   object,.** and 
183b0 74 68 65 20 69 6e 70 75 74 20 63 75 72 73 6f 72  the input cursor
183c0 20 28 70 2d 3e 6f 62 6a 69 74 65 72 2e 70 53 65   (p->objiter.pSe
183d0 6c 65 63 74 29 20 63 75 72 72 65 6e 74 6c 79 20  lect) currently 
183e0 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 69  points to a vali
183f0 64 0a 2a 2a 20 69 6e 70 75 74 20 72 6f 77 2e 20  d.** input row. 
18400 50 65 72 66 6f 72 6d 20 77 68 61 74 65 76 65 72  Perform whatever
18410 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20 72   processing is r
18420 65 71 75 69 72 65 64 20 61 6e 64 20 72 65 74 75  equired and retu
18430 72 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20  rn..**.** If no 
18440 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53   error occurs, S
18450 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
18460 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
18470 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a   an error code.*
18480 2a 20 61 6e 64 20 6d 65 73 73 61 67 65 20 69 73  * and message is
18490 20 6c 65 66 74 20 69 6e 20 74 68 65 20 52 42 55   left in the RBU
184a0 20 68 61 6e 64 6c 65 20 61 6e 64 20 61 20 63 6f   handle and a co
184b0 70 79 20 6f 66 20 74 68 65 20 65 72 72 6f 72 20  py of the error 
184c0 63 6f 64 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64  code.** returned
184d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
184e0 72 62 75 53 74 65 70 28 73 71 6c 69 74 65 33 72  rbuStep(sqlite3r
184f0 62 75 20 2a 70 29 7b 0a 20 20 52 62 75 4f 62 6a  bu *p){.  RbuObj
18500 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70  Iter *pIter = &p
18510 2d 3e 6f 62 6a 69 74 65 72 3b 0a 20 20 63 6f 6e  ->objiter;.  con
18520 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 6b 20 3d  st char *zMask =
18530 20 30 3b 0a 20 20 69 6e 74 20 65 54 79 70 65 20   0;.  int eType 
18540 3d 20 72 62 75 53 74 65 70 54 79 70 65 28 70 2c  = rbuStepType(p,
18550 20 26 7a 4d 61 73 6b 29 3b 0a 0a 20 20 69 66 28   &zMask);..  if(
18560 20 65 54 79 70 65 20 29 7b 0a 20 20 20 20 61 73   eType ){.    as
18570 73 65 72 74 28 20 65 54 79 70 65 3d 3d 52 42 55  sert( eType==RBU
18580 5f 49 4e 53 45 52 54 20 20 20 20 20 7c 7c 20 65  _INSERT     || e
18590 54 79 70 65 3d 3d 52 42 55 5f 44 45 4c 45 54 45  Type==RBU_DELETE
185a0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 65 54 79  .         || eTy
185b0 70 65 3d 3d 52 42 55 5f 52 45 50 4c 41 43 45 20  pe==RBU_REPLACE 
185c0 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 52 42 55     || eType==RBU
185d0 5f 49 44 58 5f 44 45 4c 45 54 45 0a 20 20 20 20  _IDX_DELETE.    
185e0 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 52       || eType==R
185f0 42 55 5f 49 44 58 5f 49 4e 53 45 52 54 20 7c 7c  BU_IDX_INSERT ||
18600 20 65 54 79 70 65 3d 3d 52 42 55 5f 55 50 44 41   eType==RBU_UPDA
18610 54 45 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73  TE.    );.    as
18620 73 65 72 74 28 20 65 54 79 70 65 21 3d 52 42 55  sert( eType!=RBU
18630 5f 55 50 44 41 54 45 20 7c 7c 20 70 49 74 65 72  _UPDATE || pIter
18640 2d 3e 7a 49 64 78 3d 3d 30 20 29 3b 0a 0a 20 20  ->zIdx==0 );..  
18650 20 20 69 66 28 20 70 49 74 65 72 2d 3e 7a 49 64    if( pIter->zId
18660 78 3d 3d 30 20 26 26 20 28 65 54 79 70 65 3d 3d  x==0 && (eType==
18670 52 42 55 5f 49 44 58 5f 44 45 4c 45 54 45 20 7c  RBU_IDX_DELETE |
18680 7c 20 65 54 79 70 65 3d 3d 52 42 55 5f 49 44 58  | eType==RBU_IDX
18690 5f 49 4e 53 45 52 54 29 20 29 7b 0a 20 20 20 20  _INSERT) ){.    
186a0 20 20 72 62 75 42 61 64 43 6f 6e 74 72 6f 6c 45    rbuBadControlE
186b0 72 72 6f 72 28 70 29 3b 0a 20 20 20 20 7d 0a 20  rror(p);.    }. 
186c0 20 20 20 65 6c 73 65 20 69 66 28 20 65 54 79 70     else if( eTyp
186d0 65 3d 3d 52 42 55 5f 52 45 50 4c 41 43 45 20 29  e==RBU_REPLACE )
186e0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  {.      if( pIte
186f0 72 2d 3e 7a 49 64 78 3d 3d 30 20 29 7b 0a 20 20  r->zIdx==0 ){.  
18700 20 20 20 20 20 20 70 2d 3e 6e 50 68 61 73 65 4f        p->nPhaseO
18710 6e 65 53 74 65 70 20 2b 3d 20 70 2d 3e 6f 62 6a  neStep += p->obj
18720 69 74 65 72 2e 6e 49 6e 64 65 78 3b 0a 20 20 20  iter.nIndex;.   
18730 20 20 20 20 20 72 62 75 53 74 65 70 4f 6e 65 4f       rbuStepOneO
18740 70 28 70 2c 20 52 42 55 5f 44 45 4c 45 54 45 29  p(p, RBU_DELETE)
18750 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18760 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
18770 45 5f 4f 4b 20 29 20 72 62 75 53 74 65 70 4f 6e  E_OK ) rbuStepOn
18780 65 4f 70 28 70 2c 20 52 42 55 5f 49 4e 53 45 52  eOp(p, RBU_INSER
18790 54 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c  T);.    }.    el
187a0 73 65 20 69 66 28 20 65 54 79 70 65 21 3d 52 42  se if( eType!=RB
187b0 55 5f 55 50 44 41 54 45 20 29 7b 0a 20 20 20 20  U_UPDATE ){.    
187c0 20 20 72 62 75 53 74 65 70 4f 6e 65 4f 70 28 70    rbuStepOneOp(p
187d0 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 7d 0a  , eType);.    }.
187e0 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
187f0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
18800 56 61 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Val;.      sqlit
18810 65 33 5f 73 74 6d 74 20 2a 70 55 70 64 61 74 65  e3_stmt *pUpdate
18820 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
18830 72 74 28 20 65 54 79 70 65 3d 3d 52 42 55 5f 55  rt( eType==RBU_U
18840 50 44 41 54 45 20 29 3b 0a 20 20 20 20 20 20 70  PDATE );.      p
18850 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20  ->nPhaseOneStep 
18860 2d 3d 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 6e 49  -= p->objiter.nI
18870 6e 64 65 78 3b 0a 20 20 20 20 20 20 72 62 75 47  ndex;.      rbuG
18880 65 74 55 70 64 61 74 65 53 74 6d 74 28 70 2c 20  etUpdateStmt(p, 
18890 70 49 74 65 72 2c 20 7a 4d 61 73 6b 2c 20 26 70  pIter, zMask, &p
188a0 55 70 64 61 74 65 29 3b 0a 20 20 20 20 20 20 69  Update);.      i
188b0 66 28 20 70 55 70 64 61 74 65 20 29 7b 0a 20 20  f( pUpdate ){.  
188c0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
188d0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d       for(i=0; p-
188e0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
188f0 26 20 69 3c 70 49 74 65 72 2d 3e 6e 43 6f 6c 3b  & i<pIter->nCol;
18900 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
18910 20 63 68 61 72 20 63 20 3d 20 7a 4d 61 73 6b 5b   char c = zMask[
18920 70 49 74 65 72 2d 3e 61 69 53 72 63 4f 72 64 65  pIter->aiSrcOrde
18930 72 5b 69 5d 5d 3b 0a 20 20 20 20 20 20 20 20 20  r[i]];.         
18940 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f   pVal = sqlite3_
18950 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 49 74  column_value(pIt
18960 65 72 2d 3e 70 53 65 6c 65 63 74 2c 20 69 29 3b  er->pSelect, i);
18970 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
18980 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 5d  Iter->abTblPk[i]
18990 20 7c 7c 20 63 21 3d 27 2e 27 20 29 7b 0a 20 20   || c!='.' ){.  
189a0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
189b0 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76  = sqlite3_bind_v
189c0 61 6c 75 65 28 70 55 70 64 61 74 65 2c 20 69 2b  alue(pUpdate, i+
189d0 31 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20 20 20  1, pVal);.      
189e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
189f0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
18a00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20  c==SQLITE_OK .  
18a10 20 20 20 20 20 20 20 26 26 20 28 70 49 74 65 72         && (pIter
18a20 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
18a30 56 54 41 42 20 7c 7c 20 70 49 74 65 72 2d 3e 65  VTAB || pIter->e
18a40 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e  Type==RBU_PK_NON
18a50 45 29 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  E) .        ){. 
18a60 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 6e 64           /* Bind
18a70 20 74 68 65 20 72 62 75 5f 72 6f 77 69 64 20 76   the rbu_rowid v
18a80 61 6c 75 65 20 74 6f 20 63 6f 6c 75 6d 6e 20 5f  alue to column _
18a90 72 6f 77 69 64 5f 20 2a 2f 0a 20 20 20 20 20 20  rowid_ */.      
18aa0 20 20 20 20 61 73 73 65 72 74 43 6f 6c 75 6d 6e      assertColumn
18ab0 4e 61 6d 65 28 70 49 74 65 72 2d 3e 70 53 65 6c  Name(pIter->pSel
18ac0 65 63 74 2c 20 70 49 74 65 72 2d 3e 6e 43 6f 6c  ect, pIter->nCol
18ad0 2b 31 2c 20 22 72 62 75 5f 72 6f 77 69 64 22 29  +1, "rbu_rowid")
18ae0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 6c  ;.          pVal
18af0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
18b00 6e 5f 76 61 6c 75 65 28 70 49 74 65 72 2d 3e 70  n_value(pIter->p
18b10 53 65 6c 65 63 74 2c 20 70 49 74 65 72 2d 3e 6e  Select, pIter->n
18b20 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  Col+1);.        
18b30 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
18b40 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70 55 70  3_bind_value(pUp
18b50 64 61 74 65 2c 20 70 49 74 65 72 2d 3e 6e 43 6f  date, pIter->nCo
18b60 6c 2b 31 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20  l+1, pVal);.    
18b70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
18b80 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
18b90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
18ba0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 55 70  sqlite3_step(pUp
18bb0 64 61 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20  date);.         
18bc0 20 70 2d 3e 72 63 20 3d 20 72 65 73 65 74 41 6e   p->rc = resetAn
18bd0 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 55  dCollectError(pU
18be0 70 64 61 74 65 2c 20 26 70 2d 3e 7a 45 72 72 6d  pdate, &p->zErrm
18bf0 73 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  sg);.        }. 
18c00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
18c10 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b  .  return p->rc;
18c20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d  .}../*.** Increm
18c30 65 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20 63  ent the schema c
18c40 6f 6f 6b 69 65 20 6f 66 20 74 68 65 20 6d 61 69  ookie of the mai
18c50 6e 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65  n database opene
18c60 64 20 62 79 20 70 2d 3e 64 62 4d 61 69 6e 2e 0a  d by p->dbMain..
18c70 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 69  **.** Or, if thi
18c80 73 20 69 73 20 61 6e 20 52 42 55 20 76 61 63 75  s is an RBU vacu
18c90 75 6d 2c 20 73 65 74 20 74 68 65 20 73 63 68 65  um, set the sche
18ca0 6d 61 20 63 6f 6f 6b 69 65 20 6f 66 20 74 68 65  ma cookie of the
18cb0 20 6d 61 69 6e 20 64 62 0a 2a 2a 20 6f 70 65 6e   main db.** open
18cc0 65 64 20 62 79 20 70 2d 3e 64 62 4d 61 69 6e 20  ed by p->dbMain 
18cd0 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e  to one more than
18ce0 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
18cf0 69 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 0a 2a  ie of the main.*
18d00 2a 20 64 62 20 6f 70 65 6e 65 64 20 62 79 20 70  * db opened by p
18d10 2d 3e 64 62 52 62 75 2e 0a 2a 2f 0a 73 74 61 74  ->dbRbu..*/.stat
18d20 69 63 20 76 6f 69 64 20 72 62 75 49 6e 63 72 53  ic void rbuIncrS
18d30 63 68 65 6d 61 43 6f 6f 6b 69 65 28 73 71 6c 69  chemaCookie(sqli
18d40 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 69 66  te3rbu *p){.  if
18d50 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
18d60 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
18d70 33 20 2a 64 62 72 65 61 64 20 3d 20 28 72 62 75  3 *dbread = (rbu
18d80 49 73 56 61 63 75 75 6d 28 70 29 20 3f 20 70 2d  IsVacuum(p) ? p-
18d90 3e 64 62 52 62 75 20 3a 20 70 2d 3e 64 62 4d 61  >dbRbu : p->dbMa
18da0 69 6e 29 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f  in);.    int iCo
18db0 6f 6b 69 65 20 3d 20 31 30 30 30 30 30 30 3b 0a  okie = 1000000;.
18dc0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
18dd0 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 20 20 70 2d   *pStmt;..    p-
18de0 3e 72 63 20 3d 20 70 72 65 70 61 72 65 41 6e 64  >rc = prepareAnd
18df0 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 64 62 72  CollectError(dbr
18e00 65 61 64 2c 20 26 70 53 74 6d 74 2c 20 26 70 2d  ead, &pStmt, &p-
18e10 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20  >zErrmsg, .     
18e20 20 20 20 22 50 52 41 47 4d 41 20 73 63 68 65 6d     "PRAGMA schem
18e30 61 5f 76 65 72 73 69 6f 6e 22 0a 20 20 20 20 29  a_version".    )
18e40 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  ;.    if( p->rc=
18e50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18e60 20 20 20 20 2f 2a 20 43 6f 76 65 72 61 67 65 3a      /* Coverage:
18e70 20 69 74 20 6d 61 79 20 62 65 20 74 68 61 74 20   it may be that 
18e80 74 68 69 73 20 73 71 6c 69 74 65 33 5f 73 74 65  this sqlite3_ste
18e90 70 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e  p() cannot fail.
18ea0 20 54 68 65 72 65 0a 20 20 20 20 20 20 2a 2a 20   There.      ** 
18eb0 69 73 20 61 6c 72 65 61 64 79 20 61 20 74 72 61  is already a tra
18ec0 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 73  nsaction open, s
18ed0 6f 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  o the prepared s
18ee0 74 61 74 65 6d 65 6e 74 20 63 61 6e 6e 6f 74 0a  tatement cannot.
18ef0 20 20 20 20 20 20 2a 2a 20 74 68 72 6f 77 20 61        ** throw a
18f00 6e 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 20  n SQLITE_SCHEMA 
18f10 65 78 63 65 70 74 69 6f 6e 2e 20 54 68 65 20 6f  exception. The o
18f20 6e 6c 79 20 64 61 74 61 62 61 73 65 20 70 61 67  nly database pag
18f30 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73  e the.      ** s
18f40 74 61 74 65 6d 65 6e 74 20 72 65 61 64 73 20 69  tatement reads i
18f50 73 20 70 61 67 65 20 31 2c 20 77 68 69 63 68 20  s page 1, which 
18f60 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
18f70 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65   be in the cache
18f80 2e 0a 20 20 20 20 20 20 2a 2a 20 41 6e 64 20 6e  ..      ** And n
18f90 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  o memory allocat
18fa0 69 6f 6e 73 20 61 72 65 20 72 65 71 75 69 72 65  ions are require
18fb0 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  d.  */.      if(
18fc0 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
18fd0 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
18fe0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43 6f 6f   ){.        iCoo
18ff0 6b 69 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  kie = sqlite3_co
19000 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20  lumn_int(pStmt, 
19010 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
19020 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c    rbuFinalize(p,
19030 20 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20   pStmt);.    }. 
19040 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
19050 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19060 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63 28   rbuMPrintfExec(
19070 70 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 50  p, p->dbMain, "P
19080 52 41 47 4d 41 20 73 63 68 65 6d 61 5f 76 65 72  RAGMA schema_ver
19090 73 69 6f 6e 20 3d 20 25 64 22 2c 20 69 43 6f 6f  sion = %d", iCoo
190a0 6b 69 65 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20  kie+1);.    }.  
190b0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74  }.}../*.** Updat
190c0 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
190d0 66 20 74 68 65 20 72 62 75 5f 73 74 61 74 65 20  f the rbu_state 
190e0 74 61 62 6c 65 20 77 69 74 68 69 6e 20 74 68 65  table within the
190f0 20 72 62 75 20 64 61 74 61 62 61 73 65 2e 20 54   rbu database. T
19100 68 65 0a 2a 2a 20 76 61 6c 75 65 20 73 74 6f 72  he.** value stor
19110 65 64 20 69 6e 20 74 68 65 20 52 42 55 5f 53 54  ed in the RBU_ST
19120 41 54 45 5f 53 54 41 47 45 20 63 6f 6c 75 6d 6e  ATE_STAGE column
19130 20 69 73 20 65 53 74 61 67 65 2e 20 41 6c 6c 20   is eStage. All 
19140 6f 74 68 65 72 20 76 61 6c 75 65 73 0a 2a 2a 20  other values.** 
19150 61 72 65 20 64 65 74 65 72 6d 69 6e 65 64 20 62  are determined b
19160 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65  y inspecting the
19170 20 72 62 75 20 68 61 6e 64 6c 65 20 70 61 73 73   rbu handle pass
19180 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
19190 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
191a0 74 69 63 20 76 6f 69 64 20 72 62 75 53 61 76 65  tic void rbuSave
191b0 53 74 61 74 65 28 73 71 6c 69 74 65 33 72 62 75  State(sqlite3rbu
191c0 20 2a 70 2c 20 69 6e 74 20 65 53 74 61 67 65 29   *p, int eStage)
191d0 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
191e0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72  QLITE_OK || p->r
191f0 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
19200 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  {.    sqlite3_st
19210 6d 74 20 2a 70 49 6e 73 65 72 74 20 3d 20 30 3b  mt *pInsert = 0;
19220 0a 20 20 20 20 72 62 75 5f 66 69 6c 65 20 2a 70  .    rbu_file *p
19230 46 64 20 3d 20 28 72 62 75 49 73 56 61 63 75 75  Fd = (rbuIsVacuu
19240 6d 28 70 29 20 3f 20 70 2d 3e 70 52 62 75 46 64  m(p) ? p->pRbuFd
19250 20 3a 20 70 2d 3e 70 54 61 72 67 65 74 46 64 29   : p->pTargetFd)
19260 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ;.    int rc;.. 
19270 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a 45     assert( p->zE
19280 72 72 6d 73 67 3d 3d 30 20 29 3b 0a 20 20 20 20  rrmsg==0 );.    
19290 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65  rc = prepareFree
192a0 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
192b0 70 2d 3e 64 62 52 62 75 2c 20 26 70 49 6e 73 65  p->dbRbu, &pInse
192c0 72 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c  rt, &p->zErrmsg,
192d0 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
192e0 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
192f0 20 20 20 20 20 22 49 4e 53 45 52 54 20 4f 52 20       "INSERT OR 
19300 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 25 73 2e  REPLACE INTO %s.
19310 72 62 75 5f 73 74 61 74 65 28 6b 2c 20 76 29 20  rbu_state(k, v) 
19320 56 41 4c 55 45 53 20 22 0a 20 20 20 20 20 20 20  VALUES ".       
19330 20 20 20 22 28 25 64 2c 20 25 64 29 2c 20 22 0a     "(%d, %d), ".
19340 20 20 20 20 20 20 20 20 20 20 22 28 25 64 2c 20            "(%d, 
19350 25 51 29 2c 20 22 0a 20 20 20 20 20 20 20 20 20  %Q), ".         
19360 20 22 28 25 64 2c 20 25 51 29 2c 20 22 0a 20 20   "(%d, %Q), ".  
19370 20 20 20 20 20 20 20 20 22 28 25 64 2c 20 25 64          "(%d, %d
19380 29 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 22  ), ".          "
19390 28 25 64 2c 20 25 64 29 2c 20 22 0a 20 20 20 20  (%d, %d), ".    
193a0 20 20 20 20 20 20 22 28 25 64 2c 20 25 6c 6c 64        "(%d, %lld
193b0 29 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 22  ), ".          "
193c0 28 25 64 2c 20 25 6c 6c 64 29 2c 20 22 0a 20 20  (%d, %lld), ".  
193d0 20 20 20 20 20 20 20 20 22 28 25 64 2c 20 25 6c          "(%d, %l
193e0 6c 64 29 2c 20 22 0a 20 20 20 20 20 20 20 20 20  ld), ".         
193f0 20 22 28 25 64 2c 20 25 6c 6c 64 29 2c 20 22 0a   "(%d, %lld), ".
19400 20 20 20 20 20 20 20 20 20 20 22 28 25 64 2c 20            "(%d, 
19410 25 51 29 20 20 22 2c 0a 20 20 20 20 20 20 20 20  %Q)  ",.        
19420 20 20 70 2d 3e 7a 53 74 61 74 65 44 62 2c 0a 20    p->zStateDb,. 
19430 20 20 20 20 20 20 20 20 20 52 42 55 5f 53 54 41           RBU_STA
19440 54 45 5f 53 54 41 47 45 2c 20 65 53 74 61 67 65  TE_STAGE, eStage
19450 2c 0a 20 20 20 20 20 20 20 20 20 20 52 42 55 5f  ,.          RBU_
19460 53 54 41 54 45 5f 54 42 4c 2c 20 70 2d 3e 6f 62  STATE_TBL, p->ob
19470 6a 69 74 65 72 2e 7a 54 62 6c 2c 20 0a 20 20 20  jiter.zTbl, .   
19480 20 20 20 20 20 20 20 52 42 55 5f 53 54 41 54 45         RBU_STATE
19490 5f 49 44 58 2c 20 70 2d 3e 6f 62 6a 69 74 65 72  _IDX, p->objiter
194a0 2e 7a 49 64 78 2c 20 0a 20 20 20 20 20 20 20 20  .zIdx, .        
194b0 20 20 52 42 55 5f 53 54 41 54 45 5f 52 4f 57 2c    RBU_STATE_ROW,
194c0 20 70 2d 3e 6e 53 74 65 70 2c 20 0a 20 20 20 20   p->nStep, .    
194d0 20 20 20 20 20 20 52 42 55 5f 53 54 41 54 45 5f        RBU_STATE_
194e0 50 52 4f 47 52 45 53 53 2c 20 70 2d 3e 6e 50 72  PROGRESS, p->nPr
194f0 6f 67 72 65 73 73 2c 0a 20 20 20 20 20 20 20 20  ogress,.        
19500 20 20 52 42 55 5f 53 54 41 54 45 5f 43 4b 50 54    RBU_STATE_CKPT
19510 2c 20 70 2d 3e 69 57 61 6c 43 6b 73 75 6d 2c 0a  , p->iWalCksum,.
19520 20 20 20 20 20 20 20 20 20 20 52 42 55 5f 53 54            RBU_ST
19530 41 54 45 5f 43 4f 4f 4b 49 45 2c 20 28 69 36 34  ATE_COOKIE, (i64
19540 29 70 46 64 2d 3e 69 43 6f 6f 6b 69 65 2c 0a 20  )pFd->iCookie,. 
19550 20 20 20 20 20 20 20 20 20 52 42 55 5f 53 54 41           RBU_STA
19560 54 45 5f 4f 41 4c 53 5a 2c 20 70 2d 3e 69 4f 61  TE_OALSZ, p->iOa
19570 6c 53 7a 2c 0a 20 20 20 20 20 20 20 20 20 20 52  lSz,.          R
19580 42 55 5f 53 54 41 54 45 5f 50 48 41 53 45 4f 4e  BU_STATE_PHASEON
19590 45 53 54 45 50 2c 20 70 2d 3e 6e 50 68 61 73 65  ESTEP, p->nPhase
195a0 4f 6e 65 53 74 65 70 2c 0a 20 20 20 20 20 20 20  OneStep,.       
195b0 20 20 20 52 42 55 5f 53 54 41 54 45 5f 44 41 54     RBU_STATE_DAT
195c0 41 54 42 4c 2c 20 70 2d 3e 6f 62 6a 69 74 65 72  ATBL, p->objiter
195d0 2e 7a 44 61 74 61 54 62 6c 0a 20 20 20 20 20 20  .zDataTbl.      
195e0 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73  ).    );.    ass
195f0 65 72 74 28 20 70 49 6e 73 65 72 74 3d 3d 30 20  ert( pInsert==0 
19600 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  || rc==SQLITE_OK
19610 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d   );..    if( rc=
19620 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19630 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70      sqlite3_step
19640 28 70 49 6e 73 65 72 74 29 3b 0a 20 20 20 20 20  (pInsert);.     
19650 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
19660 6e 61 6c 69 7a 65 28 70 49 6e 73 65 72 74 29 3b  nalize(pInsert);
19670 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
19680 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70  c!=SQLITE_OK ) p
19690 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 7d  ->rc = rc;.  }.}
196a0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63  .../*.** The sec
196b0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 70 61 73  ond argument pas
196c0 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
196d0 74 69 6f 6e 20 69 73 20 74 68 65 20 6e 61 6d 65  tion is the name
196e0 20 6f 66 20 61 20 50 52 41 47 4d 41 20 0a 2a 2a   of a PRAGMA .**
196f0 20 73 65 74 74 69 6e 67 20 2d 20 22 70 61 67 65   setting - "page
19700 5f 73 69 7a 65 22 2c 20 22 61 75 74 6f 5f 76 61  _size", "auto_va
19710 63 75 75 6d 22 2c 20 22 75 73 65 72 5f 76 65 72  cuum", "user_ver
19720 73 69 6f 6e 22 20 6f 72 20 22 61 70 70 6c 69 63  sion" or "applic
19730 61 74 69 6f 6e 5f 69 64 22 2e 0a 2a 2a 20 54 68  ation_id"..** Th
19740 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 78 65 63  is function exec
19750 75 74 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  utes the followi
19760 6e 67 20 6f 6e 20 73 71 6c 69 74 65 33 72 62 75  ng on sqlite3rbu
19770 2e 64 62 52 62 75 3a 0a 2a 2a 0a 2a 2a 20 20 20  .dbRbu:.**.**   
19780 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 24 7a 50  "PRAGMA main.$zP
19790 72 61 67 6d 61 22 0a 2a 2a 0a 2a 2a 20 77 68 65  ragma".**.** whe
197a0 72 65 20 24 7a 50 72 61 67 6d 61 20 69 73 20 74  re $zPragma is t
197b0 68 65 20 73 74 72 69 6e 67 20 70 61 73 73 65 64  he string passed
197c0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
197d0 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e 0a 2a 2a  rgument, then.**
197e0 20 6f 6e 20 73 71 6c 69 74 65 33 72 62 75 2e 64   on sqlite3rbu.d
197f0 62 4d 61 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 22  bMain:.**.**   "
19800 50 52 41 47 4d 41 20 6d 61 69 6e 2e 24 7a 50 72  PRAGMA main.$zPr
19810 61 67 6d 61 20 3d 20 24 76 61 6c 22 0a 2a 2a 0a  agma = $val".**.
19820 2a 2a 20 77 68 65 72 65 20 24 76 61 6c 20 69 73  ** where $val is
19830 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
19840 6e 65 64 20 62 79 20 74 68 65 20 66 69 72 73 74  ned by the first
19850 20 50 52 41 47 4d 41 20 69 6e 76 6f 63 61 74 69   PRAGMA invocati
19860 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 73 68 6f  on..**.** In sho
19870 72 74 2c 20 69 74 20 63 6f 70 69 65 73 20 74 68  rt, it copies th
19880 65 20 76 61 6c 75 65 20 20 6f 66 20 74 68 65 20  e value  of the 
19890 73 70 65 63 69 66 69 65 64 20 50 52 41 47 4d 41  specified PRAGMA
198a0 20 73 65 74 74 69 6e 67 20 66 72 6f 6d 0a 2a 2a   setting from.**
198b0 20 64 62 52 62 75 20 74 6f 20 64 62 4d 61 69 6e   dbRbu to dbMain
198c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
198d0 20 72 62 75 43 6f 70 79 50 72 61 67 6d 61 28 73   rbuCopyPragma(s
198e0 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 63 6f  qlite3rbu *p, co
198f0 6e 73 74 20 63 68 61 72 20 2a 7a 50 72 61 67 6d  nst char *zPragm
19900 61 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  a){.  if( p->rc=
19910 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19920 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
19930 70 50 72 61 67 6d 61 20 3d 20 30 3b 0a 20 20 20  pPragma = 0;.   
19940 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65   p->rc = prepare
19950 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  FreeAndCollectEr
19960 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20 26 70  ror(p->dbRbu, &p
19970 50 72 61 67 6d 61 2c 20 26 70 2d 3e 7a 45 72 72  Pragma, &p->zErr
19980 6d 73 67 2c 20 0a 20 20 20 20 20 20 20 20 73 71  msg, .        sq
19990 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50  lite3_mprintf("P
199a0 52 41 47 4d 41 20 6d 61 69 6e 2e 25 73 22 2c 20  RAGMA main.%s", 
199b0 7a 50 72 61 67 6d 61 29 0a 20 20 20 20 29 3b 0a  zPragma).    );.
199c0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
199d0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49  QLITE_OK && SQLI
199e0 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
199f0 73 74 65 70 28 70 50 72 61 67 6d 61 29 20 29 7b  step(pPragma) ){
19a00 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72  .      p->rc = r
19a10 62 75 4d 50 72 69 6e 74 66 45 78 65 63 28 70 2c  buMPrintfExec(p,
19a20 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 50 52 41   p->dbMain, "PRA
19a30 47 4d 41 20 6d 61 69 6e 2e 25 73 20 3d 20 25 64  GMA main.%s = %d
19a40 22 2c 0a 20 20 20 20 20 20 20 20 20 20 7a 50 72  ",.          zPr
19a50 61 67 6d 61 2c 20 73 71 6c 69 74 65 33 5f 63 6f  agma, sqlite3_co
19a60 6c 75 6d 6e 5f 69 6e 74 28 70 50 72 61 67 6d 61  lumn_int(pPragma
19a70 2c 20 30 29 0a 20 20 20 20 20 20 29 3b 0a 20 20  , 0).      );.  
19a80 20 20 7d 0a 20 20 20 20 72 62 75 46 69 6e 61 6c    }.    rbuFinal
19a90 69 7a 65 28 70 2c 20 70 50 72 61 67 6d 61 29 3b  ize(p, pPragma);
19aa0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
19ab0 65 20 52 42 55 20 68 61 6e 64 6c 65 20 70 61 73  e RBU handle pas
19ac0 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
19ad0 61 72 67 75 6d 65 6e 74 20 68 61 73 20 6a 75 73  argument has jus
19ae0 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 61 6e  t been opened an
19af0 64 20 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20  d .** the state 
19b00 64 61 74 61 62 61 73 65 20 69 73 20 65 6d 70 74  database is empt
19b10 79 2e 20 49 66 20 74 68 69 73 20 52 42 55 20 68  y. If this RBU h
19b20 61 6e 64 6c 65 20 77 61 73 20 6f 70 65 6e 65 64  andle was opened
19b30 20 66 6f 72 20 61 6e 0a 2a 2a 20 52 42 55 20 76   for an.** RBU v
19b40 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2c  acuum operation,
19b50 20 63 72 65 61 74 65 20 74 68 65 20 73 63 68 65   create the sche
19b60 6d 61 20 69 6e 20 74 68 65 20 74 61 72 67 65 74  ma in the target
19b70 20 64 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76   db..*/.static v
19b80 6f 69 64 20 72 62 75 43 72 65 61 74 65 54 61 72  oid rbuCreateTar
19b90 67 65 74 53 63 68 65 6d 61 28 73 71 6c 69 74 65  getSchema(sqlite
19ba0 33 72 62 75 20 2a 70 29 7b 0a 20 20 73 71 6c 69  3rbu *p){.  sqli
19bb0 74 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c 20 3d  te3_stmt *pSql =
19bc0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   0;.  sqlite3_st
19bd0 6d 74 20 2a 70 49 6e 73 65 72 74 20 3d 20 30 3b  mt *pInsert = 0;
19be0 0a 0a 20 20 61 73 73 65 72 74 28 20 72 62 75 49  ..  assert( rbuI
19bf0 73 56 61 63 75 75 6d 28 70 29 20 29 3b 0a 20 20  sVacuum(p) );.  
19c00 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
19c10 65 78 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  exec(p->dbMain, 
19c20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65  "PRAGMA writable
19c30 5f 73 63 68 65 6d 61 3d 31 22 2c 20 30 2c 30 2c  _schema=1", 0,0,
19c40 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20   &p->zErrmsg);. 
19c50 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
19c60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e  TE_OK ){.    p->
19c70 72 63 20 3d 20 70 72 65 70 61 72 65 41 6e 64 43  rc = prepareAndC
19c80 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64  ollectError(p->d
19c90 62 52 62 75 2c 20 26 70 53 71 6c 2c 20 26 70 2d  bRbu, &pSql, &p-
19ca0 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20  >zErrmsg, .     
19cb0 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f   "SELECT sql FRO
19cc0 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
19cd0 57 48 45 52 45 20 73 71 6c 21 3d 27 27 20 41 4e  WHERE sql!='' AN
19ce0 44 20 72 6f 6f 74 70 61 67 65 21 3d 30 22 0a 20  D rootpage!=0". 
19cf0 20 20 20 20 20 22 20 41 4e 44 20 6e 61 6d 65 21       " AND name!
19d00 3d 27 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  ='sqlite_sequenc
19d10 65 27 20 22 0a 20 20 20 20 20 20 22 20 4f 52 44  e' ".      " ORD
19d20 45 52 20 42 59 20 74 79 70 65 20 44 45 53 43 22  ER BY type DESC"
19d30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 77  .    );.  }..  w
19d40 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
19d50 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74 65  ITE_OK && sqlite
19d60 33 5f 73 74 65 70 28 70 53 71 6c 29 3d 3d 53 51  3_step(pSql)==SQ
19d70 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
19d80 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
19d90 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
19da0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
19db0 65 78 74 28 70 53 71 6c 2c 20 30 29 3b 0a 20 20  ext(pSql, 0);.  
19dc0 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
19dd0 33 5f 65 78 65 63 28 70 2d 3e 64 62 4d 61 69 6e  3_exec(p->dbMain
19de0 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 70  , zSql, 0, 0, &p
19df0 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 7d 0a  ->zErrmsg);.  }.
19e00 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c    rbuFinalize(p,
19e10 20 70 53 71 6c 29 3b 0a 20 20 69 66 28 20 70 2d   pSql);.  if( p-
19e20 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc!=SQLITE_OK )
19e30 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20   return;..  if( 
19e40 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
19e50 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
19e60 70 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63  prepareAndCollec
19e70 74 45 72 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c  tError(p->dbRbu,
19e80 20 26 70 53 71 6c 2c 20 26 70 2d 3e 7a 45 72 72   &pSql, &p->zErr
19e90 6d 73 67 2c 20 0a 20 20 20 20 20 20 20 20 22 53  msg, .        "S
19ea0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c  ELECT * FROM sql
19eb0 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45  ite_master WHERE
19ec0 20 72 6f 6f 74 70 61 67 65 3d 30 20 4f 52 20 72   rootpage=0 OR r
19ed0 6f 6f 74 70 61 67 65 20 49 53 20 4e 55 4c 4c 22  ootpage IS NULL"
19ee0 20 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20   .    );.  }..  
19ef0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
19f00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72  E_OK ){.    p->r
19f10 63 20 3d 20 70 72 65 70 61 72 65 41 6e 64 43 6f  c = prepareAndCo
19f20 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62  llectError(p->db
19f30 4d 61 69 6e 2c 20 26 70 49 6e 73 65 72 74 2c 20  Main, &pInsert, 
19f40 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20  &p->zErrmsg, .  
19f50 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e        "INSERT IN
19f60 54 4f 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  TO sqlite_master
19f70 20 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f 2c 3f 2c   VALUES(?,?,?,?,
19f80 3f 29 22 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a  ?)".    );.  }..
19f90 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
19fa0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c  SQLITE_OK && sql
19fb0 69 74 65 33 5f 73 74 65 70 28 70 53 71 6c 29 3d  ite3_step(pSql)=
19fc0 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
19fd0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
19fe0 72 28 69 3d 30 3b 20 69 3c 35 3b 20 69 2b 2b 29  r(i=0; i<5; i++)
19ff0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
1a000 62 69 6e 64 5f 76 61 6c 75 65 28 70 49 6e 73 65  bind_value(pInse
1a010 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65 33  rt, i+1, sqlite3
1a020 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 53  _column_value(pS
1a030 71 6c 2c 20 69 29 29 3b 0a 20 20 20 20 7d 0a 20  ql, i));.    }. 
1a040 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28     sqlite3_step(
1a050 70 49 6e 73 65 72 74 29 3b 0a 20 20 20 20 70 2d  pInsert);.    p-
1a060 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  >rc = sqlite3_re
1a070 73 65 74 28 70 49 6e 73 65 72 74 29 3b 0a 20 20  set(pInsert);.  
1a080 7d 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  }.  if( p->rc==S
1a090 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a0a0 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
1a0b0 65 78 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  exec(p->dbMain, 
1a0c0 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65  "PRAGMA writable
1a0d0 5f 73 63 68 65 6d 61 3d 30 22 2c 30 2c 30 2c 26  _schema=0",0,0,&
1a0e0 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 7d  p->zErrmsg);.  }
1a0f0 0a 0a 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28  ..  rbuFinalize(
1a100 70 2c 20 70 53 71 6c 29 3b 0a 20 20 72 62 75 46  p, pSql);.  rbuF
1a110 69 6e 61 6c 69 7a 65 28 70 2c 20 70 49 6e 73 65  inalize(p, pInse
1a120 72 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74  rt);.}../*.** St
1a130 65 70 20 74 68 65 20 52 42 55 20 6f 62 6a 65 63  ep the RBU objec
1a140 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
1a150 33 72 62 75 5f 73 74 65 70 28 73 71 6c 69 74 65  3rbu_step(sqlite
1a160 33 72 62 75 20 2a 70 29 7b 0a 20 20 69 66 28 20  3rbu *p){.  if( 
1a170 70 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28  p ){.    switch(
1a180 20 70 2d 3e 65 53 74 61 67 65 20 29 7b 0a 20 20   p->eStage ){.  
1a190 20 20 20 20 63 61 73 65 20 52 42 55 5f 53 54 41      case RBU_STA
1a1a0 47 45 5f 4f 41 4c 3a 20 7b 0a 20 20 20 20 20 20  GE_OAL: {.      
1a1b0 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49    RbuObjIter *pI
1a1c0 74 65 72 20 3d 20 26 70 2d 3e 6f 62 6a 69 74 65  ter = &p->objite
1a1d0 72 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 49  r;..        /* I
1a1e0 66 20 74 68 69 73 20 69 73 20 61 6e 20 52 42 55  f this is an RBU
1a1f0 20 76 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f   vacuum operatio
1a200 6e 20 61 6e 64 20 74 68 65 20 73 74 61 74 65 20  n and the state 
1a210 74 61 62 6c 65 20 77 61 73 20 65 6d 70 74 79 0a  table was empty.
1a220 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20          ** when 
1a230 74 68 69 73 20 68 61 6e 64 6c 65 20 77 61 73 20  this handle was 
1a240 6f 70 65 6e 65 64 2c 20 63 72 65 61 74 65 20 74  opened, create t
1a250 68 65 20 74 61 72 67 65 74 20 64 61 74 61 62 61  he target databa
1a260 73 65 20 73 63 68 65 6d 61 2e 20 2a 2f 0a 20 20  se schema. */.  
1a270 20 20 20 20 20 20 69 66 28 20 72 62 75 49 73 56        if( rbuIsV
1a280 61 63 75 75 6d 28 70 29 20 26 26 20 70 2d 3e 6e  acuum(p) && p->n
1a290 50 72 6f 67 72 65 73 73 3d 3d 30 20 26 26 20 70  Progress==0 && p
1a2a0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1a2b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 62 75  ){.          rbu
1a2c0 43 72 65 61 74 65 54 61 72 67 65 74 53 63 68 65  CreateTargetSche
1a2d0 6d 61 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ma(p);.         
1a2e0 20 72 62 75 43 6f 70 79 50 72 61 67 6d 61 28 70   rbuCopyPragma(p
1a2f0 2c 20 22 75 73 65 72 5f 76 65 72 73 69 6f 6e 22  , "user_version"
1a300 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 62 75  );.          rbu
1a310 43 6f 70 79 50 72 61 67 6d 61 28 70 2c 20 22 61  CopyPragma(p, "a
1a320 70 70 6c 69 63 61 74 69 6f 6e 5f 69 64 22 29 3b  pplication_id");
1a330 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1a340 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63      while( p->rc
1a350 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1a360 49 74 65 72 2d 3e 7a 54 62 6c 20 29 7b 0a 0a 20  Iter->zTbl ){.. 
1a370 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74           if( pIt
1a380 65 72 2d 3e 62 43 6c 65 61 6e 75 70 20 29 7b 0a  er->bCleanup ){.
1a390 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1a3a0 6c 65 61 6e 20 75 70 20 74 68 65 20 72 62 75 5f  lean up the rbu_
1a3b0 74 6d 70 5f 78 78 78 20 74 61 62 6c 65 20 66 6f  tmp_xxx table fo
1a3c0 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 74  r the previous t
1a3d0 61 62 6c 65 2e 20 49 74 20 0a 20 20 20 20 20 20  able. It .      
1a3e0 20 20 20 20 20 20 2a 2a 20 63 61 6e 6e 6f 74 20        ** cannot 
1a3f0 62 65 20 64 72 6f 70 70 65 64 20 61 73 20 74 68  be dropped as th
1a400 65 72 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c  ere are currentl
1a410 79 20 61 63 74 69 76 65 20 53 51 4c 20 73 74 61  y active SQL sta
1a420 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 20 20 20  tements..       
1a430 20 20 20 20 20 2a 2a 20 42 75 74 20 74 68 65 20       ** But the 
1a440 63 6f 6e 74 65 6e 74 73 20 63 61 6e 20 62 65 20  contents can be 
1a450 64 65 6c 65 74 65 64 2e 20 20 2a 2f 0a 20 20 20  deleted.  */.   
1a460 20 20 20 20 20 20 20 20 20 69 66 28 20 72 62 75           if( rbu
1a470 49 73 56 61 63 75 75 6d 28 70 29 3d 3d 30 20 26  IsVacuum(p)==0 &
1a480 26 20 70 49 74 65 72 2d 3e 61 62 49 6e 64 65 78  & pIter->abIndex
1a490 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ed ){.          
1a4a0 20 20 20 20 72 62 75 4d 50 72 69 6e 74 66 45 78      rbuMPrintfEx
1a4b0 65 63 28 70 2c 20 70 2d 3e 64 62 52 62 75 2c 20  ec(p, p->dbRbu, 
1a4c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a4d0 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
1a4e0 25 73 2e 27 72 62 75 5f 74 6d 70 5f 25 71 27 22  %s.'rbu_tmp_%q'"
1a4f0 2c 20 70 2d 3e 7a 53 74 61 74 65 44 62 2c 20 70  , p->zStateDb, p
1a500 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 0a 20  Iter->zDataTbl. 
1a510 20 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a               );.
1a520 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1a530 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1a540 20 20 20 20 20 20 20 20 20 20 20 72 62 75 4f 62             rbuOb
1a550 6a 49 74 65 72 50 72 65 70 61 72 65 41 6c 6c 28  jIterPrepareAll(
1a560 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 0a 20  p, pIter, 0);.. 
1a570 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
1a580 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
1a590 74 20 72 6f 77 20 74 6f 20 70 72 6f 63 65 73 73  t row to process
1a5a0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
1a5b0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1a5c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1a5d0 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20         int rc = 
1a5e0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 49 74  sqlite3_step(pIt
1a5f0 65 72 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  er->pSelect);.  
1a600 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1a610 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  rc==SQLITE_ROW )
1a620 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1a630 20 20 70 2d 3e 6e 50 72 6f 67 72 65 73 73 2b 2b    p->nProgress++
1a640 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1a650 20 20 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 20 20    p->nStep++;.  
1a660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1a670 74 75 72 6e 20 72 62 75 53 74 65 70 28 70 29 3b  turn rbuStep(p);
1a680 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1a690 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1a6a0 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72  ->rc = sqlite3_r
1a6b0 65 73 65 74 28 70 49 74 65 72 2d 3e 70 53 65 6c  eset(pIter->pSel
1a6c0 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ect);.          
1a6d0 20 20 20 20 70 2d 3e 6e 53 74 65 70 20 3d 20 30      p->nStep = 0
1a6e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1a6f0 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
1a700 20 20 20 20 20 20 20 72 62 75 4f 62 6a 49 74 65         rbuObjIte
1a710 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72 29 3b  rNext(p, pIter);
1a720 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1a730 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
1a740 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a750 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
1a760 74 65 72 2d 3e 7a 54 62 6c 3d 3d 30 20 29 3b 0a  ter->zTbl==0 );.
1a770 20 20 20 20 20 20 20 20 20 20 72 62 75 53 61 76            rbuSav
1a780 65 53 74 61 74 65 28 70 2c 20 52 42 55 5f 53 54  eState(p, RBU_ST
1a790 41 47 45 5f 4d 4f 56 45 29 3b 0a 20 20 20 20 20  AGE_MOVE);.     
1a7a0 20 20 20 20 20 72 62 75 49 6e 63 72 53 63 68 65       rbuIncrSche
1a7b0 6d 61 43 6f 6f 6b 69 65 28 70 29 3b 0a 20 20 20  maCookie(p);.   
1a7c0 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63         if( p->rc
1a7d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1a7e0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63             p->rc
1a7f0 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
1a800 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 43 4f 4d 4d  p->dbMain, "COMM
1a810 49 54 22 2c 20 30 2c 20 30 2c 20 26 70 2d 3e 7a  IT", 0, 0, &p->z
1a820 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 20 20 20  Errmsg);.       
1a830 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
1a840 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1a850 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1a860 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
1a870 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 52 62 75  e3_exec(p->dbRbu
1a880 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30  , "COMMIT", 0, 0
1a890 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a  , &p->zErrmsg);.
1a8a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1a8b0 20 20 20 20 20 20 70 2d 3e 65 53 74 61 67 65 20        p->eStage 
1a8c0 3d 20 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45  = RBU_STAGE_MOVE
1a8d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1a8e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1a8f0 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20 52   }..      case R
1a900 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 3a 20 7b  BU_STAGE_MOVE: {
1a910 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
1a920 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1a930 0a 20 20 20 20 20 20 20 20 20 20 72 62 75 4d 6f  .          rbuMo
1a940 76 65 4f 61 6c 46 69 6c 65 28 70 29 3b 0a 20 20  veOalFile(p);.  
1a950 20 20 20 20 20 20 20 20 70 2d 3e 6e 50 72 6f 67          p->nProg
1a960 72 65 73 73 2b 2b 3b 0a 20 20 20 20 20 20 20 20  ress++;.        
1a970 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
1a980 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1a990 63 61 73 65 20 52 42 55 5f 53 54 41 47 45 5f 43  case RBU_STAGE_C
1a9a0 4b 50 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  KPT: {.        i
1a9b0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1a9c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1a9d0 20 69 66 28 20 70 2d 3e 6e 53 74 65 70 3e 3d 70   if( p->nStep>=p
1a9e0 2d 3e 6e 46 72 61 6d 65 20 29 7b 0a 20 20 20 20  ->nFrame ){.    
1a9f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1aa00 66 69 6c 65 20 2a 70 44 62 20 3d 20 70 2d 3e 70  file *pDb = p->p
1aa10 54 61 72 67 65 74 46 64 2d 3e 70 52 65 61 6c 3b  TargetFd->pReal;
1aa20 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  .  .            
1aa30 2f 2a 20 53 79 6e 63 20 74 68 65 20 64 62 20 66  /* Sync the db f
1aa40 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ile */.         
1aa50 20 20 20 70 2d 3e 72 63 20 3d 20 70 44 62 2d 3e     p->rc = pDb->
1aa60 70 4d 65 74 68 6f 64 73 2d 3e 78 53 79 6e 63 28  pMethods->xSync(
1aa70 70 44 62 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  pDb, SQLITE_SYNC
1aa80 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 0a 20 20 20  _NORMAL);.  .   
1aa90 20 20 20 20 20 20 20 20 20 2f 2a 20 55 70 64 61           /* Upda
1aaa0 74 65 20 6e 42 61 63 6b 66 69 6c 6c 20 2a 2f 0a  te nBackfill */.
1aab0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1aac0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1aad0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1aae0 20 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20    void volatile 
1aaf0 2a 70 74 72 3b 0a 20 20 20 20 20 20 20 20 20 20  *ptr;.          
1ab00 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 44 62 2d      p->rc = pDb-
1ab10 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4d  >pMethods->xShmM
1ab20 61 70 28 70 44 62 2c 20 30 2c 20 33 32 2a 31 30  ap(pDb, 0, 32*10
1ab30 32 34 2c 20 30 2c 20 26 70 74 72 29 3b 0a 20 20  24, 0, &ptr);.  
1ab40 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1ab50 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1ab60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1ab70 20 20 20 20 28 28 75 33 32 20 76 6f 6c 61 74 69      ((u32 volati
1ab80 6c 65 2a 29 70 74 72 29 5b 32 34 5d 20 3d 20 70  le*)ptr)[24] = p
1ab90 2d 3e 69 4d 61 78 46 72 61 6d 65 3b 0a 20 20 20  ->iMaxFrame;.   
1aba0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1abb0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20           }.  .  
1abc0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
1abd0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1abe0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1abf0 70 2d 3e 65 53 74 61 67 65 20 3d 20 52 42 55 5f  p->eStage = RBU_
1ac00 53 54 41 47 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  STAGE_DONE;.    
1ac10 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
1ac20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
1ac30 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1ac40 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1ac50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20            /* At 
1ac60 6f 6e 65 20 70 6f 69 6e 74 20 74 68 65 20 66 6f  one point the fo
1ac70 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 63 6f  llowing block co
1ac80 70 69 65 64 20 61 20 73 69 6e 67 6c 65 20 66 72  pied a single fr
1ac90 61 6d 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 20  ame from the.   
1aca0 20 20 20 20 20 20 20 20 20 2a 2a 20 77 61 6c 20           ** wal 
1acb0 66 69 6c 65 20 74 6f 20 74 68 65 20 64 61 74 61  file to the data
1acc0 62 61 73 65 20 66 69 6c 65 2e 20 53 6f 20 74 68  base file. So th
1acd0 61 74 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 73  at one call to s
1ace0 71 6c 69 74 65 33 72 62 75 5f 73 74 65 70 28 29  qlite3rbu_step()
1acf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1ad00 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 61 20 73  checkpointed a s
1ad10 69 6e 67 6c 65 20 66 72 61 6d 65 2e 20 0a 20 20  ingle frame. .  
1ad20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20            **.   
1ad30 20 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65           ** Howe
1ad40 76 65 72 2c 20 69 66 20 74 68 65 20 73 65 63 74  ver, if the sect
1ad50 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65  or-size is large
1ad60 72 20 74 68 61 6e 20 74 68 65 20 70 61 67 65 2d  r than the page-
1ad70 73 69 7a 65 2c 20 61 6e 64 20 74 68 65 0a 20 20  size, and the.  
1ad80 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70            ** app
1ad90 6c 69 63 61 74 69 6f 6e 20 63 61 6c 6c 73 20 73  lication calls s
1ada0 71 6c 69 74 65 33 72 62 75 5f 73 61 76 65 73 74  qlite3rbu_savest
1adb0 61 74 65 28 29 20 6f 72 20 63 6c 6f 73 65 28 29  ate() or close()
1adc0 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 20 20 20   immediately.   
1add0 20 20 20 20 20 20 20 20 20 2a 2a 20 61 66 74 65           ** afte
1ade0 72 20 74 68 69 73 20 73 74 65 70 2c 20 74 68 65  r this step, the
1adf0 6e 20 72 62 75 5f 73 74 65 70 28 29 20 61 67 61  n rbu_step() aga
1ae00 69 6e 2c 20 74 68 65 6e 20 61 20 70 6f 77 65 72  in, then a power
1ae10 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2c   failure occurs,
1ae20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1ae30 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  then the databas
1ae40 65 20 70 61 67 65 20 77 72 69 74 74 65 6e 20 68  e page written h
1ae50 65 72 65 20 6d 61 79 20 62 65 20 64 61 6d 61 67  ere may be damag
1ae60 65 64 2e 20 57 6f 72 6b 20 61 72 6f 75 6e 64 0a  ed. Work around.
1ae70 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
1ae80 68 69 73 20 62 79 20 63 68 65 63 6b 70 6f 69 6e  his by checkpoin
1ae90 74 69 6e 67 20 66 72 61 6d 65 73 20 75 6e 74 69  ting frames unti
1aea0 6c 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  l the next page 
1aeb0 69 6e 20 74 68 65 20 61 46 72 61 6d 65 5b 5d 0a  in the aFrame[].
1aec0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6c              ** l
1aed0 69 65 73 20 6f 6e 20 61 20 64 69 66 66 65 72 65  ies on a differe
1aee0 6e 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 74  nt disk sector t
1aef0 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f 6e  o the current on
1af00 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e. */.          
1af10 20 20 75 33 32 20 69 53 65 63 74 6f 72 3b 0a 20    u32 iSector;. 
1af20 20 20 20 20 20 20 20 20 20 20 20 64 6f 7b 0a 20             do{. 
1af30 20 20 20 20 20 20 20 20 20 20 20 20 20 52 62 75               Rbu
1af40 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 20 3d 20  Frame *pFrame = 
1af50 26 70 2d 3e 61 46 72 61 6d 65 5b 70 2d 3e 6e 53  &p->aFrame[p->nS
1af60 74 65 70 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  tep];.          
1af70 20 20 20 20 69 53 65 63 74 6f 72 20 3d 20 28 70      iSector = (p
1af80 46 72 61 6d 65 2d 3e 69 44 62 50 61 67 65 2d 31  Frame->iDbPage-1
1af90 29 20 2f 20 70 2d 3e 6e 50 61 67 65 50 65 72 53  ) / p->nPagePerS
1afa0 65 63 74 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  ector;.         
1afb0 20 20 20 20 20 72 62 75 43 68 65 63 6b 70 6f 69       rbuCheckpoi
1afc0 6e 74 46 72 61 6d 65 28 70 2c 20 70 46 72 61 6d  ntFrame(p, pFram
1afd0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
1afe0 20 20 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 20 20    p->nStep++;.  
1aff0 20 20 20 20 20 20 20 20 20 20 7d 77 68 69 6c 65            }while
1b000 28 20 70 2d 3e 6e 53 74 65 70 3c 70 2d 3e 6e 46  ( p->nStep<p->nF
1b010 72 61 6d 65 20 0a 20 20 20 20 20 20 20 20 20 20  rame .          
1b020 20 20 20 20 20 20 20 26 26 20 69 53 65 63 74 6f         && iSecto
1b030 72 3d 3d 28 28 70 2d 3e 61 46 72 61 6d 65 5b 70  r==((p->aFrame[p
1b040 2d 3e 6e 53 74 65 70 5d 2e 69 44 62 50 61 67 65  ->nStep].iDbPage
1b050 2d 31 29 20 2f 20 70 2d 3e 6e 50 61 67 65 50 65  -1) / p->nPagePe
1b060 72 53 65 63 74 6f 72 29 0a 20 20 20 20 20 20 20  rSector).       
1b070 20 20 20 20 20 20 20 20 20 20 26 26 20 70 2d 3e            && p->
1b080 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  rc==SQLITE_OK.  
1b090 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
1b0a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b0b0 20 20 20 70 2d 3e 6e 50 72 6f 67 72 65 73 73 2b     p->nProgress+
1b0c0 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
1b0d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1b0e0 20 20 7d 0a 0a 20 20 20 20 20 20 64 65 66 61 75    }..      defau
1b0f0 6c 74 3a 0a 20 20 20 20 20 20 20 20 62 72 65 61  lt:.        brea
1b100 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  k;.    }.    ret
1b110 75 72 6e 20 70 2d 3e 72 63 3b 0a 20 20 7d 65 6c  urn p->rc;.  }el
1b120 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  se{.    return S
1b130 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
1b140 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  .}../*.** Compar
1b150 65 20 73 74 72 69 6e 67 73 20 7a 31 20 61 6e 64  e strings z1 and
1b160 20 7a 32 2c 20 72 65 74 75 72 6e 69 6e 67 20 30   z2, returning 0
1b170 20 69 66 20 74 68 65 79 20 61 72 65 20 69 64 65   if they are ide
1b180 6e 74 69 63 61 6c 2c 20 6f 72 20 6e 6f 6e 2d 7a  ntical, or non-z
1b190 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65  ero.** otherwise
1b1a0 2e 20 45 69 74 68 65 72 20 6f 72 20 62 6f 74 68  . Either or both
1b1b0 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 20 62 65   argument may be
1b1c0 20 4e 55 4c 4c 2e 20 54 77 6f 20 4e 55 4c 4c 20   NULL. Two NULL 
1b1d0 76 61 6c 75 65 73 20 61 72 65 0a 2a 2a 20 63 6f  values are.** co
1b1e0 6e 73 69 64 65 72 65 64 20 65 71 75 61 6c 2c 20  nsidered equal, 
1b1f0 61 6e 64 20 4e 55 4c 4c 20 69 73 20 63 6f 6e 73  and NULL is cons
1b200 69 64 65 72 65 64 20 64 69 73 74 69 6e 63 74 20  idered distinct 
1b210 66 72 6f 6d 20 61 6c 6c 20 6f 74 68 65 72 20 76  from all other v
1b220 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  alues..*/.static
1b230 20 69 6e 74 20 72 62 75 53 74 72 43 6f 6d 70 61   int rbuStrCompa
1b240 72 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  re(const char *z
1b250 31 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  1, const char *z
1b260 32 29 7b 0a 20 20 69 66 28 20 7a 31 3d 3d 30 20  2){.  if( z1==0 
1b270 26 26 20 7a 32 3d 3d 30 20 29 20 72 65 74 75 72  && z2==0 ) retur
1b280 6e 20 30 3b 0a 20 20 69 66 28 20 7a 31 3d 3d 30  n 0;.  if( z1==0
1b290 20 7c 7c 20 7a 32 3d 3d 30 20 29 20 72 65 74 75   || z2==0 ) retu
1b2a0 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 28  rn 1;.  return (
1b2b0 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
1b2c0 7a 31 2c 20 7a 32 29 21 3d 30 29 3b 0a 7d 0a 0a  z1, z2)!=0);.}..
1b2d0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1b2e0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 73  ion is called as
1b2f0 20 70 61 72 74 20 6f 66 20 73 71 6c 69 74 65 33   part of sqlite3
1b300 72 62 75 5f 6f 70 65 6e 28 29 20 77 68 65 6e 20  rbu_open() when 
1b310 69 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 2a 2a 20  initializing.** 
1b320 61 6e 20 72 62 75 20 68 61 6e 64 6c 65 20 69 6e  an rbu handle in
1b330 20 4f 41 4c 20 73 74 61 67 65 2e 20 49 66 20 74   OAL stage. If t
1b340 68 65 20 72 62 75 20 75 70 64 61 74 65 20 68 61  he rbu update ha
1b350 73 20 6e 6f 74 20 73 74 61 72 74 65 64 20 28 69  s not started (i
1b360 2e 65 2e 0a 2a 2a 20 74 68 65 20 72 62 75 5f 73  .e..** the rbu_s
1b370 74 61 74 65 20 74 61 62 6c 65 20 77 61 73 20 65  tate table was e
1b380 6d 70 74 79 29 20 69 74 20 69 73 20 61 20 6e 6f  mpty) it is a no
1b390 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  -op. Otherwise, 
1b3a0 69 74 20 61 72 72 61 6e 67 65 73 0a 2a 2a 20 74  it arranges.** t
1b3b0 68 69 6e 67 73 20 73 6f 20 74 68 61 74 20 74 68  hings so that th
1b3c0 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 73  e next call to s
1b3d0 71 6c 69 74 65 33 72 62 75 5f 73 74 65 70 28 29  qlite3rbu_step()
1b3e0 20 63 6f 6e 74 69 6e 75 65 73 20 6f 6e 20 66 72   continues on fr
1b3f0 6f 6d 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20  om.** where the 
1b400 70 72 65 76 69 6f 75 73 20 72 62 75 20 68 61 6e  previous rbu han
1b410 64 6c 65 20 6c 65 66 74 20 6f 66 66 2e 0a 2a 2a  dle left off..**
1b420 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
1b430 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72  occurs, an error
1b440 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20   code and error 
1b450 6d 65 73 73 61 67 65 20 61 72 65 20 6c 65 66 74  message are left
1b460 20 69 6e 20 74 68 65 0a 2a 2a 20 72 62 75 20 68   in the.** rbu h
1b470 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20  andle passed as 
1b480 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
1b490 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
1b4a0 69 64 20 72 62 75 53 65 74 75 70 4f 61 6c 28 73  id rbuSetupOal(s
1b4b0 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62  qlite3rbu *p, Rb
1b4c0 75 53 74 61 74 65 20 2a 70 53 74 61 74 65 29 7b  uState *pState){
1b4d0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
1b4e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
1b4f0 20 69 66 28 20 70 53 74 61 74 65 2d 3e 7a 54 62   if( pState->zTb
1b500 6c 20 29 7b 0a 20 20 20 20 52 62 75 4f 62 6a 49  l ){.    RbuObjI
1b510 74 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70 2d  ter *pIter = &p-
1b520 3e 6f 62 6a 69 74 65 72 3b 0a 20 20 20 20 69 6e  >objiter;.    in
1b530 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1b540 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63  ;..    while( rc
1b550 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1b560 49 74 65 72 2d 3e 7a 54 62 6c 20 26 26 20 28 70  Iter->zTbl && (p
1b570 49 74 65 72 2d 3e 62 43 6c 65 61 6e 75 70 20 0a  Iter->bCleanup .
1b580 20 20 20 20 20 20 20 7c 7c 20 72 62 75 53 74 72         || rbuStr
1b590 43 6f 6d 70 61 72 65 28 70 49 74 65 72 2d 3e 7a  Compare(pIter->z
1b5a0 49 64 78 2c 20 70 53 74 61 74 65 2d 3e 7a 49 64  Idx, pState->zId
1b5b0 78 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 53  x).       || (pS
1b5c0 74 61 74 65 2d 3e 7a 44 61 74 61 54 62 6c 3d 3d  tate->zDataTbl==
1b5d0 30 20 26 26 20 72 62 75 53 74 72 43 6f 6d 70 61  0 && rbuStrCompa
1b5e0 72 65 28 70 49 74 65 72 2d 3e 7a 54 62 6c 2c 20  re(pIter->zTbl, 
1b5f0 70 53 74 61 74 65 2d 3e 7a 54 62 6c 29 29 0a 20  pState->zTbl)). 
1b600 20 20 20 20 20 20 7c 7c 20 28 70 53 74 61 74 65        || (pState
1b610 2d 3e 7a 44 61 74 61 54 62 6c 20 26 26 20 72 62  ->zDataTbl && rb
1b620 75 53 74 72 43 6f 6d 70 61 72 65 28 70 49 74 65  uStrCompare(pIte
1b630 72 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 70 53 74  r->zDataTbl, pSt
1b640 61 74 65 2d 3e 7a 44 61 74 61 54 62 6c 29 29 0a  ate->zDataTbl)).
1b650 20 20 20 20 29 29 7b 0a 20 20 20 20 20 20 72 63      )){.      rc
1b660 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 4e 65 78   = rbuObjIterNex
1b670 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  t(p, pIter);.   
1b680 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   }..    if( rc==
1b690 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 49  SQLITE_OK && !pI
1b6a0 74 65 72 2d 3e 7a 54 62 6c 20 29 7b 0a 20 20 20  ter->zTbl ){.   
1b6b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
1b6c0 52 52 4f 52 3b 0a 20 20 20 20 20 20 70 2d 3e 7a  RROR;.      p->z
1b6d0 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33  Errmsg = sqlite3
1b6e0 5f 6d 70 72 69 6e 74 66 28 22 72 62 75 5f 73 74  _mprintf("rbu_st
1b6f0 61 74 65 20 6d 69 73 6d 61 74 63 68 20 65 72 72  ate mismatch err
1b700 6f 72 22 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  or");.    }..   
1b710 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1b720 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  OK ){.      p->n
1b730 53 74 65 70 20 3d 20 70 53 74 61 74 65 2d 3e 6e  Step = pState->n
1b740 52 6f 77 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Row;.      rc = 
1b750 72 62 75 4f 62 6a 49 74 65 72 50 72 65 70 61 72  rbuObjIterPrepar
1b760 65 41 6c 6c 28 70 2c 20 26 70 2d 3e 6f 62 6a 69  eAll(p, &p->obji
1b770 74 65 72 2c 20 70 2d 3e 6e 53 74 65 70 29 3b 0a  ter, p->nStep);.
1b780 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e 72 63      }..    p->rc
1b790 20 3d 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   = rc;.  }.}../*
1b7a0 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20  .** If there is 
1b7b0 61 20 22 2a 2d 6f 61 6c 22 20 66 69 6c 65 20 69  a "*-oal" file i
1b7c0 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
1b7d0 6d 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  m corresponding 
1b7e0 74 6f 20 74 68 65 0a 2a 2a 20 74 61 72 67 65 74  to the.** target
1b7f0 20 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65   database in the
1b800 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 64 65   file-system, de
1b810 6c 65 74 65 20 69 74 2e 20 49 66 20 61 6e 20 65  lete it. If an e
1b820 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20  rror occurs,.** 
1b830 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 63  leave an error c
1b840 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65  ode and error me
1b850 73 73 61 67 65 20 69 6e 20 74 68 65 20 72 62 75  ssage in the rbu
1b860 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74   handle..*/.stat
1b870 69 63 20 76 6f 69 64 20 72 62 75 44 65 6c 65 74  ic void rbuDelet
1b880 65 4f 61 6c 46 69 6c 65 28 73 71 6c 69 74 65 33  eOalFile(sqlite3
1b890 72 62 75 20 2a 70 29 7b 0a 20 20 63 68 61 72 20  rbu *p){.  char 
1b8a0 2a 7a 4f 61 6c 20 3d 20 72 62 75 4d 50 72 69 6e  *zOal = rbuMPrin
1b8b0 74 66 28 70 2c 20 22 25 73 2d 6f 61 6c 22 2c 20  tf(p, "%s-oal", 
1b8c0 70 2d 3e 7a 54 61 72 67 65 74 29 3b 0a 20 20 69  p->zTarget);.  i
1b8d0 66 28 20 7a 4f 61 6c 20 29 7b 0a 20 20 20 20 73  f( zOal ){.    s
1b8e0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1b8f0 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66   = sqlite3_vfs_f
1b900 69 6e 64 28 30 29 3b 0a 20 20 20 20 61 73 73 65  ind(0);.    asse
1b910 72 74 28 20 70 56 66 73 20 26 26 20 70 2d 3e 72  rt( pVfs && p->r
1b920 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1b930 70 2d 3e 7a 45 72 72 6d 73 67 3d 3d 30 20 29 3b  p->zErrmsg==0 );
1b940 0a 20 20 20 20 70 56 66 73 2d 3e 78 44 65 6c 65  .    pVfs->xDele
1b950 74 65 28 70 56 66 73 2c 20 7a 4f 61 6c 2c 20 30  te(pVfs, zOal, 0
1b960 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
1b970 72 65 65 28 7a 4f 61 6c 29 3b 0a 20 20 7d 0a 7d  ree(zOal);.  }.}
1b980 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
1b990 20 61 20 70 72 69 76 61 74 65 20 72 62 75 20 56   a private rbu V
1b9a0 46 53 20 66 6f 72 20 74 68 65 20 72 62 75 20 68  FS for the rbu h
1b9b0 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20  andle passed as 
1b9c0 74 68 65 20 6f 6e 6c 79 0a 2a 2a 20 61 72 67 75  the only.** argu
1b9d0 6d 65 6e 74 2e 20 54 68 69 73 20 56 46 53 20 77  ment. This VFS w
1b9e0 69 6c 6c 20 62 65 20 75 73 65 64 20 75 6e 6c 65  ill be used unle
1b9f0 73 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  ss the call to s
1ba00 71 6c 69 74 65 33 72 62 75 5f 6f 70 65 6e 28 29  qlite3rbu_open()
1ba10 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 61 20  .** specified a 
1ba20 55 52 49 20 77 69 74 68 20 61 20 76 66 73 3d 3f  URI with a vfs=?
1ba30 20 6f 70 74 69 6f 6e 20 69 6e 20 70 6c 61 63 65   option in place
1ba40 20 6f 66 20 61 20 74 61 72 67 65 74 20 64 61 74   of a target dat
1ba50 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 6e 61  abase.** file na
1ba60 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  me..*/.static vo
1ba70 69 64 20 72 62 75 43 72 65 61 74 65 56 66 73 28  id rbuCreateVfs(
1ba80 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a  sqlite3rbu *p){.
1ba90 20 20 69 6e 74 20 72 6e 64 3b 0a 20 20 63 68 61    int rnd;.  cha
1baa0 72 20 7a 52 6e 64 5b 36 34 5d 3b 0a 0a 20 20 61  r zRnd[64];..  a
1bab0 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
1bac0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c  LITE_OK );.  sql
1bad0 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
1bae0 73 69 7a 65 6f 66 28 69 6e 74 29 2c 20 28 76 6f  sizeof(int), (vo
1baf0 69 64 2a 29 26 72 6e 64 29 3b 0a 20 20 73 71 6c  id*)&rnd);.  sql
1bb00 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
1bb10 7a 65 6f 66 28 7a 52 6e 64 29 2c 20 7a 52 6e 64  zeof(zRnd), zRnd
1bb20 2c 20 22 72 62 75 5f 76 66 73 5f 25 64 22 2c 20  , "rbu_vfs_%d", 
1bb30 72 6e 64 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20  rnd);.  p->rc = 
1bb40 73 71 6c 69 74 65 33 72 62 75 5f 63 72 65 61 74  sqlite3rbu_creat
1bb50 65 5f 76 66 73 28 7a 52 6e 64 2c 20 30 29 3b 0a  e_vfs(zRnd, 0);.
1bb60 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1bb70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
1bb80 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
1bb90 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  = sqlite3_vfs_fi
1bba0 6e 64 28 7a 52 6e 64 29 3b 0a 20 20 20 20 61 73  nd(zRnd);.    as
1bbb0 73 65 72 74 28 20 70 56 66 73 20 29 3b 0a 20 20  sert( pVfs );.  
1bbc0 20 20 70 2d 3e 7a 56 66 73 4e 61 6d 65 20 3d 20    p->zVfsName = 
1bbd0 70 56 66 73 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pVfs->zName;.   
1bbe0 20 28 28 72 62 75 5f 76 66 73 2a 29 70 56 66 73   ((rbu_vfs*)pVfs
1bbf0 29 2d 3e 70 52 62 75 20 3d 20 70 3b 0a 20 20 7d  )->pRbu = p;.  }
1bc00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f  .}../*.** Destro
1bc10 79 20 74 68 65 20 70 72 69 76 61 74 65 20 56 46  y the private VF
1bc20 53 20 63 72 65 61 74 65 64 20 66 6f 72 20 74 68  S created for th
1bc30 65 20 72 62 75 20 68 61 6e 64 6c 65 20 70 61 73  e rbu handle pas
1bc40 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 0a  sed as the only.
1bc50 2a 2a 20 61 72 67 75 6d 65 6e 74 20 62 79 20 61  ** argument by a
1bc60 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74  n earlier call t
1bc70 6f 20 72 62 75 43 72 65 61 74 65 56 66 73 28 29  o rbuCreateVfs()
1bc80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1bc90 20 72 62 75 44 65 6c 65 74 65 56 66 73 28 73 71   rbuDeleteVfs(sq
1bca0 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20  lite3rbu *p){.  
1bcb0 69 66 28 20 70 2d 3e 7a 56 66 73 4e 61 6d 65 20  if( p->zVfsName 
1bcc0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 72 62  ){.    sqlite3rb
1bcd0 75 5f 64 65 73 74 72 6f 79 5f 76 66 73 28 70 2d  u_destroy_vfs(p-
1bce0 3e 7a 56 66 73 4e 61 6d 65 29 3b 0a 20 20 20 20  >zVfsName);.    
1bcf0 70 2d 3e 7a 56 66 73 4e 61 6d 65 20 3d 20 30 3b  p->zVfsName = 0;
1bd00 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
1bd10 69 73 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  is user-defined 
1bd20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  SQL function is 
1bd30 69 6e 76 6f 6b 65 64 20 77 69 74 68 20 61 20 73  invoked with a s
1bd40 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 2d  ingle argument -
1bd50 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20   the.** name of 
1bd60 61 20 74 61 62 6c 65 20 65 78 70 65 63 74 65 64  a table expected
1bd70 20 74 6f 20 61 70 70 65 61 72 20 69 6e 20 74 68   to appear in th
1bd80 65 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73  e target databas
1bd90 65 2e 20 49 74 20 72 65 74 75 72 6e 73 0a 2a 2a  e. It returns.**
1bda0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
1bdb0 75 78 69 6c 6c 69 61 72 79 20 69 6e 64 65 78 65  uxilliary indexe
1bdc0 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  s on the table..
1bdd0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
1bde0 62 75 49 6e 64 65 78 43 6e 74 46 75 6e 63 28 0a  buIndexCntFunc(.
1bdf0 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
1be00 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20  t *pCtx, .  int 
1be10 6e 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f  nVal,.  sqlite3_
1be20 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b  value **apVal.){
1be30 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70  .  sqlite3rbu *p
1be40 20 3d 20 28 73 71 6c 69 74 65 33 72 62 75 2a 29   = (sqlite3rbu*)
1be50 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
1be60 61 28 70 43 74 78 29 3b 0a 20 20 73 71 6c 69 74  a(pCtx);.  sqlit
1be70 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
1be80 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72   0;.  char *zErr
1be90 6d 73 67 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  msg = 0;.  int r
1bea0 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 56  c;..  assert( nV
1beb0 61 6c 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 72 63  al==1 );.  .  rc
1bec0 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e   = prepareFreeAn
1bed0 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d  dCollectError(p-
1bee0 3e 64 62 4d 61 69 6e 2c 20 26 70 53 74 6d 74 2c  >dbMain, &pStmt,
1bef0 20 26 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20   &zErrmsg, .    
1bf00 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
1bf10 66 28 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28  f("SELECT count(
1bf20 2a 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  *) FROM sqlite_m
1bf30 61 73 74 65 72 20 22 0a 20 20 20 20 20 20 20 20  aster ".        
1bf40 22 57 48 45 52 45 20 74 79 70 65 3d 27 69 6e 64  "WHERE type='ind
1bf50 65 78 27 20 41 4e 44 20 74 62 6c 5f 6e 61 6d 65  ex' AND tbl_name
1bf60 20 3d 20 25 51 22 2c 20 73 71 6c 69 74 65 33 5f   = %Q", sqlite3_
1bf70 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c  value_text(apVal
1bf80 5b 30 5d 29 29 0a 20 20 29 3b 0a 20 20 69 66 28  [0])).  );.  if(
1bf90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1bfa0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
1bfb0 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c  sult_error(pCtx,
1bfc0 20 7a 45 72 72 6d 73 67 2c 20 2d 31 29 3b 0a 20   zErrmsg, -1);. 
1bfd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
1bfe0 6e 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20  nIndex = 0;.    
1bff0 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  if( SQLITE_ROW==
1c000 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
1c010 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 49 6e  mt) ){.      nIn
1c020 64 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  dex = sqlite3_co
1c030 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20  lumn_int(pStmt, 
1c040 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  0);.    }.    rc
1c050 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   = sqlite3_final
1c060 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
1c070 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1c080 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
1c090 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 70 43  e3_result_int(pC
1c0a0 74 78 2c 20 6e 49 6e 64 65 78 29 3b 0a 20 20 20  tx, nIndex);.   
1c0b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
1c0c0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
1c0d0 6f 72 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33  or(pCtx, sqlite3
1c0e0 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 4d 61 69  _errmsg(p->dbMai
1c0f0 6e 29 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20  n), -1);.    }. 
1c100 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   }..  sqlite3_fr
1c110 65 65 28 7a 45 72 72 6d 73 67 29 3b 0a 7d 0a 0a  ee(zErrmsg);.}..
1c120 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 52 42 55  /*.** If the RBU
1c130 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
1c140 6e 73 20 74 68 65 20 72 62 75 5f 63 6f 75 6e 74  ns the rbu_count
1c150 20 74 61 62 6c 65 2c 20 75 73 65 20 69 74 20 74   table, use it t
1c160 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 2a 2a 20  o initialize.** 
1c170 74 68 65 20 73 71 6c 69 74 65 33 72 62 75 2e 6e  the sqlite3rbu.n
1c180 50 68 61 73 65 4f 6e 65 53 74 65 70 20 76 61 72  PhaseOneStep var
1c190 69 61 62 6c 65 2e 20 54 68 65 20 73 63 68 65 6d  iable. The schem
1c1a0 61 20 6f 66 20 74 68 65 20 72 62 75 5f 63 6f 75  a of the rbu_cou
1c1b0 6e 74 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20 61  nt table.** is a
1c1c0 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69  ssumed to contai
1c1d0 6e 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d  n the same colum
1c1e0 6e 73 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 43  ns as:.**.**   C
1c1f0 52 45 41 54 45 20 54 41 42 4c 45 20 72 62 75 5f  REATE TABLE rbu_
1c200 63 6f 75 6e 74 28 74 62 6c 20 54 45 58 54 20 50  count(tbl TEXT P
1c210 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 6e 74 20  RIMARY KEY, cnt 
1c220 49 4e 54 45 47 45 52 29 20 57 49 54 48 4f 55 54  INTEGER) WITHOUT
1c230 20 52 4f 57 49 44 3b 0a 2a 2a 0a 2a 2a 20 54 68   ROWID;.**.** Th
1c240 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e  ere should be on
1c250 65 20 72 6f 77 20 69 6e 20 74 68 65 20 74 61 62  e row in the tab
1c260 6c 65 20 66 6f 72 20 65 61 63 68 20 64 61 74 61  le for each data
1c270 5f 78 78 78 20 74 61 62 6c 65 20 69 6e 20 74 68  _xxx table in th
1c280 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54  e.** database. T
1c290 68 65 20 27 74 62 6c 27 20 63 6f 6c 75 6d 6e 20  he 'tbl' column 
1c2a0 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 20 74  should contain t
1c2b0 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74  he name of a dat
1c2c0 61 5f 78 78 78 20 74 61 62 6c 65 2c 0a 2a 2a 20  a_xxx table,.** 
1c2d0 61 6e 64 20 74 68 65 20 63 6e 74 20 63 6f 6c 75  and the cnt colu
1c2e0 6d 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  mn the number of
1c2f0 20 72 6f 77 73 20 69 74 20 63 6f 6e 74 61 69 6e   rows it contain
1c300 73 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33  s..**.** sqlite3
1c310 72 62 75 2e 6e 50 68 61 73 65 4f 6e 65 53 74 65  rbu.nPhaseOneSte
1c320 70 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  p is initialized
1c330 20 74 6f 20 74 68 65 20 73 75 6d 20 6f 66 20 28   to the sum of (
1c340 31 20 2b 20 6e 49 6e 64 65 78 29 20 2a 20 63 6e  1 + nIndex) * cn
1c350 74 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 72 6f 77  t.** for all row
1c360 73 20 69 6e 20 74 68 65 20 72 62 75 5f 63 6f 75  s in the rbu_cou
1c370 6e 74 20 74 61 62 6c 65 2c 20 77 68 65 72 65 20  nt table, where 
1c380 6e 49 6e 64 65 78 20 69 73 20 74 68 65 20 6e 75  nIndex is the nu
1c390 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 69 6e 64 65  mber of .** inde
1c3a0 78 65 73 20 6f 6e 20 74 68 65 20 63 6f 72 72 65  xes on the corre
1c3b0 73 70 6f 6e 64 69 6e 67 20 74 61 72 67 65 74 20  sponding target 
1c3c0 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a  database table..
1c3d0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
1c3e0 62 75 49 6e 69 74 50 68 61 73 65 4f 6e 65 53 74  buInitPhaseOneSt
1c3f0 65 70 73 28 73 71 6c 69 74 65 33 72 62 75 20 2a  eps(sqlite3rbu *
1c400 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  p){.  if( p->rc=
1c410 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c420 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1c430 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 69  pStmt = 0;.    i
1c440 6e 74 20 62 45 78 69 73 74 73 20 3d 20 30 3b 20  nt bExists = 0; 
1c450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c460 2a 20 54 72 75 65 20 69 66 20 72 62 75 5f 63 6f  * True if rbu_co
1c470 75 6e 74 20 65 78 69 73 74 73 20 2a 2f 0a 0a 20  unt exists */.. 
1c480 20 20 20 70 2d 3e 6e 50 68 61 73 65 4f 6e 65 53     p->nPhaseOneS
1c490 74 65 70 20 3d 20 2d 31 3b 0a 0a 20 20 20 20 70  tep = -1;..    p
1c4a0 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63  ->rc = sqlite3_c
1c4b0 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70  reate_function(p
1c4c0 2d 3e 64 62 52 62 75 2c 20 0a 20 20 20 20 20 20  ->dbRbu, .      
1c4d0 20 20 22 72 62 75 5f 69 6e 64 65 78 5f 63 6e 74    "rbu_index_cnt
1c4e0 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
1c4f0 38 2c 20 28 76 6f 69 64 2a 29 70 2c 20 72 62 75  8, (void*)p, rbu
1c500 49 6e 64 65 78 43 6e 74 46 75 6e 63 2c 20 30 2c  IndexCntFunc, 0,
1c510 20 30 0a 20 20 20 20 29 3b 0a 20 20 0a 20 20 20   0.    );.  .   
1c520 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 74 68   /* Check for th
1c530 65 20 72 62 75 5f 63 6f 75 6e 74 20 74 61 62 6c  e rbu_count tabl
1c540 65 2e 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f  e. If it does no
1c550 74 20 65 78 69 73 74 2c 20 6f 72 20 69 66 20 61  t exist, or if a
1c560 6e 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20 6f  n error.    ** o
1c570 63 63 75 72 73 2c 20 6e 50 68 61 73 65 4f 6e 65  ccurs, nPhaseOne
1c580 53 74 65 70 20 77 69 6c 6c 20 62 65 20 6c 65 66  Step will be lef
1c590 74 20 73 65 74 20 74 6f 20 2d 31 2e 20 2a 2f 0a  t set to -1. */.
1c5a0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
1c5b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c5c0 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72    p->rc = prepar
1c5d0 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72  eAndCollectError
1c5e0 28 70 2d 3e 64 62 52 62 75 2c 20 26 70 53 74 6d  (p->dbRbu, &pStm
1c5f0 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a  t, &p->zErrmsg,.
1c600 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
1c610 54 20 31 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  T 1 FROM sqlite_
1c620 6d 61 73 74 65 72 20 57 48 45 52 45 20 74 62 6c  master WHERE tbl
1c630 5f 6e 61 6d 65 20 3d 20 27 72 62 75 5f 63 6f 75  _name = 'rbu_cou
1c640 6e 74 27 22 0a 20 20 20 20 20 20 29 3b 0a 20 20  nt'".      );.  
1c650 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 72    }.    if( p->r
1c660 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1c670 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
1c680 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
1c690 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20  ep(pStmt) ){.   
1c6a0 20 20 20 20 20 62 45 78 69 73 74 73 20 3d 20 31       bExists = 1
1c6b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c6c0 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
1c6d0 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
1c6e0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
1c6f0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1c700 4f 4b 20 26 26 20 62 45 78 69 73 74 73 20 29 7b  OK && bExists ){
1c710 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70  .      p->rc = p
1c720 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74  repareAndCollect
1c730 45 72 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20  Error(p->dbRbu, 
1c740 26 70 53 74 6d 74 2c 20 26 70 2d 3e 7a 45 72 72  &pStmt, &p->zErr
1c750 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20 22  msg,.          "
1c760 53 45 4c 45 43 54 20 73 75 6d 28 63 6e 74 20 2a  SELECT sum(cnt *
1c770 20 28 31 20 2b 20 72 62 75 5f 69 6e 64 65 78 5f   (1 + rbu_index_
1c780 63 6e 74 28 72 62 75 5f 74 61 72 67 65 74 5f 6e  cnt(rbu_target_n
1c790 61 6d 65 28 74 62 6c 29 29 29 29 22 0a 20 20 20  ame(tbl))))".   
1c7a0 20 20 20 20 20 20 20 22 46 52 4f 4d 20 72 62 75         "FROM rbu
1c7b0 5f 63 6f 75 6e 74 22 0a 20 20 20 20 20 20 29 3b  _count".      );
1c7c0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
1c7d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1c7e0 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54         if( SQLIT
1c7f0 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
1c800 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20  tep(pStmt) ){.  
1c810 20 20 20 20 20 20 20 20 70 2d 3e 6e 50 68 61 73          p->nPhas
1c820 65 4f 6e 65 53 74 65 70 20 3d 20 73 71 6c 69 74  eOneStep = sqlit
1c830 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  e3_column_int64(
1c840 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20  pStmt, 0);.     
1c850 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e     }.        p->
1c860 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e  rc = sqlite3_fin
1c870 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
1c880 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1c890 7d 0a 0a 0a 73 74 61 74 69 63 20 73 71 6c 69 74  }...static sqlit
1c8a0 65 33 72 62 75 20 2a 6f 70 65 6e 52 62 75 48 61  e3rbu *openRbuHa
1c8b0 6e 64 6c 65 28 0a 20 20 63 6f 6e 73 74 20 63 68  ndle(.  const ch
1c8c0 61 72 20 2a 7a 54 61 72 67 65 74 2c 20 0a 20 20  ar *zTarget, .  
1c8d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 62 75  const char *zRbu
1c8e0 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
1c8f0 7a 53 74 61 74 65 0a 29 7b 0a 20 20 73 71 6c 69  zState.){.  sqli
1c900 74 65 33 72 62 75 20 2a 70 3b 0a 20 20 73 69 7a  te3rbu *p;.  siz
1c910 65 5f 74 20 6e 54 61 72 67 65 74 20 3d 20 7a 54  e_t nTarget = zT
1c920 61 72 67 65 74 20 3f 20 73 74 72 6c 65 6e 28 7a  arget ? strlen(z
1c930 54 61 72 67 65 74 29 20 3a 20 30 3b 0a 20 20 73  Target) : 0;.  s
1c940 69 7a 65 5f 74 20 6e 52 62 75 20 3d 20 73 74 72  ize_t nRbu = str
1c950 6c 65 6e 28 7a 52 62 75 29 3b 0a 20 20 73 69 7a  len(zRbu);.  siz
1c960 65 5f 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  e_t nByte = size
1c970 6f 66 28 73 71 6c 69 74 65 33 72 62 75 29 20 2b  of(sqlite3rbu) +
1c980 20 6e 54 61 72 67 65 74 2b 31 20 2b 20 6e 52 62   nTarget+1 + nRb
1c990 75 2b 31 3b 0a 0a 20 20 70 20 3d 20 28 73 71 6c  u+1;..  p = (sql
1c9a0 69 74 65 33 72 62 75 2a 29 73 71 6c 69 74 65 33  ite3rbu*)sqlite3
1c9b0 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29  _malloc64(nByte)
1c9c0 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
1c9d0 20 52 62 75 53 74 61 74 65 20 2a 70 53 74 61 74   RbuState *pStat
1c9e0 65 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43  e = 0;..    /* C
1c9f0 72 65 61 74 65 20 74 68 65 20 63 75 73 74 6f 6d  reate the custom
1ca00 20 56 46 53 2e 20 2a 2f 0a 20 20 20 20 6d 65 6d   VFS. */.    mem
1ca10 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
1ca20 28 73 71 6c 69 74 65 33 72 62 75 29 29 3b 0a 20  (sqlite3rbu));. 
1ca30 20 20 20 72 62 75 43 72 65 61 74 65 56 66 73 28     rbuCreateVfs(
1ca40 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e  p);..    /* Open
1ca50 20 74 68 65 20 74 61 72 67 65 74 2c 20 52 42 55   the target, RBU
1ca60 20 61 6e 64 20 73 74 61 74 65 20 64 61 74 61 62   and state datab
1ca70 61 73 65 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ases */.    if( 
1ca80 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1ca90 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
1caa0 70 43 73 72 20 3d 20 28 63 68 61 72 2a 29 26 70  pCsr = (char*)&p
1cab0 5b 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 62  [1];.      int b
1cac0 52 65 74 72 79 20 3d 20 30 3b 0a 20 20 20 20 20  Retry = 0;.     
1cad0 20 69 66 28 20 7a 54 61 72 67 65 74 20 29 7b 0a   if( zTarget ){.
1cae0 20 20 20 20 20 20 20 20 70 2d 3e 7a 54 61 72 67          p->zTarg
1caf0 65 74 20 3d 20 70 43 73 72 3b 0a 20 20 20 20 20  et = pCsr;.     
1cb00 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 7a 54 61     memcpy(p->zTa
1cb10 72 67 65 74 2c 20 7a 54 61 72 67 65 74 2c 20 6e  rget, zTarget, n
1cb20 54 61 72 67 65 74 2b 31 29 3b 0a 20 20 20 20 20  Target+1);.     
1cb30 20 20 20 70 43 73 72 20 2b 3d 20 6e 54 61 72 67     pCsr += nTarg
1cb40 65 74 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  et+1;.      }.  
1cb50 20 20 20 20 70 2d 3e 7a 52 62 75 20 3d 20 70 43      p->zRbu = pC
1cb60 73 72 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  sr;.      memcpy
1cb70 28 70 2d 3e 7a 52 62 75 2c 20 7a 52 62 75 2c 20  (p->zRbu, zRbu, 
1cb80 6e 52 62 75 2b 31 29 3b 0a 20 20 20 20 20 20 70  nRbu+1);.      p
1cb90 43 73 72 20 2b 3d 20 6e 52 62 75 2b 31 3b 0a 20  Csr += nRbu+1;. 
1cba0 20 20 20 20 20 69 66 28 20 7a 53 74 61 74 65 20       if( zState 
1cbb0 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 53  ){.        p->zS
1cbc0 74 61 74 65 20 3d 20 72 62 75 4d 50 72 69 6e 74  tate = rbuMPrint
1cbd0 66 28 70 2c 20 22 25 73 22 2c 20 7a 53 74 61 74  f(p, "%s", zStat
1cbe0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  e);.      }..   
1cbf0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 72     /* If the fir
1cc00 73 74 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 70  st attempt to op
1cc10 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  en the database 
1cc20 66 69 6c 65 20 66 61 69 6c 73 20 61 6e 64 20 74  file fails and t
1cc30 68 65 20 62 52 65 74 72 79 0a 20 20 20 20 20 20  he bRetry.      
1cc40 2a 2a 20 66 6c 61 67 20 69 74 20 73 65 74 2c 20  ** flag it set, 
1cc50 74 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  this means that 
1cc60 74 68 65 20 64 62 20 77 61 73 20 6e 6f 74 20 6f  the db was not o
1cc70 70 65 6e 65 64 20 62 65 63 61 75 73 65 20 69 74  pened because it
1cc80 20 73 65 65 6d 65 64 0a 20 20 20 20 20 20 2a 2a   seemed.      **
1cc90 20 74 6f 20 62 65 20 61 20 77 61 6c 2d 6d 6f 64   to be a wal-mod
1cca0 65 20 64 62 2e 20 42 75 74 2c 20 74 68 69 73 20  e db. But, this 
1ccb0 6d 61 79 20 68 61 76 65 20 68 61 70 70 65 6e 65  may have happene
1ccc0 64 20 64 75 65 20 74 6f 20 61 6e 20 65 61 72 6c  d due to an earl
1ccd0 69 65 72 0a 20 20 20 20 20 20 2a 2a 20 52 42 55  ier.      ** RBU
1cce0 20 76 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f   vacuum operatio
1ccf0 6e 20 6c 65 61 76 69 6e 67 20 61 6e 20 6f 6c 64  n leaving an old
1cd00 20 77 61 6c 20 66 69 6c 65 20 69 6e 20 74 68 65   wal file in the
1cd10 20 64 69 72 65 63 74 6f 72 79 2e 0a 20 20 20 20   directory..    
1cd20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
1cd30 74 68 65 20 63 61 73 65 2c 20 69 74 20 77 69 6c  the case, it wil
1cd40 6c 20 68 61 76 65 20 62 65 65 6e 20 63 68 65 63  l have been chec
1cd50 6b 70 6f 69 6e 74 65 64 20 61 6e 64 20 64 65 6c  kpointed and del
1cd60 65 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 77 68  eted.      ** wh
1cd70 65 6e 20 74 68 65 20 68 61 6e 64 6c 65 20 77 61  en the handle wa
1cd80 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 61 20 73  s closed and a s
1cd90 65 63 6f 6e 64 20 61 74 74 65 6d 70 74 20 74 6f  econd attempt to
1cda0 20 6f 70 65 6e 20 74 68 65 20 0a 20 20 20 20 20   open the .     
1cdb0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 6d 61 79   ** database may
1cdc0 20 73 75 63 63 65 65 64 2e 20 20 2a 2f 0a 20 20   succeed.  */.  
1cdd0 20 20 20 20 72 62 75 4f 70 65 6e 44 61 74 61 62      rbuOpenDatab
1cde0 61 73 65 28 70 2c 20 26 62 52 65 74 72 79 29 3b  ase(p, &bRetry);
1cdf0 0a 20 20 20 20 20 20 69 66 28 20 62 52 65 74 72  .      if( bRetr
1ce00 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72 62 75  y ){.        rbu
1ce10 4f 70 65 6e 44 61 74 61 62 61 73 65 28 70 2c 20  OpenDatabase(p, 
1ce20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
1ce30 7d 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  }..    if( p->rc
1ce40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1ce50 20 20 20 20 20 70 53 74 61 74 65 20 3d 20 72 62       pState = rb
1ce60 75 4c 6f 61 64 53 74 61 74 65 28 70 29 3b 0a 20  uLoadState(p);. 
1ce70 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74       assert( pSt
1ce80 61 74 65 20 7c 7c 20 70 2d 3e 72 63 21 3d 53 51  ate || p->rc!=SQ
1ce90 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
1cea0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1ceb0 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 20 20  TE_OK ){..      
1cec0 20 20 69 66 28 20 70 53 74 61 74 65 2d 3e 65 53    if( pState->eS
1ced0 74 61 67 65 3d 3d 30 20 29 7b 20 0a 20 20 20 20  tage==0 ){ .    
1cee0 20 20 20 20 20 20 72 62 75 44 65 6c 65 74 65 4f        rbuDeleteO
1cef0 61 6c 46 69 6c 65 28 70 29 3b 0a 20 20 20 20 20  alFile(p);.     
1cf00 20 20 20 20 20 72 62 75 49 6e 69 74 50 68 61 73       rbuInitPhas
1cf10 65 4f 6e 65 53 74 65 70 73 28 70 29 3b 0a 20 20  eOneSteps(p);.  
1cf20 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 67          p->eStag
1cf30 65 20 3d 20 52 42 55 5f 53 54 41 47 45 5f 4f 41  e = RBU_STAGE_OA
1cf40 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  L;.        }else
1cf50 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 65  {.          p->e
1cf60 53 74 61 67 65 20 3d 20 70 53 74 61 74 65 2d 3e  Stage = pState->
1cf70 65 53 74 61 67 65 3b 0a 20 20 20 20 20 20 20 20  eStage;.        
1cf80 20 20 70 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74    p->nPhaseOneSt
1cf90 65 70 20 3d 20 70 53 74 61 74 65 2d 3e 6e 50 68  ep = pState->nPh
1cfa0 61 73 65 4f 6e 65 53 74 65 70 3b 0a 20 20 20 20  aseOneStep;.    
1cfb0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d      }.        p-
1cfc0 3e 6e 50 72 6f 67 72 65 73 73 20 3d 20 70 53 74  >nProgress = pSt
1cfd0 61 74 65 2d 3e 6e 50 72 6f 67 72 65 73 73 3b 0a  ate->nProgress;.
1cfe0 20 20 20 20 20 20 20 20 70 2d 3e 69 4f 61 6c 53          p->iOalS
1cff0 7a 20 3d 20 70 53 74 61 74 65 2d 3e 69 4f 61 6c  z = pState->iOal
1d000 53 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Sz;.      }.    
1d010 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  }.    assert( p-
1d020 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc!=SQLITE_OK |
1d030 7c 20 70 2d 3e 65 53 74 61 67 65 21 3d 30 20 29  | p->eStage!=0 )
1d040 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  ;..    if( p->rc
1d050 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1d060 2d 3e 70 54 61 72 67 65 74 46 64 2d 3e 70 57 61  ->pTargetFd->pWa
1d070 6c 46 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28  lFd ){.      if(
1d080 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f   p->eStage==RBU_
1d090 53 54 41 47 45 5f 4f 41 4c 20 29 7b 0a 20 20 20  STAGE_OAL ){.   
1d0a0 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c       p->rc = SQL
1d0b0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
1d0c0 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20     p->zErrmsg = 
1d0d0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
1d0e0 22 63 61 6e 6e 6f 74 20 75 70 64 61 74 65 20 77  "cannot update w
1d0f0 61 6c 20 6d 6f 64 65 20 64 61 74 61 62 61 73 65  al mode database
1d100 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ");.      }else 
1d110 69 66 28 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52  if( p->eStage==R
1d120 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 20 29 7b  BU_STAGE_MOVE ){
1d130 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
1d140 67 65 20 3d 20 52 42 55 5f 53 54 41 47 45 5f 43  ge = RBU_STAGE_C
1d150 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  KPT;.        p->
1d160 6e 53 74 65 70 20 3d 20 30 3b 0a 20 20 20 20 20  nStep = 0;.     
1d170 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66   }.    }..    if
1d180 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1d190 4f 4b 20 0a 20 20 20 20 20 26 26 20 28 70 2d 3e  OK .     && (p->
1d1a0 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47  eStage==RBU_STAG
1d1b0 45 5f 4f 41 4c 20 7c 7c 20 70 2d 3e 65 53 74 61  E_OAL || p->eSta
1d1c0 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f  ge==RBU_STAGE_MO
1d1d0 56 45 29 0a 20 20 20 20 20 26 26 20 70 53 74 61  VE).     && pSta
1d1e0 74 65 2d 3e 65 53 74 61 67 65 21 3d 30 0a 20 20  te->eStage!=0.  
1d1f0 20 20 29 7b 0a 20 20 20 20 20 20 72 62 75 5f 66    ){.      rbu_f
1d200 69 6c 65 20 2a 70 46 64 20 3d 20 28 72 62 75 49  ile *pFd = (rbuI
1d210 73 56 61 63 75 75 6d 28 70 29 20 3f 20 70 2d 3e  sVacuum(p) ? p->
1d220 70 52 62 75 46 64 20 3a 20 70 2d 3e 70 54 61 72  pRbuFd : p->pTar
1d230 67 65 74 46 64 29 3b 0a 20 20 20 20 20 20 69 66  getFd);.      if
1d240 28 20 70 46 64 2d 3e 69 43 6f 6f 6b 69 65 21 3d  ( pFd->iCookie!=
1d250 70 53 74 61 74 65 2d 3e 69 43 6f 6f 6b 69 65 20  pState->iCookie 
1d260 29 7b 20 20 20 0a 20 20 20 20 20 20 20 20 2f 2a  ){   .        /*
1d270 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 28   At this point (
1d280 70 54 61 72 67 65 74 46 64 2d 3e 69 43 6f 6f 6b  pTargetFd->iCook
1d290 69 65 29 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ie) contains the
1d2a0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 20 20   value of the.  
1d2b0 20 20 20 20 20 20 2a 2a 20 63 68 61 6e 67 65 2d        ** change-
1d2c0 63 6f 75 6e 74 65 72 20 63 6f 6f 6b 69 65 20 28  counter cookie (
1d2d0 74 68 65 20 74 68 69 6e 67 20 74 68 61 74 20 67  the thing that g
1d2e0 65 74 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20  ets incremented 
1d2f0 77 68 65 6e 20 61 20 0a 20 20 20 20 20 20 20 20  when a .        
1d300 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
1d310 73 20 63 6f 6d 6d 69 74 74 65 64 20 69 6e 20 72  s committed in r
1d320 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 29 20 63 75  ollback mode) cu
1d330 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 6f  rrently stored o
1d340 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  n .        ** pa
1d350 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61  ge 1 of the data
1d360 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
1d370 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
1d380 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
1d390 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20     p->zErrmsg = 
1d3a0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
1d3b0 22 64 61 74 61 62 61 73 65 20 6d 6f 64 69 66 69  "database modifi
1d3c0 65 64 20 64 75 72 69 6e 67 20 72 62 75 20 25 73  ed during rbu %s
1d3d0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  ",.            (
1d3e0 72 62 75 49 73 56 61 63 75 75 6d 28 70 29 20 3f  rbuIsVacuum(p) ?
1d3f0 20 22 76 61 63 75 75 6d 22 20 3a 20 22 75 70 64   "vacuum" : "upd
1d400 61 74 65 22 29 0a 20 20 20 20 20 20 20 20 29 3b  ate").        );
1d410 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1d420 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
1d430 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d440 20 20 69 66 28 20 70 2d 3e 65 53 74 61 67 65 3d    if( p->eStage=
1d450 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 29  =RBU_STAGE_OAL )
1d460 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1d470 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 4d 61 69  3 *db = p->dbMai
1d480 6e 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63  n;.        p->rc
1d490 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
1d4a0 70 2d 3e 64 62 52 62 75 2c 20 22 42 45 47 49 4e  p->dbRbu, "BEGIN
1d4b0 22 2c 20 30 2c 20 30 2c 20 26 70 2d 3e 7a 45 72  ", 0, 0, &p->zEr
1d4c0 72 6d 73 67 29 3b 0a 0a 20 20 20 20 20 20 20 20  rmsg);..        
1d4d0 2f 2a 20 50 6f 69 6e 74 20 74 68 65 20 6f 62 6a  /* Point the obj
1d4e0 65 63 74 20 69 74 65 72 61 74 6f 72 20 61 74 20  ect iterator at 
1d4f0 74 68 65 20 66 69 72 73 74 20 6f 62 6a 65 63 74  the first object
1d500 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
1d510 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1d520 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
1d530 3e 72 63 20 3d 20 72 62 75 4f 62 6a 49 74 65 72  >rc = rbuObjIter
1d540 46 69 72 73 74 28 70 2c 20 26 70 2d 3e 6f 62 6a  First(p, &p->obj
1d550 69 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  iter);.        }
1d560 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ..        /* If 
1d570 74 68 65 20 52 42 55 20 64 61 74 61 62 61 73 65  the RBU database
1d580 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74   contains no dat
1d590 61 5f 78 78 78 20 74 61 62 6c 65 73 2c 20 64 65  a_xxx tables, de
1d5a0 63 6c 61 72 65 20 74 68 65 20 52 42 55 0a 20 20  clare the RBU.  
1d5b0 20 20 20 20 20 20 2a 2a 20 75 70 64 61 74 65 20        ** update 
1d5c0 66 69 6e 69 73 68 65 64 2e 20 20 2a 2f 0a 20 20  finished.  */.  
1d5d0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
1d5e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d  =SQLITE_OK && p-
1d5f0 3e 6f 62 6a 69 74 65 72 2e 7a 54 62 6c 3d 3d 30  >objiter.zTbl==0
1d600 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
1d610 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e  >rc = SQLITE_DON
1d620 45 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  E;.          p->
1d630 65 53 74 61 67 65 20 3d 20 52 42 55 5f 53 54 41  eStage = RBU_STA
1d640 47 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 20  GE_DONE;.       
1d650 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1d660 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1d670 49 54 45 5f 4f 4b 20 26 26 20 70 53 74 61 74 65  ITE_OK && pState
1d680 2d 3e 65 53 74 61 67 65 3d 3d 30 20 26 26 20 72  ->eStage==0 && r
1d690 62 75 49 73 56 61 63 75 75 6d 28 70 29 20 29 7b  buIsVacuum(p) ){
1d6a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 62 75  .            rbu
1d6b0 43 6f 70 79 50 72 61 67 6d 61 28 70 2c 20 22 70  CopyPragma(p, "p
1d6c0 61 67 65 5f 73 69 7a 65 22 29 3b 0a 20 20 20 20  age_size");.    
1d6d0 20 20 20 20 20 20 20 20 72 62 75 43 6f 70 79 50          rbuCopyP
1d6e0 72 61 67 6d 61 28 70 2c 20 22 61 75 74 6f 5f 76  ragma(p, "auto_v
1d6f0 61 63 75 75 6d 22 29 3b 0a 20 20 20 20 20 20 20  acuum");.       
1d700 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
1d710 2f 2a 20 4f 70 65 6e 20 74 72 61 6e 73 61 63 74  /* Open transact
1d720 69 6f 6e 73 20 62 6f 74 68 20 64 61 74 61 62 61  ions both databa
1d730 73 65 73 2e 20 54 68 65 20 2a 2d 6f 61 6c 20 66  ses. The *-oal f
1d740 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 6f 72  ile is opened or
1d750 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 72  .          ** cr
1d760 65 61 74 65 64 20 61 74 20 74 68 69 73 20 70 6f  eated at this po
1d770 69 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  int. */.        
1d780 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1d790 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d7a0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71        p->rc = sq
1d7b0 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 22  lite3_exec(db, "
1d7c0 42 45 47 49 4e 20 49 4d 4d 45 44 49 41 54 45 22  BEGIN IMMEDIATE"
1d7d0 2c 20 30 2c 20 30 2c 20 26 70 2d 3e 7a 45 72 72  , 0, 0, &p->zErr
1d7e0 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  msg);.          
1d7f0 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  }..          /* 
1d800 43 68 65 63 6b 20 69 66 20 74 68 65 20 6d 61 69  Check if the mai
1d810 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20  n database is a 
1d820 7a 69 70 76 66 73 20 64 62 2e 20 49 66 20 69 74  zipvfs db. If it
1d830 20 69 73 2c 20 73 65 74 20 74 68 65 20 75 70 70   is, set the upp
1d840 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  er.          ** 
1d850 6c 65 76 65 6c 20 70 61 67 65 72 20 74 6f 20 75  level pager to u
1d860 73 65 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  se "journal_mode
1d870 3d 6f 66 66 22 2e 20 54 68 69 73 20 70 72 65 76  =off". This prev
1d880 65 6e 74 73 20 69 74 20 66 72 6f 6d 20 0a 20 20  ents it from .  
1d890 20 20 20 20 20 20 20 20 2a 2a 20 67 65 6e 65 72          ** gener
1d8a0 61 74 69 6e 67 20 61 20 6c 61 72 67 65 20 6a 6f  ating a large jo
1d8b0 75 72 6e 61 6c 20 75 73 69 6e 67 20 61 20 74 65  urnal using a te
1d8c0 6d 70 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20  mp file.  */.   
1d8d0 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63         if( p->rc
1d8e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1d8f0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66             int f
1d900 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
1d910 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 6d  e_control(db, "m
1d920 61 69 6e 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e  ain", SQLITE_FCN
1d930 54 4c 5f 5a 49 50 56 46 53 2c 20 30 29 3b 0a 20  TL_ZIPVFS, 0);. 
1d940 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 66             if( f
1d950 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1d960 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1d970 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65  ->rc = sqlite3_e
1d980 78 65 63 28 0a 20 20 20 20 20 20 20 20 20 20 20  xec(.           
1d990 20 20 20 20 20 64 62 2c 20 22 50 52 41 47 4d 41       db, "PRAGMA
1d9a0 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66   journal_mode=of
1d9b0 66 22 2c 30 2c 30 2c 26 70 2d 3e 7a 45 72 72 6d  f",0,0,&p->zErrm
1d9c0 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  sg);.           
1d9d0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a   }.          }..
1d9e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
1d9f0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1da00 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 62  {.            rb
1da10 75 53 65 74 75 70 4f 61 6c 28 70 2c 20 70 53 74  uSetupOal(p, pSt
1da20 61 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ate);.          
1da30 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1da40 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65    }else if( p->e
1da50 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45  Stage==RBU_STAGE
1da60 5f 4d 4f 56 45 20 29 7b 0a 20 20 20 20 20 20 20  _MOVE ){.       
1da70 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20   /* no-op */.   
1da80 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
1da90 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47  eStage==RBU_STAG
1daa0 45 5f 43 4b 50 54 20 29 7b 0a 20 20 20 20 20 20  E_CKPT ){.      
1dab0 20 20 72 62 75 53 65 74 75 70 43 68 65 63 6b 70    rbuSetupCheckp
1dac0 6f 69 6e 74 28 70 2c 20 70 53 74 61 74 65 29 3b  oint(p, pState);
1dad0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1dae0 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f   p->eStage==RBU_
1daf0 53 54 41 47 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  STAGE_DONE ){.  
1db00 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
1db10 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20  LITE_DONE;.     
1db20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1db30 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43  p->rc = SQLITE_C
1db40 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a  ORRUPT;.      }.
1db50 20 20 20 20 7d 0a 0a 20 20 20 20 72 62 75 46 72      }..    rbuFr
1db60 65 65 53 74 61 74 65 28 70 53 74 61 74 65 29 3b  eeState(pState);
1db70 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
1db80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
1db90 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ate and return a
1dba0 6e 20 52 42 55 20 68 61 6e 64 6c 65 20 77 69 74  n RBU handle wit
1dbb0 68 20 61 6c 6c 20 66 69 65 6c 64 73 20 7a 65 72  h all fields zer
1dbc0 6f 65 64 20 65 78 63 65 70 74 20 66 6f 72 20 74  oed except for t
1dbd0 68 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  he.** error code
1dbe0 2c 20 77 68 69 63 68 20 69 73 20 73 65 74 20 74  , which is set t
1dbf0 6f 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2e  o SQLITE_MISUSE.
1dc00 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
1dc10 65 33 72 62 75 20 2a 72 62 75 4d 69 73 75 73 65  e3rbu *rbuMisuse
1dc20 45 72 72 6f 72 28 76 6f 69 64 29 7b 0a 20 20 73  Error(void){.  s
1dc30 71 6c 69 74 65 33 72 62 75 20 2a 70 52 65 74 3b  qlite3rbu *pRet;
1dc40 0a 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65  .  pRet = sqlite
1dc50 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 69 7a 65 6f  3_malloc64(sizeo
1dc60 66 28 73 71 6c 69 74 65 33 72 62 75 29 29 3b 0a  f(sqlite3rbu));.
1dc70 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20    if( pRet ){.  
1dc80 20 20 6d 65 6d 73 65 74 28 70 52 65 74 2c 20 30    memset(pRet, 0
1dc90 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33  , sizeof(sqlite3
1dca0 72 62 75 29 29 3b 0a 20 20 20 20 70 52 65 74 2d  rbu));.    pRet-
1dcb0 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4d 49 53  >rc = SQLITE_MIS
1dcc0 55 53 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  USE;.  }.  retur
1dcd0 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
1dce0 20 4f 70 65 6e 20 61 6e 64 20 72 65 74 75 72 6e   Open and return
1dcf0 20 61 20 6e 65 77 20 52 42 55 20 68 61 6e 64 6c   a new RBU handl
1dd00 65 2e 20 0a 2a 2f 0a 73 71 6c 69 74 65 33 72 62  e. .*/.sqlite3rb
1dd10 75 20 2a 73 71 6c 69 74 65 33 72 62 75 5f 6f 70  u *sqlite3rbu_op
1dd20 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  en(.  const char
1dd30 20 2a 7a 54 61 72 67 65 74 2c 20 0a 20 20 63 6f   *zTarget, .  co
1dd40 6e 73 74 20 63 68 61 72 20 2a 7a 52 62 75 2c 0a  nst char *zRbu,.
1dd50 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
1dd60 74 61 74 65 0a 29 7b 0a 20 20 69 66 28 20 7a 54  tate.){.  if( zT
1dd70 61 72 67 65 74 3d 3d 30 20 7c 7c 20 7a 52 62 75  arget==0 || zRbu
1dd80 3d 3d 30 20 29 7b 20 72 65 74 75 72 6e 20 72 62  ==0 ){ return rb
1dd90 75 4d 69 73 75 73 65 45 72 72 6f 72 28 29 3b 20  uMisuseError(); 
1dda0 7d 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65  }.  /* TODO: Che
1ddb0 63 6b 20 74 68 61 74 20 7a 54 61 72 67 65 74 20  ck that zTarget 
1ddc0 61 6e 64 20 7a 52 62 75 20 61 72 65 20 6e 6f 6e  and zRbu are non
1ddd0 2d 4e 55 4c 4c 20 2a 2f 0a 20 20 72 65 74 75 72  -NULL */.  retur
1dde0 6e 20 6f 70 65 6e 52 62 75 48 61 6e 64 6c 65 28  n openRbuHandle(
1ddf0 7a 54 61 72 67 65 74 2c 20 7a 52 62 75 2c 20 7a  zTarget, zRbu, z
1de00 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  State);.}../*.**
1de10 20 4f 70 65 6e 20 61 20 68 61 6e 64 6c 65 20 74   Open a handle t
1de20 6f 20 62 65 67 69 6e 20 6f 72 20 72 65 73 75 6d  o begin or resum
1de30 65 20 61 6e 20 52 42 55 20 56 41 43 55 55 4d 20  e an RBU VACUUM 
1de40 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 71  operation..*/.sq
1de50 6c 69 74 65 33 72 62 75 20 2a 73 71 6c 69 74 65  lite3rbu *sqlite
1de60 33 72 62 75 5f 76 61 63 75 75 6d 28 0a 20 20 63  3rbu_vacuum(.  c
1de70 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 72 67  onst char *zTarg
1de80 65 74 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  et, .  const cha
1de90 72 20 2a 7a 53 74 61 74 65 0a 29 7b 0a 20 20 69  r *zState.){.  i
1dea0 66 28 20 7a 54 61 72 67 65 74 3d 3d 30 20 29 7b  f( zTarget==0 ){
1deb0 20 72 65 74 75 72 6e 20 72 62 75 4d 69 73 75 73   return rbuMisus
1dec0 65 45 72 72 6f 72 28 29 3b 20 7d 0a 20 20 69 66  eError(); }.  if
1ded0 28 20 7a 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ( zState ){.    
1dee0 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a  int n = strlen(z
1def0 53 74 61 74 65 29 3b 0a 20 20 20 20 69 66 28 20  State);.    if( 
1df00 6e 3e 3d 37 20 26 26 20 30 3d 3d 6d 65 6d 63 6d  n>=7 && 0==memcm
1df10 70 28 22 2d 76 61 63 74 6d 70 22 2c 20 26 7a 53  p("-vactmp", &zS
1df20 74 61 74 65 5b 6e 2d 37 5d 2c 20 37 29 20 29 7b  tate[n-7], 7) ){
1df30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 62  .      return rb
1df40 75 4d 69 73 75 73 65 45 72 72 6f 72 28 29 3b 0a  uMisuseError();.
1df50 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 54      }.  }.  /* T
1df60 4f 44 4f 3a 20 43 68 65 63 6b 20 74 68 61 74 20  ODO: Check that 
1df70 62 6f 74 68 20 61 72 67 75 6d 65 6e 74 73 20 61  both arguments a
1df80 72 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 2a 2f 0a 20  re non-NULL */. 
1df90 20 72 65 74 75 72 6e 20 6f 70 65 6e 52 62 75 48   return openRbuH
1dfa0 61 6e 64 6c 65 28 30 2c 20 7a 54 61 72 67 65 74  andle(0, zTarget
1dfb0 2c 20 7a 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a  , zState);.}../*
1dfc0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
1dfd0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 75  atabase handle u
1dfe0 73 65 64 20 62 79 20 70 52 62 75 2e 0a 2a 2f 0a  sed by pRbu..*/.
1dff0 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33  sqlite3 *sqlite3
1e000 72 62 75 5f 64 62 28 73 71 6c 69 74 65 33 72 62  rbu_db(sqlite3rb
1e010 75 20 2a 70 52 62 75 2c 20 69 6e 74 20 62 52 62  u *pRbu, int bRb
1e020 75 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  u){.  sqlite3 *d
1e030 62 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 52 62  b = 0;.  if( pRb
1e040 75 20 29 7b 0a 20 20 20 20 64 62 20 3d 20 28 62  u ){.    db = (b
1e050 52 62 75 20 3f 20 70 52 62 75 2d 3e 64 62 52 62  Rbu ? pRbu->dbRb
1e060 75 20 3a 20 70 52 62 75 2d 3e 64 62 4d 61 69 6e  u : pRbu->dbMain
1e070 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1e080 64 62 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66  db;.}.../*.** If
1e090 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
1e0a0 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64  currently stored
1e0b0 20 69 6e 20 74 68 65 20 52 42 55 20 68 61 6e 64   in the RBU hand
1e0c0 6c 65 20 69 73 20 53 51 4c 49 54 45 5f 43 4f 4e  le is SQLITE_CON
1e0d0 53 54 52 41 49 4e 54 2c 0a 2a 2a 20 74 68 65 6e  STRAINT,.** then
1e0e0 20 65 64 69 74 20 61 6e 79 20 65 72 72 6f 72 20   edit any error 
1e0f0 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67 20 73  message string s
1e100 6f 20 61 73 20 74 6f 20 72 65 6d 6f 76 65 20 61  o as to remove a
1e110 6c 6c 20 6f 63 63 75 72 72 65 6e 63 65 73 20 6f  ll occurrences o
1e120 66 0a 2a 2a 20 74 68 65 20 70 61 74 74 65 72 6e  f.** the pattern
1e130 20 22 72 62 75 5f 69 6d 70 5f 5b 30 2d 39 5d 2a   "rbu_imp_[0-9]*
1e140 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  "..*/.static voi
1e150 64 20 72 62 75 45 64 69 74 45 72 72 6d 73 67 28  d rbuEditErrmsg(
1e160 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a  sqlite3rbu *p){.
1e170 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1e180 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26  ITE_CONSTRAINT &
1e190 26 20 70 2d 3e 7a 45 72 72 6d 73 67 20 29 7b 0a  & p->zErrmsg ){.
1e1a0 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
1e1b0 20 69 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6e   i;.    size_t n
1e1c0 45 72 72 6d 73 67 20 3d 20 73 74 72 6c 65 6e 28  Errmsg = strlen(
1e1d0 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20  p->zErrmsg);.   
1e1e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 6e 45 72   for(i=0; i<(nEr
1e1f0 72 6d 73 67 2d 38 29 3b 20 69 2b 2b 29 7b 0a 20  rmsg-8); i++){. 
1e200 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28       if( memcmp(
1e210 26 70 2d 3e 7a 45 72 72 6d 73 67 5b 69 5d 2c 20  &p->zErrmsg[i], 
1e220 22 72 62 75 5f 69 6d 70 5f 22 2c 20 38 29 3d 3d  "rbu_imp_", 8)==
1e230 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  0 ){.        int
1e240 20 6e 44 65 6c 20 3d 20 38 3b 0a 20 20 20 20 20   nDel = 8;.     
1e250 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 7a 45 72     while( p->zEr
1e260 72 6d 73 67 5b 69 2b 6e 44 65 6c 5d 3e 3d 27 30  rmsg[i+nDel]>='0
1e270 27 20 26 26 20 70 2d 3e 7a 45 72 72 6d 73 67 5b  ' && p->zErrmsg[
1e280 69 2b 6e 44 65 6c 5d 3c 3d 27 39 27 20 29 20 6e  i+nDel]<='9' ) n
1e290 44 65 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6d  Del++;.        m
1e2a0 65 6d 6d 6f 76 65 28 26 70 2d 3e 7a 45 72 72 6d  emmove(&p->zErrm
1e2b0 73 67 5b 69 5d 2c 20 26 70 2d 3e 7a 45 72 72 6d  sg[i], &p->zErrm
1e2c0 73 67 5b 69 2b 6e 44 65 6c 5d 2c 20 6e 45 72 72  sg[i+nDel], nErr
1e2d0 6d 73 67 20 2b 20 31 20 2d 20 69 20 2d 20 6e 44  msg + 1 - i - nD
1e2e0 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 6e 45 72  el);.        nEr
1e2f0 72 6d 73 67 20 2d 3d 20 6e 44 65 6c 3b 0a 20 20  rmsg -= nDel;.  
1e300 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1e310 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74  }../*.** Close t
1e320 68 65 20 52 42 55 20 68 61 6e 64 6c 65 2e 0a 2a  he RBU handle..*
1e330 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 72 62 75  /.int sqlite3rbu
1e340 5f 63 6c 6f 73 65 28 73 71 6c 69 74 65 33 72 62  _close(sqlite3rb
1e350 75 20 2a 70 2c 20 63 68 61 72 20 2a 2a 70 7a 45  u *p, char **pzE
1e360 72 72 6d 73 67 29 7b 0a 20 20 69 6e 74 20 72 63  rrmsg){.  int rc
1e370 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 0a 20 20  ;.  if( p ){..  
1e380 20 20 2f 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20    /* Commit the 
1e390 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 74  transaction to t
1e3a0 68 65 20 2a 2d 6f 61 6c 20 66 69 6c 65 2e 20 2a  he *-oal file. *
1e3b0 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  /.    if( p->rc=
1e3c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d  =SQLITE_OK && p-
1e3d0 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41  >eStage==RBU_STA
1e3e0 47 45 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 20 20  GE_OAL ){.      
1e3f0 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
1e400 65 78 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  exec(p->dbMain, 
1e410 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20  "COMMIT", 0, 0, 
1e420 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20  &p->zErrmsg);.  
1e430 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63    }..    /* Sync
1e440 20 74 68 65 20 64 62 20 66 69 6c 65 20 69 66 20   the db file if 
1e450 63 75 72 72 65 6e 74 6c 79 20 64 6f 69 6e 67 20  currently doing 
1e460 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 63  an incremental c
1e470 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a 20 20 20  heckpoint */.   
1e480 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1e490 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 65 53 74 61  TE_OK && p->eSta
1e4a0 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 43 4b  ge==RBU_STAGE_CK
1e4b0 50 54 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  PT ){.      sqli
1e4c0 74 65 33 5f 66 69 6c 65 20 2a 70 44 62 20 3d 20  te3_file *pDb = 
1e4d0 70 2d 3e 70 54 61 72 67 65 74 46 64 2d 3e 70 52  p->pTargetFd->pR
1e4e0 65 61 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 72 63  eal;.      p->rc
1e4f0 20 3d 20 70 44 62 2d 3e 70 4d 65 74 68 6f 64 73   = pDb->pMethods
1e500 2d 3e 78 53 79 6e 63 28 70 44 62 2c 20 53 51 4c  ->xSync(pDb, SQL
1e510 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
1e520 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 62 75  ;.    }..    rbu
1e530 53 61 76 65 53 74 61 74 65 28 70 2c 20 70 2d 3e  SaveState(p, p->
1e540 65 53 74 61 67 65 29 3b 0a 0a 20 20 20 20 69 66  eStage);..    if
1e550 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1e560 4f 4b 20 26 26 20 70 2d 3e 65 53 74 61 67 65 3d  OK && p->eStage=
1e570 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 29  =RBU_STAGE_OAL )
1e580 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
1e590 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
1e5a0 64 62 52 62 75 2c 20 22 43 4f 4d 4d 49 54 22 2c  dbRbu, "COMMIT",
1e5b0 20 30 2c 20 30 2c 20 26 70 2d 3e 7a 45 72 72 6d   0, 0, &p->zErrm
1e5c0 73 67 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  sg);.    }..    
1e5d0 2f 2a 20 43 6c 6f 73 65 20 61 6e 79 20 6f 70 65  /* Close any ope
1e5e0 6e 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64  n statement hand
1e5f0 6c 65 73 2e 20 2a 2f 0a 20 20 20 20 72 62 75 4f  les. */.    rbuO
1e600 62 6a 49 74 65 72 46 69 6e 61 6c 69 7a 65 28 26  bjIterFinalize(&
1e610 70 2d 3e 6f 62 6a 69 74 65 72 29 3b 0a 0a 20 20  p->objiter);..  
1e620 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1e630 61 6e 20 52 42 55 20 76 61 63 75 75 6d 20 68 61  an RBU vacuum ha
1e640 6e 64 6c 65 20 61 6e 64 20 74 68 65 20 76 61 63  ndle and the vac
1e650 75 75 6d 20 68 61 73 20 65 69 74 68 65 72 20 66  uum has either f
1e660 69 6e 69 73 68 65 64 0a 20 20 20 20 2a 2a 20 73  inished.    ** s
1e670 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 72 20 65  uccessfully or e
1e680 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 20 65 72  ncountered an er
1e690 72 6f 72 2c 20 64 65 6c 65 74 65 20 74 68 65 20  ror, delete the 
1e6a0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1e6b0 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 20 74 61  .    ** state ta
1e6c0 62 6c 65 2e 20 54 68 69 73 20 63 61 75 73 65 73  ble. This causes
1e6d0 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74   the next call t
1e6e0 6f 20 73 71 6c 69 74 65 33 72 62 75 5f 76 61 63  o sqlite3rbu_vac
1e6f0 75 75 6d 28 29 20 0a 20 20 20 20 2a 2a 20 73 70  uum() .    ** sp
1e700 65 63 69 66 79 69 6e 67 20 74 68 65 20 63 75 72  ecifying the cur
1e710 72 65 6e 74 20 74 61 72 67 65 74 20 61 6e 64 20  rent target and 
1e720 73 74 61 74 65 20 64 61 74 61 62 61 73 65 73 20  state databases 
1e730 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 0a 20  to start a new. 
1e740 20 20 20 2a 2a 20 76 61 63 75 75 6d 20 66 72 6f     ** vacuum fro
1e750 6d 20 73 63 72 61 74 63 68 2e 20 20 2a 2f 0a 20  m scratch.  */. 
1e760 20 20 20 69 66 28 20 72 62 75 49 73 56 61 63 75     if( rbuIsVacu
1e770 75 6d 28 70 29 20 26 26 20 70 2d 3e 72 63 21 3d  um(p) && p->rc!=
1e780 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e  SQLITE_OK && p->
1e790 64 62 52 62 75 20 29 7b 0a 20 20 20 20 20 20 69  dbRbu ){.      i
1e7a0 6e 74 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33  nt rc2 = sqlite3
1e7b0 5f 65 78 65 63 28 70 2d 3e 64 62 52 62 75 2c 20  _exec(p->dbRbu, 
1e7c0 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 73 74 61  "DELETE FROM sta
1e7d0 74 2e 72 62 75 5f 73 74 61 74 65 22 2c 20 30 2c  t.rbu_state", 0,
1e7e0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
1e7f0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1e800 44 4f 4e 45 20 26 26 20 72 63 32 21 3d 53 51 4c  DONE && rc2!=SQL
1e810 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63 20 3d  ITE_OK ) p->rc =
1e820 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   rc2;.    }..   
1e830 20 2f 2a 20 43 6c 6f 73 65 20 74 68 65 20 6f 70   /* Close the op
1e840 65 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  en database hand
1e850 6c 65 20 61 6e 64 20 56 46 53 20 6f 62 6a 65 63  le and VFS objec
1e860 74 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  t. */.    sqlite
1e870 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 52 62 75  3_close(p->dbRbu
1e880 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
1e890 6c 6f 73 65 28 70 2d 3e 64 62 4d 61 69 6e 29 3b  lose(p->dbMain);
1e8a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
1e8b0 73 7a 54 65 6d 70 3d 3d 30 20 29 3b 0a 20 20 20  szTemp==0 );.   
1e8c0 20 72 62 75 44 65 6c 65 74 65 56 66 73 28 70 29   rbuDeleteVfs(p)
1e8d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
1e8e0 65 65 28 70 2d 3e 61 42 75 66 29 3b 0a 20 20 20  ee(p->aBuf);.   
1e8f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
1e900 3e 61 46 72 61 6d 65 29 3b 0a 0a 20 20 20 20 72  >aFrame);..    r
1e910 62 75 45 64 69 74 45 72 72 6d 73 67 28 70 29 3b  buEditErrmsg(p);
1e920 0a 20 20 20 20 72 63 20 3d 20 70 2d 3e 72 63 3b  .    rc = p->rc;
1e930 0a 20 20 20 20 69 66 28 20 70 7a 45 72 72 6d 73  .    if( pzErrms
1e940 67 20 29 7b 0a 20 20 20 20 20 20 2a 70 7a 45 72  g ){.      *pzEr
1e950 72 6d 73 67 20 3d 20 70 2d 3e 7a 45 72 72 6d 73  rmsg = p->zErrms
1e960 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  g;.    }else{.  
1e970 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1e980 28 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20  (p->zErrmsg);.  
1e990 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
1e9a0 66 72 65 65 28 70 2d 3e 7a 53 74 61 74 65 29 3b  free(p->zState);
1e9b0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1e9c0 65 28 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  e(p);.  }else{. 
1e9d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1e9e0 4f 4d 45 4d 3b 0a 20 20 20 20 2a 70 7a 45 72 72  OMEM;.    *pzErr
1e9f0 6d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  msg = 0;.  }.  r
1ea00 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1ea10 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f  ** Return the to
1ea20 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6b 65  tal number of ke
1ea30 79 2d 76 61 6c 75 65 20 6f 70 65 72 61 74 69 6f  y-value operatio
1ea40 6e 73 20 28 69 6e 73 65 72 74 73 2c 20 64 65 6c  ns (inserts, del
1ea50 65 74 65 73 20 6f 72 20 0a 2a 2a 20 75 70 64 61  etes or .** upda
1ea60 74 65 73 29 20 74 68 61 74 20 68 61 76 65 20 62  tes) that have b
1ea70 65 65 6e 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e  een performed on
1ea80 20 74 68 65 20 74 61 72 67 65 74 20 64 61 74 61   the target data
1ea90 62 61 73 65 20 73 69 6e 63 65 20 74 68 65 0a 2a  base since the.*
1eaa0 2a 20 63 75 72 72 65 6e 74 20 52 42 55 20 75 70  * current RBU up
1eab0 64 61 74 65 20 77 61 73 20 73 74 61 72 74 65 64  date was started
1eac0 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74  ..*/.sqlite3_int
1ead0 36 34 20 73 71 6c 69 74 65 33 72 62 75 5f 70 72  64 sqlite3rbu_pr
1eae0 6f 67 72 65 73 73 28 73 71 6c 69 74 65 33 72 62  ogress(sqlite3rb
1eaf0 75 20 2a 70 52 62 75 29 7b 0a 20 20 72 65 74 75  u *pRbu){.  retu
1eb00 72 6e 20 70 52 62 75 2d 3e 6e 50 72 6f 67 72 65  rn pRbu->nProgre
1eb10 73 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ss;.}../*.** Ret
1eb20 75 72 6e 20 70 65 72 6d 79 72 69 61 64 61 67 65  urn permyriadage
1eb30 20 70 72 6f 67 72 65 73 73 20 69 6e 64 69 63 61   progress indica
1eb40 74 69 6f 6e 73 20 66 6f 72 20 74 68 65 20 74 77  tions for the tw
1eb50 6f 20 6d 61 69 6e 20 73 74 61 67 65 73 20 6f 66  o main stages of
1eb60 0a 2a 2a 20 61 6e 20 52 42 55 20 75 70 64 61 74  .** an RBU updat
1eb70 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
1eb80 65 33 72 62 75 5f 62 70 5f 70 72 6f 67 72 65 73  e3rbu_bp_progres
1eb90 73 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c  s(sqlite3rbu *p,
1eba0 20 69 6e 74 20 2a 70 6e 4f 6e 65 2c 20 69 6e 74   int *pnOne, int
1ebb0 20 2a 70 6e 54 77 6f 29 7b 0a 20 20 63 6f 6e 73   *pnTwo){.  cons
1ebc0 74 20 69 6e 74 20 4d 41 58 5f 50 52 4f 47 52 45  t int MAX_PROGRE
1ebd0 53 53 20 3d 20 31 30 30 30 30 3b 0a 20 20 73 77  SS = 10000;.  sw
1ebe0 69 74 63 68 28 20 70 2d 3e 65 53 74 61 67 65 20  itch( p->eStage 
1ebf0 29 7b 0a 20 20 20 20 63 61 73 65 20 52 42 55 5f  ){.    case RBU_
1ec00 53 54 41 47 45 5f 4f 41 4c 3a 0a 20 20 20 20 20  STAGE_OAL:.     
1ec10 20 69 66 28 20 70 2d 3e 6e 50 68 61 73 65 4f 6e   if( p->nPhaseOn
1ec20 65 53 74 65 70 3e 30 20 29 7b 0a 20 20 20 20 20  eStep>0 ){.     
1ec30 20 20 20 2a 70 6e 4f 6e 65 20 3d 20 28 69 6e 74     *pnOne = (int
1ec40 29 28 4d 41 58 5f 50 52 4f 47 52 45 53 53 20 2a  )(MAX_PROGRESS *
1ec50 20 28 69 36 34 29 70 2d 3e 6e 50 72 6f 67 72 65   (i64)p->nProgre
1ec60 73 73 2f 28 69 36 34 29 70 2d 3e 6e 50 68 61 73  ss/(i64)p->nPhas
1ec70 65 4f 6e 65 53 74 65 70 29 3b 0a 20 20 20 20 20  eOneStep);.     
1ec80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ec90 2a 70 6e 4f 6e 65 20 3d 20 2d 31 3b 0a 20 20 20  *pnOne = -1;.   
1eca0 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 6e 54 77     }.      *pnTw
1ecb0 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  o = 0;.      bre
1ecc0 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 52 42  ak;..    case RB
1ecd0 55 5f 53 54 41 47 45 5f 4d 4f 56 45 3a 0a 20 20  U_STAGE_MOVE:.  
1ece0 20 20 20 20 2a 70 6e 4f 6e 65 20 3d 20 4d 41 58      *pnOne = MAX
1ecf0 5f 50 52 4f 47 52 45 53 53 3b 0a 20 20 20 20 20  _PROGRESS;.     
1ed00 20 2a 70 6e 54 77 6f 20 3d 20 30 3b 0a 20 20 20   *pnTwo = 0;.   
1ed10 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
1ed20 61 73 65 20 52 42 55 5f 53 54 41 47 45 5f 43 4b  ase RBU_STAGE_CK
1ed30 50 54 3a 0a 20 20 20 20 20 20 2a 70 6e 4f 6e 65  PT:.      *pnOne
1ed40 20 3d 20 4d 41 58 5f 50 52 4f 47 52 45 53 53 3b   = MAX_PROGRESS;
1ed50 0a 20 20 20 20 20 20 2a 70 6e 54 77 6f 20 3d 20  .      *pnTwo = 
1ed60 28 69 6e 74 29 28 4d 41 58 5f 50 52 4f 47 52 45  (int)(MAX_PROGRE
1ed70 53 53 20 2a 20 28 69 36 34 29 70 2d 3e 6e 53 74  SS * (i64)p->nSt
1ed80 65 70 20 2f 20 28 69 36 34 29 70 2d 3e 6e 46 72  ep / (i64)p->nFr
1ed90 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ame);.      brea
1eda0 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 52 42 55  k;..    case RBU
1edb0 5f 53 54 41 47 45 5f 44 4f 4e 45 3a 0a 20 20 20  _STAGE_DONE:.   
1edc0 20 20 20 2a 70 6e 4f 6e 65 20 3d 20 4d 41 58 5f     *pnOne = MAX_
1edd0 50 52 4f 47 52 45 53 53 3b 0a 20 20 20 20 20 20  PROGRESS;.      
1ede0 2a 70 6e 54 77 6f 20 3d 20 4d 41 58 5f 50 52 4f  *pnTwo = MAX_PRO
1edf0 47 52 45 53 53 3b 0a 20 20 20 20 20 20 62 72 65  GRESS;.      bre
1ee00 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74  ak;..    default
1ee10 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
1ee20 30 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  0 );.  }.}../*.*
1ee30 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
1ee40 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68  rent state of th
1ee50 65 20 52 42 55 20 76 61 63 75 75 6d 20 6f 72 20  e RBU vacuum or 
1ee60 75 70 64 61 74 65 20 6f 70 65 72 61 74 69 6f 6e  update operation
1ee70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1ee80 72 62 75 5f 73 74 61 74 65 28 73 71 6c 69 74 65  rbu_state(sqlite
1ee90 33 72 62 75 20 2a 70 29 7b 0a 20 20 69 6e 74 20  3rbu *p){.  int 
1eea0 61 52 65 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 30  aRes[] = {.    0
1eeb0 2c 20 53 51 4c 49 54 45 5f 52 42 55 5f 53 54 41  , SQLITE_RBU_STA
1eec0 54 45 5f 4f 41 4c 2c 20 53 51 4c 49 54 45 5f 52  TE_OAL, SQLITE_R
1eed0 42 55 5f 53 54 41 54 45 5f 4d 4f 56 45 2c 0a 20  BU_STATE_MOVE,. 
1eee0 20 20 20 30 2c 20 53 51 4c 49 54 45 5f 52 42 55     0, SQLITE_RBU
1eef0 5f 53 54 41 54 45 5f 43 48 45 43 4b 50 4f 49 4e  _STATE_CHECKPOIN
1ef00 54 2c 20 53 51 4c 49 54 45 5f 52 42 55 5f 53 54  T, SQLITE_RBU_ST
1ef10 41 54 45 5f 44 4f 4e 45 0a 20 20 7d 3b 0a 0a 20  ATE_DONE.  };.. 
1ef20 20 61 73 73 65 72 74 28 20 52 42 55 5f 53 54 41   assert( RBU_STA
1ef30 47 45 5f 4f 41 4c 3d 3d 31 20 29 3b 0a 20 20 61  GE_OAL==1 );.  a
1ef40 73 73 65 72 74 28 20 52 42 55 5f 53 54 41 47 45  ssert( RBU_STAGE
1ef50 5f 4d 4f 56 45 3d 3d 32 20 29 3b 0a 20 20 61 73  _MOVE==2 );.  as
1ef60 73 65 72 74 28 20 52 42 55 5f 53 54 41 47 45 5f  sert( RBU_STAGE_
1ef70 43 4b 50 54 3d 3d 34 20 29 3b 0a 20 20 61 73 73  CKPT==4 );.  ass
1ef80 65 72 74 28 20 52 42 55 5f 53 54 41 47 45 5f 44  ert( RBU_STAGE_D
1ef90 4f 4e 45 3d 3d 35 20 29 3b 0a 20 20 61 73 73 65  ONE==5 );.  asse
1efa0 72 74 28 20 61 52 65 73 5b 52 42 55 5f 53 54 41  rt( aRes[RBU_STA
1efb0 47 45 5f 4f 41 4c 5d 3d 3d 53 51 4c 49 54 45 5f  GE_OAL]==SQLITE_
1efc0 52 42 55 5f 53 54 41 54 45 5f 4f 41 4c 20 29 3b  RBU_STATE_OAL );
1efd0 0a 20 20 61 73 73 65 72 74 28 20 61 52 65 73 5b  .  assert( aRes[
1efe0 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 5d 3d  RBU_STAGE_MOVE]=
1eff0 3d 53 51 4c 49 54 45 5f 52 42 55 5f 53 54 41 54  =SQLITE_RBU_STAT
1f000 45 5f 4d 4f 56 45 20 29 3b 0a 20 20 61 73 73 65  E_MOVE );.  asse
1f010 72 74 28 20 61 52 65 73 5b 52 42 55 5f 53 54 41  rt( aRes[RBU_STA
1f020 47 45 5f 43 4b 50 54 5d 3d 3d 53 51 4c 49 54 45  GE_CKPT]==SQLITE
1f030 5f 52 42 55 5f 53 54 41 54 45 5f 43 48 45 43 4b  _RBU_STATE_CHECK
1f040 50 4f 49 4e 54 20 29 3b 0a 20 20 61 73 73 65 72  POINT );.  asser
1f050 74 28 20 61 52 65 73 5b 52 42 55 5f 53 54 41 47  t( aRes[RBU_STAG
1f060 45 5f 44 4f 4e 45 5d 3d 3d 53 51 4c 49 54 45 5f  E_DONE]==SQLITE_
1f070 52 42 55 5f 53 54 41 54 45 5f 44 4f 4e 45 20 29  RBU_STATE_DONE )
1f080 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d  ;..  if( p->rc!=
1f090 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e  SQLITE_OK && p->
1f0a0 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
1f0b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1f0c0 4c 49 54 45 5f 52 42 55 5f 53 54 41 54 45 5f 45  LITE_RBU_STATE_E
1f0d0 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  RROR;.  }else{. 
1f0e0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63     assert( p->rc
1f0f0 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c  !=SQLITE_DONE ||
1f100 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f   p->eStage==RBU_
1f110 53 54 41 47 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  STAGE_DONE );.  
1f120 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74    assert( p->eSt
1f130 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f  age==RBU_STAGE_O
1f140 41 4c 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  AL.         || p
1f150 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  ->eStage==RBU_ST
1f160 41 47 45 5f 4d 4f 56 45 0a 20 20 20 20 20 20 20  AGE_MOVE.       
1f170 20 20 7c 7c 20 70 2d 3e 65 53 74 61 67 65 3d 3d    || p->eStage==
1f180 52 42 55 5f 53 54 41 47 45 5f 43 4b 50 54 0a 20  RBU_STAGE_CKPT. 
1f190 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53          || p->eS
1f1a0 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f  tage==RBU_STAGE_
1f1b0 44 4f 4e 45 0a 20 20 20 20 29 3b 0a 20 20 20 20  DONE.    );.    
1f1c0 72 65 74 75 72 6e 20 61 52 65 73 5b 70 2d 3e 65  return aRes[p->e
1f1d0 53 74 61 67 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 69  Stage];.  }.}..i
1f1e0 6e 74 20 73 71 6c 69 74 65 33 72 62 75 5f 73 61  nt sqlite3rbu_sa
1f1f0 76 65 73 74 61 74 65 28 73 71 6c 69 74 65 33 72  vestate(sqlite3r
1f200 62 75 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  bu *p){.  int rc
1f210 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20   = p->rc;.  if( 
1f220 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
1f230 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1f240 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
1f250 2d 3e 65 53 74 61 67 65 3e 3d 52 42 55 5f 53 54  ->eStage>=RBU_ST
1f260 41 47 45 5f 4f 41 4c 20 26 26 20 70 2d 3e 65 53  AGE_OAL && p->eS
1f270 74 61 67 65 3c 3d 52 42 55 5f 53 54 41 47 45 5f  tage<=RBU_STAGE_
1f280 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 2d  DONE );.  if( p-
1f290 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41  >eStage==RBU_STA
1f2a0 47 45 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 61 73  GE_OAL ){.    as
1f2b0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
1f2c0 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28  _DONE );.    if(
1f2d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1f2e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
1f2f0 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 43  ec(p->dbMain, "C
1f300 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 30 29  OMMIT", 0, 0, 0)
1f310 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 79 6e 63  ;.  }..  /* Sync
1f320 20 74 68 65 20 64 62 20 66 69 6c 65 20 2a 2f 0a   the db file */.
1f330 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f340 5f 4f 4b 20 26 26 20 70 2d 3e 65 53 74 61 67 65  _OK && p->eStage
1f350 3d 3d 52 42 55 5f 53 54 41 47 45 5f 43 4b 50 54  ==RBU_STAGE_CKPT
1f360 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1f370 66 69 6c 65 20 2a 70 44 62 20 3d 20 70 2d 3e 70  file *pDb = p->p
1f380 54 61 72 67 65 74 46 64 2d 3e 70 52 65 61 6c 3b  TargetFd->pReal;
1f390 0a 20 20 20 20 72 63 20 3d 20 70 44 62 2d 3e 70  .    rc = pDb->p
1f3a0 4d 65 74 68 6f 64 73 2d 3e 78 53 79 6e 63 28 70  Methods->xSync(p
1f3b0 44 62 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  Db, SQLITE_SYNC_
1f3c0 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a 0a 20 20  NORMAL);.  }..  
1f3d0 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 72 62  p->rc = rc;.  rb
1f3e0 75 53 61 76 65 53 74 61 74 65 28 70 2c 20 70 2d  uSaveState(p, p-
1f3f0 3e 65 53 74 61 67 65 29 3b 0a 20 20 72 63 20 3d  >eStage);.  rc =
1f400 20 70 2d 3e 72 63 3b 0a 0a 20 20 69 66 28 20 70   p->rc;..  if( p
1f410 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  ->eStage==RBU_ST
1f420 41 47 45 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 61  AGE_OAL ){.    a
1f430 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
1f440 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66  E_DONE );.    if
1f450 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1f460 29 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65  ) rc = sqlite3_e
1f470 78 65 63 28 70 2d 3e 64 62 52 62 75 2c 20 22 43  xec(p->dbRbu, "C
1f480 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 30 29  OMMIT", 0, 0, 0)
1f490 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1f4a0 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20  LITE_OK ){ .    
1f4b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42    const char *zB
1f4c0 65 67 69 6e 20 3d 20 72 62 75 49 73 56 61 63 75  egin = rbuIsVacu
1f4d0 75 6d 28 70 29 20 3f 20 22 42 45 47 49 4e 22 20  um(p) ? "BEGIN" 
1f4e0 3a 20 22 42 45 47 49 4e 20 49 4d 4d 45 44 49 41  : "BEGIN IMMEDIA
1f4f0 54 45 22 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  TE";.      rc = 
1f500 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
1f510 64 62 52 62 75 2c 20 7a 42 65 67 69 6e 2c 20 30  dbRbu, zBegin, 0
1f520 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
1f530 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1f540 45 5f 4f 4b 20 29 20 72 63 20 3d 20 73 71 6c 69  E_OK ) rc = sqli
1f550 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 4d 61  te3_exec(p->dbMa
1f560 69 6e 2c 20 22 42 45 47 49 4e 20 49 4d 4d 45 44  in, "BEGIN IMMED
1f570 49 41 54 45 22 2c 20 30 2c 20 30 2c 30 29 3b 0a  IATE", 0, 0,0);.
1f580 20 20 7d 0a 0a 20 20 70 2d 3e 72 63 20 3d 20 72    }..  p->rc = r
1f590 63 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  c;.  return rc;.
1f5a0 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }../************
1f5b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f5c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f5d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f5e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
1f5f0 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 52  * Beginning of R
1f600 42 55 20 56 46 53 20 73 68 69 6d 20 6d 65 74 68  BU VFS shim meth
1f610 6f 64 73 2e 20 54 68 65 20 56 46 53 20 73 68 69  ods. The VFS shi
1f620 6d 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 62  m modifies the b
1f630 65 68 61 76 69 6f 75 72 0a 2a 2a 20 6f 66 20 61  ehaviour.** of a
1f640 20 73 74 61 6e 64 61 72 64 20 56 46 53 20 69 6e   standard VFS in
1f650 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77   the following w
1f660 61 79 73 3a 0a 2a 2a 0a 2a 2a 20 31 2e 20 57 68  ays:.**.** 1. Wh
1f670 65 6e 65 76 65 72 20 74 68 65 20 66 69 72 73 74  enever the first
1f680 20 70 61 67 65 20 6f 66 20 61 20 6d 61 69 6e 20   page of a main 
1f690 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1f6a0 20 72 65 61 64 20 6f 72 20 0a 2a 2a 20 20 20 20   read or .**    
1f6b0 77 72 69 74 74 65 6e 2c 20 74 68 65 20 76 61 6c  written, the val
1f6c0 75 65 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65  ue of the change
1f6d0 2d 63 6f 75 6e 74 65 72 20 63 6f 6f 6b 69 65 20  -counter cookie 
1f6e0 69 73 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  is stored in.** 
1f6f0 20 20 20 72 62 75 5f 66 69 6c 65 2e 69 43 6f 6f     rbu_file.iCoo
1f700 6b 69 65 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20  kie. Similarly, 
1f710 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
1f720 20 22 77 72 69 74 65 2d 76 65 72 73 69 6f 6e 22   "write-version"
1f730 0a 2a 2a 20 20 20 20 64 61 74 61 62 61 73 65 20  .**    database 
1f740 68 65 61 64 65 72 20 66 69 65 6c 64 20 69 73 20  header field is 
1f750 73 74 6f 72 65 64 20 69 6e 20 72 62 75 5f 66 69  stored in rbu_fi
1f760 6c 65 2e 69 57 72 69 74 65 56 65 72 2e 20 54 68  le.iWriteVer. Th
1f770 69 73 20 65 6e 73 75 72 65 73 0a 2a 2a 20 20 20  is ensures.**   
1f780 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
1f790 20 61 72 65 20 61 6c 77 61 79 73 20 74 72 75 73   are always trus
1f7a0 74 77 6f 72 74 68 79 20 77 69 74 68 69 6e 20 61  tworthy within a
1f7b0 6e 20 6f 70 65 6e 20 74 72 61 6e 73 61 63 74 69  n open transacti
1f7c0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 32 2e 20 57 68 65  on..**.** 2. Whe
1f7d0 6e 65 76 65 72 20 61 6e 20 53 51 4c 49 54 45 5f  never an SQLITE_
1f7e0 4f 50 45 4e 5f 57 41 4c 20 66 69 6c 65 20 69 73  OPEN_WAL file is
1f7f0 20 6f 70 65 6e 65 64 2c 20 74 68 65 20 28 72 62   opened, the (rb
1f800 75 5f 66 69 6c 65 2e 70 57 61 6c 46 64 29 0a 2a  u_file.pWalFd).*
1f810 2a 20 20 20 20 6d 65 6d 62 65 72 20 76 61 72 69  *    member vari
1f820 61 62 6c 65 20 6f 66 20 74 68 65 20 61 73 73 6f  able of the asso
1f830 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
1f840 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1f850 69 73 20 73 65 74 0a 2a 2a 20 20 20 20 74 6f 20  is set.**    to 
1f860 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77  point to the new
1f870 20 66 69 6c 65 2e 20 41 20 6d 75 74 65 78 20 70   file. A mutex p
1f880 72 6f 74 65 63 74 65 64 20 6c 69 6e 6b 65 64 20  rotected linked 
1f890 6c 69 73 74 20 6f 66 20 61 6c 6c 20 6d 61 69 6e  list of all main
1f8a0 20 0a 2a 2a 20 20 20 20 64 62 20 66 64 73 20 6f   .**    db fds o
1f8b0 70 65 6e 65 64 20 75 73 69 6e 67 20 61 20 70 61  pened using a pa
1f8c0 72 74 69 63 75 6c 61 72 20 52 42 55 20 56 46 53  rticular RBU VFS
1f8d0 20 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 20 61   is maintained a
1f8e0 74 20 0a 2a 2a 20 20 20 20 72 62 75 5f 76 66 73  t .**    rbu_vfs
1f8f0 2e 70 4d 61 69 6e 20 74 6f 20 66 61 63 69 6c 69  .pMain to facili
1f900 74 61 74 65 20 74 68 69 73 2e 0a 2a 2a 0a 2a 2a  tate this..**.**
1f910 20 33 2e 20 55 73 69 6e 67 20 61 20 6e 65 77 20   3. Using a new 
1f920 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 22 53 51  file-control "SQ
1f930 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 42 55 22 2c  LITE_FCNTL_RBU",
1f940 20 61 20 6d 61 69 6e 20 64 62 20 72 62 75 5f 66   a main db rbu_f
1f950 69 6c 65 20 0a 2a 2a 20 20 20 20 6f 62 6a 65 63  ile .**    objec
1f960 74 20 63 61 6e 20 62 65 20 6d 61 72 6b 65 64 20  t can be marked 
1f970 61 73 20 74 68 65 20 74 61 72 67 65 74 20 64 61  as the target da
1f980 74 61 62 61 73 65 20 6f 66 20 61 6e 20 52 42 55  tabase of an RBU
1f990 20 75 70 64 61 74 65 2e 20 54 68 69 73 0a 2a 2a   update. This.**
1f9a0 20 20 20 20 74 75 72 6e 73 20 6f 6e 20 74 68 65      turns on the
1f9b0 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 74 72 61   following extra
1f9c0 20 73 70 65 63 69 61 6c 20 62 65 68 61 76 69 6f   special behavio
1f9d0 75 72 3a 0a 2a 2a 0a 2a 2a 20 33 61 2e 20 49 66  ur:.**.** 3a. If
1f9e0 20 78 41 63 63 65 73 73 28 29 20 69 73 20 63 61   xAccess() is ca
1f9f0 6c 6c 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66  lled to check if
1fa00 20 74 68 65 72 65 20 65 78 69 73 74 73 20 61 20   there exists a 
1fa10 2a 2d 77 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 20  *-wal file .**  
1fa20 20 20 20 61 73 73 6f 63 69 61 74 65 64 20 77 69     associated wi
1fa30 74 68 20 61 6e 20 52 42 55 20 74 61 72 67 65 74  th an RBU target
1fa40 20 64 61 74 61 62 61 73 65 20 63 75 72 72 65 6e   database curren
1fa50 74 6c 79 20 69 6e 20 52 42 55 5f 53 54 41 47 45  tly in RBU_STAGE
1fa60 5f 4f 41 4c 0a 2a 2a 20 20 20 20 20 73 74 61 67  _OAL.**     stag
1fa70 65 20 28 70 72 65 70 61 72 69 6e 67 20 74 68 65  e (preparing the
1fa80 20 2a 2d 6f 61 6c 20 66 69 6c 65 29 2c 20 74 68   *-oal file), th
1fa90 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 70 65 63  e following spec
1faa0 69 61 6c 20 68 61 6e 64 6c 69 6e 67 0a 2a 2a 20  ial handling.** 
1fab0 20 20 20 20 61 70 70 6c 69 65 73 3a 0a 2a 2a 0a      applies:.**.
1fac0 2a 2a 20 20 20 20 20 20 2a 20 69 66 20 74 68 65  **      * if the
1fad0 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65 73   *-wal file does
1fae0 20 65 78 69 73 74 2c 20 72 65 74 75 72 6e 20 53   exist, return S
1faf0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2e 20  QLITE_CANTOPEN. 
1fb00 41 6e 20 52 42 55 0a 2a 2a 20 20 20 20 20 20 20  An RBU.**       
1fb10 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65   target database
1fb20 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20 77   may not be in w
1fb30 61 6c 20 6d 6f 64 65 20 61 6c 72 65 61 64 79 2e  al mode already.
1fb40 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 2a 20 69 66  .**.**      * if
1fb50 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20   the *-wal file 
1fb60 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
1fb70 73 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 70  set the output p
1fb80 61 72 61 6d 65 74 65 72 20 74 6f 0a 2a 2a 20 20  arameter to.**  
1fb90 20 20 20 20 20 20 6e 6f 6e 2d 7a 65 72 6f 20 28        non-zero (
1fba0 74 6f 20 74 65 6c 6c 20 53 51 4c 69 74 65 20 74  to tell SQLite t
1fbb0 68 61 74 20 69 74 20 64 6f 65 73 20 65 78 69 73  hat it does exis
1fbc0 74 29 20 61 6e 79 77 61 79 2e 0a 2a 2a 0a 2a 2a  t) anyway..**.**
1fbd0 20 20 20 20 20 54 68 65 6e 2c 20 77 68 65 6e 20       Then, when 
1fbe0 78 4f 70 65 6e 28 29 20 69 73 20 63 61 6c 6c 65  xOpen() is calle
1fbf0 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 2a 2d  d to open the *-
1fc00 77 61 6c 20 66 69 6c 65 20 61 73 73 6f 63 69 61  wal file associa
1fc10 74 65 64 20 77 69 74 68 0a 2a 2a 20 20 20 20 20  ted with.**     
1fc20 74 68 65 20 52 42 55 20 74 61 72 67 65 74 20 69  the RBU target i
1fc30 6e 20 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20  n RBU_STAGE_OAL 
1fc40 73 74 61 67 65 2c 20 69 6e 73 74 65 61 64 20 6f  stage, instead o
1fc50 66 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 2a 2d  f opening the *-
1fc60 77 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2c  wal.**     file,
1fc70 20 74 68 65 20 72 62 75 20 76 66 73 20 6f 70 65   the rbu vfs ope
1fc80 6e 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  ns the correspon
1fc90 64 69 6e 67 20 2a 2d 6f 61 6c 20 66 69 6c 65 20  ding *-oal file 
1fca0 69 6e 73 74 65 61 64 2e 20 0a 2a 2a 0a 2a 2a 20  instead. .**.** 
1fcb0 33 62 2e 20 54 68 65 20 2a 2d 73 68 6d 20 70 61  3b. The *-shm pa
1fcc0 67 65 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  ges returned by 
1fcd0 78 53 68 6d 4d 61 70 28 29 20 66 6f 72 20 61 20  xShmMap() for a 
1fce0 74 61 72 67 65 74 20 64 62 20 66 69 6c 65 20 69  target db file i
1fcf0 6e 0a 2a 2a 20 20 20 20 20 52 42 55 5f 53 54 41  n.**     RBU_STA
1fd00 47 45 5f 4f 41 4c 20 6d 6f 64 65 20 61 72 65 20  GE_OAL mode are 
1fd10 61 63 74 75 61 6c 6c 79 20 73 74 6f 72 65 64 20  actually stored 
1fd20 69 6e 20 68 65 61 70 20 6d 65 6d 6f 72 79 2e 20  in heap memory. 
1fd30 54 68 69 73 20 69 73 20 74 6f 0a 2a 2a 20 20 20  This is to.**   
1fd40 20 20 61 76 6f 69 64 20 63 72 65 61 74 69 6e 67    avoid creating
1fd50 20 61 20 2a 2d 73 68 6d 20 66 69 6c 65 20 6f 6e   a *-shm file on
1fd60 20 64 69 73 6b 2e 20 41 64 64 69 74 69 6f 6e 61   disk. Additiona
1fd70 6c 6c 79 2c 20 78 53 68 6d 4c 6f 63 6b 28 29 20  lly, xShmLock() 
1fd80 63 61 6c 6c 73 0a 2a 2a 20 20 20 20 20 61 72 65  calls.**     are
1fd90 20 6e 6f 2d 6f 70 73 20 6f 6e 20 74 61 72 67 65   no-ops on targe
1fda0 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  t database files
1fdb0 20 69 6e 20 52 42 55 5f 53 54 41 47 45 5f 4f 41   in RBU_STAGE_OA
1fdc0 4c 20 6d 6f 64 65 2e 20 54 68 69 73 20 69 73 0a  L mode. This is.
1fdd0 2a 2a 20 20 20 20 20 62 65 63 61 75 73 65 20 61  **     because a
1fde0 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
1fdf0 74 73 20 69 6e 20 73 6f 6d 65 20 56 46 53 20 69  ts in some VFS i
1fe00 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66  mplementations f
1fe10 61 69 6c 20 69 66 20 0a 2a 2a 20 20 20 20 20 78  ail if .**     x
1fe20 53 68 6d 4c 6f 63 6b 28 29 20 69 73 20 63 61 6c  ShmLock() is cal
1fe30 6c 65 64 20 62 65 66 6f 72 65 20 78 53 68 6d 4d  led before xShmM
1fe40 61 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 33 63 2e 20  ap()..**.** 3c. 
1fe50 49 66 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  If an EXCLUSIVE 
1fe60 6c 6f 63 6b 20 69 73 20 61 74 74 65 6d 70 74 65  lock is attempte
1fe70 64 20 6f 6e 20 61 20 74 61 72 67 65 74 20 64 61  d on a target da
1fe80 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 61  tabase file in a
1fe90 6e 79 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 20 65  ny.**     mode e
1fea0 78 63 65 70 74 20 52 42 55 5f 53 54 41 47 45 5f  xcept RBU_STAGE_
1feb0 44 4f 4e 45 20 28 61 6c 6c 20 77 6f 72 6b 20 63  DONE (all work c
1fec0 6f 6d 70 6c 65 74 65 64 20 61 6e 64 20 63 68 65  ompleted and che
1fed0 63 6b 70 6f 69 6e 74 65 64 29 2c 20 69 74 20 0a  ckpointed), it .
1fee0 2a 2a 20 20 20 20 20 66 61 69 6c 73 20 77 69 74  **     fails wit
1fef0 68 20 61 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  h an SQLITE_BUSY
1ff00 20 65 72 72 6f 72 2e 20 54 68 69 73 20 69 73 20   error. This is 
1ff10 74 6f 20 73 74 6f 70 20 52 42 55 20 63 6f 6e 6e  to stop RBU conn
1ff20 65 63 74 69 6f 6e 73 0a 2a 2a 20 20 20 20 20 66  ections.**     f
1ff30 72 6f 6d 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  rom automaticall
1ff40 79 20 63 68 65 63 6b 70 6f 69 6e 74 69 6e 67 20  y checkpointing 
1ff50 61 20 2a 2d 77 61 6c 20 28 6f 72 20 2a 2d 6f 61  a *-wal (or *-oa
1ff60 6c 29 20 66 69 6c 65 20 66 72 6f 6d 20 77 69 74  l) file from wit
1ff70 68 69 6e 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  hin.**     sqlit
1ff80 65 33 5f 63 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a  e3_close()..**.*
1ff90 2a 20 33 64 2e 20 49 6e 20 52 42 55 5f 53 54 41  * 3d. In RBU_STA
1ffa0 47 45 5f 43 41 50 54 55 52 45 20 6d 6f 64 65 2c  GE_CAPTURE mode,
1ffb0 20 61 6c 6c 20 78 52 65 61 64 28 29 20 63 61 6c   all xRead() cal
1ffc0 6c 73 20 6f 6e 20 74 68 65 20 77 61 6c 20 66 69  ls on the wal fi
1ffd0 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61  le, and.**     a
1ffe0 6c 6c 20 78 57 72 69 74 65 28 29 20 63 61 6c 6c  ll xWrite() call
1fff0 73 20 6f 6e 20 74 68 65 20 74 61 72 67 65 74 20  s on the target 
20000 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 65  database file pe
20010 72 66 6f 72 6d 20 6e 6f 20 49 4f 2e 20 0a 2a 2a  rform no IO. .**
20020 20 20 20 20 20 49 6e 73 74 65 61 64 20 74 68 65       Instead the
20030 20 66 72 61 6d 65 20 61 6e 64 20 70 61 67 65 20   frame and page 
20040 6e 75 6d 62 65 72 73 20 74 68 61 74 20 77 6f 75  numbers that wou
20050 6c 64 20 62 65 20 72 65 61 64 20 61 6e 64 20 77  ld be read and w
20060 72 69 74 74 65 6e 0a 2a 2a 20 20 20 20 20 61 72  ritten.**     ar
20070 65 20 72 65 63 6f 72 64 65 64 2e 20 41 64 64 69  e recorded. Addi
20080 74 69 6f 6e 61 6c 6c 79 2c 20 73 75 63 63 65 73  tionally, succes
20090 73 66 75 6c 20 61 74 74 65 6d 70 74 73 20 74 6f  sful attempts to
200a0 20 6f 62 74 61 69 6e 20 65 78 63 6c 75 73 69 76   obtain exclusiv
200b0 65 0a 2a 2a 20 20 20 20 20 78 53 68 6d 4c 6f 63  e.**     xShmLoc
200c0 6b 28 29 20 57 52 49 54 45 52 2c 20 43 48 45 43  k() WRITER, CHEC
200d0 4b 50 4f 49 4e 54 45 52 20 61 6e 64 20 52 45 41  KPOINTER and REA
200e0 44 30 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20  D0 locks on the 
200f0 74 61 72 67 65 74 20 0a 2a 2a 20 20 20 20 20 64  target .**     d
20100 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65  atabase file are
20110 20 72 65 63 6f 72 64 65 64 2e 20 78 53 68 6d 4c   recorded. xShmL
20120 6f 63 6b 28 29 20 63 61 6c 6c 73 20 74 6f 20 75  ock() calls to u
20130 6e 6c 6f 63 6b 20 74 68 65 20 73 61 6d 65 0a 2a  nlock the same.*
20140 2a 20 20 20 20 20 6c 6f 63 6b 73 20 61 72 65 20  *     locks are 
20150 6e 6f 2d 6f 70 73 20 28 73 6f 20 74 68 61 74 20  no-ops (so that 
20160 6f 6e 63 65 20 6f 62 74 61 69 6e 65 64 2c 20 74  once obtained, t
20170 68 65 73 65 20 6c 6f 63 6b 73 20 61 72 65 20 6e  hese locks are n
20180 65 76 65 72 0a 2a 2a 20 20 20 20 20 72 65 6c 69  ever.**     reli
20190 6e 71 75 69 73 68 65 64 29 2e 20 46 69 6e 61 6c  nquished). Final
201a0 6c 79 2c 20 63 61 6c 6c 73 20 74 6f 20 78 53 79  ly, calls to xSy
201b0 6e 63 28 29 20 6f 6e 20 74 68 65 20 74 61 72 67  nc() on the targ
201c0 65 74 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  et database.**  
201d0 20 20 20 66 69 6c 65 20 66 61 69 6c 20 77 69 74     file fail wit
201e0 68 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41  h SQLITE_INTERNA
201f0 4c 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 0a 73 74  L errors..*/..st
20200 61 74 69 63 20 76 6f 69 64 20 72 62 75 55 6e 6c  atic void rbuUnl
20210 6f 63 6b 53 68 6d 28 72 62 75 5f 66 69 6c 65 20  ockShm(rbu_file 
20220 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
20230 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51  ->openFlags & SQ
20240 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
20250 42 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 52  B );.  if( p->pR
20260 62 75 20 29 7b 0a 20 20 20 20 69 6e 74 20 28 2a  bu ){.    int (*
20270 78 53 68 6d 4c 6f 63 6b 29 28 73 71 6c 69 74 65  xShmLock)(sqlite
20280 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 69 6e 74 2c  3_file*,int,int,
20290 69 6e 74 29 20 3d 20 70 2d 3e 70 52 65 61 6c 2d  int) = p->pReal-
202a0 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4c  >pMethods->xShmL
202b0 6f 63 6b 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ock;.    int i;.
202c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 53      for(i=0; i<S
202d0 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 3b  QLITE_SHM_NLOCK;
202e0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
202f0 28 31 3c 3c 69 29 20 26 20 70 2d 3e 70 52 62 75  (1<<i) & p->pRbu
20300 2d 3e 6d 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  ->mLock ){.     
20310 20 20 20 78 53 68 6d 4c 6f 63 6b 28 70 2d 3e 70     xShmLock(p->p
20320 52 65 61 6c 2c 20 69 2c 20 31 2c 20 53 51 4c 49  Real, i, 1, SQLI
20330 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 7c 53 51  TE_SHM_UNLOCK|SQ
20340 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
20350 56 45 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  VE);.      }.   
20360 20 7d 0a 20 20 20 20 70 2d 3e 70 52 62 75 2d 3e   }.    p->pRbu->
20370 6d 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 7d 0a 7d  mLock = 0;.  }.}
20380 0a 0a 2f 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ../*.*/.static i
20390 6e 74 20 72 62 75 55 70 64 61 74 65 54 65 6d 70  nt rbuUpdateTemp
203a0 53 69 7a 65 28 72 62 75 5f 66 69 6c 65 20 2a 70  Size(rbu_file *p
203b0 46 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  Fd, sqlite3_int6
203c0 34 20 6e 4e 65 77 29 7b 0a 20 20 73 71 6c 69 74  4 nNew){.  sqlit
203d0 65 33 72 62 75 20 2a 70 52 62 75 20 3d 20 70 46  e3rbu *pRbu = pF
203e0 64 2d 3e 70 52 62 75 3b 0a 20 20 69 36 34 20 6e  d->pRbu;.  i64 n
203f0 44 69 66 66 20 3d 20 6e 4e 65 77 20 2d 20 70 46  Diff = nNew - pF
20400 64 2d 3e 73 7a 3b 0a 20 20 70 52 62 75 2d 3e 73  d->sz;.  pRbu->s
20410 7a 54 65 6d 70 20 2b 3d 20 6e 44 69 66 66 3b 0a  zTemp += nDiff;.
20420 20 20 70 46 64 2d 3e 73 7a 20 3d 20 6e 4e 65 77    pFd->sz = nNew
20430 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 62 75  ;.  assert( pRbu
20440 2d 3e 73 7a 54 65 6d 70 3e 3d 30 20 29 3b 0a 20  ->szTemp>=0 );. 
20450 20 69 66 28 20 70 52 62 75 2d 3e 73 7a 54 65 6d   if( pRbu->szTem
20460 70 4c 69 6d 69 74 20 26 26 20 70 52 62 75 2d 3e  pLimit && pRbu->
20470 73 7a 54 65 6d 70 3e 70 52 62 75 2d 3e 73 7a 54  szTemp>pRbu->szT
20480 65 6d 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72  empLimit ) retur
20490 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  n SQLITE_FULL;. 
204a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
204b0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  K;.}../*.** Add 
204c0 61 6e 20 69 74 65 6d 20 74 6f 20 74 68 65 20 6d  an item to the m
204d0 61 69 6e 2d 64 62 20 6c 69 73 74 73 2c 20 69 66  ain-db lists, if
204e0 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
204f0 64 79 20 70 72 65 73 65 6e 74 2e 0a 2a 2a 0a 2a  dy present..**.*
20500 2a 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 20  * There are two 
20510 6d 61 69 6e 2d 64 62 20 6c 69 73 74 73 2e 20 4f  main-db lists. O
20520 6e 65 20 66 6f 72 20 61 6c 6c 20 66 69 6c 65 20  ne for all file 
20530 64 65 73 63 72 69 70 74 6f 72 73 2c 20 61 6e 64  descriptors, and
20540 20 6f 6e 65 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20   one.** for all 
20550 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
20560 20 77 69 74 68 20 72 62 75 5f 66 69 6c 65 2e 70   with rbu_file.p
20570 44 62 21 3d 30 2e 20 49 66 20 74 68 65 20 61 72  Db!=0. If the ar
20580 67 75 6d 65 6e 74 20 68 61 73 0a 2a 2a 20 72 62  gument has.** rb
20590 75 5f 66 69 6c 65 2e 70 44 62 21 3d 30 2c 20 74  u_file.pDb!=0, t
205a0 68 65 6e 20 69 74 20 69 73 20 61 73 73 75 6d 65  hen it is assume
205b0 64 20 74 6f 20 61 6c 72 65 61 64 79 20 62 65 20  d to already be 
205c0 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65 0a 2a  present on the.*
205d0 2a 20 6d 61 69 6e 20 6c 69 73 74 20 61 6e 64 20  * main list and 
205e0 69 73 20 6f 6e 6c 79 20 61 64 64 65 64 20 74 6f  is only added to
205f0 20 74 68 65 20 70 44 62 21 3d 30 20 6c 69 73 74   the pDb!=0 list
20600 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
20610 20 72 62 75 4d 61 69 6e 6c 69 73 74 41 64 64 28   rbuMainlistAdd(
20620 72 62 75 5f 66 69 6c 65 20 2a 70 29 7b 0a 20 20  rbu_file *p){.  
20630 72 62 75 5f 76 66 73 20 2a 70 52 62 75 56 66 73  rbu_vfs *pRbuVfs
20640 20 3d 20 70 2d 3e 70 52 62 75 56 66 73 3b 0a 20   = p->pRbuVfs;. 
20650 20 72 62 75 5f 66 69 6c 65 20 2a 70 49 74 65 72   rbu_file *pIter
20660 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e  ;.  assert( (p->
20670 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49  openFlags & SQLI
20680 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29  TE_OPEN_MAIN_DB)
20690 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   );.  sqlite3_mu
206a0 74 65 78 5f 65 6e 74 65 72 28 70 52 62 75 56 66  tex_enter(pRbuVf
206b0 73 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  s->mutex);.  if(
206c0 20 70 2d 3e 70 52 62 75 3d 3d 30 20 29 7b 0a 20   p->pRbu==0 ){. 
206d0 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70 52 62     for(pIter=pRb
206e0 75 56 66 73 2d 3e 70 4d 61 69 6e 3b 20 70 49 74  uVfs->pMain; pIt
206f0 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d  er; pIter=pIter-
20700 3e 70 4d 61 69 6e 4e 65 78 74 29 3b 0a 20 20 20  >pMainNext);.   
20710 20 70 2d 3e 70 4d 61 69 6e 4e 65 78 74 20 3d 20   p->pMainNext = 
20720 70 52 62 75 56 66 73 2d 3e 70 4d 61 69 6e 3b 0a  pRbuVfs->pMain;.
20730 20 20 20 20 70 52 62 75 56 66 73 2d 3e 70 4d 61      pRbuVfs->pMa
20740 69 6e 20 3d 20 70 3b 0a 20 20 7d 65 6c 73 65 7b  in = p;.  }else{
20750 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70  .    for(pIter=p
20760 52 62 75 56 66 73 2d 3e 70 4d 61 69 6e 52 62 75  RbuVfs->pMainRbu
20770 3b 20 70 49 74 65 72 20 26 26 20 70 49 74 65 72  ; pIter && pIter
20780 21 3d 70 3b 20 70 49 74 65 72 3d 70 49 74 65 72  !=p; pIter=pIter
20790 2d 3e 70 4d 61 69 6e 52 62 75 4e 65 78 74 29 7b  ->pMainRbuNext){
207a0 7d 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 3d  }.    if( pIter=
207b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70  =0 ){.      p->p
207c0 4d 61 69 6e 52 62 75 4e 65 78 74 20 3d 20 70 52  MainRbuNext = pR
207d0 62 75 56 66 73 2d 3e 70 4d 61 69 6e 52 62 75 3b  buVfs->pMainRbu;
207e0 0a 20 20 20 20 20 20 70 52 62 75 56 66 73 2d 3e  .      pRbuVfs->
207f0 70 4d 61 69 6e 52 62 75 20 3d 20 70 3b 0a 20 20  pMainRbu = p;.  
20800 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
20810 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 52  3_mutex_leave(pR
20820 62 75 56 66 73 2d 3e 6d 75 74 65 78 29 3b 0a 7d  buVfs->mutex);.}
20830 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 61  ../*.** Remove a
20840 6e 20 69 74 65 6d 20 66 72 6f 6d 20 74 68 65 20  n item from the 
20850 6d 61 69 6e 2d 64 62 20 6c 69 73 74 73 2e 0a 2a  main-db lists..*
20860 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62  /.static void rb
20870 75 4d 61 69 6e 6c 69 73 74 52 65 6d 6f 76 65 28  uMainlistRemove(
20880 72 62 75 5f 66 69 6c 65 20 2a 70 29 7b 0a 20 20  rbu_file *p){.  
20890 72 62 75 5f 66 69 6c 65 20 2a 2a 70 70 3b 0a 20  rbu_file **pp;. 
208a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
208b0 6e 74 65 72 28 70 2d 3e 70 52 62 75 56 66 73 2d  nter(p->pRbuVfs-
208c0 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70  >mutex);.  for(p
208d0 70 3d 26 70 2d 3e 70 52 62 75 56 66 73 2d 3e 70  p=&p->pRbuVfs->p
208e0 4d 61 69 6e 3b 20 2a 70 70 20 26 26 20 2a 70 70  Main; *pp && *pp
208f0 21 3d 70 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d  !=p; pp=&((*pp)-
20900 3e 70 4d 61 69 6e 4e 65 78 74 29 29 7b 7d 0a 20  >pMainNext)){}. 
20910 20 69 66 28 20 2a 70 70 20 29 20 2a 70 70 20 3d   if( *pp ) *pp =
20920 20 70 2d 3e 70 4d 61 69 6e 4e 65 78 74 3b 0a 20   p->pMainNext;. 
20930 20 70 2d 3e 70 4d 61 69 6e 4e 65 78 74 20 3d 20   p->pMainNext = 
20940 30 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 2d 3e  0;.  for(pp=&p->
20950 70 52 62 75 56 66 73 2d 3e 70 4d 61 69 6e 52 62  pRbuVfs->pMainRb
20960 75 3b 20 2a 70 70 20 26 26 20 2a 70 70 21 3d 70  u; *pp && *pp!=p
20970 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4d  ; pp=&((*pp)->pM
20980 61 69 6e 52 62 75 4e 65 78 74 29 29 7b 7d 0a 20  ainRbuNext)){}. 
20990 20 69 66 28 20 2a 70 70 20 29 20 2a 70 70 20 3d   if( *pp ) *pp =
209a0 20 70 2d 3e 70 4d 61 69 6e 52 62 75 4e 65 78 74   p->pMainRbuNext
209b0 3b 0a 20 20 70 2d 3e 70 4d 61 69 6e 52 62 75 4e  ;.  p->pMainRbuN
209c0 65 78 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ext = 0;.  sqlit
209d0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
209e0 2d 3e 70 52 62 75 56 66 73 2d 3e 6d 75 74 65 78  ->pRbuVfs->mutex
209f0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  );.}../*.** Give
20a00 6e 20 74 68 61 74 20 7a 57 61 6c 20 70 6f 69 6e  n that zWal poin
20a10 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  ts to a buffer c
20a20 6f 6e 74 61 69 6e 69 6e 67 20 61 20 77 61 6c 20  ontaining a wal 
20a30 66 69 6c 65 20 6e 61 6d 65 20 70 61 73 73 65 64  file name passed
20a40 20 74 6f 20 0a 2a 2a 20 65 69 74 68 65 72 20 74   to .** either t
20a50 68 65 20 78 4f 70 65 6e 28 29 20 6f 72 20 78 41  he xOpen() or xA
20a60 63 63 65 73 73 28 29 20 56 46 53 20 6d 65 74 68  ccess() VFS meth
20a70 6f 64 2c 20 73 65 61 72 63 68 20 74 68 65 20 6d  od, search the m
20a80 61 69 6e 2d 64 62 20 6c 69 73 74 20 66 6f 72 0a  ain-db list for.
20a90 2a 2a 20 61 20 66 69 6c 65 2d 68 61 6e 64 6c 65  ** a file-handle
20aa0 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 73   opened by the s
20ab0 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ame database con
20ac0 6e 65 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63  nection on the c
20ad0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
20ae0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
20af0 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
20b00 72 20 62 52 62 75 20 69 73 20 74 72 75 65 2c 20  r bRbu is true, 
20b10 6f 6e 6c 79 20 73 65 61 72 63 68 20 66 6f 72 20  only search for 
20b20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
20b30 20 77 69 74 68 0a 2a 2a 20 72 62 75 5f 66 69 6c   with.** rbu_fil
20b40 65 2e 70 44 62 21 3d 30 2e 0a 2a 2f 0a 73 74 61  e.pDb!=0..*/.sta
20b50 74 69 63 20 72 62 75 5f 66 69 6c 65 20 2a 72 62  tic rbu_file *rb
20b60 75 46 69 6e 64 4d 61 69 6e 64 62 28 72 62 75 5f  uFindMaindb(rbu_
20b70 76 66 73 20 2a 70 52 62 75 56 66 73 2c 20 63 6f  vfs *pRbuVfs, co
20b80 6e 73 74 20 63 68 61 72 20 2a 7a 57 61 6c 2c 20  nst char *zWal, 
20b90 69 6e 74 20 62 52 62 75 29 7b 0a 20 20 72 62 75  int bRbu){.  rbu
20ba0 5f 66 69 6c 65 20 2a 70 44 62 3b 0a 20 20 73 71  _file *pDb;.  sq
20bb0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
20bc0 72 28 70 52 62 75 56 66 73 2d 3e 6d 75 74 65 78  r(pRbuVfs->mutex
20bd0 29 3b 0a 20 20 69 66 28 20 62 52 62 75 20 29 7b  );.  if( bRbu ){
20be0 0a 20 20 20 20 66 6f 72 28 70 44 62 3d 70 52 62  .    for(pDb=pRb
20bf0 75 56 66 73 2d 3e 70 4d 61 69 6e 52 62 75 3b 20  uVfs->pMainRbu; 
20c00 70 44 62 20 26 26 20 70 44 62 2d 3e 7a 57 61 6c  pDb && pDb->zWal
20c10 21 3d 7a 57 61 6c 3b 20 70 44 62 3d 70 44 62 2d  !=zWal; pDb=pDb-
20c20 3e 70 4d 61 69 6e 52 62 75 4e 65 78 74 29 7b 7d  >pMainRbuNext){}
20c30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
20c40 72 28 70 44 62 3d 70 52 62 75 56 66 73 2d 3e 70  r(pDb=pRbuVfs->p
20c50 4d 61 69 6e 3b 20 70 44 62 20 26 26 20 70 44 62  Main; pDb && pDb
20c60 2d 3e 7a 57 61 6c 21 3d 7a 57 61 6c 3b 20 70 44  ->zWal!=zWal; pD
20c70 62 3d 70 44 62 2d 3e 70 4d 61 69 6e 4e 65 78 74  b=pDb->pMainNext
20c80 29 7b 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ){}.  }.  sqlite
20c90 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 52  3_mutex_leave(pR
20ca0 62 75 56 66 73 2d 3e 6d 75 74 65 78 29 3b 0a 20  buVfs->mutex);. 
20cb0 20 72 65 74 75 72 6e 20 70 44 62 3b 0a 7d 0a 0a   return pDb;.}..
20cc0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 72  /*.** Close an r
20cd0 62 75 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  bu file..*/.stat
20ce0 69 63 20 69 6e 74 20 72 62 75 56 66 73 43 6c 6f  ic int rbuVfsClo
20cf0 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
20d00 2a 70 46 69 6c 65 29 7b 0a 20 20 72 62 75 5f 66  *pFile){.  rbu_f
20d10 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69  ile *p = (rbu_fi
20d20 6c 65 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74  le*)pFile;.  int
20d30 20 72 63 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20   rc;.  int i;.. 
20d40 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e   /* Free the con
20d50 74 65 6e 74 73 20 6f 66 20 74 68 65 20 61 70 53  tents of the apS
20d60 68 6d 5b 5d 20 61 72 72 61 79 2e 20 41 6e 64 20  hm[] array. And 
20d70 74 68 65 20 61 72 72 61 79 20 69 74 73 65 6c 66  the array itself
20d80 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  . */.  for(i=0; 
20d90 69 3c 70 2d 3e 6e 53 68 6d 3b 20 69 2b 2b 29 7b  i<p->nShm; i++){
20da0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
20db0 65 28 70 2d 3e 61 70 53 68 6d 5b 69 5d 29 3b 0a  e(p->apShm[i]);.
20dc0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
20dd0 65 65 28 70 2d 3e 61 70 53 68 6d 29 3b 0a 20 20  ee(p->apShm);.  
20de0 70 2d 3e 61 70 53 68 6d 20 3d 20 30 3b 0a 20 20  p->apShm = 0;.  
20df0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
20e00 7a 44 65 6c 29 3b 0a 0a 20 20 69 66 28 20 70 2d  zDel);..  if( p-
20e10 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c  >openFlags & SQL
20e20 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
20e30 20 29 7b 0a 20 20 20 20 72 62 75 4d 61 69 6e 6c   ){.    rbuMainl
20e40 69 73 74 52 65 6d 6f 76 65 28 70 29 3b 0a 20 20  istRemove(p);.  
20e50 20 20 72 62 75 55 6e 6c 6f 63 6b 53 68 6d 28 70    rbuUnlockShm(p
20e60 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65 61 6c 2d  );.    p->pReal-
20e70 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 55  >pMethods->xShmU
20e80 6e 6d 61 70 28 70 2d 3e 70 52 65 61 6c 2c 20 30  nmap(p->pReal, 0
20e90 29 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66  );.  }.  else if
20ea0 28 20 28 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20  ( (p->openFlags 
20eb0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  & SQLITE_OPEN_DE
20ec0 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 20 26 26 20  LETEONCLOSE) && 
20ed0 70 2d 3e 70 52 62 75 20 29 7b 0a 20 20 20 20 72  p->pRbu ){.    r
20ee0 62 75 55 70 64 61 74 65 54 65 6d 70 53 69 7a 65  buUpdateTempSize
20ef0 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 61 73  (p, 0);.  }.  as
20f00 73 65 72 74 28 20 70 2d 3e 70 4d 61 69 6e 4e 65  sert( p->pMainNe
20f10 78 74 3d 3d 30 20 26 26 20 70 2d 3e 70 52 62 75  xt==0 && p->pRbu
20f20 56 66 73 2d 3e 70 4d 61 69 6e 21 3d 70 20 29 3b  Vfs->pMain!=p );
20f30 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 74 68 65  ..  /* Close the
20f40 20 75 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65   underlying file
20f50 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 72 63 20   handle */.  rc 
20f60 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74  = p->pReal->pMet
20f70 68 6f 64 73 2d 3e 78 43 6c 6f 73 65 28 70 2d 3e  hods->xClose(p->
20f80 70 52 65 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e  pReal);.  return
20f90 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52   rc;.}.../*.** R
20fa0 65 61 64 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ead and return a
20fb0 6e 20 75 6e 73 69 67 6e 65 64 20 33 32 2d 62 69  n unsigned 32-bi
20fc0 74 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  t big-endian int
20fd0 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20 62 75  eger from the bu
20fe0 66 66 65 72 20 0a 2a 2a 20 70 61 73 73 65 64 20  ffer .** passed 
20ff0 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
21000 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
21010 75 33 32 20 72 62 75 47 65 74 55 33 32 28 75 38  u32 rbuGetU32(u8
21020 20 2a 61 42 75 66 29 7b 0a 20 20 72 65 74 75 72   *aBuf){.  retur
21030 6e 20 28 28 75 33 32 29 61 42 75 66 5b 30 5d 20  n ((u32)aBuf[0] 
21040 3c 3c 20 32 34 29 0a 20 20 20 20 20 20 20 2b 20  << 24).       + 
21050 28 28 75 33 32 29 61 42 75 66 5b 31 5d 20 3c 3c  ((u32)aBuf[1] <<
21060 20 31 36 29 0a 20 20 20 20 20 20 20 2b 20 28 28   16).       + ((
21070 75 33 32 29 61 42 75 66 5b 32 5d 20 3c 3c 20 20  u32)aBuf[2] <<  
21080 38 29 0a 20 20 20 20 20 20 20 2b 20 28 28 75 33  8).       + ((u3
21090 32 29 61 42 75 66 5b 33 5d 29 3b 0a 7d 0a 0a 2f  2)aBuf[3]);.}../
210a0 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 75 6e  *.** Write an un
210b0 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20 76 61  signed 32-bit va
210c0 6c 75 65 20 69 6e 20 62 69 67 2d 65 6e 64 69 61  lue in big-endia
210d0 6e 20 66 6f 72 6d 61 74 20 74 6f 20 74 68 65 20  n format to the 
210e0 73 75 70 70 6c 69 65 64 0a 2a 2a 20 62 75 66 66  supplied.** buff
210f0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
21100 69 64 20 72 62 75 50 75 74 55 33 32 28 75 38 20  id rbuPutU32(u8 
21110 2a 61 42 75 66 2c 20 75 33 32 20 69 56 61 6c 29  *aBuf, u32 iVal)
21120 7b 0a 20 20 61 42 75 66 5b 30 5d 20 3d 20 28 69  {.  aBuf[0] = (i
21130 56 61 6c 20 3e 3e 20 32 34 29 20 26 20 30 78 46  Val >> 24) & 0xF
21140 46 3b 0a 20 20 61 42 75 66 5b 31 5d 20 3d 20 28  F;.  aBuf[1] = (
21150 69 56 61 6c 20 3e 3e 20 31 36 29 20 26 20 30 78  iVal >> 16) & 0x
21160 46 46 3b 0a 20 20 61 42 75 66 5b 32 5d 20 3d 20  FF;.  aBuf[2] = 
21170 28 69 56 61 6c 20 3e 3e 20 20 38 29 20 26 20 30  (iVal >>  8) & 0
21180 78 46 46 3b 0a 20 20 61 42 75 66 5b 33 5d 20 3d  xFF;.  aBuf[3] =
21190 20 28 69 56 61 6c 20 3e 3e 20 20 30 29 20 26 20   (iVal >>  0) & 
211a0 30 78 46 46 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  0xFF;.}..static 
211b0 76 6f 69 64 20 72 62 75 50 75 74 55 31 36 28 75  void rbuPutU16(u
211c0 38 20 2a 61 42 75 66 2c 20 75 31 36 20 69 56 61  8 *aBuf, u16 iVa
211d0 6c 29 7b 0a 20 20 61 42 75 66 5b 30 5d 20 3d 20  l){.  aBuf[0] = 
211e0 28 69 56 61 6c 20 3e 3e 20 20 38 29 20 26 20 30  (iVal >>  8) & 0
211f0 78 46 46 3b 0a 20 20 61 42 75 66 5b 31 5d 20 3d  xFF;.  aBuf[1] =
21200 20 28 69 56 61 6c 20 3e 3e 20 20 30 29 20 26 20   (iVal >>  0) & 
21210 30 78 46 46 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  0xFF;.}../*.** R
21220 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 6e  ead data from an
21230 20 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f   rbuVfs-file..*/
21240 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56  .static int rbuV
21250 66 73 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65  fsRead(.  sqlite
21260 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 0a  3_file *pFile, .
21270 20 20 76 6f 69 64 20 2a 7a 42 75 66 2c 20 0a 20    void *zBuf, . 
21280 20 69 6e 74 20 69 41 6d 74 2c 20 0a 20 20 73 71   int iAmt, .  sq
21290 6c 69 74 65 5f 69 6e 74 36 34 20 69 4f 66 73 74  lite_int64 iOfst
212a0 0a 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a  .){.  rbu_file *
212b0 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 2a 29 70  p = (rbu_file*)p
212c0 46 69 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33 72  File;.  sqlite3r
212d0 62 75 20 2a 70 52 62 75 20 3d 20 70 2d 3e 70 52  bu *pRbu = p->pR
212e0 62 75 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  bu;.  int rc;.. 
212f0 20 69 66 28 20 70 52 62 75 20 26 26 20 70 52 62   if( pRbu && pRb
21300 75 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53  u->eStage==RBU_S
21310 54 41 47 45 5f 43 41 50 54 55 52 45 20 29 7b 0a  TAGE_CAPTURE ){.
21320 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f      assert( p->o
21330 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49 54  penFlags & SQLIT
21340 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 20 20  E_OPEN_WAL );.  
21350 20 20 72 63 20 3d 20 72 62 75 43 61 70 74 75 72    rc = rbuCaptur
21360 65 57 61 6c 52 65 61 64 28 70 2d 3e 70 52 62 75  eWalRead(p->pRbu
21370 2c 20 69 4f 66 73 74 2c 20 69 41 6d 74 29 3b 0a  , iOfst, iAmt);.
21380 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
21390 20 70 52 62 75 20 26 26 20 70 52 62 75 2d 3e 65   pRbu && pRbu->e
213a0 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45  Stage==RBU_STAGE
213b0 5f 4f 41 4c 20 0a 20 20 20 20 20 26 26 20 28 70  _OAL .     && (p
213c0 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51  ->openFlags & SQ
213d0 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 29 20 0a  LITE_OPEN_WAL) .
213e0 20 20 20 20 20 26 26 20 69 4f 66 73 74 3e 3d 70       && iOfst>=p
213f0 52 62 75 2d 3e 69 4f 61 6c 53 7a 20 0a 20 20 20  Rbu->iOalSz .   
21400 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
21410 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
21420 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20  memset(zBuf, 0, 
21430 69 41 6d 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  iAmt);.    }else
21440 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 2d 3e  {.      rc = p->
21450 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d  pReal->pMethods-
21460 3e 78 52 65 61 64 28 70 2d 3e 70 52 65 61 6c 2c  >xRead(p->pReal,
21470 20 7a 42 75 66 2c 20 69 41 6d 74 2c 20 69 4f 66   zBuf, iAmt, iOf
21480 73 74 29 3b 0a 23 69 66 20 31 0a 20 20 20 20 20  st);.#if 1.     
21490 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 62   /* If this is b
214a0 65 69 6e 67 20 63 61 6c 6c 65 64 20 74 6f 20 72  eing called to r
214b0 65 61 64 20 74 68 65 20 66 69 72 73 74 20 70 61  ead the first pa
214c0 67 65 20 6f 66 20 74 68 65 20 74 61 72 67 65 74  ge of the target
214d0 20 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62   .      ** datab
214e0 61 73 65 20 61 73 20 70 61 72 74 20 6f 66 20 61  ase as part of a
214f0 6e 20 72 62 75 20 76 61 63 75 75 6d 20 6f 70 65  n rbu vacuum ope
21500 72 61 74 69 6f 6e 2c 20 73 79 6e 74 68 65 73 69  ration, synthesi
21510 7a 65 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  ze the .      **
21520 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
21530 20 66 69 72 73 74 20 70 61 67 65 20 69 66 20 69   first page if i
21540 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65  t does not yet e
21550 78 69 73 74 2e 20 4f 74 68 65 72 77 69 73 65 2c  xist. Otherwise,
21560 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 69 74 65  .      ** SQLite
21570 20 77 69 6c 6c 20 6e 6f 74 20 63 68 65 63 6b 20   will not check 
21580 66 6f 72 20 61 20 2a 2d 77 61 6c 20 66 69 6c 65  for a *-wal file
21590 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .  */.      if( 
215a0 70 52 62 75 20 26 26 20 72 62 75 49 73 56 61 63  pRbu && rbuIsVac
215b0 75 75 6d 28 70 52 62 75 29 20 0a 20 20 20 20 20  uum(pRbu) .     
215c0 20 20 20 20 20 26 26 20 72 63 3d 3d 53 51 4c 49       && rc==SQLI
215d0 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
215e0 45 41 44 20 26 26 20 69 4f 66 73 74 3d 3d 30 0a  EAD && iOfst==0.
215f0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 2d            && (p-
21600 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c  >openFlags & SQL
21610 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
21620 29 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 70  ).          && p
21630 52 62 75 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  Rbu->rc==SQLITE_
21640 4f 4b 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  OK.      ){.    
21650 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
21660 20 2a 70 46 64 20 3d 20 28 73 71 6c 69 74 65 33   *pFd = (sqlite3
21670 5f 66 69 6c 65 2a 29 70 52 62 75 2d 3e 70 52 62  _file*)pRbu->pRb
21680 75 46 64 3b 0a 20 20 20 20 20 20 20 20 72 63 20  uFd;.        rc 
21690 3d 20 70 46 64 2d 3e 70 4d 65 74 68 6f 64 73 2d  = pFd->pMethods-
216a0 3e 78 52 65 61 64 28 70 46 64 2c 20 7a 42 75 66  >xRead(pFd, zBuf
216b0 2c 20 69 41 6d 74 2c 20 69 4f 66 73 74 29 3b 0a  , iAmt, iOfst);.
216c0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
216d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
216e0 20 20 20 20 20 20 20 75 38 20 2a 61 42 75 66 20         u8 *aBuf 
216f0 3d 20 28 75 38 2a 29 7a 42 75 66 3b 0a 20 20 20  = (u8*)zBuf;.   
21700 20 20 20 20 20 20 20 75 33 32 20 69 52 6f 6f 74         u32 iRoot
21710 20 3d 20 72 62 75 47 65 74 55 33 32 28 26 61 42   = rbuGetU32(&aB
21720 75 66 5b 35 32 5d 29 20 3f 20 31 20 3a 20 30 3b  uf[52]) ? 1 : 0;
21730 0a 20 20 20 20 20 20 20 20 20 20 72 62 75 50 75  .          rbuPu
21740 74 55 33 32 28 26 61 42 75 66 5b 35 32 5d 2c 20  tU32(&aBuf[52], 
21750 69 52 6f 6f 74 29 3b 20 20 20 20 20 20 2f 2a 20  iRoot);      /* 
21760 6c 61 72 67 65 73 74 20 72 6f 6f 74 20 70 61 67  largest root pag
21770 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20  e number */.    
21780 20 20 20 20 20 20 72 62 75 50 75 74 55 33 32 28        rbuPutU32(
21790 26 61 42 75 66 5b 33 36 5d 2c 20 30 29 3b 20 20  &aBuf[36], 0);  
217a0 20 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d 62 65          /* numbe
217b0 72 20 6f 66 20 66 72 65 65 20 70 61 67 65 73 20  r of free pages 
217c0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 62 75  */.          rbu
217d0 50 75 74 55 33 32 28 26 61 42 75 66 5b 33 32 5d  PutU32(&aBuf[32]
217e0 2c 20 30 29 3b 20 20 20 20 20 20 20 20 20 20 2f  , 0);          /
217f0 2a 20 66 69 72 73 74 20 70 61 67 65 20 6f 6e 20  * first page on 
21800 66 72 65 65 20 6c 69 73 74 20 74 72 75 6e 6b 20  free list trunk 
21810 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 62 75  */.          rbu
21820 50 75 74 55 33 32 28 26 61 42 75 66 5b 32 38 5d  PutU32(&aBuf[28]
21830 2c 20 31 29 3b 20 20 20 20 20 20 20 20 20 20 2f  , 1);          /
21840 2a 20 73 69 7a 65 20 6f 66 20 64 62 20 66 69 6c  * size of db fil
21850 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20  e in pages */.  
21860 20 20 20 20 20 20 20 20 72 62 75 50 75 74 55 33          rbuPutU3
21870 32 28 26 61 42 75 66 5b 32 34 5d 2c 20 70 52 62  2(&aBuf[24], pRb
21880 75 2d 3e 70 52 62 75 46 64 2d 3e 69 43 6f 6f 6b  u->pRbuFd->iCook
21890 69 65 2b 31 29 3b 20 20 2f 2a 20 43 68 61 6e 67  ie+1);  /* Chang
218a0 65 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20  e counter */..  
218b0 20 20 20 20 20 20 20 20 69 66 28 20 69 41 6d 74          if( iAmt
218c0 3e 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20  >100 ){.        
218d0 20 20 20 20 6d 65 6d 73 65 74 28 26 61 42 75 66      memset(&aBuf
218e0 5b 31 30 30 5d 2c 20 30 2c 20 69 41 6d 74 2d 31  [100], 0, iAmt-1
218f0 30 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  00);.           
21900 20 72 62 75 50 75 74 55 31 36 28 26 61 42 75 66   rbuPutU16(&aBuf
21910 5b 31 30 35 5d 2c 20 69 41 6d 74 20 26 20 30 78  [105], iAmt & 0x
21920 46 46 46 46 29 3b 0a 20 20 20 20 20 20 20 20 20  FFFF);.         
21930 20 20 20 61 42 75 66 5b 31 30 30 5d 20 3d 20 30     aBuf[100] = 0
21940 78 30 44 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  x0D;.          }
21950 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21960 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
21970 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
21980 54 45 5f 4f 4b 20 26 26 20 69 4f 66 73 74 3d 3d  TE_OK && iOfst==
21990 30 20 26 26 20 28 70 2d 3e 6f 70 65 6e 46 6c 61  0 && (p->openFla
219a0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
219b0 5f 4d 41 49 4e 5f 44 42 29 20 29 7b 0a 20 20 20  _MAIN_DB) ){.   
219c0 20 20 20 2f 2a 20 54 68 65 73 65 20 6c 6f 6f 6b     /* These look
219d0 20 6c 69 6b 65 20 6d 61 67 69 63 20 6e 75 6d 62   like magic numb
219e0 65 72 73 2e 20 42 75 74 20 74 68 65 79 20 61 72  ers. But they ar
219f0 65 20 73 74 61 62 6c 65 2c 20 61 73 20 74 68 65  e stable, as the
21a00 79 20 61 72 65 20 70 61 72 74 0a 20 20 20 20 20  y are part.     
21a10 20 20 2a 2a 20 6f 66 20 74 68 65 20 64 65 66 69    ** of the defi
21a20 6e 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 53 51  nition of the SQ
21a30 4c 69 74 65 20 66 69 6c 65 20 66 6f 72 6d 61 74  Lite file format
21a40 2c 20 77 68 69 63 68 20 6d 61 79 20 6e 6f 74 20  , which may not 
21a50 63 68 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 20  change. */.     
21a60 20 75 38 20 2a 70 42 75 66 20 3d 20 28 75 38 2a   u8 *pBuf = (u8*
21a70 29 7a 42 75 66 3b 0a 20 20 20 20 20 20 70 2d 3e  )zBuf;.      p->
21a80 69 43 6f 6f 6b 69 65 20 3d 20 72 62 75 47 65 74  iCookie = rbuGet
21a90 55 33 32 28 26 70 42 75 66 5b 32 34 5d 29 3b 0a  U32(&pBuf[24]);.
21aa0 20 20 20 20 20 20 70 2d 3e 69 57 72 69 74 65 56        p->iWriteV
21ab0 65 72 20 3d 20 70 42 75 66 5b 31 39 5d 3b 0a 20  er = pBuf[19];. 
21ac0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
21ad0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  n rc;.}../*.** W
21ae0 72 69 74 65 20 64 61 74 61 20 74 6f 20 61 6e 20  rite data to an 
21af0 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a  rbuVfs-file..*/.
21b00 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66  static int rbuVf
21b10 73 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65  sWrite(.  sqlite
21b20 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 0a  3_file *pFile, .
21b30 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42    const void *zB
21b40 75 66 2c 20 0a 20 20 69 6e 74 20 69 41 6d 74 2c  uf, .  int iAmt,
21b50 20 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34   .  sqlite_int64
21b60 20 69 4f 66 73 74 0a 29 7b 0a 20 20 72 62 75 5f   iOfst.){.  rbu_
21b70 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66  file *p = (rbu_f
21b80 69 6c 65 2a 29 70 46 69 6c 65 3b 0a 20 20 73 71  ile*)pFile;.  sq
21b90 6c 69 74 65 33 72 62 75 20 2a 70 52 62 75 20 3d  lite3rbu *pRbu =
21ba0 20 70 2d 3e 70 52 62 75 3b 0a 20 20 69 6e 74 20   p->pRbu;.  int 
21bb0 72 63 3b 0a 0a 20 20 69 66 28 20 70 52 62 75 20  rc;..  if( pRbu 
21bc0 26 26 20 70 52 62 75 2d 3e 65 53 74 61 67 65 3d  && pRbu->eStage=
21bd0 3d 52 42 55 5f 53 54 41 47 45 5f 43 41 50 54 55  =RBU_STAGE_CAPTU
21be0 52 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  RE ){.    assert
21bf0 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26  ( p->openFlags &
21c00 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
21c10 4e 5f 44 42 20 29 3b 0a 20 20 20 20 72 63 20 3d  N_DB );.    rc =
21c20 20 72 62 75 43 61 70 74 75 72 65 44 62 57 72 69   rbuCaptureDbWri
21c30 74 65 28 70 2d 3e 70 52 62 75 2c 20 69 4f 66 73  te(p->pRbu, iOfs
21c40 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
21c50 20 69 66 28 20 70 52 62 75 20 29 7b 0a 20 20 20   if( pRbu ){.   
21c60 20 20 20 69 66 28 20 70 52 62 75 2d 3e 65 53 74     if( pRbu->eSt
21c70 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f  age==RBU_STAGE_O
21c80 41 4c 20 0a 20 20 20 20 20 20 20 26 26 20 28 70  AL .       && (p
21c90 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51  ->openFlags & SQ
21ca0 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 29 20 0a  LITE_OPEN_WAL) .
21cb0 20 20 20 20 20 20 20 26 26 20 69 4f 66 73 74 3e         && iOfst>
21cc0 3d 70 52 62 75 2d 3e 69 4f 61 6c 53 7a 0a 20 20  =pRbu->iOalSz.  
21cd0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70      ){.        p
21ce0 52 62 75 2d 3e 69 4f 61 6c 53 7a 20 3d 20 69 41  Rbu->iOalSz = iA
21cf0 6d 74 20 2b 20 69 4f 66 73 74 3b 0a 20 20 20 20  mt + iOfst;.    
21d00 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f    }else if( p->o
21d10 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49 54  penFlags & SQLIT
21d20 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
21d30 4c 4f 53 45 20 29 7b 0a 20 20 20 20 20 20 20 20  LOSE ){.        
21d40 69 36 34 20 73 7a 4e 65 77 20 3d 20 69 41 6d 74  i64 szNew = iAmt
21d50 2b 69 4f 66 73 74 3b 0a 20 20 20 20 20 20 20 20  +iOfst;.        
21d60 69 66 28 20 73 7a 4e 65 77 3e 70 2d 3e 73 7a 20  if( szNew>p->sz 
21d70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
21d80 3d 20 72 62 75 55 70 64 61 74 65 54 65 6d 70 53  = rbuUpdateTempS
21d90 69 7a 65 28 70 2c 20 73 7a 4e 65 77 29 3b 0a 20  ize(p, szNew);. 
21da0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
21db0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
21dc0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
21dd0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
21de0 20 20 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61      rc = p->pRea
21df0 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 57 72  l->pMethods->xWr
21e00 69 74 65 28 70 2d 3e 70 52 65 61 6c 2c 20 7a 42  ite(p->pReal, zB
21e10 75 66 2c 20 69 41 6d 74 2c 20 69 4f 66 73 74 29  uf, iAmt, iOfst)
21e20 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
21e30 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4f 66 73 74  LITE_OK && iOfst
21e40 3d 3d 30 20 26 26 20 28 70 2d 3e 6f 70 65 6e 46  ==0 && (p->openF
21e50 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
21e60 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 29 7b 0a 20  EN_MAIN_DB) ){. 
21e70 20 20 20 20 20 2f 2a 20 54 68 65 73 65 20 6c 6f       /* These lo
21e80 6f 6b 20 6c 69 6b 65 20 6d 61 67 69 63 20 6e 75  ok like magic nu
21e90 6d 62 65 72 73 2e 20 42 75 74 20 74 68 65 79 20  mbers. But they 
21ea0 61 72 65 20 73 74 61 62 6c 65 2c 20 61 73 20 74  are stable, as t
21eb0 68 65 79 20 61 72 65 20 70 61 72 74 0a 20 20 20  hey are part.   
21ec0 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 64 65 66     ** of the def
21ed0 69 6e 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 53  inition of the S
21ee0 51 4c 69 74 65 20 66 69 6c 65 20 66 6f 72 6d 61  QLite file forma
21ef0 74 2c 20 77 68 69 63 68 20 6d 61 79 20 6e 6f 74  t, which may not
21f00 20 63 68 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20   change. */.    
21f10 20 20 75 38 20 2a 70 42 75 66 20 3d 20 28 75 38    u8 *pBuf = (u8
21f20 2a 29 7a 42 75 66 3b 0a 20 20 20 20 20 20 70 2d  *)zBuf;.      p-
21f30 3e 69 43 6f 6f 6b 69 65 20 3d 20 72 62 75 47 65  >iCookie = rbuGe
21f40 74 55 33 32 28 26 70 42 75 66 5b 32 34 5d 29 3b  tU32(&pBuf[24]);
21f50 0a 20 20 20 20 20 20 70 2d 3e 69 57 72 69 74 65  .      p->iWrite
21f60 56 65 72 20 3d 20 70 42 75 66 5b 31 39 5d 3b 0a  Ver = pBuf[19];.
21f70 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
21f80 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21f90 54 72 75 6e 63 61 74 65 20 61 6e 20 72 62 75 56  Truncate an rbuV
21fa0 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  fs-file..*/.stat
21fb0 69 63 20 69 6e 74 20 72 62 75 56 66 73 54 72 75  ic int rbuVfsTru
21fc0 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69  ncate(sqlite3_fi
21fd0 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74  le *pFile, sqlit
21fe0 65 5f 69 6e 74 36 34 20 73 69 7a 65 29 7b 0a 20  e_int64 size){. 
21ff0 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28   rbu_file *p = (
22000 72 62 75 5f 66 69 6c 65 2a 29 70 46 69 6c 65 3b  rbu_file*)pFile;
22010 0a 20 20 69 66 28 20 28 70 2d 3e 6f 70 65 6e 46  .  if( (p->openF
22020 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
22030 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
22040 29 20 26 26 20 70 2d 3e 70 52 62 75 20 29 7b 0a  ) && p->pRbu ){.
22050 20 20 20 20 69 6e 74 20 72 63 20 3d 20 72 62 75      int rc = rbu
22060 55 70 64 61 74 65 54 65 6d 70 53 69 7a 65 28 70  UpdateTempSize(p
22070 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 69 66 28  , size);.    if(
22080 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
22090 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
220a0 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 52 65 61    return p->pRea
220b0 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 54 72  l->pMethods->xTr
220c0 75 6e 63 61 74 65 28 70 2d 3e 70 52 65 61 6c 2c  uncate(p->pReal,
220d0 20 73 69 7a 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   size);.}../*.**
220e0 20 53 79 6e 63 20 61 6e 20 72 62 75 56 66 73 2d   Sync an rbuVfs-
220f0 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
22100 69 6e 74 20 72 62 75 56 66 73 53 79 6e 63 28 73  int rbuVfsSync(s
22110 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
22120 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  le, int flags){.
22130 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20    rbu_file *p = 
22140 28 72 62 75 5f 66 69 6c 65 20 2a 29 70 46 69 6c  (rbu_file *)pFil
22150 65 3b 0a 20 20 69 66 28 20 70 2d 3e 70 52 62 75  e;.  if( p->pRbu
22160 20 26 26 20 70 2d 3e 70 52 62 75 2d 3e 65 53 74   && p->pRbu->eSt
22170 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 43  age==RBU_STAGE_C
22180 41 50 54 55 52 45 20 29 7b 0a 20 20 20 20 69 66  APTURE ){.    if
22190 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26  ( p->openFlags &
221a0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
221b0 4e 5f 44 42 20 29 7b 0a 20 20 20 20 20 20 72 65  N_DB ){.      re
221c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4e 54 45  turn SQLITE_INTE
221d0 52 4e 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RNAL;.    }.    
221e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
221f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
22200 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
22210 73 2d 3e 78 53 79 6e 63 28 70 2d 3e 70 52 65 61  s->xSync(p->pRea
22220 6c 2c 20 66 6c 61 67 73 29 3b 0a 7d 0a 0a 2f 2a  l, flags);.}../*
22230 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
22240 75 72 72 65 6e 74 20 66 69 6c 65 2d 73 69 7a 65  urrent file-size
22250 20 6f 66 20 61 6e 20 72 62 75 56 66 73 2d 66 69   of an rbuVfs-fi
22260 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
22270 74 20 72 62 75 56 66 73 46 69 6c 65 53 69 7a 65  t rbuVfsFileSize
22280 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
22290 46 69 6c 65 2c 20 73 71 6c 69 74 65 5f 69 6e 74  File, sqlite_int
222a0 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 72 62  64 *pSize){.  rb
222b0 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75  u_file *p = (rbu
222c0 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20  _file *)pFile;. 
222d0 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20   int rc;.  rc = 
222e0 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f  p->pReal->pMetho
222f0 64 73 2d 3e 78 46 69 6c 65 53 69 7a 65 28 70 2d  ds->xFileSize(p-
22300 3e 70 52 65 61 6c 2c 20 70 53 69 7a 65 29 3b 0a  >pReal, pSize);.
22310 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
22320 20 61 6e 20 52 42 55 20 76 61 63 75 75 6d 20 6f   an RBU vacuum o
22330 70 65 72 61 74 69 6f 6e 20 61 6e 64 20 74 68 69  peration and thi
22340 73 20 69 73 20 74 68 65 20 74 61 72 67 65 74 20  s is the target 
22350 64 61 74 61 62 61 73 65 2c 0a 20 20 2a 2a 20 70  database,.  ** p
22360 72 65 74 65 6e 64 20 74 68 61 74 20 69 74 20 68  retend that it h
22370 61 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  as at least one 
22380 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  page. Otherwise,
22390 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74   SQLite will not
223a0 0a 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20  .  ** check for 
223b0 74 68 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66  the existance of
223c0 20 61 20 2a 2d 77 61 6c 20 66 69 6c 65 2e 20 72   a *-wal file. r
223d0 62 75 56 66 73 52 65 61 64 28 29 20 63 6f 6e 74  buVfsRead() cont
223e0 61 69 6e 73 20 0a 20 20 2a 2a 20 73 69 6d 69 6c  ains .  ** simil
223f0 61 72 20 6c 6f 67 69 63 2e 20 20 2a 2f 0a 20 20  ar logic.  */.  
22400 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
22410 4b 20 26 26 20 2a 70 53 69 7a 65 3d 3d 30 20 0a  K && *pSize==0 .
22420 20 20 20 26 26 20 70 2d 3e 70 52 62 75 20 26 26     && p->pRbu &&
22430 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 2d 3e   rbuIsVacuum(p->
22440 70 52 62 75 29 20 0a 20 20 20 26 26 20 28 70 2d  pRbu) .   && (p-
22450 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c  >openFlags & SQL
22460 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
22470 29 0a 20 20 29 7b 0a 20 20 20 20 2a 70 53 69 7a  ).  ){.    *pSiz
22480 65 20 3d 20 31 30 32 34 3b 0a 20 20 7d 0a 20 20  e = 1024;.  }.  
22490 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
224a0 0a 2a 2a 20 4c 6f 63 6b 20 61 6e 20 72 62 75 56  .** Lock an rbuV
224b0 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  fs-file..*/.stat
224c0 69 63 20 69 6e 74 20 72 62 75 56 66 73 4c 6f 63  ic int rbuVfsLoc
224d0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
224e0 70 46 69 6c 65 2c 20 69 6e 74 20 65 4c 6f 63 6b  pFile, int eLock
224f0 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70  ){.  rbu_file *p
22500 20 3d 20 28 72 62 75 5f 66 69 6c 65 2a 29 70 46   = (rbu_file*)pF
22510 69 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33 72 62  ile;.  sqlite3rb
22520 75 20 2a 70 52 62 75 20 3d 20 70 2d 3e 70 52 62  u *pRbu = p->pRb
22530 75 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  u;.  int rc = SQ
22540 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
22550 72 74 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73  rt( p->openFlags
22560 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   & (SQLITE_OPEN_
22570 4d 41 49 4e 5f 44 42 7c 53 51 4c 49 54 45 5f 4f  MAIN_DB|SQLITE_O
22580 50 45 4e 5f 54 45 4d 50 5f 44 42 29 20 29 3b 0a  PEN_TEMP_DB) );.
22590 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 53 51 4c    if( eLock==SQL
225a0 49 54 45 5f 4c 4f 43 4b 5f 45 58 43 4c 55 53 49  ITE_LOCK_EXCLUSI
225b0 56 45 20 0a 20 20 20 26 26 20 28 70 2d 3e 62 4e  VE .   && (p->bN
225c0 6f 6c 6f 63 6b 20 7c 7c 20 28 70 52 62 75 20 26  olock || (pRbu &
225d0 26 20 70 52 62 75 2d 3e 65 53 74 61 67 65 21 3d  & pRbu->eStage!=
225e0 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45 29 29  RBU_STAGE_DONE))
225f0 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 20  .  ){.    /* Do 
22600 6e 6f 74 20 61 6c 6c 6f 77 20 45 58 43 4c 55 53  not allow EXCLUS
22610 49 56 45 20 6c 6f 63 6b 73 2e 20 50 72 65 76 65  IVE locks. Preve
22620 6e 74 69 6e 67 20 53 51 4c 69 74 65 20 66 72 6f  nting SQLite fro
22630 6d 20 74 61 6b 69 6e 67 20 74 68 69 73 20 0a 20  m taking this . 
22640 20 20 20 2a 2a 20 70 72 65 76 65 6e 74 73 20 69     ** prevents i
22650 74 20 66 72 6f 6d 20 63 68 65 63 6b 70 6f 69 6e  t from checkpoin
22660 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
22670 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 63  e from sqlite3_c
22680 6c 6f 73 65 28 29 2e 20 2a 2f 0a 20 20 20 20 72  lose(). */.    r
22690 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
226a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
226b0 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65   = p->pReal->pMe
226c0 74 68 6f 64 73 2d 3e 78 4c 6f 63 6b 28 70 2d 3e  thods->xLock(p->
226d0 70 52 65 61 6c 2c 20 65 4c 6f 63 6b 29 3b 0a 20  pReal, eLock);. 
226e0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
226f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b  .}../*.** Unlock
22700 20 61 6e 20 72 62 75 56 66 73 2d 66 69 6c 65 2e   an rbuVfs-file.
22710 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
22720 62 75 56 66 73 55 6e 6c 6f 63 6b 28 73 71 6c 69  buVfsUnlock(sqli
22730 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
22740 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 72   int eLock){.  r
22750 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62  bu_file *p = (rb
22760 75 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a  u_file *)pFile;.
22770 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 52 65 61    return p->pRea
22780 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 55 6e  l->pMethods->xUn
22790 6c 6f 63 6b 28 70 2d 3e 70 52 65 61 6c 2c 20 65  lock(p->pReal, e
227a0 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Lock);.}../*.** 
227b0 43 68 65 63 6b 20 69 66 20 61 6e 6f 74 68 65 72  Check if another
227c0 20 66 69 6c 65 2d 68 61 6e 64 6c 65 20 68 6f 6c   file-handle hol
227d0 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  ds a RESERVED lo
227e0 63 6b 20 6f 6e 20 61 6e 20 72 62 75 56 66 73 2d  ck on an rbuVfs-
227f0 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
22800 69 6e 74 20 72 62 75 56 66 73 43 68 65 63 6b 52  int rbuVfsCheckR
22810 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
22820 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
22830 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
22840 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20    rbu_file *p = 
22850 28 72 62 75 5f 66 69 6c 65 20 2a 29 70 46 69 6c  (rbu_file *)pFil
22860 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70  e;.  return p->p
22870 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  Real->pMethods->
22880 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
22890 63 6b 28 70 2d 3e 70 52 65 61 6c 2c 20 70 52 65  ck(p->pReal, pRe
228a0 73 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  sOut);.}../*.** 
228b0 46 69 6c 65 20 63 6f 6e 74 72 6f 6c 20 6d 65 74  File control met
228c0 68 6f 64 2e 20 46 6f 72 20 63 75 73 74 6f 6d 20  hod. For custom 
228d0 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20 61 6e  operations on an
228e0 20 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f   rbuVfs-file..*/
228f0 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56  .static int rbuV
22900 66 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71  fsFileControl(sq
22910 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
22920 65 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20  e, int op, void 
22930 2a 70 41 72 67 29 7b 0a 20 20 72 62 75 5f 66 69  *pArg){.  rbu_fi
22940 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c  le *p = (rbu_fil
22950 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74  e *)pFile;.  int
22960 20 28 2a 78 43 6f 6e 74 72 6f 6c 29 28 73 71 6c   (*xControl)(sql
22970 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76  ite3_file*,int,v
22980 6f 69 64 2a 29 20 3d 20 70 2d 3e 70 52 65 61 6c  oid*) = p->pReal
22990 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 46 69 6c  ->pMethods->xFil
229a0 65 43 6f 6e 74 72 6f 6c 3b 0a 20 20 69 6e 74 20  eControl;.  int 
229b0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  rc;..  assert( p
229c0 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 28 53  ->openFlags & (S
229d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
229e0 44 42 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  DB|SQLITE_OPEN_T
229f0 45 4d 50 5f 44 42 29 0a 20 20 20 20 20 20 20 7c  EMP_DB).       |
22a00 7c 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26  | p->openFlags &
22a10 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52   (SQLITE_OPEN_TR
22a20 41 4e 53 49 45 4e 54 5f 44 42 7c 53 51 4c 49 54  ANSIENT_DB|SQLIT
22a30 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
22a40 4e 41 4c 29 0a 20 20 29 3b 0a 20 20 69 66 28 20  NAL).  );.  if( 
22a50 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c  op==SQLITE_FCNTL
22a60 5f 52 42 55 20 29 7b 0a 20 20 20 20 73 71 6c 69  _RBU ){.    sqli
22a70 74 65 33 72 62 75 20 2a 70 52 62 75 20 3d 20 28  te3rbu *pRbu = (
22a80 73 71 6c 69 74 65 33 72 62 75 2a 29 70 41 72 67  sqlite3rbu*)pArg
22a90 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 72 73 74 20  ;..    /* First 
22aa0 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 6f 74  try to find anot
22ab0 68 65 72 20 52 42 55 20 76 66 73 20 6c 6f 77 65  her RBU vfs lowe
22ac0 72 20 64 6f 77 6e 20 69 6e 20 74 68 65 20 76 66  r down in the vf
22ad0 73 20 73 74 61 63 6b 2e 20 49 66 0a 20 20 20 20  s stack. If.    
22ae0 2a 2a 20 6f 6e 65 20 69 73 20 66 6f 75 6e 64 2c  ** one is found,
22af0 20 74 68 69 73 20 76 66 73 20 77 69 6c 6c 20 6f   this vfs will o
22b00 70 65 72 61 74 65 20 69 6e 20 70 61 73 73 2d 74  perate in pass-t
22b10 68 72 6f 75 67 68 20 6d 6f 64 65 2e 20 54 68 65  hrough mode. The
22b20 20 6c 6f 77 65 72 0a 20 20 20 20 2a 2a 20 6c 65   lower.    ** le
22b30 76 65 6c 20 76 66 73 20 77 69 6c 6c 20 64 6f 20  vel vfs will do 
22b40 74 68 65 20 73 70 65 63 69 61 6c 20 52 42 55 20  the special RBU 
22b50 68 61 6e 64 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20  handling.  */.  
22b60 20 20 72 63 20 3d 20 78 43 6f 6e 74 72 6f 6c 28    rc = xControl(
22b70 70 2d 3e 70 52 65 61 6c 2c 20 6f 70 2c 20 70 41  p->pReal, op, pA
22b80 72 67 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  rg);..    if( rc
22b90 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  ==SQLITE_NOTFOUN
22ba0 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f  D ){.      /* No
22bb0 77 20 73 65 61 72 63 68 20 66 6f 72 20 61 20 7a  w search for a z
22bc0 69 70 76 66 73 20 69 6e 73 74 61 6e 63 65 20 6c  ipvfs instance l
22bd0 6f 77 65 72 20 64 6f 77 6e 20 69 6e 20 74 68 65  ower down in the
22be0 20 56 46 53 20 73 74 61 63 6b 2e 20 49 66 0a 20   VFS stack. If. 
22bf0 20 20 20 20 20 2a 2a 20 6f 6e 65 20 69 73 20 66       ** one is f
22c00 6f 75 6e 64 2c 20 74 68 69 73 20 69 73 20 61 6e  ound, this is an
22c10 20 65 72 72 6f 72 2e 20 20 2a 2f 0a 20 20 20 20   error.  */.    
22c20 20 20 76 6f 69 64 20 2a 64 75 6d 6d 79 20 3d 20    void *dummy = 
22c30 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 78 43  0;.      rc = xC
22c40 6f 6e 74 72 6f 6c 28 70 2d 3e 70 52 65 61 6c 2c  ontrol(p->pReal,
22c50 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 5a 49   SQLITE_FCNTL_ZI
22c60 50 56 46 53 2c 20 26 64 75 6d 6d 79 29 3b 0a 20  PVFS, &dummy);. 
22c70 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
22c80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
22c90 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
22ca0 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 70 52 62  ROR;.        pRb
22cb0 75 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c  u->zErrmsg = sql
22cc0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 72 62  ite3_mprintf("rb
22cd0 75 2f 7a 69 70 76 66 73 20 73 65 74 75 70 20 65  u/zipvfs setup e
22ce0 72 72 6f 72 22 29 3b 0a 20 20 20 20 20 20 7d 65  rror");.      }e
22cf0 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
22d00 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20  TE_NOTFOUND ){. 
22d10 20 20 20 20 20 20 20 70 52 62 75 2d 3e 70 54 61         pRbu->pTa
22d20 72 67 65 74 46 64 20 3d 20 70 3b 0a 20 20 20 20  rgetFd = p;.    
22d30 20 20 20 20 70 2d 3e 70 52 62 75 20 3d 20 70 52      p->pRbu = pR
22d40 62 75 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  bu;.        if( 
22d50 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53  p->openFlags & S
22d60 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
22d70 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  DB ){.          
22d80 72 62 75 4d 61 69 6e 6c 69 73 74 41 64 64 28 70  rbuMainlistAdd(p
22d90 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
22da0 20 20 20 20 20 69 66 28 20 70 2d 3e 70 57 61 6c       if( p->pWal
22db0 46 64 20 29 20 70 2d 3e 70 57 61 6c 46 64 2d 3e  Fd ) p->pWalFd->
22dc0 70 52 62 75 20 3d 20 70 52 62 75 3b 0a 20 20 20  pRbu = pRbu;.   
22dd0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
22de0 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
22df0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
22e00 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28  ;.  }.  else if(
22e10 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54   op==SQLITE_FCNT
22e20 4c 5f 52 42 55 43 4e 54 20 29 7b 0a 20 20 20 20  L_RBUCNT ){.    
22e30 73 71 6c 69 74 65 33 72 62 75 20 2a 70 52 62 75  sqlite3rbu *pRbu
22e40 20 3d 20 28 73 71 6c 69 74 65 33 72 62 75 2a 29   = (sqlite3rbu*)
22e50 70 41 72 67 3b 0a 20 20 20 20 70 52 62 75 2d 3e  pArg;.    pRbu->
22e60 6e 52 62 75 2b 2b 3b 0a 20 20 20 20 70 52 62 75  nRbu++;.    pRbu
22e70 2d 3e 70 52 62 75 46 64 20 3d 20 70 3b 0a 20 20  ->pRbuFd = p;.  
22e80 20 20 70 2d 3e 62 4e 6f 6c 6f 63 6b 20 3d 20 31    p->bNolock = 1
22e90 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 78 43  ;.  }..  rc = xC
22ea0 6f 6e 74 72 6f 6c 28 70 2d 3e 70 52 65 61 6c 2c  ontrol(p->pReal,
22eb0 20 6f 70 2c 20 70 41 72 67 29 3b 0a 20 20 69 66   op, pArg);.  if
22ec0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22ed0 26 26 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43  && op==SQLITE_FC
22ee0 4e 54 4c 5f 56 46 53 4e 41 4d 45 20 29 7b 0a 20  NTL_VFSNAME ){. 
22ef0 20 20 20 72 62 75 5f 76 66 73 20 2a 70 52 62 75     rbu_vfs *pRbu
22f00 56 66 73 20 3d 20 70 2d 3e 70 52 62 75 56 66 73  Vfs = p->pRbuVfs
22f10 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 20  ;.    char *zIn 
22f20 3d 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 3b  = *(char**)pArg;
22f30 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f 75 74 20  .    char *zOut 
22f40 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
22f50 66 28 22 72 62 75 28 25 73 29 2f 25 7a 22 2c 20  f("rbu(%s)/%z", 
22f60 70 52 62 75 56 66 73 2d 3e 62 61 73 65 2e 7a 4e  pRbuVfs->base.zN
22f70 61 6d 65 2c 20 7a 49 6e 29 3b 0a 20 20 20 20 2a  ame, zIn);.    *
22f80 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 7a  (char**)pArg = z
22f90 4f 75 74 3b 0a 20 20 20 20 69 66 28 20 7a 4f 75  Out;.    if( zOu
22fa0 74 3d 3d 30 20 29 20 72 63 20 3d 20 53 51 4c 49  t==0 ) rc = SQLI
22fb0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
22fc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
22fd0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
22fe0 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20 62  sector-size in b
22ff0 79 74 65 73 20 66 6f 72 20 61 6e 20 72 62 75 56  ytes for an rbuV
23000 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  fs-file..*/.stat
23010 69 63 20 69 6e 74 20 72 62 75 56 66 73 53 65 63  ic int rbuVfsSec
23020 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  torSize(sqlite3_
23030 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  file *pFile){.  
23040 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72  rbu_file *p = (r
23050 62 75 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b  bu_file *)pFile;
23060 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 52 65  .  return p->pRe
23070 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53  al->pMethods->xS
23080 65 63 74 6f 72 53 69 7a 65 28 70 2d 3e 70 52 65  ectorSize(p->pRe
23090 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  al);.}../*.** Re
230a0 74 75 72 6e 20 74 68 65 20 64 65 76 69 63 65 20  turn the device 
230b0 63 68 61 72 61 63 74 65 72 69 73 74 69 63 20 66  characteristic f
230c0 6c 61 67 73 20 73 75 70 70 6f 72 74 65 64 20 62  lags supported b
230d0 79 20 61 6e 20 72 62 75 56 66 73 2d 66 69 6c 65  y an rbuVfs-file
230e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
230f0 72 62 75 56 66 73 44 65 76 69 63 65 43 68 61 72  rbuVfsDeviceChar
23100 61 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69  acteristics(sqli
23110 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29  te3_file *pFile)
23120 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20  {.  rbu_file *p 
23130 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a 29 70 46  = (rbu_file *)pF
23140 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  ile;.  return p-
23150 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73  >pReal->pMethods
23160 2d 3e 78 44 65 76 69 63 65 43 68 61 72 61 63 74  ->xDeviceCharact
23170 65 72 69 73 74 69 63 73 28 70 2d 3e 70 52 65 61  eristics(p->pRea
23180 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 61 6b  l);.}../*.** Tak
23190 65 20 6f 72 20 72 65 6c 65 61 73 65 20 61 20 73  e or release a s
231a0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6c 6f 63  hared-memory loc
231b0 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
231c0 20 72 62 75 56 66 73 53 68 6d 4c 6f 63 6b 28 73   rbuVfsShmLock(s
231d0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
231e0 6c 65 2c 20 69 6e 74 20 6f 66 73 74 2c 20 69 6e  le, int ofst, in
231f0 74 20 6e 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  t n, int flags){
23200 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d  .  rbu_file *p =
23210 20 28 72 62 75 5f 66 69 6c 65 2a 29 70 46 69 6c   (rbu_file*)pFil
23220 65 3b 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20  e;.  sqlite3rbu 
23230 2a 70 52 62 75 20 3d 20 70 2d 3e 70 52 62 75 3b  *pRbu = p->pRbu;
23240 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
23250 54 45 5f 4f 4b 3b 0a 0a 23 69 66 64 65 66 20 53  TE_OK;..#ifdef S
23260 51 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49  QLITE_AMALGAMATI
23270 4f 4e 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  ON.    assert( W
23280 41 4c 5f 43 4b 50 54 5f 4c 4f 43 4b 3d 3d 31 20  AL_CKPT_LOCK==1 
23290 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  );.#endif..  ass
232a0 65 72 74 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67  ert( p->openFlag
232b0 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s & (SQLITE_OPEN
232c0 5f 4d 41 49 4e 5f 44 42 7c 53 51 4c 49 54 45 5f  _MAIN_DB|SQLITE_
232d0 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 29 20 29 3b  OPEN_TEMP_DB) );
232e0 0a 20 20 69 66 28 20 70 52 62 75 20 26 26 20 28  .  if( pRbu && (
232f0 70 52 62 75 2d 3e 65 53 74 61 67 65 3d 3d 52 42  pRbu->eStage==RB
23300 55 5f 53 54 41 47 45 5f 4f 41 4c 20 7c 7c 20 70  U_STAGE_OAL || p
23310 52 62 75 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55  Rbu->eStage==RBU
23320 5f 53 54 41 47 45 5f 4d 4f 56 45 29 20 29 7b 0a  _STAGE_MOVE) ){.
23330 20 20 20 20 2f 2a 20 4d 61 67 69 63 20 6e 75 6d      /* Magic num
23340 62 65 72 20 31 20 69 73 20 74 68 65 20 57 41 4c  ber 1 is the WAL
23350 5f 43 4b 50 54 5f 4c 4f 43 4b 20 6c 6f 63 6b 2e  _CKPT_LOCK lock.
23360 20 50 72 65 76 65 6e 74 69 6e 67 20 53 51 4c 69   Preventing SQLi
23370 74 65 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74  te from.    ** t
23380 61 6b 69 6e 67 20 74 68 69 73 20 6c 6f 63 6b 20  aking this lock 
23390 61 6c 73 6f 20 70 72 65 76 65 6e 74 73 20 61 6e  also prevents an
233a0 79 20 63 68 65 63 6b 70 6f 69 6e 74 73 20 66 72  y checkpoints fr
233b0 6f 6d 20 6f 63 63 75 72 72 69 6e 67 2e 20 0a 20  om occurring. . 
233c0 20 20 20 2a 2a 20 74 6f 64 6f 3a 20 72 65 61 6c     ** todo: real
233d0 6c 79 2c 20 69 74 27 73 20 6e 6f 74 20 63 6c 65  ly, it's not cle
233e0 61 72 20 77 68 79 20 74 68 69 73 20 6d 69 67 68  ar why this migh
233f0 74 20 6f 63 63 75 72 2c 20 61 73 20 0a 20 20 20  t occur, as .   
23400 20 2a 2a 20 77 61 6c 5f 61 75 74 6f 63 68 65 63   ** wal_autochec
23410 6b 70 6f 69 6e 74 20 6f 75 67 68 74 20 74 6f 20  kpoint ought to 
23420 62 65 20 74 75 72 6e 65 64 20 6f 66 66 2e 20 20  be turned off.  
23430 2a 2f 0a 20 20 20 20 69 66 28 20 6f 66 73 74 3d  */.    if( ofst=
23440 3d 57 41 4c 5f 4c 4f 43 4b 5f 43 4b 50 54 20 26  =WAL_LOCK_CKPT &
23450 26 20 6e 3d 3d 31 20 29 20 72 63 20 3d 20 53 51  & n==1 ) rc = SQ
23460 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c  LITE_BUSY;.  }el
23470 73 65 7b 0a 20 20 20 20 69 6e 74 20 62 43 61 70  se{.    int bCap
23480 74 75 72 65 20 3d 20 30 3b 0a 20 20 20 20 69 66  ture = 0;.    if
23490 28 20 6e 3d 3d 31 20 26 26 20 28 66 6c 61 67 73  ( n==1 && (flags
234a0 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   & SQLITE_SHM_EX
234b0 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20 26 26  CLUSIVE).     &&
234c0 20 70 52 62 75 20 26 26 20 70 52 62 75 2d 3e 65   pRbu && pRbu->e
234d0 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45  Stage==RBU_STAGE
234e0 5f 43 41 50 54 55 52 45 0a 20 20 20 20 20 26 26  _CAPTURE.     &&
234f0 20 28 6f 66 73 74 3d 3d 57 41 4c 5f 4c 4f 43 4b   (ofst==WAL_LOCK
23500 5f 57 52 49 54 45 20 7c 7c 20 6f 66 73 74 3d 3d  _WRITE || ofst==
23510 57 41 4c 5f 4c 4f 43 4b 5f 43 4b 50 54 20 7c 7c  WAL_LOCK_CKPT ||
23520 20 6f 66 73 74 3d 3d 57 41 4c 5f 4c 4f 43 4b 5f   ofst==WAL_LOCK_
23530 52 45 41 44 30 29 0a 20 20 20 20 29 7b 0a 20 20  READ0).    ){.  
23540 20 20 20 20 62 43 61 70 74 75 72 65 20 3d 20 31      bCapture = 1
23550 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
23560 20 62 43 61 70 74 75 72 65 3d 3d 30 20 7c 7c 20   bCapture==0 || 
23570 30 3d 3d 28 66 6c 61 67 73 20 26 20 53 51 4c 49  0==(flags & SQLI
23580 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 29 20 29  TE_SHM_UNLOCK) )
23590 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 2d 3e  {.      rc = p->
235a0 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d  pReal->pMethods-
235b0 3e 78 53 68 6d 4c 6f 63 6b 28 70 2d 3e 70 52 65  >xShmLock(p->pRe
235c0 61 6c 2c 20 6f 66 73 74 2c 20 6e 2c 20 66 6c 61  al, ofst, n, fla
235d0 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62  gs);.      if( b
235e0 43 61 70 74 75 72 65 20 26 26 20 72 63 3d 3d 53  Capture && rc==S
235f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23600 20 20 20 20 70 52 62 75 2d 3e 6d 4c 6f 63 6b 20      pRbu->mLock 
23610 7c 3d 20 28 31 20 3c 3c 20 6f 66 73 74 29 3b 0a  |= (1 << ofst);.
23620 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
23630 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
23640 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20  }../*.** Obtain 
23650 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d  a pointer to a m
23660 61 70 70 69 6e 67 20 6f 66 20 61 20 73 69 6e 67  apping of a sing
23670 6c 65 20 33 32 4b 69 42 20 70 61 67 65 20 6f 66  le 32KiB page of
23680 20 74 68 65 20 2a 2d 73 68 6d 20 66 69 6c 65 2e   the *-shm file.
23690 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
236a0 62 75 56 66 73 53 68 6d 4d 61 70 28 0a 20 20 73  buVfsShmMap(.  s
236b0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
236c0 6c 65 2c 20 0a 20 20 69 6e 74 20 69 52 65 67 69  le, .  int iRegi
236d0 6f 6e 2c 20 0a 20 20 69 6e 74 20 73 7a 52 65 67  on, .  int szReg
236e0 69 6f 6e 2c 20 0a 20 20 69 6e 74 20 69 73 57 72  ion, .  int isWr
236f0 69 74 65 2c 20 0a 20 20 76 6f 69 64 20 76 6f 6c  ite, .  void vol
23700 61 74 69 6c 65 20 2a 2a 70 70 0a 29 7b 0a 20 20  atile **pp.){.  
23710 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72  rbu_file *p = (r
23720 62 75 5f 66 69 6c 65 2a 29 70 46 69 6c 65 3b 0a  bu_file*)pFile;.
23730 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
23740 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 65 53 74 61  E_OK;.  int eSta
23750 67 65 20 3d 20 28 70 2d 3e 70 52 62 75 20 3f 20  ge = (p->pRbu ? 
23760 70 2d 3e 70 52 62 75 2d 3e 65 53 74 61 67 65 20  p->pRbu->eStage 
23770 3a 20 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e  : 0);..  /* If n
23780 6f 74 20 69 6e 20 52 42 55 5f 53 54 41 47 45 5f  ot in RBU_STAGE_
23790 4f 41 4c 2c 20 61 6c 6c 6f 77 20 74 68 69 73 20  OAL, allow this 
237a0 63 61 6c 6c 20 74 6f 20 70 61 73 73 20 74 68 72  call to pass thr
237b0 6f 75 67 68 2e 20 4f 72 2c 20 69 66 20 74 68 69  ough. Or, if thi
237c0 73 0a 20 20 2a 2a 20 72 62 75 20 69 73 20 69 6e  s.  ** rbu is in
237d0 20 74 68 65 20 52 42 55 5f 53 54 41 47 45 5f 4f   the RBU_STAGE_O
237e0 41 4c 20 73 74 61 74 65 2c 20 75 73 65 20 68 65  AL state, use he
237f0 61 70 20 6d 65 6d 6f 72 79 20 66 6f 72 20 2a 2d  ap memory for *-
23800 73 68 6d 20 73 70 61 63 65 20 0a 20 20 2a 2a 20  shm space .  ** 
23810 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66 69 6c  instead of a fil
23820 65 20 6f 6e 20 64 69 73 6b 2e 20 20 2a 2f 0a 20  e on disk.  */. 
23830 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 65 6e   assert( p->open
23840 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f  Flags & (SQLITE_
23850 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 7c 53 51 4c  OPEN_MAIN_DB|SQL
23860 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
23870 29 20 29 3b 0a 20 20 69 66 28 20 65 53 74 61 67  ) );.  if( eStag
23880 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c  e==RBU_STAGE_OAL
23890 20 7c 7c 20 65 53 74 61 67 65 3d 3d 52 42 55 5f   || eStage==RBU_
238a0 53 54 41 47 45 5f 4d 4f 56 45 20 29 7b 0a 20 20  STAGE_MOVE ){.  
238b0 20 20 69 66 28 20 69 52 65 67 69 6f 6e 3c 3d 70    if( iRegion<=p
238c0 2d 3e 6e 53 68 6d 20 29 7b 0a 20 20 20 20 20 20  ->nShm ){.      
238d0 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52 65  int nByte = (iRe
238e0 67 69 6f 6e 2b 31 29 20 2a 20 73 69 7a 65 6f 66  gion+1) * sizeof
238f0 28 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 63  (char*);.      c
23900 68 61 72 20 2a 2a 61 70 4e 65 77 20 3d 20 28 63  har **apNew = (c
23910 68 61 72 2a 2a 29 73 71 6c 69 74 65 33 5f 72 65  har**)sqlite3_re
23920 61 6c 6c 6f 63 36 34 28 70 2d 3e 61 70 53 68 6d  alloc64(p->apShm
23930 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  , nByte);.      
23940 69 66 28 20 61 70 4e 65 77 3d 3d 30 20 29 7b 0a  if( apNew==0 ){.
23950 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
23960 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
23970 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23980 6d 65 6d 73 65 74 28 26 61 70 4e 65 77 5b 70 2d  memset(&apNew[p-
23990 3e 6e 53 68 6d 5d 2c 20 30 2c 20 73 69 7a 65 6f  >nShm], 0, sizeo
239a0 66 28 63 68 61 72 2a 29 20 2a 20 28 31 20 2b 20  f(char*) * (1 + 
239b0 69 52 65 67 69 6f 6e 20 2d 20 70 2d 3e 6e 53 68  iRegion - p->nSh
239c0 6d 29 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  m));.        p->
239d0 61 70 53 68 6d 20 3d 20 61 70 4e 65 77 3b 0a 20  apShm = apNew;. 
239e0 20 20 20 20 20 20 20 70 2d 3e 6e 53 68 6d 20 3d         p->nShm =
239f0 20 69 52 65 67 69 6f 6e 2b 31 3b 0a 20 20 20 20   iRegion+1;.    
23a00 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
23a10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
23a20 20 26 26 20 70 2d 3e 61 70 53 68 6d 5b 69 52 65   && p->apShm[iRe
23a30 67 69 6f 6e 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  gion]==0 ){.    
23a40 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 28    char *pNew = (
23a50 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 6d 61  char*)sqlite3_ma
23a60 6c 6c 6f 63 36 34 28 73 7a 52 65 67 69 6f 6e 29  lloc64(szRegion)
23a70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  ;.      if( pNew
23a80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
23a90 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
23aa0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
23ab0 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4e         memset(pN
23ac0 65 77 2c 20 30 2c 20 73 7a 52 65 67 69 6f 6e 29  ew, 0, szRegion)
23ad0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53  ;.        p->apS
23ae0 68 6d 5b 69 52 65 67 69 6f 6e 5d 20 3d 20 70 4e  hm[iRegion] = pN
23af0 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ew;.      }.    
23b00 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  }..    if( rc==S
23b10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23b20 20 20 2a 70 70 20 3d 20 70 2d 3e 61 70 53 68 6d    *pp = p->apShm
23b30 5b 69 52 65 67 69 6f 6e 5d 3b 0a 20 20 20 20 7d  [iRegion];.    }
23b40 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 70 20  else{.      *pp 
23b50 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 0;.    }.  }el
23b60 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
23b70 70 2d 3e 61 70 53 68 6d 3d 3d 30 20 29 3b 0a 20  p->apShm==0 );. 
23b80 20 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c     rc = p->pReal
23b90 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d  ->pMethods->xShm
23ba0 4d 61 70 28 70 2d 3e 70 52 65 61 6c 2c 20 69 52  Map(p->pReal, iR
23bb0 65 67 69 6f 6e 2c 20 73 7a 52 65 67 69 6f 6e 2c  egion, szRegion,
23bc0 20 69 73 57 72 69 74 65 2c 20 70 70 29 3b 0a 20   isWrite, pp);. 
23bd0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
23be0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72 79  .}../*.** Memory
23bf0 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61   barrier..*/.sta
23c00 74 69 63 20 76 6f 69 64 20 72 62 75 56 66 73 53  tic void rbuVfsS
23c10 68 6d 42 61 72 72 69 65 72 28 73 71 6c 69 74 65  hmBarrier(sqlite
23c20 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  3_file *pFile){.
23c30 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20    rbu_file *p = 
23c40 28 72 62 75 5f 66 69 6c 65 20 2a 29 70 46 69 6c  (rbu_file *)pFil
23c50 65 3b 0a 20 20 70 2d 3e 70 52 65 61 6c 2d 3e 70  e;.  p->pReal->p
23c60 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 42 61 72  Methods->xShmBar
23c70 72 69 65 72 28 70 2d 3e 70 52 65 61 6c 29 3b 0a  rier(p->pReal);.
23c80 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 78 53 68  }../*.** The xSh
23c90 6d 55 6e 6d 61 70 20 6d 65 74 68 6f 64 2e 0a 2a  mUnmap method..*
23ca0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75  /.static int rbu
23cb0 56 66 73 53 68 6d 55 6e 6d 61 70 28 73 71 6c 69  VfsShmUnmap(sqli
23cc0 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
23cd0 20 69 6e 74 20 64 65 6c 46 6c 61 67 29 7b 0a 20   int delFlag){. 
23ce0 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28   rbu_file *p = (
23cf0 72 62 75 5f 66 69 6c 65 2a 29 70 46 69 6c 65 3b  rbu_file*)pFile;
23d00 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
23d10 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 65 53 74  TE_OK;.  int eSt
23d20 61 67 65 20 3d 20 28 70 2d 3e 70 52 62 75 20 3f  age = (p->pRbu ?
23d30 20 70 2d 3e 70 52 62 75 2d 3e 65 53 74 61 67 65   p->pRbu->eStage
23d40 20 3a 20 30 29 3b 0a 0a 20 20 61 73 73 65 72 74   : 0);..  assert
23d50 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26  ( p->openFlags &
23d60 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41   (SQLITE_OPEN_MA
23d70 49 4e 5f 44 42 7c 53 51 4c 49 54 45 5f 4f 50 45  IN_DB|SQLITE_OPE
23d80 4e 5f 54 45 4d 50 5f 44 42 29 20 29 3b 0a 20 20  N_TEMP_DB) );.  
23d90 69 66 28 20 65 53 74 61 67 65 3d 3d 52 42 55 5f  if( eStage==RBU_
23da0 53 54 41 47 45 5f 4f 41 4c 20 7c 7c 20 65 53 74  STAGE_OAL || eSt
23db0 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4d  age==RBU_STAGE_M
23dc0 4f 56 45 20 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f  OVE ){.    /* no
23dd0 2d 6f 70 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  -op */.  }else{.
23de0 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74      /* Release t
23df0 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 20  he checkpointer 
23e00 61 6e 64 20 77 72 69 74 65 72 20 6c 6f 63 6b 73  and writer locks
23e10 20 2a 2f 0a 20 20 20 20 72 62 75 55 6e 6c 6f 63   */.    rbuUnloc
23e20 6b 53 68 6d 28 70 29 3b 0a 20 20 20 20 72 63 20  kShm(p);.    rc 
23e30 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74  = p->pReal->pMet
23e40 68 6f 64 73 2d 3e 78 53 68 6d 55 6e 6d 61 70 28  hods->xShmUnmap(
23e50 70 2d 3e 70 52 65 61 6c 2c 20 64 65 6c 46 6c 61  p->pReal, delFla
23e60 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
23e70 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41   rc;.}../* .** A
23e80 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 6e   main database n
23e90 61 6d 65 64 20 7a 4e 61 6d 65 20 68 61 73 20 6a  amed zName has j
23ea0 75 73 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e  ust been opened.
23eb0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a   The following .
23ec0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ** function retu
23ed0 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  rns a pointer to
23ee0 20 61 20 62 75 66 66 65 72 20 6f 77 6e 65 64 20   a buffer owned 
23ef0 62 79 20 53 51 4c 69 74 65 20 74 68 61 74 20 63  by SQLite that c
23f00 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 6e  ontains.** the n
23f10 61 6d 65 20 6f 66 20 74 68 65 20 2a 2d 77 61 6c  ame of the *-wal
23f20 20 66 69 6c 65 20 74 68 69 73 20 64 62 20 63 6f   file this db co
23f30 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73  nnection will us
23f40 65 2e 20 53 51 4c 69 74 65 0a 2a 2a 20 68 61 70  e. SQLite.** hap
23f50 70 65 6e 73 20 74 6f 20 70 61 73 73 20 61 20 70  pens to pass a p
23f60 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 62  ointer to this b
23f70 75 66 66 65 72 20 77 68 65 6e 20 75 73 69 6e 67  uffer when using
23f80 20 78 41 63 63 65 73 73 28 29 0a 2a 2a 20 6f 72   xAccess().** or
23f90 20 78 4f 70 65 6e 28 29 20 74 6f 20 6f 70 65 72   xOpen() to oper
23fa0 61 74 65 20 6f 6e 20 74 68 65 20 2a 2d 77 61 6c  ate on the *-wal
23fb0 20 66 69 6c 65 2e 20 20 0a 2a 2f 0a 73 74 61 74   file.  .*/.stat
23fc0 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 72  ic const char *r
23fd0 62 75 4d 61 69 6e 54 6f 57 61 6c 28 63 6f 6e 73  buMainToWal(cons
23fe0 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69  t char *zName, i
23ff0 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74  nt flags){.  int
24000 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e   n = (int)strlen
24010 28 7a 4e 61 6d 65 29 3b 0a 20 20 63 6f 6e 73 74  (zName);.  const
24020 20 63 68 61 72 20 2a 7a 20 3d 20 26 7a 4e 61 6d   char *z = &zNam
24030 65 5b 6e 5d 3b 0a 20 20 69 66 28 20 66 6c 61 67  e[n];.  if( flag
24040 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
24050 55 52 49 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f  URI ){.    int o
24060 64 64 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c  dd = 0;.    whil
24070 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20 69 66  e( 1 ){.      if
24080 28 20 7a 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20  ( z[0]==0 ){.   
24090 20 20 20 20 20 6f 64 64 20 3d 20 31 20 2d 20 6f       odd = 1 - o
240a0 64 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  dd;.        if( 
240b0 6f 64 64 20 26 26 20 7a 5b 31 5d 3d 3d 30 20 29  odd && z[1]==0 )
240c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
240d0 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d        z++;.    }
240e0 0a 20 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20 7d  .    z += 2;.  }
240f0 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
24100 20 2a 7a 3d 3d 30 20 29 20 7a 2b 2b 3b 0a 20 20   *z==0 ) z++;.  
24110 7d 0a 20 20 7a 20 2b 3d 20 28 6e 20 2b 20 38 20  }.  z += (n + 8 
24120 2b 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  + 1);.  return z
24130 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
24140 61 6e 20 72 62 75 20 66 69 6c 65 20 68 61 6e 64  an rbu file hand
24150 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
24160 74 20 72 62 75 56 66 73 4f 70 65 6e 28 0a 20 20  t rbuVfsOpen(.  
24170 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
24180 73 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  s,.  const char 
24190 2a 7a 4e 61 6d 65 2c 0a 20 20 73 71 6c 69 74 65  *zName,.  sqlite
241a0 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 0a 20  3_file *pFile,. 
241b0 20 69 6e 74 20 66 6c 61 67 73 2c 0a 20 20 69 6e   int flags,.  in
241c0 74 20 2a 70 4f 75 74 46 6c 61 67 73 0a 29 7b 0a  t *pOutFlags.){.
241d0 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33    static sqlite3
241e0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 72 62 75 76  _io_methods rbuv
241f0 66 73 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 3d 20  fs_io_methods = 
24200 7b 0a 20 20 20 20 32 2c 20 20 20 20 20 20 20 20  {.    2,        
24210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24220 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
24230 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 43 6c 6f  */.    rbuVfsClo
24240 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
24250 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a       /* xClose *
24260 2f 0a 20 20 20 20 72 62 75 56 66 73 52 65 61 64  /.    rbuVfsRead
24270 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24280 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 0a      /* xRead */.
24290 20 20 20 20 72 62 75 56 66 73 57 72 69 74 65 2c      rbuVfsWrite,
242a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
242b0 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 0a 20    /* xWrite */. 
242c0 20 20 20 72 62 75 56 66 73 54 72 75 6e 63 61 74     rbuVfsTruncat
242d0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
242e0 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f   /* xTruncate */
242f0 0a 20 20 20 20 72 62 75 56 66 73 53 79 6e 63 2c  .    rbuVfsSync,
24300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24310 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20     /* xSync */. 
24320 20 20 20 72 62 75 56 66 73 46 69 6c 65 53 69 7a     rbuVfsFileSiz
24330 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
24340 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f   /* xFileSize */
24350 0a 20 20 20 20 72 62 75 56 66 73 4c 6f 63 6b 2c  .    rbuVfsLock,
24360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24370 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20     /* xLock */. 
24380 20 20 20 72 62 75 56 66 73 55 6e 6c 6f 63 6b 2c     rbuVfsUnlock,
24390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
243a0 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20   /* xUnlock */. 
243b0 20 20 20 72 62 75 56 66 73 43 68 65 63 6b 52 65     rbuVfsCheckRe
243c0 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20  servedLock,     
243d0 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
243e0 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20 20 20 72 62  edLock */.    rb
243f0 75 56 66 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c  uVfsFileControl,
24400 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
24410 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20  FileControl */. 
24420 20 20 20 72 62 75 56 66 73 53 65 63 74 6f 72 53     rbuVfsSectorS
24430 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
24440 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20   /* xSectorSize 
24450 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 44 65 76  */.    rbuVfsDev
24460 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
24470 63 73 2c 20 20 2f 2a 20 78 44 65 76 69 63 65 43  cs,  /* xDeviceC
24480 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a  haracteristics *
24490 2f 0a 20 20 20 20 72 62 75 56 66 73 53 68 6d 4d  /.    rbuVfsShmM
244a0 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ap,             
244b0 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a      /* xShmMap *
244c0 2f 0a 20 20 20 20 72 62 75 56 66 73 53 68 6d 4c  /.    rbuVfsShmL
244d0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
244e0 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20      /* xShmLock 
244f0 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 53 68 6d  */.    rbuVfsShm
24500 42 61 72 72 69 65 72 2c 20 20 20 20 20 20 20 20  Barrier,        
24510 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72       /* xShmBarr
24520 69 65 72 20 2a 2f 0a 20 20 20 20 72 62 75 56 66  ier */.    rbuVf
24530 73 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20 20  sShmUnmap,      
24540 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
24550 55 6e 6d 61 70 20 2a 2f 0a 20 20 20 20 30 2c 20  Unmap */.    0, 
24560 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
24570 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
24580 65 74 63 68 2c 20 78 55 6e 66 65 74 63 68 20 2a  etch, xUnfetch *
24590 2f 0a 20 20 7d 3b 0a 20 20 72 62 75 5f 76 66 73  /.  };.  rbu_vfs
245a0 20 2a 70 52 62 75 56 66 73 20 3d 20 28 72 62 75   *pRbuVfs = (rbu
245b0 5f 76 66 73 2a 29 70 56 66 73 3b 0a 20 20 73 71  _vfs*)pVfs;.  sq
245c0 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65 61 6c  lite3_vfs *pReal
245d0 56 66 73 20 3d 20 70 52 62 75 56 66 73 2d 3e 70  Vfs = pRbuVfs->p
245e0 52 65 61 6c 56 66 73 3b 0a 20 20 72 62 75 5f 66  RealVfs;.  rbu_f
245f0 69 6c 65 20 2a 70 46 64 20 3d 20 28 72 62 75 5f  ile *pFd = (rbu_
24600 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20  file *)pFile;.  
24610 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
24620 4f 4b 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  OK;.  const char
24630 20 2a 7a 4f 70 65 6e 20 3d 20 7a 4e 61 6d 65 3b   *zOpen = zName;
24640 0a 20 20 69 6e 74 20 6f 66 6c 61 67 73 20 3d 20  .  int oflags = 
24650 66 6c 61 67 73 3b 0a 0a 20 20 6d 65 6d 73 65 74  flags;..  memset
24660 28 70 46 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  (pFd, 0, sizeof(
24670 72 62 75 5f 66 69 6c 65 29 29 3b 0a 20 20 70 46  rbu_file));.  pF
24680 64 2d 3e 70 52 65 61 6c 20 3d 20 28 73 71 6c 69  d->pReal = (sqli
24690 74 65 33 5f 66 69 6c 65 2a 29 26 70 46 64 5b 31  te3_file*)&pFd[1
246a0 5d 3b 0a 20 20 70 46 64 2d 3e 70 52 62 75 56 66  ];.  pFd->pRbuVf
246b0 73 20 3d 20 70 52 62 75 56 66 73 3b 0a 20 20 70  s = pRbuVfs;.  p
246c0 46 64 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20  Fd->openFlags = 
246d0 66 6c 61 67 73 3b 0a 20 20 69 66 28 20 7a 4e 61  flags;.  if( zNa
246e0 6d 65 20 29 7b 0a 20 20 20 20 69 66 28 20 66 6c  me ){.    if( fl
246f0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
24700 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20 20  N_MAIN_DB ){.   
24710 20 20 20 2f 2a 20 41 20 6d 61 69 6e 20 64 61 74     /* A main dat
24720 61 62 61 73 65 20 68 61 73 20 6a 75 73 74 20 62  abase has just b
24730 65 65 6e 20 6f 70 65 6e 65 64 2e 20 54 68 65 20  een opened. The 
24740 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
24750 73 65 74 73 0a 20 20 20 20 20 20 2a 2a 20 28 70  sets.      ** (p
24760 46 64 2d 3e 7a 57 61 6c 29 20 74 6f 20 70 6f 69  Fd->zWal) to poi
24770 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f  nt to a buffer o
24780 77 6e 65 64 20 62 79 20 53 51 4c 69 74 65 20 74  wned by SQLite t
24790 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20  hat contains.   
247a0 20 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f     ** the name o
247b0 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  f the *-wal file
247c0 20 74 68 69 73 20 64 62 20 63 6f 6e 6e 65 63 74   this db connect
247d0 69 6f 6e 20 77 69 6c 6c 20 75 73 65 2e 20 53 51  ion will use. SQ
247e0 4c 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 68 61  Lite.      ** ha
247f0 70 70 65 6e 73 20 74 6f 20 70 61 73 73 20 61 20  ppens to pass a 
24800 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20  pointer to this 
24810 62 75 66 66 65 72 20 77 68 65 6e 20 75 73 69 6e  buffer when usin
24820 67 20 78 41 63 63 65 73 73 28 29 0a 20 20 20 20  g xAccess().    
24830 20 20 2a 2a 20 6f 72 20 78 4f 70 65 6e 28 29 20    ** or xOpen() 
24840 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
24850 65 20 2a 2d 77 61 6c 20 66 69 6c 65 2e 20 20 2a  e *-wal file.  *
24860 2f 0a 20 20 20 20 20 20 70 46 64 2d 3e 7a 57 61  /.      pFd->zWa
24870 6c 20 3d 20 72 62 75 4d 61 69 6e 54 6f 57 61 6c  l = rbuMainToWal
24880 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a  (zName, flags);.
24890 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69      }.    else i
248a0 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
248b0 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 7b 0a 20 20  E_OPEN_WAL ){.  
248c0 20 20 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 44      rbu_file *pD
248d0 62 20 3d 20 72 62 75 46 69 6e 64 4d 61 69 6e 64  b = rbuFindMaind
248e0 62 28 70 52 62 75 56 66 73 2c 20 7a 4e 61 6d 65  b(pRbuVfs, zName
248f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
24900 70 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69  pDb ){.        i
24910 66 28 20 70 44 62 2d 3e 70 52 62 75 20 26 26 20  f( pDb->pRbu && 
24920 70 44 62 2d 3e 70 52 62 75 2d 3e 65 53 74 61 67  pDb->pRbu->eStag
24930 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c  e==RBU_STAGE_OAL
24940 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
24950 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 74 6f   This call is to
24960 20 6f 70 65 6e 20 61 20 2a 2d 77 61 6c 20 66 69   open a *-wal fi
24970 6c 65 2e 20 49 6e 74 65 61 64 2c 20 6f 70 65 6e  le. Intead, open
24980 20 74 68 65 20 2a 2d 6f 61 6c 2e 20 54 68 69 73   the *-oal. This
24990 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
249a0 64 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  de ensures that 
249b0 74 68 65 20 73 74 72 69 6e 67 20 70 61 73 73 65  the string passe
249c0 64 20 74 6f 20 78 4f 70 65 6e 28 29 20 69 73 20  d to xOpen() is 
249d0 74 65 72 6d 69 6e 61 74 65 64 20 62 79 20 61 0a  terminated by a.
249e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 69            ** pai
249f0 72 20 6f 66 20 27 5c 30 27 20 62 79 74 65 73 20  r of '\0' bytes 
24a00 69 6e 20 63 61 73 65 20 74 68 65 20 56 46 53 20  in case the VFS 
24a10 61 74 74 65 6d 70 74 73 20 74 6f 20 65 78 74 72  attempts to extr
24a20 61 63 74 20 61 20 55 52 49 20 0a 20 20 20 20 20  act a URI .     
24a30 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65       ** paramete
24a40 72 20 66 72 6f 6d 20 69 74 2e 20 20 2a 2f 0a 20  r from it.  */. 
24a50 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63           const c
24a60 68 61 72 20 2a 7a 42 61 73 65 20 3d 20 7a 4e 61  har *zBase = zNa
24a70 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 73 69  me;.          si
24a80 7a 65 5f 74 20 6e 43 6f 70 79 3b 0a 20 20 20 20  ze_t nCopy;.    
24a90 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 70        char *zCop
24aa0 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  y;.          if(
24ab0 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 44 62   rbuIsVacuum(pDb
24ac0 2d 3e 70 52 62 75 29 20 29 7b 0a 20 20 20 20 20  ->pRbu) ){.     
24ad0 20 20 20 20 20 20 20 7a 42 61 73 65 20 3d 20 73         zBase = s
24ae0 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61  qlite3_db_filena
24af0 6d 65 28 70 44 62 2d 3e 70 52 62 75 2d 3e 64 62  me(pDb->pRbu->db
24b00 52 62 75 2c 20 22 6d 61 69 6e 22 29 3b 0a 20 20  Rbu, "main");.  
24b10 20 20 20 20 20 20 20 20 20 20 7a 42 61 73 65 20            zBase 
24b20 3d 20 72 62 75 4d 61 69 6e 54 6f 57 61 6c 28 7a  = rbuMainToWal(z
24b30 42 61 73 65 2c 20 53 51 4c 49 54 45 5f 4f 50 45  Base, SQLITE_OPE
24b40 4e 5f 55 52 49 29 3b 0a 20 20 20 20 20 20 20 20  N_URI);.        
24b50 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6e 43    }.          nC
24b60 6f 70 79 20 3d 20 73 74 72 6c 65 6e 28 7a 42 61  opy = strlen(zBa
24b70 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  se);.          z
24b80 43 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Copy = sqlite3_m
24b90 61 6c 6c 6f 63 36 34 28 6e 43 6f 70 79 2b 32 29  alloc64(nCopy+2)
24ba0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
24bb0 7a 43 6f 70 79 20 29 7b 0a 20 20 20 20 20 20 20  zCopy ){.       
24bc0 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 43 6f 70       memcpy(zCop
24bd0 79 2c 20 7a 42 61 73 65 2c 20 6e 43 6f 70 79 29  y, zBase, nCopy)
24be0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 43  ;.            zC
24bf0 6f 70 79 5b 6e 43 6f 70 79 2d 33 5d 20 3d 20 27  opy[nCopy-3] = '
24c00 6f 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  o';.            
24c10 7a 43 6f 70 79 5b 6e 43 6f 70 79 5d 20 3d 20 27  zCopy[nCopy] = '
24c20 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20  \0';.           
24c30 20 7a 43 6f 70 79 5b 6e 43 6f 70 79 2b 31 5d 20   zCopy[nCopy+1] 
24c40 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20  = '\0';.        
24c50 20 20 20 20 7a 4f 70 65 6e 20 3d 20 28 63 6f 6e      zOpen = (con
24c60 73 74 20 63 68 61 72 2a 29 28 70 46 64 2d 3e 7a  st char*)(pFd->z
24c70 44 65 6c 20 3d 20 7a 43 6f 70 79 29 3b 0a 20 20  Del = zCopy);.  
24c80 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
24c90 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
24ca0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
24cb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24cc0 20 20 20 20 70 46 64 2d 3e 70 52 62 75 20 3d 20      pFd->pRbu = 
24cd0 70 44 62 2d 3e 70 52 62 75 3b 0a 20 20 20 20 20  pDb->pRbu;.     
24ce0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 44 62     }.        pDb
24cf0 2d 3e 70 57 61 6c 46 64 20 3d 20 70 46 64 3b 0a  ->pWalFd = pFd;.
24d00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
24d10 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 64 2d 3e  }else{.    pFd->
24d20 70 52 62 75 20 3d 20 70 52 62 75 56 66 73 2d 3e  pRbu = pRbuVfs->
24d30 70 52 62 75 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  pRbu;.  }..  if(
24d40 20 6f 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   oflags & SQLITE
24d50 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 0a 20  _OPEN_MAIN_DB . 
24d60 20 20 26 26 20 73 71 6c 69 74 65 33 5f 75 72 69    && sqlite3_uri
24d70 5f 62 6f 6f 6c 65 61 6e 28 7a 4e 61 6d 65 2c 20  _boolean(zName, 
24d80 22 72 62 75 5f 6d 65 6d 6f 72 79 22 2c 20 30 29  "rbu_memory", 0)
24d90 20 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65 72   .  ){.    asser
24da0 74 28 20 6f 66 6c 61 67 73 20 26 20 53 51 4c 49  t( oflags & SQLI
24db0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
24dc0 29 3b 0a 20 20 20 20 6f 66 6c 61 67 73 20 3d 20  );.    oflags = 
24dd0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
24de0 50 5f 44 42 20 7c 20 53 51 4c 49 54 45 5f 4f 50  P_DB | SQLITE_OP
24df0 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
24e00 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
24e10 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  E |.            
24e20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
24e30 43 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45  CLUSIVE | SQLITE
24e40 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
24e50 4f 53 45 3b 0a 20 20 20 20 7a 4f 70 65 6e 20 3d  OSE;.    zOpen =
24e60 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72   0;.  }..  if( r
24e70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
24e80 20 20 20 20 72 63 20 3d 20 70 52 65 61 6c 56 66      rc = pRealVf
24e90 73 2d 3e 78 4f 70 65 6e 28 70 52 65 61 6c 56 66  s->xOpen(pRealVf
24ea0 73 2c 20 7a 4f 70 65 6e 2c 20 70 46 64 2d 3e 70  s, zOpen, pFd->p
24eb0 52 65 61 6c 2c 20 6f 66 6c 61 67 73 2c 20 70 4f  Real, oflags, pO
24ec0 75 74 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20  utFlags);.  }.  
24ed0 69 66 28 20 70 46 64 2d 3e 70 52 65 61 6c 2d 3e  if( pFd->pReal->
24ee0 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
24ef0 2f 2a 20 54 68 65 20 78 4f 70 65 6e 28 29 20 6f  /* The xOpen() o
24f00 70 65 72 61 74 69 6f 6e 20 68 61 73 20 73 75 63  peration has suc
24f10 63 65 65 64 65 64 2e 20 53 65 74 20 74 68 65 20  ceeded. Set the 
24f20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2e 70 4d 65  sqlite3_file.pMe
24f30 74 68 6f 64 73 0a 20 20 20 20 2a 2a 20 70 6f 69  thods.    ** poi
24f40 6e 74 65 72 20 61 6e 64 2c 20 69 66 20 74 68 65  nter and, if the
24f50 20 66 69 6c 65 20 69 73 20 61 20 6d 61 69 6e 20   file is a main 
24f60 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 6c  database file, l
24f70 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74 68 65 0a  ink it into the.
24f80 20 20 20 20 2a 2a 20 6d 75 74 65 78 20 70 72 6f      ** mutex pro
24f90 74 65 63 74 65 64 20 6c 69 6e 6b 65 64 20 6c 69  tected linked li
24fa0 73 74 20 6f 66 20 61 6c 6c 20 73 75 63 68 20 66  st of all such f
24fb0 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 20 20 70 46  iles.  */.    pF
24fc0 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 3d 20  ile->pMethods = 
24fd0 26 72 62 75 76 66 73 5f 69 6f 5f 6d 65 74 68 6f  &rbuvfs_io_metho
24fe0 64 73 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67  ds;.    if( flag
24ff0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
25000 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20 20  MAIN_DB ){.     
25010 20 72 62 75 4d 61 69 6e 6c 69 73 74 41 64 64 28   rbuMainlistAdd(
25020 70 46 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  pFd);.    }.  }e
25030 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
25040 5f 66 72 65 65 28 70 46 64 2d 3e 7a 44 65 6c 29  _free(pFd->zDel)
25050 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
25060 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  rc;.}../*.** Del
25070 65 74 65 20 74 68 65 20 66 69 6c 65 20 6c 6f 63  ete the file loc
25080 61 74 65 64 20 61 74 20 7a 50 61 74 68 2e 0a 2a  ated at zPath..*
25090 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75  /.static int rbu
250a0 56 66 73 44 65 6c 65 74 65 28 73 71 6c 69 74 65  VfsDelete(sqlite
250b0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e  3_vfs *pVfs, con
250c0 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
250d0 69 6e 74 20 64 69 72 53 79 6e 63 29 7b 0a 20 20  int dirSync){.  
250e0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65  sqlite3_vfs *pRe
250f0 61 6c 56 66 73 20 3d 20 28 28 72 62 75 5f 76 66  alVfs = ((rbu_vf
25100 73 2a 29 70 56 66 73 29 2d 3e 70 52 65 61 6c 56  s*)pVfs)->pRealV
25110 66 73 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65  fs;.  return pRe
25120 61 6c 56 66 73 2d 3e 78 44 65 6c 65 74 65 28 70  alVfs->xDelete(p
25130 52 65 61 6c 56 66 73 2c 20 7a 50 61 74 68 2c 20  RealVfs, zPath, 
25140 64 69 72 53 79 6e 63 29 3b 0a 7d 0a 0a 2f 2a 0a  dirSync);.}../*.
25150 2a 2a 20 54 65 73 74 20 66 6f 72 20 61 63 63 65  ** Test for acce
25160 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 20  ss permissions. 
25170 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
25180 68 65 20 72 65 71 75 65 73 74 65 64 20 70 65 72  he requested per
25190 6d 69 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61 76  mission.** is av
251a0 61 69 6c 61 62 6c 65 2c 20 6f 72 20 66 61 6c 73  ailable, or fals
251b0 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
251c0 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66  static int rbuVf
251d0 73 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74  sAccess(.  sqlit
251e0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 0a 20  e3_vfs *pVfs, . 
251f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
25200 74 68 2c 20 0a 20 20 69 6e 74 20 66 6c 61 67 73  th, .  int flags
25210 2c 20 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75  , .  int *pResOu
25220 74 0a 29 7b 0a 20 20 72 62 75 5f 76 66 73 20 2a  t.){.  rbu_vfs *
25230 70 52 62 75 56 66 73 20 3d 20 28 72 62 75 5f 76  pRbuVfs = (rbu_v
25240 66 73 2a 29 70 56 66 73 3b 0a 20 20 73 71 6c 69  fs*)pVfs;.  sqli
25250 74 65 33 5f 76 66 73 20 2a 70 52 65 61 6c 56 66  te3_vfs *pRealVf
25260 73 20 3d 20 70 52 62 75 56 66 73 2d 3e 70 52 65  s = pRbuVfs->pRe
25270 61 6c 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b  alVfs;.  int rc;
25280 0a 0a 20 20 72 63 20 3d 20 70 52 65 61 6c 56 66  ..  rc = pRealVf
25290 73 2d 3e 78 41 63 63 65 73 73 28 70 52 65 61 6c  s->xAccess(pReal
252a0 56 66 73 2c 20 7a 50 61 74 68 2c 20 66 6c 61 67  Vfs, zPath, flag
252b0 73 2c 20 70 52 65 73 4f 75 74 29 3b 0a 0a 20 20  s, pResOut);..  
252c0 2f 2a 20 49 66 20 74 68 69 73 20 63 61 6c 6c 20  /* If this call 
252d0 69 73 20 74 6f 20 63 68 65 63 6b 20 69 66 20 61  is to check if a
252e0 20 2a 2d 77 61 6c 20 66 69 6c 65 20 61 73 73 6f   *-wal file asso
252f0 63 69 61 74 65 64 20 77 69 74 68 20 61 6e 20 52  ciated with an R
25300 42 55 20 74 61 72 67 65 74 0a 20 20 2a 2a 20 64  BU target.  ** d
25310 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
25320 6f 6e 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74  on exists, and t
25330 68 65 20 52 42 55 20 75 70 64 61 74 65 20 69 73  he RBU update is
25340 20 69 6e 20 52 42 55 5f 53 54 41 47 45 5f 4f 41   in RBU_STAGE_OA
25350 4c 2c 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c  L,.  ** the foll
25360 6f 77 69 6e 67 20 73 70 65 63 69 61 6c 20 68 61  owing special ha
25370 6e 64 6c 69 6e 67 20 69 73 20 61 63 74 69 76 61  ndling is activa
25380 74 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ted:.  **.  **  
25390 20 61 29 20 69 66 20 74 68 65 20 2a 2d 77 61 6c   a) if the *-wal
253a0 20 66 69 6c 65 20 64 6f 65 73 20 65 78 69 73 74   file does exist
253b0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
253c0 43 41 4e 54 4f 50 45 4e 2e 20 54 68 69 73 0a 20  CANTOPEN. This. 
253d0 20 2a 2a 20 20 20 20 20 20 65 6e 73 75 72 65 73   **      ensures
253e0 20 74 68 61 74 20 74 68 65 20 52 42 55 20 65 78   that the RBU ex
253f0 74 65 6e 73 69 6f 6e 20 6e 65 76 65 72 20 74 72  tension never tr
25400 69 65 73 20 74 6f 20 75 70 64 61 74 65 20 61 20  ies to update a 
25410 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 20 20  database.  **   
25420 20 20 20 69 6e 20 77 61 6c 20 6d 6f 64 65 2c 20     in wal mode, 
25430 65 76 65 6e 20 69 66 20 74 68 65 20 66 69 72 73  even if the firs
25440 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
25450 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 0a  tabase file has.
25460 20 20 2a 2a 20 20 20 20 20 20 62 65 65 6e 20 64    **      been d
25470 61 6d 61 67 65 64 2e 20 0a 20 20 2a 2a 0a 20 20  amaged. .  **.  
25480 2a 2a 20 20 20 62 29 20 69 66 20 74 68 65 20 2a  **   b) if the *
25490 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e  -wal file does n
254a0 6f 74 20 65 78 69 73 74 2c 20 63 6c 61 69 6d 20  ot exist, claim 
254b0 74 68 61 74 20 69 74 20 64 6f 65 73 20 61 6e 79  that it does any
254c0 77 61 79 2c 0a 20 20 2a 2a 20 20 20 20 20 20 63  way,.  **      c
254d0 61 75 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f  ausing SQLite to
254e0 20 63 61 6c 6c 20 78 4f 70 65 6e 28 29 20 74 6f   call xOpen() to
254f0 20 6f 70 65 6e 20 69 74 2e 20 54 68 69 73 20 63   open it. This c
25500 61 6c 6c 20 77 69 6c 6c 20 61 6c 73 6f 0a 20 20  all will also.  
25510 2a 2a 20 20 20 20 20 20 62 65 20 69 6e 74 65 72  **      be inter
25520 63 65 70 74 65 64 20 28 73 65 65 20 74 68 65 20  cepted (see the 
25530 72 62 75 56 66 73 4f 70 65 6e 28 29 20 66 75 6e  rbuVfsOpen() fun
25540 63 74 69 6f 6e 29 20 61 6e 64 20 74 68 65 20 2a  ction) and the *
25550 2d 6f 61 6c 0a 20 20 2a 2a 20 20 20 20 20 20 66  -oal.  **      f
25560 69 6c 65 20 6f 70 65 6e 65 64 20 69 6e 73 74 65  ile opened inste
25570 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  ad..  */.  if( r
25580 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
25590 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43  flags==SQLITE_AC
255a0 43 45 53 53 5f 45 58 49 53 54 53 20 29 7b 0a 20  CESS_EXISTS ){. 
255b0 20 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 44 62     rbu_file *pDb
255c0 20 3d 20 72 62 75 46 69 6e 64 4d 61 69 6e 64 62   = rbuFindMaindb
255d0 28 70 52 62 75 56 66 73 2c 20 7a 50 61 74 68 2c  (pRbuVfs, zPath,
255e0 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70 44 62   1);.    if( pDb
255f0 20 26 26 20 70 44 62 2d 3e 70 52 62 75 20 26 26   && pDb->pRbu &&
25600 20 70 44 62 2d 3e 70 52 62 75 2d 3e 65 53 74 61   pDb->pRbu->eSta
25610 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41  ge==RBU_STAGE_OA
25620 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 2a  L ){.      if( *
25630 70 52 65 73 4f 75 74 20 29 7b 0a 20 20 20 20 20  pResOut ){.     
25640 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
25650 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 20 20 7d  ANTOPEN;.      }
25660 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
25670 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 20 3d  lite3_int64 sz =
25680 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
25690 20 72 62 75 56 66 73 46 69 6c 65 53 69 7a 65 28   rbuVfsFileSize(
256a0 26 70 44 62 2d 3e 62 61 73 65 2c 20 26 73 7a 29  &pDb->base, &sz)
256b0 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 4f  ;.        *pResO
256c0 75 74 20 3d 20 28 73 7a 3e 30 29 3b 0a 20 20 20  ut = (sz>0);.   
256d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
256e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
256f0 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20 62  /*.** Populate b
25700 75 66 66 65 72 20 7a 4f 75 74 20 77 69 74 68 20  uffer zOut with 
25710 74 68 65 20 66 75 6c 6c 20 63 61 6e 6f 6e 69 63  the full canonic
25720 61 6c 20 70 61 74 68 6e 61 6d 65 20 63 6f 72 72  al pathname corr
25730 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20  esponding.** to 
25740 74 68 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 20  the pathname in 
25750 7a 50 61 74 68 2e 20 7a 4f 75 74 20 69 73 20 67  zPath. zOut is g
25760 75 61 72 61 6e 74 65 65 64 20 74 6f 20 70 6f 69  uaranteed to poi
25770 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 0a 2a  nt to a buffer.*
25780 2a 20 6f 66 20 61 74 20 6c 65 61 73 74 20 28 44  * of at least (D
25790 45 56 53 59 4d 5f 4d 41 58 5f 50 41 54 48 4e 41  EVSYM_MAX_PATHNA
257a0 4d 45 2b 31 29 20 62 79 74 65 73 2e 0a 2a 2f 0a  ME+1) bytes..*/.
257b0 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66  static int rbuVf
257c0 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20  sFullPathname(. 
257d0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
257e0 66 73 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  fs, .  const cha
257f0 72 20 2a 7a 50 61 74 68 2c 20 0a 20 20 69 6e 74  r *zPath, .  int
25800 20 6e 4f 75 74 2c 20 0a 20 20 63 68 61 72 20 2a   nOut, .  char *
25810 7a 4f 75 74 0a 29 7b 0a 20 20 73 71 6c 69 74 65  zOut.){.  sqlite
25820 33 5f 76 66 73 20 2a 70 52 65 61 6c 56 66 73 20  3_vfs *pRealVfs 
25830 3d 20 28 28 72 62 75 5f 76 66 73 2a 29 70 56 66  = ((rbu_vfs*)pVf
25840 73 29 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20  s)->pRealVfs;.  
25850 72 65 74 75 72 6e 20 70 52 65 61 6c 56 66 73 2d  return pRealVfs-
25860 3e 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70  >xFullPathname(p
25870 52 65 61 6c 56 66 73 2c 20 7a 50 61 74 68 2c 20  RealVfs, zPath, 
25880 6e 4f 75 74 2c 20 7a 4f 75 74 29 3b 0a 7d 0a 0a  nOut, zOut);.}..
25890 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
258a0 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
258b0 4f 4e 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  ON./*.** Open th
258c0 65 20 64 79 6e 61 6d 69 63 20 6c 69 62 72 61 72  e dynamic librar
258d0 79 20 6c 6f 63 61 74 65 64 20 61 74 20 7a 50 61  y located at zPa
258e0 74 68 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  th and return a 
258f0 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  handle..*/.stati
25900 63 20 76 6f 69 64 20 2a 72 62 75 56 66 73 44 6c  c void *rbuVfsDl
25910 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73  Open(sqlite3_vfs
25920 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68   *pVfs, const ch
25930 61 72 20 2a 7a 50 61 74 68 29 7b 0a 20 20 73 71  ar *zPath){.  sq
25940 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65 61 6c  lite3_vfs *pReal
25950 56 66 73 20 3d 20 28 28 72 62 75 5f 76 66 73 2a  Vfs = ((rbu_vfs*
25960 29 70 56 66 73 29 2d 3e 70 52 65 61 6c 56 66 73  )pVfs)->pRealVfs
25970 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 61 6c  ;.  return pReal
25980 56 66 73 2d 3e 78 44 6c 4f 70 65 6e 28 70 52 65  Vfs->xDlOpen(pRe
25990 61 6c 56 66 73 2c 20 7a 50 61 74 68 29 3b 0a 7d  alVfs, zPath);.}
259a0 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65  ../*.** Populate
259b0 20 74 68 65 20 62 75 66 66 65 72 20 7a 45 72 72   the buffer zErr
259c0 4d 73 67 20 28 73 69 7a 65 20 6e 42 79 74 65 20  Msg (size nByte 
259d0 62 79 74 65 73 29 20 77 69 74 68 20 61 20 68 75  bytes) with a hu
259e0 6d 61 6e 20 72 65 61 64 61 62 6c 65 0a 2a 2a 20  man readable.** 
259f0 75 74 66 2d 38 20 73 74 72 69 6e 67 20 64 65 73  utf-8 string des
25a00 63 72 69 62 69 6e 67 20 74 68 65 20 6d 6f 73 74  cribing the most
25a10 20 72 65 63 65 6e 74 20 65 72 72 6f 72 20 65 6e   recent error en
25a20 63 6f 75 6e 74 65 72 65 64 20 61 73 73 6f 63 69  countered associ
25a30 61 74 65 64 20 0a 2a 2a 20 77 69 74 68 20 64 79  ated .** with dy
25a40 6e 61 6d 69 63 20 6c 69 62 72 61 72 69 65 73 2e  namic libraries.
25a50 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
25a60 72 62 75 56 66 73 44 6c 45 72 72 6f 72 28 73 71  rbuVfsDlError(sq
25a70 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
25a80 20 69 6e 74 20 6e 42 79 74 65 2c 20 63 68 61 72   int nByte, char
25a90 20 2a 7a 45 72 72 4d 73 67 29 7b 0a 20 20 73 71   *zErrMsg){.  sq
25aa0 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65 61 6c  lite3_vfs *pReal
25ab0 56 66 73 20 3d 20 28 28 72 62 75 5f 76 66 73 2a  Vfs = ((rbu_vfs*
25ac0 29 70 56 66 73 29 2d 3e 70 52 65 61 6c 56 66 73  )pVfs)->pRealVfs
25ad0 3b 0a 20 20 70 52 65 61 6c 56 66 73 2d 3e 78 44  ;.  pRealVfs->xD
25ae0 6c 45 72 72 6f 72 28 70 52 65 61 6c 56 66 73 2c  lError(pRealVfs,
25af0 20 6e 42 79 74 65 2c 20 7a 45 72 72 4d 73 67 29   nByte, zErrMsg)
25b00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
25b10 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
25b20 68 65 20 73 79 6d 62 6f 6c 20 7a 53 79 6d 62 6f  he symbol zSymbo
25b30 6c 20 69 6e 20 74 68 65 20 64 79 6e 61 6d 69 63  l in the dynamic
25b40 20 6c 69 62 72 61 72 79 20 70 48 61 6e 64 6c 65   library pHandle
25b50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
25b60 20 28 2a 72 62 75 56 66 73 44 6c 53 79 6d 28 0a   (*rbuVfsDlSym(.
25b70 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
25b80 56 66 73 2c 20 0a 20 20 76 6f 69 64 20 2a 70 41  Vfs, .  void *pA
25b90 72 67 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  rg, .  const cha
25ba0 72 20 2a 7a 53 79 6d 0a 29 29 28 76 6f 69 64 29  r *zSym.))(void)
25bb0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
25bc0 2a 70 52 65 61 6c 56 66 73 20 3d 20 28 28 72 62  *pRealVfs = ((rb
25bd0 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e 70 52  u_vfs*)pVfs)->pR
25be0 65 61 6c 56 66 73 3b 0a 20 20 72 65 74 75 72 6e  ealVfs;.  return
25bf0 20 70 52 65 61 6c 56 66 73 2d 3e 78 44 6c 53 79   pRealVfs->xDlSy
25c00 6d 28 70 52 65 61 6c 56 66 73 2c 20 70 41 72 67  m(pRealVfs, pArg
25c10 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , zSym);.}../*.*
25c20 2a 20 43 6c 6f 73 65 20 74 68 65 20 64 79 6e 61  * Close the dyna
25c30 6d 69 63 20 6c 69 62 72 61 72 79 20 68 61 6e 64  mic library hand
25c40 6c 65 20 70 48 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  le pHandle..*/.s
25c50 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 56 66  tatic void rbuVf
25c60 73 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  sDlClose(sqlite3
25c70 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64  _vfs *pVfs, void
25c80 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 73 71   *pHandle){.  sq
25c90 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65 61 6c  lite3_vfs *pReal
25ca0 56 66 73 20 3d 20 28 28 72 62 75 5f 76 66 73 2a  Vfs = ((rbu_vfs*
25cb0 29 70 56 66 73 29 2d 3e 70 52 65 61 6c 56 66 73  )pVfs)->pRealVfs
25cc0 3b 0a 20 20 70 52 65 61 6c 56 66 73 2d 3e 78 44  ;.  pRealVfs->xD
25cd0 6c 43 6c 6f 73 65 28 70 52 65 61 6c 56 66 73 2c  lClose(pRealVfs,
25ce0 20 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6e   pHandle);.}.#en
25cf0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
25d00 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
25d10 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75  N */../*.** Popu
25d20 6c 61 74 65 20 74 68 65 20 62 75 66 66 65 72 20  late the buffer 
25d30 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 42  pointed to by zB
25d40 75 66 4f 75 74 20 77 69 74 68 20 6e 42 79 74 65  ufOut with nByte
25d50 20 62 79 74 65 73 20 6f 66 20 0a 2a 2a 20 72 61   bytes of .** ra
25d60 6e 64 6f 6d 20 64 61 74 61 2e 0a 2a 2f 0a 73 74  ndom data..*/.st
25d70 61 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 52  atic int rbuVfsR
25d80 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65  andomness(sqlite
25d90 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
25da0 20 6e 42 79 74 65 2c 20 63 68 61 72 20 2a 7a 42   nByte, char *zB
25db0 75 66 4f 75 74 29 7b 0a 20 20 73 71 6c 69 74 65  ufOut){.  sqlite
25dc0 33 5f 76 66 73 20 2a 70 52 65 61 6c 56 66 73 20  3_vfs *pRealVfs 
25dd0 3d 20 28 28 72 62 75 5f 76 66 73 2a 29 70 56 66  = ((rbu_vfs*)pVf
25de0 73 29 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20  s)->pRealVfs;.  
25df0 72 65 74 75 72 6e 20 70 52 65 61 6c 56 66 73 2d  return pRealVfs-
25e00 3e 78 52 61 6e 64 6f 6d 6e 65 73 73 28 70 52 65  >xRandomness(pRe
25e10 61 6c 56 66 73 2c 20 6e 42 79 74 65 2c 20 7a 42  alVfs, nByte, zB
25e20 75 66 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ufOut);.}../*.**
25e30 20 53 6c 65 65 70 20 66 6f 72 20 6e 4d 69 63 72   Sleep for nMicr
25e40 6f 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2e 20  o microseconds. 
25e50 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
25e60 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64  r of microsecond
25e70 73 20 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 73  s .** actually s
25e80 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lept..*/.static 
25e90 69 6e 74 20 72 62 75 56 66 73 53 6c 65 65 70 28  int rbuVfsSleep(
25ea0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
25eb0 73 2c 20 69 6e 74 20 6e 4d 69 63 72 6f 29 7b 0a  s, int nMicro){.
25ec0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
25ed0 52 65 61 6c 56 66 73 20 3d 20 28 28 72 62 75 5f  RealVfs = ((rbu_
25ee0 76 66 73 2a 29 70 56 66 73 29 2d 3e 70 52 65 61  vfs*)pVfs)->pRea
25ef0 6c 56 66 73 3b 0a 20 20 72 65 74 75 72 6e 20 70  lVfs;.  return p
25f00 52 65 61 6c 56 66 73 2d 3e 78 53 6c 65 65 70 28  RealVfs->xSleep(
25f10 70 52 65 61 6c 56 66 73 2c 20 6e 4d 69 63 72 6f  pRealVfs, nMicro
25f20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
25f30 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  rn the current t
25f40 69 6d 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20  ime as a Julian 
25f50 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 20 2a 70  Day number in *p
25f60 54 69 6d 65 4f 75 74 2e 0a 2a 2f 0a 73 74 61 74  TimeOut..*/.stat
25f70 69 63 20 69 6e 74 20 72 62 75 56 66 73 43 75 72  ic int rbuVfsCur
25f80 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33  rentTime(sqlite3
25f90 5f 76 66 73 20 2a 70 56 66 73 2c 20 64 6f 75 62  _vfs *pVfs, doub
25fa0 6c 65 20 2a 70 54 69 6d 65 4f 75 74 29 7b 0a 20  le *pTimeOut){. 
25fb0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 52   sqlite3_vfs *pR
25fc0 65 61 6c 56 66 73 20 3d 20 28 28 72 62 75 5f 76  ealVfs = ((rbu_v
25fd0 66 73 2a 29 70 56 66 73 29 2d 3e 70 52 65 61 6c  fs*)pVfs)->pReal
25fe0 56 66 73 3b 0a 20 20 72 65 74 75 72 6e 20 70 52  Vfs;.  return pR
25ff0 65 61 6c 56 66 73 2d 3e 78 43 75 72 72 65 6e 74  ealVfs->xCurrent
26000 54 69 6d 65 28 70 52 65 61 6c 56 66 73 2c 20 70  Time(pRealVfs, p
26010 54 69 6d 65 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a  TimeOut);.}../*.
26020 2a 2a 20 4e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61  ** No-op..*/.sta
26030 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 47 65  tic int rbuVfsGe
26040 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74  tLastError(sqlit
26050 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
26060 74 20 61 2c 20 63 68 61 72 20 2a 62 29 7b 0a 20  t a, char *b){. 
26070 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
26080 0a 2a 2a 20 44 65 72 65 67 69 73 74 65 72 20 61  .** Deregister a
26090 6e 64 20 64 65 73 74 72 6f 79 20 61 6e 20 52 42  nd destroy an RB
260a0 55 20 76 66 73 20 63 72 65 61 74 65 64 20 62 79  U vfs created by
260b0 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c   an earlier call
260c0 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 72 62   to.** sqlite3rb
260d0 75 5f 63 72 65 61 74 65 5f 76 66 73 28 29 2e 0a  u_create_vfs()..
260e0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 72  */.void sqlite3r
260f0 62 75 5f 64 65 73 74 72 6f 79 5f 76 66 73 28 63  bu_destroy_vfs(c
26100 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
26110 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
26120 20 2a 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33   *pVfs = sqlite3
26130 5f 76 66 73 5f 66 69 6e 64 28 7a 4e 61 6d 65 29  _vfs_find(zName)
26140 3b 0a 20 20 69 66 28 20 70 56 66 73 20 26 26 20  ;.  if( pVfs && 
26150 70 56 66 73 2d 3e 78 4f 70 65 6e 3d 3d 72 62 75  pVfs->xOpen==rbu
26160 56 66 73 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73  VfsOpen ){.    s
26170 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
26180 65 28 28 28 72 62 75 5f 76 66 73 2a 29 70 56 66  e(((rbu_vfs*)pVf
26190 73 29 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  s)->mutex);.    
261a0 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65  sqlite3_vfs_unre
261b0 67 69 73 74 65 72 28 70 56 66 73 29 3b 0a 20 20  gister(pVfs);.  
261c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
261d0 56 66 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Vfs);.  }.}../*.
261e0 2a 2a 20 43 72 65 61 74 65 20 61 6e 20 52 42 55  ** Create an RBU
261f0 20 56 46 53 20 6e 61 6d 65 64 20 7a 4e 61 6d 65   VFS named zName
26200 20 74 68 61 74 20 61 63 63 65 73 73 65 73 20 74   that accesses t
26210 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 66 69  he underlying fi
26220 6c 65 2d 73 79 73 74 65 6d 0a 2a 2a 20 76 69 61  le-system.** via
26230 20 65 78 69 73 74 69 6e 67 20 56 46 53 20 7a 50   existing VFS zP
26240 61 72 65 6e 74 2e 20 54 68 65 20 6e 65 77 20 6f  arent. The new o
26250 62 6a 65 63 74 20 69 73 20 72 65 67 69 73 74 65  bject is registe
26260 72 65 64 20 61 73 20 61 20 6e 6f 6e 2d 64 65 66  red as a non-def
26270 61 75 6c 74 0a 2a 2a 20 56 46 53 20 77 69 74 68  ault.** VFS with
26280 20 53 51 4c 69 74 65 20 62 65 66 6f 72 65 20 72   SQLite before r
26290 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  eturning..*/.int
262a0 20 73 71 6c 69 74 65 33 72 62 75 5f 63 72 65 61   sqlite3rbu_crea
262b0 74 65 5f 76 66 73 28 63 6f 6e 73 74 20 63 68 61  te_vfs(const cha
262c0 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20  r *zName, const 
262d0 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 29 7b 0a  char *zParent){.
262e0 0a 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20 66  .  /* Template f
262f0 6f 72 20 56 46 53 20 2a 2f 0a 20 20 73 74 61 74  or VFS */.  stat
26300 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20 76  ic sqlite3_vfs v
26310 66 73 5f 74 65 6d 70 6c 61 74 65 20 3d 20 7b 0a  fs_template = {.
26320 20 20 20 20 31 2c 20 20 20 20 20 20 20 20 20 20      1,          
26330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26340 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
26350 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
26360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26370 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a     /* szOsFile *
26380 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  /.    0,        
26390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
263a0 20 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d      /* mxPathnam
263b0 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  e */.    0,     
263c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
263d0 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20         /* pNext 
263e0 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20  */.    0,       
263f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26400 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f       /* zName */
26410 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
26420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26430 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a     /* pAppData *
26440 2f 0a 20 20 20 20 72 62 75 56 66 73 4f 70 65 6e  /.    rbuVfsOpen
26450 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26460 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a      /* xOpen */.
26470 20 20 20 20 72 62 75 56 66 73 44 65 6c 65 74 65      rbuVfsDelete
26480 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26490 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a    /* xDelete */.
264a0 20 20 20 20 72 62 75 56 66 73 41 63 63 65 73 73      rbuVfsAccess
264b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
264c0 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a    /* xAccess */.
264d0 20 20 20 20 72 62 75 56 66 73 46 75 6c 6c 50 61      rbuVfsFullPa
264e0 74 68 6e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  thname,         
264f0 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61    /* xFullPathna
26500 6d 65 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  me */..#ifndef S
26510 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
26520 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 72 62  EXTENSION.    rb
26530 75 56 66 73 44 6c 4f 70 65 6e 2c 20 20 20 20 20  uVfsDlOpen,     
26540 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
26550 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 72 62  DlOpen */.    rb
26560 75 56 66 73 44 6c 45 72 72 6f 72 2c 20 20 20 20  uVfsDlError,    
26570 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
26580 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72  DlError */.    r
26590 62 75 56 66 73 44 6c 53 79 6d 2c 20 20 20 20 20  buVfsDlSym,     
265a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
265b0 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 72 62  xDlSym */.    rb
265c0 75 56 66 73 44 6c 43 6c 6f 73 65 2c 20 20 20 20  uVfsDlClose,    
265d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
265e0 44 6c 43 6c 6f 73 65 20 2a 2f 0a 23 65 6c 73 65  DlClose */.#else
265f0 0a 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  .    0, 0, 0, 0,
26600 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 72 62 75  .#endif..    rbu
26610 56 66 73 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20  VfsRandomness,  
26620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
26630 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20  andomness */.   
26640 20 72 62 75 56 66 73 53 6c 65 65 70 2c 20 20 20   rbuVfsSleep,   
26650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26660 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20  * xSleep */.    
26670 72 62 75 56 66 73 43 75 72 72 65 6e 74 54 69 6d  rbuVfsCurrentTim
26680 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
26690 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f   xCurrentTime */
266a0 0a 20 20 20 20 72 62 75 56 66 73 47 65 74 4c 61  .    rbuVfsGetLa
266b0 73 74 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20  stError,        
266c0 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72     /* xGetLastEr
266d0 72 6f 72 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20  ror */.    0,   
266e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
266f0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 75 72           /* xCur
26700 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 28 76  rentTimeInt64 (v
26710 65 72 73 69 6f 6e 20 32 29 20 2a 2f 0a 20 20 20  ersion 2) */.   
26720 20 30 2c 20 30 2c 20 30 20 20 20 20 20 20 20 20   0, 0, 0        
26730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26740 2a 20 55 6e 69 6d 70 6c 65 6d 65 6e 74 65 64 20  * Unimplemented 
26750 76 65 72 73 69 6f 6e 20 33 20 6d 65 74 68 6f 64  version 3 method
26760 73 20 2a 2f 0a 20 20 7d 3b 0a 0a 20 20 72 62 75  s */.  };..  rbu
26770 5f 76 66 73 20 2a 70 4e 65 77 20 3d 20 30 3b 20  _vfs *pNew = 0; 
26780 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26790 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  Newly allocated 
267a0 56 46 53 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  VFS */.  int rc 
267b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73  = SQLITE_OK;.  s
267c0 69 7a 65 5f 74 20 6e 4e 61 6d 65 3b 0a 20 20 73  ize_t nName;.  s
267d0 69 7a 65 5f 74 20 6e 42 79 74 65 3b 0a 0a 20 20  ize_t nByte;..  
267e0 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a  nName = strlen(z
267f0 4e 61 6d 65 29 3b 0a 20 20 6e 42 79 74 65 20 3d  Name);.  nByte =
26800 20 73 69 7a 65 6f 66 28 72 62 75 5f 76 66 73 29   sizeof(rbu_vfs)
26810 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 3b 0a 20 20   + nName + 1;.  
26820 70 4e 65 77 20 3d 20 28 72 62 75 5f 76 66 73 2a  pNew = (rbu_vfs*
26830 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36  )sqlite3_malloc6
26840 34 28 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20  4(nByte);.  if( 
26850 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pNew==0 ){.    r
26860 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
26870 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
26880 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 50 61 72  qlite3_vfs *pPar
26890 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ent;           /
268a0 2a 20 50 61 72 65 6e 74 20 56 46 53 20 2a 2f 0a  * Parent VFS */.
268b0 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c      memset(pNew,
268c0 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20   0, nByte);.    
268d0 70 50 61 72 65 6e 74 20 3d 20 73 71 6c 69 74 65  pParent = sqlite
268e0 33 5f 76 66 73 5f 66 69 6e 64 28 7a 50 61 72 65  3_vfs_find(zPare
268f0 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  nt);.    if( pPa
26900 72 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rent==0 ){.     
26910 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54   rc = SQLITE_NOT
26920 46 4f 55 4e 44 3b 0a 20 20 20 20 7d 65 6c 73 65  FOUND;.    }else
26930 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53  {.      char *zS
26940 70 61 63 65 3b 0a 20 20 20 20 20 20 6d 65 6d 63  pace;.      memc
26950 70 79 28 26 70 4e 65 77 2d 3e 62 61 73 65 2c 20  py(&pNew->base, 
26960 26 76 66 73 5f 74 65 6d 70 6c 61 74 65 2c 20 73  &vfs_template, s
26970 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 76 66  izeof(sqlite3_vf
26980 73 29 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  s));.      pNew-
26990 3e 62 61 73 65 2e 6d 78 50 61 74 68 6e 61 6d 65  >base.mxPathname
269a0 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6d 78 50 61   = pParent->mxPa
269b0 74 68 6e 61 6d 65 3b 0a 20 20 20 20 20 20 70 4e  thname;.      pN
269c0 65 77 2d 3e 62 61 73 65 2e 73 7a 4f 73 46 69 6c  ew->base.szOsFil
269d0 65 20 3d 20 73 69 7a 65 6f 66 28 72 62 75 5f 66  e = sizeof(rbu_f
269e0 69 6c 65 29 20 2b 20 70 50 61 72 65 6e 74 2d 3e  ile) + pParent->
269f0 73 7a 4f 73 46 69 6c 65 3b 0a 20 20 20 20 20 20  szOsFile;.      
26a00 70 4e 65 77 2d 3e 70 52 65 61 6c 56 66 73 20 3d  pNew->pRealVfs =
26a10 20 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 20 20   pParent;.      
26a20 70 4e 65 77 2d 3e 62 61 73 65 2e 7a 4e 61 6d 65  pNew->base.zName
26a30 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
26a40 28 7a 53 70 61 63 65 20 3d 20 28 63 68 61 72 2a  (zSpace = (char*
26a50 29 26 70 4e 65 77 5b 31 5d 29 3b 0a 20 20 20 20  )&pNew[1]);.    
26a60 20 20 6d 65 6d 63 70 79 28 7a 53 70 61 63 65 2c    memcpy(zSpace,
26a70 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a   zName, nName);.
26a80 0a 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61  .      /* Alloca
26a90 74 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64  te the mutex and
26aa0 20 72 65 67 69 73 74 65 72 20 74 68 65 20 6e 65   register the ne
26ab0 77 20 56 46 53 20 28 6e 6f 74 20 61 73 20 74 68  w VFS (not as th
26ac0 65 20 64 65 66 61 75 6c 74 29 20 2a 2f 0a 20 20  e default) */.  
26ad0 20 20 20 20 70 4e 65 77 2d 3e 6d 75 74 65 78 20      pNew->mutex 
26ae0 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  = sqlite3_mutex_
26af0 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
26b00 45 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20  EX_RECURSIVE);. 
26b10 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 6d       if( pNew->m
26b20 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
26b30 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
26b40 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  OMEM;.      }els
26b50 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
26b60 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
26b70 73 74 65 72 28 26 70 4e 65 77 2d 3e 62 61 73 65  ster(&pNew->base
26b80 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
26b90 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 21    }..    if( rc!
26ba0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26bb0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
26bc0 78 5f 66 72 65 65 28 70 4e 65 77 2d 3e 6d 75 74  x_free(pNew->mut
26bd0 65 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ex);.      sqlit
26be0 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20  e3_free(pNew);. 
26bf0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
26c00 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
26c10 43 6f 6e 66 69 67 75 72 65 20 74 68 65 20 61 67  Configure the ag
26c20 67 72 65 67 61 74 65 20 74 65 6d 70 20 66 69 6c  gregate temp fil
26c30 65 20 73 69 7a 65 20 6c 69 6d 69 74 20 66 6f 72  e size limit for
26c40 20 74 68 69 73 20 52 42 55 20 68 61 6e 64 6c 65   this RBU handle
26c50 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74  ..*/.sqlite3_int
26c60 36 34 20 73 71 6c 69 74 65 33 72 62 75 5f 74 65  64 sqlite3rbu_te
26c70 6d 70 5f 73 69 7a 65 5f 6c 69 6d 69 74 28 73 71  mp_size_limit(sq
26c80 6c 69 74 65 33 72 62 75 20 2a 70 52 62 75 2c 20  lite3rbu *pRbu, 
26c90 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 29  sqlite3_int64 n)
26ca0 7b 0a 20 20 69 66 28 20 6e 3e 3d 30 20 29 7b 0a  {.  if( n>=0 ){.
26cb0 20 20 20 20 70 52 62 75 2d 3e 73 7a 54 65 6d 70      pRbu->szTemp
26cc0 4c 69 6d 69 74 20 3d 20 6e 3b 0a 20 20 7d 0a 20  Limit = n;.  }. 
26cd0 20 72 65 74 75 72 6e 20 70 52 62 75 2d 3e 73 7a   return pRbu->sz
26ce0 54 65 6d 70 4c 69 6d 69 74 3b 0a 7d 0a 0a 73 71  TempLimit;.}..sq
26cf0 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69  lite3_int64 sqli
26d00 74 65 33 72 62 75 5f 74 65 6d 70 5f 73 69 7a 65  te3rbu_temp_size
26d10 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 52 62  (sqlite3rbu *pRb
26d20 75 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 52 62  u){.  return pRb
26d30 75 2d 3e 73 7a 54 65 6d 70 3b 0a 7d 0a 0a 0a 2f  u->szTemp;.}.../
26d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 65 6e  **********/..#en
26d90 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
26da0 53 51 4c 49 54 45 5f 43 4f 52 45 29 20 7c 7c 20  SQLITE_CORE) || 
26db0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
26dc0 4e 41 42 4c 45 5f 52 42 55 29 20 2a 2f 0a        NABLE_RBU) */.