/ Hex Artifact Content
Login

Artifact e2669fb2a716615f38628a0477ecd665a040970501cba2511e9dffe066e2c9c8:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 41 75 67 75 73  /*.** 2014 Augus
0010: 74 20 33 30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  t 30.**.** The a
0020: 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20  uthor disclaims 
0030: 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69  copyright to thi
0040: 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20  s source code.  
0050: 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61  In place of.** a
0060: 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68   legal notice, h
0070: 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e  ere is a blessin
0080: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20  g:.**.**    May 
0090: 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20  you do good and 
00a0: 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20  not evil..**    
00b0: 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72  May you find for
00c0: 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75  giveness for you
00d0: 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76  rself and forgiv
00e0: 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20  e others..**    
00f0: 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72  May you share fr
0100: 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69  eely, never taki
0110: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75  ng more than you
0120: 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   give..**.******
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 56 45  ***.**.**.** OVE
0180: 52 56 49 45 57 20 0a 2a 2a 0a 2a 2a 20 20 54 68  RVIEW .**.**  Th
0190: 65 20 52 42 55 20 65 78 74 65 6e 73 69 6f 6e 20  e RBU extension 
01a0: 72 65 71 75 69 72 65 73 20 74 68 61 74 20 74 68  requires that th
01b0: 65 20 52 42 55 20 75 70 64 61 74 65 20 62 65 20  e RBU update be 
01c0: 70 61 63 6b 61 67 65 64 20 61 73 20 61 6e 0a 2a  packaged as an.*
01d0: 2a 20 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  *  SQLite databa
01e0: 73 65 2e 20 54 68 65 20 74 61 62 6c 65 73 20 69  se. The tables i
01f0: 74 20 65 78 70 65 63 74 73 20 74 6f 20 66 69 6e  t expects to fin
0200: 64 20 61 72 65 20 64 65 73 63 72 69 62 65 64 20  d are described 
0210: 69 6e 0a 2a 2a 20 20 73 71 6c 69 74 65 33 72 62  in.**  sqlite3rb
0220: 75 2e 68 2e 20 20 45 73 73 65 6e 74 69 61 6c 6c  u.h.  Essentiall
0230: 79 2c 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c  y, for each tabl
0240: 65 20 78 79 7a 20 69 6e 20 74 68 65 20 74 61 72  e xyz in the tar
0250: 67 65 74 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  get database.** 
0260: 20 74 68 61 74 20 74 68 65 20 75 73 65 72 20 77   that the user w
0270: 69 73 68 65 73 20 74 6f 20 77 72 69 74 65 20 74  ishes to write t
0280: 6f 2c 20 61 20 63 6f 72 72 65 73 70 6f 6e 64 69  o, a correspondi
0290: 6e 67 20 64 61 74 61 5f 78 79 7a 20 74 61 62 6c  ng data_xyz tabl
02a0: 65 20 69 73 0a 2a 2a 20 20 63 72 65 61 74 65 64  e is.**  created
02b0: 20 69 6e 20 74 68 65 20 52 42 55 20 64 61 74 61   in the RBU data
02c0: 62 61 73 65 20 61 6e 64 20 70 6f 70 75 6c 61 74  base and populat
02d0: 65 64 20 77 69 74 68 20 6f 6e 65 20 72 6f 77 20  ed with one row 
02e0: 66 6f 72 20 65 61 63 68 20 72 6f 77 20 74 6f 0a  for each row to.
02f0: 2a 2a 20 20 75 70 64 61 74 65 2c 20 69 6e 73 65  **  update, inse
0300: 72 74 20 6f 72 20 64 65 6c 65 74 65 20 66 72 6f  rt or delete fro
0310: 6d 20 74 68 65 20 74 61 72 67 65 74 20 74 61 62  m the target tab
0320: 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 20 54 68 65 20  le..** .**  The 
0330: 75 70 64 61 74 65 20 70 72 6f 63 65 65 64 73 20  update proceeds 
0340: 69 6e 20 74 68 72 65 65 20 73 74 61 67 65 73 3a  in three stages:
0350: 0a 2a 2a 20 0a 2a 2a 20 20 31 29 20 54 68 65 20  .** .**  1) The 
0360: 64 61 74 61 62 61 73 65 20 69 73 20 75 70 64 61  database is upda
0370: 74 65 64 2e 20 54 68 65 20 6d 6f 64 69 66 69 65  ted. The modifie
0380: 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 73  d database pages
0390: 20 61 72 65 20 77 72 69 74 74 65 6e 0a 2a 2a 20   are written.** 
03a0: 20 20 20 20 74 6f 20 61 20 2a 2d 6f 61 6c 20 66      to a *-oal f
03b0: 69 6c 65 2e 20 41 20 2a 2d 6f 61 6c 20 66 69 6c  ile. A *-oal fil
03c0: 65 20 69 73 20 6a 75 73 74 20 6c 69 6b 65 20 61  e is just like a
03d0: 20 2a 2d 77 61 6c 20 66 69 6c 65 2c 20 65 78 63   *-wal file, exc
03e0: 65 70 74 0a 2a 2a 20 20 20 20 20 74 68 61 74 20  ept.**     that 
03f0: 69 74 20 69 73 20 6e 61 6d 65 64 20 22 3c 64 61  it is named "<da
0400: 74 61 62 61 73 65 3e 2d 6f 61 6c 22 20 69 6e 73  tabase>-oal" ins
0410: 74 65 61 64 20 6f 66 20 22 3c 64 61 74 61 62 61  tead of "<databa
0420: 73 65 3e 2d 77 61 6c 22 2e 0a 2a 2a 20 20 20 20  se>-wal"..**    
0430: 20 42 65 63 61 75 73 65 20 72 65 67 75 6c 61 72   Because regular
0440: 20 53 51 4c 69 74 65 20 63 6c 69 65 6e 74 73 20   SQLite clients 
0450: 64 6f 20 6e 6f 74 20 6c 6f 6f 6b 20 66 6f 72 20  do not look for 
0460: 66 69 6c 65 20 6e 61 6d 65 64 0a 2a 2a 20 20 20  file named.**   
0470: 20 20 22 3c 64 61 74 61 62 61 73 65 3e 2d 6f 61    "<database>-oa
0480: 6c 22 2c 20 74 68 65 79 20 67 6f 20 6f 6e 20 75  l", they go on u
0490: 73 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61  sing the origina
04a0: 6c 20 64 61 74 61 62 61 73 65 20 69 6e 0a 2a 2a  l database in.**
04b0: 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f       rollback mo
04c0: 64 65 20 77 68 69 6c 65 20 74 68 65 20 2a 2d 6f  de while the *-o
04d0: 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67  al file is being
04e0: 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2a 20 0a   generated..** .
04f0: 2a 2a 20 20 20 20 20 44 75 72 69 6e 67 20 74 68  **     During th
0500: 69 73 20 73 74 61 67 65 20 52 42 55 20 64 6f 65  is stage RBU doe
0510: 73 20 6e 6f 74 20 75 70 64 61 74 65 20 74 68 65  s not update the
0520: 20 64 61 74 61 62 61 73 65 20 62 79 20 77 72 69   database by wri
0530: 74 69 6e 67 0a 2a 2a 20 20 20 20 20 64 69 72 65  ting.**     dire
0540: 63 74 6c 79 20 74 6f 20 74 68 65 20 74 61 72 67  ctly to the targ
0550: 65 74 20 74 61 62 6c 65 73 2e 20 49 6e 73 74 65  et tables. Inste
0560: 61 64 20 69 74 20 63 72 65 61 74 65 73 20 22 69  ad it creates "i
0570: 6d 70 6f 73 74 65 72 22 0a 2a 2a 20 20 20 20 20  mposter".**     
0580: 74 61 62 6c 65 73 20 75 73 69 6e 67 20 74 68 65  tables using the
0590: 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
05a0: 5f 49 4d 50 4f 53 54 45 52 20 69 6e 74 65 72 66  _IMPOSTER interf
05b0: 61 63 65 20 74 68 61 74 20 69 74 20 75 73 65 73  ace that it uses
05c0: 0a 2a 2a 20 20 20 20 20 74 6f 20 75 70 64 61 74  .**     to updat
05d0: 65 20 65 61 63 68 20 62 2d 74 72 65 65 20 69 6e  e each b-tree in
05e0: 64 69 76 69 64 75 61 6c 6c 79 2e 20 41 6c 6c 20  dividually. All 
05f0: 75 70 64 61 74 65 73 20 72 65 71 75 69 72 65 64  updates required
0600: 20 62 79 20 65 61 63 68 0a 2a 2a 20 20 20 20 20   by each.**     
0610: 62 2d 74 72 65 65 20 61 72 65 20 63 6f 6d 70 6c  b-tree are compl
0620: 65 74 65 64 20 62 65 66 6f 72 65 20 6d 6f 76 69  eted before movi
0630: 6e 67 20 6f 6e 20 74 6f 20 74 68 65 20 6e 65 78  ng on to the nex
0640: 74 2c 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 20 20  t, and all.**   
0650: 20 20 75 70 64 61 74 65 73 20 61 72 65 20 64 6f    updates are do
0660: 6e 65 20 69 6e 20 73 6f 72 74 65 64 20 6b 65 79  ne in sorted key
0670: 20 6f 72 64 65 72 2e 0a 2a 2a 20 0a 2a 2a 20 20   order..** .**  
0680: 32 29 20 54 68 65 20 22 3c 64 61 74 61 62 61 73  2) The "<databas
0690: 65 3e 2d 6f 61 6c 22 20 66 69 6c 65 20 69 73 20  e>-oal" file is 
06a0: 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 65 71 75  moved to the equ
06b0: 69 76 61 6c 65 6e 74 20 22 3c 64 61 74 61 62 61  ivalent "<databa
06c0: 73 65 3e 2d 77 61 6c 22 0a 2a 2a 20 20 20 20 20  se>-wal".**     
06d0: 6c 6f 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 61  location using a
06e0: 20 63 61 6c 6c 20 74 6f 20 72 65 6e 61 6d 65 28   call to rename(
06f0: 32 29 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67  2). Before doing
0700: 20 74 68 69 73 20 74 68 65 20 52 42 55 0a 2a 2a   this the RBU.**
0710: 20 20 20 20 20 6d 6f 64 75 6c 65 20 74 61 6b 65       module take
0720: 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  s an EXCLUSIVE l
0730: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
0740: 61 73 65 20 66 69 6c 65 2c 20 65 6e 73 75 72 69  ase file, ensuri
0750: 6e 67 0a 2a 2a 20 20 20 20 20 74 68 61 74 20 74  ng.**     that t
0760: 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 74 68 65  here are no othe
0770: 72 20 61 63 74 69 76 65 20 72 65 61 64 65 72 73  r active readers
0780: 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 4f 6e 63  ..** .**     Onc
0790: 65 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20  e the EXCLUSIVE 
07a0: 6c 6f 63 6b 20 69 73 20 72 65 6c 65 61 73 65 64  lock is released
07b0: 2c 20 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61  , any other data
07c0: 62 61 73 65 20 72 65 61 64 65 72 73 0a 2a 2a 20  base readers.** 
07d0: 20 20 20 20 64 65 74 65 63 74 20 74 68 65 20 6e      detect the n
07e0: 65 77 20 2a 2d 77 61 6c 20 66 69 6c 65 20 61 6e  ew *-wal file an
07f0: 64 20 72 65 61 64 20 74 68 65 20 64 61 74 61 62  d read the datab
0800: 61 73 65 20 69 6e 20 77 61 6c 20 6d 6f 64 65 2e  ase in wal mode.
0810: 20 41 74 0a 2a 2a 20 20 20 20 20 74 68 69 73 20   At.**     this 
0820: 70 6f 69 6e 74 20 74 68 65 79 20 73 65 65 20 74  point they see t
0830: 68 65 20 6e 65 77 20 76 65 72 73 69 6f 6e 20 6f  he new version o
0840: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2d  f the database -
0850: 20 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20   including.**   
0860: 20 20 74 68 65 20 75 70 64 61 74 65 73 20 6d 61    the updates ma
0870: 64 65 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  de as part of th
0880: 65 20 52 42 55 20 75 70 64 61 74 65 2e 0a 2a 2a  e RBU update..**
0890: 20 0a 2a 2a 20 20 33 29 20 54 68 65 20 6e 65 77   .**  3) The new
08a0: 20 2a 2d 77 61 6c 20 66 69 6c 65 20 69 73 20 63   *-wal file is c
08b0: 68 65 63 6b 70 6f 69 6e 74 65 64 2e 20 54 68 69  heckpointed. Thi
08c0: 73 20 70 72 6f 63 65 65 64 73 20 69 6e 20 74 68  s proceeds in th
08d0: 65 20 73 61 6d 65 20 77 61 79 20 0a 2a 2a 20 20  e same way .**  
08e0: 20 20 20 61 73 20 61 20 72 65 67 75 6c 61 72 20     as a regular 
08f0: 64 61 74 61 62 61 73 65 20 63 68 65 63 6b 70 6f  database checkpo
0900: 69 6e 74 2c 20 65 78 63 65 70 74 20 74 68 61 74  int, except that
0910: 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20   a single frame 
0920: 69 73 0a 2a 2a 20 20 20 20 20 63 68 65 63 6b 70  is.**     checkp
0930: 6f 69 6e 74 65 64 20 65 61 63 68 20 74 69 6d 65  ointed each time
0940: 20 73 71 6c 69 74 65 33 72 62 75 5f 73 74 65 70   sqlite3rbu_step
0950: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 49 66  () is called. If
0960: 20 74 68 65 20 52 42 55 0a 2a 2a 20 20 20 20 20   the RBU.**     
0970: 68 61 6e 64 6c 65 20 69 73 20 63 6c 6f 73 65 64  handle is closed
0980: 20 62 65 66 6f 72 65 20 74 68 65 20 65 6e 74 69   before the enti
0990: 72 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 69 73  re *-wal file is
09a0: 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2c 0a 2a   checkpointed,.*
09b0: 2a 20 20 20 20 20 74 68 65 20 63 68 65 63 6b 70  *     the checkp
09c0: 6f 69 6e 74 20 70 72 6f 67 72 65 73 73 20 69 73  oint progress is
09d0: 20 73 61 76 65 64 20 69 6e 20 74 68 65 20 52 42   saved in the RB
09e0: 55 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  U database and t
09f0: 68 65 0a 2a 2a 20 20 20 20 20 63 68 65 63 6b 70  he.**     checkp
0a00: 6f 69 6e 74 20 63 61 6e 20 62 65 20 72 65 73 75  oint can be resu
0a10: 6d 65 64 20 62 79 20 61 6e 6f 74 68 65 72 20 52  med by another R
0a20: 42 55 20 63 6c 69 65 6e 74 20 61 74 20 73 6f 6d  BU client at som
0a30: 65 20 70 6f 69 6e 74 20 69 6e 0a 2a 2a 20 20 20  e point in.**   
0a40: 20 20 74 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a    the future..**
0a50: 0a 2a 2a 20 50 4f 54 45 4e 54 49 41 4c 20 50 52  .** POTENTIAL PR
0a60: 4f 42 4c 45 4d 53 0a 2a 2a 20 0a 2a 2a 20 20 54  OBLEMS.** .**  T
0a70: 68 65 20 72 65 6e 61 6d 65 28 29 20 63 61 6c 6c  he rename() call
0a80: 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 70 6f   might not be po
0a90: 72 74 61 62 6c 65 2e 20 41 6e 64 20 52 42 55 20  rtable. And RBU 
0aa0: 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
0ab0: 0a 2a 2a 20 20 73 79 6e 63 69 6e 67 20 74 68 65  .**  syncing the
0ac0: 20 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72   directory after
0ad0: 20 72 65 6e 61 6d 69 6e 67 20 74 68 65 20 66 69   renaming the fi
0ae0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 57 68 65 6e 20  le..**.**  When 
0af0: 73 74 61 74 65 20 69 73 20 73 61 76 65 64 2c 20  state is saved, 
0b00: 61 6e 79 20 63 6f 6d 6d 69 74 20 74 6f 20 74 68  any commit to th
0b10: 65 20 2a 2d 6f 61 6c 20 66 69 6c 65 20 61 6e 64  e *-oal file and
0b20: 20 74 68 65 20 63 6f 6d 6d 69 74 20 74 6f 0a 2a   the commit to.*
0b30: 2a 20 20 74 68 65 20 52 42 55 20 75 70 64 61 74  *  the RBU updat
0b40: 65 20 64 61 74 61 62 61 73 65 20 61 72 65 20 6e  e database are n
0b50: 6f 74 20 61 74 6f 6d 69 63 2e 20 53 6f 20 69 66  ot atomic. So if
0b60: 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73   the power fails
0b70: 20 61 74 20 74 68 65 0a 2a 2a 20 20 77 72 6f 6e   at the.**  wron
0b80: 67 20 6d 6f 6d 65 6e 74 20 74 68 65 79 20 6d 69  g moment they mi
0b90: 67 68 74 20 67 65 74 20 6f 75 74 20 6f 66 20 73  ght get out of s
0ba0: 79 6e 63 2e 20 41 73 20 74 68 65 20 6d 61 69 6e  ync. As the main
0bb0: 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62   database will b
0bc0: 65 0a 2a 2a 20 20 63 6f 6d 6d 69 74 74 65 64 20  e.**  committed 
0bd0: 62 65 66 6f 72 65 20 74 68 65 20 52 42 55 20 75  before the RBU u
0be0: 70 64 61 74 65 20 64 61 74 61 62 61 73 65 20 74  pdate database t
0bf0: 68 69 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  his will likely 
0c00: 65 69 74 68 65 72 20 6a 75 73 74 0a 2a 2a 20 20  either just.**  
0c10: 70 61 73 73 20 75 6e 6e 6f 74 69 63 65 64 2c 20  pass unnoticed, 
0c20: 6f 72 20 72 65 73 75 6c 74 20 69 6e 20 53 51 4c  or result in SQL
0c30: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65  ITE_CONSTRAINT e
0c40: 72 72 6f 72 73 20 28 64 75 65 20 74 6f 20 55 4e  rrors (due to UN
0c50: 49 51 55 45 0a 2a 2a 20 20 63 6f 6e 73 74 72 61  IQUE.**  constra
0c60: 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 29 2e  int violations).
0c70: 0a 2a 2a 0a 2a 2a 20 20 49 66 20 73 6f 6d 65 20  .**.**  If some 
0c80: 63 6c 69 65 6e 74 20 64 6f 65 73 20 6d 6f 64 69  client does modi
0c90: 66 79 20 74 68 65 20 74 61 72 67 65 74 20 64 61  fy the target da
0ca0: 74 61 62 61 73 65 20 6d 69 64 20 52 42 55 20 75  tabase mid RBU u
0cb0: 70 64 61 74 65 2c 20 6f 72 20 73 6f 6d 65 0a 2a  pdate, or some.*
0cc0: 2a 20 20 6f 74 68 65 72 20 65 72 72 6f 72 20 6f  *  other error o
0cd0: 63 63 75 72 73 2c 20 74 68 65 20 52 42 55 20 65  ccurs, the RBU e
0ce0: 78 74 65 6e 73 69 6f 6e 20 77 69 6c 6c 20 6b 65  xtension will ke
0cf0: 65 70 20 74 68 72 6f 77 69 6e 67 20 65 72 72 6f  ep throwing erro
0d00: 72 73 2e 20 49 74 27 73 0a 2a 2a 20 20 6e 6f 74  rs. It's.**  not
0d10: 20 72 65 61 6c 6c 79 20 63 6c 65 61 72 20 68 6f   really clear ho
0d20: 77 20 74 6f 20 67 65 74 20 6f 75 74 20 6f 66 20  w to get out of 
0d30: 74 68 69 73 20 73 74 61 74 65 2e 20 54 68 65 20  this state. The 
0d40: 73 79 73 74 65 6d 20 63 6f 75 6c 64 20 6a 75 73  system could jus
0d50: 74 0a 2a 2a 20 20 62 79 20 64 65 6c 65 74 65 20  t.**  by delete 
0d60: 74 68 65 20 52 42 55 20 75 70 64 61 74 65 20 64  the RBU update d
0d70: 61 74 61 62 61 73 65 20 61 6e 64 20 2a 2d 6f 61  atabase and *-oa
0d80: 6c 20 66 69 6c 65 20 61 6e 64 20 68 61 76 65 20  l file and have 
0d90: 74 68 65 20 64 65 76 69 63 65 0a 2a 2a 20 20 64  the device.**  d
0da0: 6f 77 6e 6c 6f 61 64 20 74 68 65 20 75 70 64 61  ownload the upda
0db0: 74 65 20 61 67 61 69 6e 20 61 6e 64 20 73 74 61  te again and sta
0dc0: 72 74 20 6f 76 65 72 2e 0a 2a 2a 0a 2a 2a 20 20  rt over..**.**  
0dd0: 41 74 20 70 72 65 73 65 6e 74 2c 20 66 6f 72 20  At present, for 
0de0: 61 6e 20 55 50 44 41 54 45 2c 20 62 6f 74 68 20  an UPDATE, both 
0df0: 74 68 65 20 6e 65 77 2e 2a 20 61 6e 64 20 6f 6c  the new.* and ol
0e00: 64 2e 2a 20 72 65 63 6f 72 64 73 20 61 72 65 0a  d.* records are.
0e10: 2a 2a 20 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e  **  collected in
0e20: 20 74 68 65 20 72 62 75 5f 78 79 7a 20 74 61 62   the rbu_xyz tab
0e30: 6c 65 2e 20 41 6e 64 20 66 6f 72 20 62 6f 74 68  le. And for both
0e40: 20 55 50 44 41 54 45 73 20 61 6e 64 20 44 45 4c   UPDATEs and DEL
0e50: 45 54 45 73 20 61 6c 6c 0a 2a 2a 20 20 66 69 65  ETEs all.**  fie
0e60: 6c 64 73 20 61 72 65 20 63 6f 6c 6c 65 63 74 65  lds are collecte
0e70: 64 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20 77  d.  This means w
0e80: 65 27 72 65 20 70 72 6f 62 61 62 6c 79 20 77 72  e're probably wr
0e90: 69 74 69 6e 67 20 61 20 6c 6f 74 20 6d 6f 72 65  iting a lot more
0ea0: 0a 2a 2a 20 20 64 61 74 61 20 74 6f 20 64 69 73  .**  data to dis
0eb0: 6b 20 77 68 65 6e 20 73 61 76 69 6e 67 20 74 68  k when saving th
0ec0: 65 20 73 74 61 74 65 20 6f 66 20 61 6e 20 6f 6e  e state of an on
0ed0: 67 6f 69 6e 67 20 75 70 64 61 74 65 20 74 6f 20  going update to 
0ee0: 74 68 65 20 52 42 55 0a 2a 2a 20 20 75 70 64 61  the RBU.**  upda
0ef0: 74 65 20 64 61 74 61 62 61 73 65 20 74 68 61 6e  te database than
0f00: 20 69 73 20 73 74 72 69 63 74 6c 79 20 6e 65 63   is strictly nec
0f10: 65 73 73 61 72 79 2e 0a 2a 2a 20 0a 2a 2f 0a 0a  essary..** .*/..
0f20: 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74  #include <assert
0f30: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
0f40: 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ring.h>.#include
0f50: 20 3c 73 74 64 69 6f 2e 68 3e 0a 0a 23 69 6e 63   <stdio.h>..#inc
0f60: 6c 75 64 65 20 22 73 71 6c 69 74 65 33 2e 68 22  lude "sqlite3.h"
0f70: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
0f80: 51 4c 49 54 45 5f 43 4f 52 45 29 20 7c 7c 20 64  QLITE_CORE) || d
0f90: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
0fa0: 41 42 4c 45 5f 52 42 55 29 0a 23 69 6e 63 6c 75  ABLE_RBU).#inclu
0fb0: 64 65 20 22 73 71 6c 69 74 65 33 72 62 75 2e 68  de "sqlite3rbu.h
0fc0: 22 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  "..#if defined(_
0fd0: 57 49 4e 33 32 5f 57 43 45 29 0a 23 69 6e 63 6c  WIN32_WCE).#incl
0fe0: 75 64 65 20 22 77 69 6e 64 6f 77 73 2e 68 22 0a  ude "windows.h".
0ff0: 23 65 6e 64 69 66 0a 0a 2f 2a 20 4d 61 78 69 6d  #endif../* Maxim
1000: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 72 65  um number of pre
1010: 70 61 72 65 64 20 55 50 44 41 54 45 20 73 74 61  pared UPDATE sta
1020: 74 65 6d 65 6e 74 73 20 68 65 6c 64 20 62 79 20  tements held by 
1030: 74 68 69 73 20 6d 6f 64 75 6c 65 20 2a 2f 0a 23  this module */.#
1040: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 52 42  define SQLITE_RB
1050: 55 5f 55 50 44 41 54 45 5f 43 41 43 48 45 53 49  U_UPDATE_CACHESI
1060: 5a 45 20 31 36 0a 0a 2f 2a 20 44 65 6c 74 61 20  ZE 16../* Delta 
1070: 63 68 65 63 6b 73 75 6d 73 20 64 69 73 61 62 6c  checksums disabl
1080: 65 64 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20  ed by default.  
1090: 43 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d 44 52  Compile with -DR
10a0: 42 55 5f 45 4e 41 42 4c 45 5f 44 45 4c 54 41 5f  BU_ENABLE_DELTA_
10b0: 43 4b 53 55 4d 0a 2a 2a 20 74 6f 20 65 6e 61 62  CKSUM.** to enab
10c0: 6c 65 20 63 68 65 63 6b 73 75 6d 20 76 65 72 69  le checksum veri
10d0: 66 69 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66  fication..*/.#if
10e0: 6e 64 65 66 20 52 42 55 5f 45 4e 41 42 4c 45 5f  ndef RBU_ENABLE_
10f0: 44 45 4c 54 41 5f 43 4b 53 55 4d 0a 23 20 64 65  DELTA_CKSUM.# de
1100: 66 69 6e 65 20 52 42 55 5f 45 4e 41 42 4c 45 5f  fine RBU_ENABLE_
1110: 44 45 4c 54 41 5f 43 4b 53 55 4d 20 30 0a 23 65  DELTA_CKSUM 0.#e
1120: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70  ndif../*.** Swap
1130: 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66 20   two objects of 
1140: 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f 0a 23 69  type TYPE..*/.#i
1150: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
1160: 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 29 0a  E_AMALGAMATION).
1170: 23 20 64 65 66 69 6e 65 20 53 57 41 50 28 54 59  # define SWAP(TY
1180: 50 45 2c 41 2c 42 29 20 7b 54 59 50 45 20 74 3d  PE,A,B) {TYPE t=
1190: 41 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 23 65  A; A=B; B=t;}.#e
11a0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
11b0: 72 62 75 5f 73 74 61 74 65 20 74 61 62 6c 65 20  rbu_state table 
11c0: 69 73 20 75 73 65 64 20 74 6f 20 73 61 76 65 20  is used to save 
11d0: 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 20 70  the state of a p
11e0: 61 72 74 69 61 6c 6c 79 20 61 70 70 6c 69 65 64  artially applied
11f0: 0a 2a 2a 20 75 70 64 61 74 65 20 73 6f 20 74 68  .** update so th
1200: 61 74 20 69 74 20 63 61 6e 20 62 65 20 72 65 73  at it can be res
1210: 75 6d 65 64 20 6c 61 74 65 72 2e 20 54 68 65 20  umed later. The 
1220: 74 61 62 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f  table consists o
1230: 66 20 69 6e 74 65 67 65 72 0a 2a 2a 20 6b 65 79  f integer.** key
1240: 73 20 6d 61 70 70 65 64 20 74 6f 20 76 61 6c 75  s mapped to valu
1250: 65 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  es as follows:.*
1260: 2a 0a 2a 2a 20 52 42 55 5f 53 54 41 54 45 5f 53  *.** RBU_STATE_S
1270: 54 41 47 45 3a 0a 2a 2a 20 20 20 4d 61 79 20 62  TAGE:.**   May b
1280: 65 20 73 65 74 20 74 6f 20 69 6e 74 65 67 65 72  e set to integer
1290: 20 76 61 6c 75 65 73 20 31 2c 20 32 2c 20 34 20   values 1, 2, 4 
12a0: 6f 72 20 35 2e 20 41 73 20 66 6f 6c 6c 6f 77 73  or 5. As follows
12b0: 3a 0a 2a 2a 20 20 20 20 20 20 20 31 3a 20 74 68  :.**       1: th
12c0: 65 20 2a 2d 72 62 75 20 66 69 6c 65 20 69 73 20  e *-rbu file is 
12d0: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
12e0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a  construction..**
12f0: 20 20 20 20 20 20 20 32 3a 20 74 68 65 20 2a 2d         2: the *-
1300: 72 62 75 20 66 69 6c 65 20 68 61 73 20 62 65 65  rbu file has bee
1310: 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 2c 20 62  n constructed, b
1320: 75 74 20 6e 6f 74 20 79 65 74 20 6d 6f 76 65 64  ut not yet moved
1330: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f   .**          to
1340: 20 74 68 65 20 2a 2d 77 61 6c 20 70 61 74 68 2e   the *-wal path.
1350: 0a 2a 2a 20 20 20 20 20 20 20 34 3a 20 74 68 65  .**       4: the
1360: 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 75   checkpoint is u
1370: 6e 64 65 72 77 61 79 2e 0a 2a 2a 20 20 20 20 20  nderway..**     
1380: 20 20 35 3a 20 74 68 65 20 72 62 75 20 75 70 64    5: the rbu upd
1390: 61 74 65 20 68 61 73 20 62 65 65 6e 20 63 68 65  ate has been che
13a0: 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a  ckpointed..**.**
13b0: 20 52 42 55 5f 53 54 41 54 45 5f 54 42 4c 3a 0a   RBU_STATE_TBL:.
13c0: 2a 2a 20 20 20 4f 6e 6c 79 20 76 61 6c 69 64 20  **   Only valid 
13d0: 69 66 20 53 54 41 47 45 3d 3d 31 2e 20 54 68 65  if STAGE==1. The
13e0: 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65   target database
13f0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
1400: 6c 65 20 0a 2a 2a 20 20 20 63 75 72 72 65 6e 74  le .**   current
1410: 6c 79 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  ly being written
1420: 2e 0a 2a 2a 0a 2a 2a 20 52 42 55 5f 53 54 41 54  ..**.** RBU_STAT
1430: 45 5f 49 44 58 3a 0a 2a 2a 20 20 20 4f 6e 6c 79  E_IDX:.**   Only
1440: 20 76 61 6c 69 64 20 69 66 20 53 54 41 47 45 3d   valid if STAGE=
1450: 3d 31 2e 20 54 68 65 20 74 61 72 67 65 74 20 64  =1. The target d
1460: 61 74 61 62 61 73 65 20 6e 61 6d 65 20 6f 66 20  atabase name of 
1470: 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 20 20  the index .**   
1480: 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
1490: 77 72 69 74 74 65 6e 2c 20 6f 72 20 4e 55 4c 4c  written, or NULL
14a0: 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 61 62   if the main tab
14b0: 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  le is currently 
14c0: 62 65 69 6e 67 0a 2a 2a 20 20 20 75 70 64 61 74  being.**   updat
14d0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 42 55 5f 53 54  ed..**.** RBU_ST
14e0: 41 54 45 5f 52 4f 57 3a 0a 2a 2a 20 20 20 4f 6e  ATE_ROW:.**   On
14f0: 6c 79 20 76 61 6c 69 64 20 69 66 20 53 54 41 47  ly valid if STAG
1500: 45 3d 3d 31 2e 20 4e 75 6d 62 65 72 20 6f 66 20  E==1. Number of 
1510: 72 6f 77 73 20 61 6c 72 65 61 64 79 20 70 72 6f  rows already pro
1520: 63 65 73 73 65 64 20 66 6f 72 20 74 68 65 20 63  cessed for the c
1530: 75 72 72 65 6e 74 0a 2a 2a 20 20 20 74 61 62 6c  urrent.**   tabl
1540: 65 2f 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 52  e/index..**.** R
1550: 42 55 5f 53 54 41 54 45 5f 50 52 4f 47 52 45 53  BU_STATE_PROGRES
1560: 53 3a 0a 2a 2a 20 20 20 54 72 62 75 6c 20 6e 75  S:.**   Trbul nu
1570: 6d 62 65 72 20 6f 66 20 73 71 6c 69 74 65 33 72  mber of sqlite3r
1580: 62 75 5f 73 74 65 70 28 29 20 63 61 6c 6c 73 20  bu_step() calls 
1590: 6d 61 64 65 20 73 6f 20 66 61 72 20 61 73 20 70  made so far as p
15a0: 61 72 74 20 6f 66 20 74 68 69 73 0a 2a 2a 20 20  art of this.**  
15b0: 20 72 62 75 20 75 70 64 61 74 65 2e 0a 2a 2a 0a   rbu update..**.
15c0: 2a 2a 20 52 42 55 5f 53 54 41 54 45 5f 43 4b 50  ** RBU_STATE_CKP
15d0: 54 3a 0a 2a 2a 20 20 20 56 61 6c 69 64 20 69 66  T:.**   Valid if
15e0: 20 53 54 41 47 45 3d 3d 34 2e 20 54 68 65 20 36   STAGE==4. The 6
15f0: 34 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 61  4-bit checksum a
1600: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
1610: 68 65 20 77 61 6c 2d 69 6e 64 65 78 0a 2a 2a 20  he wal-index.** 
1620: 20 20 68 65 61 64 65 72 20 63 72 65 61 74 65 64    header created
1630: 20 62 79 20 72 65 63 6f 76 65 72 69 6e 67 20 74   by recovering t
1640: 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 2e 20 54  he *-wal file. T
1650: 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 64  his is used to d
1660: 65 74 65 63 74 0a 2a 2a 20 20 20 63 61 73 65 73  etect.**   cases
1670: 20 77 68 65 6e 20 61 6e 6f 74 68 65 72 20 63 6c   when another cl
1680: 69 65 6e 74 20 61 70 70 65 6e 64 73 20 66 72 61  ient appends fra
1690: 6d 65 73 20 74 6f 20 74 68 65 20 2a 2d 77 61 6c  mes to the *-wal
16a0: 20 66 69 6c 65 20 69 6e 20 74 68 65 0a 2a 2a 20   file in the.** 
16b0: 20 20 6d 69 64 64 6c 65 20 6f 66 20 61 6e 20 69    middle of an i
16c0: 6e 63 72 65 6d 65 6e 74 61 6c 20 63 68 65 63 6b  ncremental check
16d0: 70 6f 69 6e 74 20 28 61 6e 20 69 6e 63 72 65 6d  point (an increm
16e0: 65 6e 74 61 6c 20 63 68 65 63 6b 70 6f 69 6e 74  ental checkpoint
16f0: 20 63 61 6e 6e 6f 74 0a 2a 2a 20 20 20 62 65 20   cannot.**   be 
1700: 63 6f 6e 74 69 6e 75 65 64 20 69 66 20 74 68 69  continued if thi
1710: 73 20 68 61 70 70 65 6e 73 29 2e 0a 2a 2a 0a 2a  s happens)..**.*
1720: 2a 20 52 42 55 5f 53 54 41 54 45 5f 43 4f 4f 4b  * RBU_STATE_COOK
1730: 49 45 3a 0a 2a 2a 20 20 20 56 61 6c 69 64 20 69  IE:.**   Valid i
1740: 66 20 53 54 41 47 45 3d 3d 31 2e 20 54 68 65 20  f STAGE==1. The 
1750: 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 2d 63  current change-c
1760: 6f 75 6e 74 65 72 20 63 6f 6f 6b 69 65 20 76 61  ounter cookie va
1770: 6c 75 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 20  lue in the .**  
1780: 20 74 61 72 67 65 74 20 64 62 20 66 69 6c 65 2e   target db file.
1790: 0a 2a 2a 0a 2a 2a 20 52 42 55 5f 53 54 41 54 45  .**.** RBU_STATE
17a0: 5f 4f 41 4c 53 5a 3a 0a 2a 2a 20 20 20 56 61 6c  _OALSZ:.**   Val
17b0: 69 64 20 69 66 20 53 54 41 47 45 3d 3d 31 2e 20  id if STAGE==1. 
17c0: 54 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65  The size in byte
17d0: 73 20 6f 66 20 74 68 65 20 2a 2d 6f 61 6c 20 66  s of the *-oal f
17e0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 42 55 5f 53  ile..**.** RBU_S
17f0: 54 41 54 45 5f 44 41 54 41 54 42 4c 3a 0a 2a 2a  TATE_DATATBL:.**
1800: 20 20 20 4f 6e 6c 79 20 76 61 6c 69 64 20 69 66     Only valid if
1810: 20 53 54 41 47 45 3d 3d 31 2e 20 54 68 65 20 52   STAGE==1. The R
1820: 42 55 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  BU database name
1830: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 0a 2a   of the table .*
1840: 2a 20 20 20 63 75 72 72 65 6e 74 6c 79 20 62 65  *   currently be
1850: 69 6e 67 20 72 65 61 64 2e 0a 2a 2f 0a 23 64 65  ing read..*/.#de
1860: 66 69 6e 65 20 52 42 55 5f 53 54 41 54 45 5f 53  fine RBU_STATE_S
1870: 54 41 47 45 20 20 20 20 20 20 20 20 31 0a 23 64  TAGE        1.#d
1880: 65 66 69 6e 65 20 52 42 55 5f 53 54 41 54 45 5f  efine RBU_STATE_
1890: 54 42 4c 20 20 20 20 20 20 20 20 20 20 32 0a 23  TBL          2.#
18a0: 64 65 66 69 6e 65 20 52 42 55 5f 53 54 41 54 45  define RBU_STATE
18b0: 5f 49 44 58 20 20 20 20 20 20 20 20 20 20 33 0a  _IDX          3.
18c0: 23 64 65 66 69 6e 65 20 52 42 55 5f 53 54 41 54  #define RBU_STAT
18d0: 45 5f 52 4f 57 20 20 20 20 20 20 20 20 20 20 34  E_ROW          4
18e0: 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53 54 41  .#define RBU_STA
18f0: 54 45 5f 50 52 4f 47 52 45 53 53 20 20 20 20 20  TE_PROGRESS     
1900: 35 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53 54  5.#define RBU_ST
1910: 41 54 45 5f 43 4b 50 54 20 20 20 20 20 20 20 20  ATE_CKPT        
1920: 20 36 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53   6.#define RBU_S
1930: 54 41 54 45 5f 43 4f 4f 4b 49 45 20 20 20 20 20  TATE_COOKIE     
1940: 20 20 37 0a 23 64 65 66 69 6e 65 20 52 42 55 5f    7.#define RBU_
1950: 53 54 41 54 45 5f 4f 41 4c 53 5a 20 20 20 20 20  STATE_OALSZ     
1960: 20 20 20 38 0a 23 64 65 66 69 6e 65 20 52 42 55     8.#define RBU
1970: 5f 53 54 41 54 45 5f 50 48 41 53 45 4f 4e 45 53  _STATE_PHASEONES
1980: 54 45 50 20 39 0a 23 64 65 66 69 6e 65 20 52 42  TEP 9.#define RB
1990: 55 5f 53 54 41 54 45 5f 44 41 54 41 54 42 4c 20  U_STATE_DATATBL 
19a0: 20 20 20 20 31 30 0a 0a 23 64 65 66 69 6e 65 20      10..#define 
19b0: 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 20 20  RBU_STAGE_OAL   
19c0: 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20        1.#define 
19d0: 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 20 20  RBU_STAGE_MOVE  
19e0: 20 20 20 20 20 20 32 0a 23 64 65 66 69 6e 65 20        2.#define 
19f0: 52 42 55 5f 53 54 41 47 45 5f 43 41 50 54 55 52  RBU_STAGE_CAPTUR
1a00: 45 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20  E     3.#define 
1a10: 52 42 55 5f 53 54 41 47 45 5f 43 4b 50 54 20 20  RBU_STAGE_CKPT  
1a20: 20 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20        4.#define 
1a30: 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45 20 20  RBU_STAGE_DONE  
1a40: 20 20 20 20 20 20 35 0a 0a 0a 23 64 65 66 69 6e        5...#defin
1a50: 65 20 52 42 55 5f 43 52 45 41 54 45 5f 53 54 41  e RBU_CREATE_STA
1a60: 54 45 20 5c 0a 20 20 22 43 52 45 41 54 45 20 54  TE \.  "CREATE T
1a70: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53  ABLE IF NOT EXIS
1a80: 54 53 20 25 73 2e 72 62 75 5f 73 74 61 74 65 28  TS %s.rbu_state(
1a90: 6b 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  k INTEGER PRIMAR
1aa0: 59 20 4b 45 59 2c 20 76 29 22 0a 0a 74 79 70 65  Y KEY, v)"..type
1ab0: 64 65 66 20 73 74 72 75 63 74 20 52 62 75 46 72  def struct RbuFr
1ac0: 61 6d 65 20 52 62 75 46 72 61 6d 65 3b 0a 74 79  ame RbuFrame;.ty
1ad0: 70 65 64 65 66 20 73 74 72 75 63 74 20 52 62 75  pedef struct Rbu
1ae0: 4f 62 6a 49 74 65 72 20 52 62 75 4f 62 6a 49 74  ObjIter RbuObjIt
1af0: 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  er;.typedef stru
1b00: 63 74 20 52 62 75 53 74 61 74 65 20 52 62 75 53  ct RbuState RbuS
1b10: 74 61 74 65 3b 0a 74 79 70 65 64 65 66 20 73 74  tate;.typedef st
1b20: 72 75 63 74 20 72 62 75 5f 76 66 73 20 72 62 75  ruct rbu_vfs rbu
1b30: 5f 76 66 73 3b 0a 74 79 70 65 64 65 66 20 73 74  _vfs;.typedef st
1b40: 72 75 63 74 20 72 62 75 5f 66 69 6c 65 20 72 62  ruct rbu_file rb
1b50: 75 5f 66 69 6c 65 3b 0a 74 79 70 65 64 65 66 20  u_file;.typedef 
1b60: 73 74 72 75 63 74 20 52 62 75 55 70 64 61 74 65  struct RbuUpdate
1b70: 53 74 6d 74 20 52 62 75 55 70 64 61 74 65 53 74  Stmt RbuUpdateSt
1b80: 6d 74 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  mt;..#if !define
1b90: 64 28 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41 4d  d(SQLITE_AMALGAM
1ba0: 41 54 49 4f 4e 29 0a 74 79 70 65 64 65 66 20 75  ATION).typedef u
1bb0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 33 32 3b  nsigned int u32;
1bc0: 0a 74 79 70 65 64 65 66 20 75 6e 73 69 67 6e 65  .typedef unsigne
1bd0: 64 20 73 68 6f 72 74 20 75 31 36 3b 0a 74 79 70  d short u16;.typ
1be0: 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20 63 68  edef unsigned ch
1bf0: 61 72 20 75 38 3b 0a 74 79 70 65 64 65 66 20 73  ar u8;.typedef s
1c00: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 36 34  qlite3_int64 i64
1c10: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
1c20: 54 68 65 73 65 20 76 61 6c 75 65 73 20 6d 75 73  These values mus
1c30: 74 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75  t match the valu
1c40: 65 73 20 64 65 66 69 6e 65 64 20 69 6e 20 77 61  es defined in wa
1c50: 6c 2e 63 20 66 6f 72 20 74 68 65 20 65 71 75 69  l.c for the equi
1c60: 76 61 6c 65 6e 74 0a 2a 2a 20 6c 6f 63 6b 73 2e  valent.** locks.
1c70: 20 54 68 65 73 65 20 61 72 65 20 6e 6f 74 20 6d   These are not m
1c80: 61 67 69 63 20 6e 75 6d 62 65 72 73 20 61 73 20  agic numbers as 
1c90: 74 68 65 79 20 61 72 65 20 70 61 72 74 20 6f 66  they are part of
1ca0: 20 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c 65   the SQLite file
1cb0: 0a 2a 2a 20 66 6f 72 6d 61 74 2e 0a 2a 2f 0a 23  .** format..*/.#
1cc0: 64 65 66 69 6e 65 20 57 41 4c 5f 4c 4f 43 4b 5f  define WAL_LOCK_
1cd0: 57 52 49 54 45 20 20 30 0a 23 64 65 66 69 6e 65  WRITE  0.#define
1ce0: 20 57 41 4c 5f 4c 4f 43 4b 5f 43 4b 50 54 20 20   WAL_LOCK_CKPT  
1cf0: 20 31 0a 23 64 65 66 69 6e 65 20 57 41 4c 5f 4c   1.#define WAL_L
1d00: 4f 43 4b 5f 52 45 41 44 30 20 20 33 0a 0a 23 64  OCK_READ0  3..#d
1d10: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 46 43 4e  efine SQLITE_FCN
1d20: 54 4c 5f 52 42 55 43 4e 54 20 20 20 20 35 31 34  TL_RBUCNT    514
1d30: 39 32 31 36 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74  9216../*.** A st
1d40: 72 75 63 74 75 72 65 20 74 6f 20 73 74 6f 72 65  ructure to store
1d50: 20 76 61 6c 75 65 73 20 72 65 61 64 20 66 72 6f   values read fro
1d60: 6d 20 74 68 65 20 72 62 75 5f 73 74 61 74 65 20  m the rbu_state 
1d70: 74 61 62 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 2e  table in memory.
1d80: 0a 2a 2f 0a 73 74 72 75 63 74 20 52 62 75 53 74  .*/.struct RbuSt
1d90: 61 74 65 20 7b 0a 20 20 69 6e 74 20 65 53 74 61  ate {.  int eSta
1da0: 67 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 62 6c  ge;.  char *zTbl
1db0: 3b 0a 20 20 63 68 61 72 20 2a 7a 44 61 74 61 54  ;.  char *zDataT
1dc0: 62 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 49 64 78  bl;.  char *zIdx
1dd0: 3b 0a 20 20 69 36 34 20 69 57 61 6c 43 6b 73 75  ;.  i64 iWalCksu
1de0: 6d 3b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 0a 20  m;.  int nRow;. 
1df0: 20 69 36 34 20 6e 50 72 6f 67 72 65 73 73 3b 0a   i64 nProgress;.
1e00: 20 20 75 33 32 20 69 43 6f 6f 6b 69 65 3b 0a 20    u32 iCookie;. 
1e10: 20 69 36 34 20 69 4f 61 6c 53 7a 3b 0a 20 20 69   i64 iOalSz;.  i
1e20: 36 34 20 6e 50 68 61 73 65 4f 6e 65 53 74 65 70  64 nPhaseOneStep
1e30: 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 52 62 75  ;.};..struct Rbu
1e40: 55 70 64 61 74 65 53 74 6d 74 20 7b 0a 20 20 63  UpdateStmt {.  c
1e50: 68 61 72 20 2a 7a 4d 61 73 6b 3b 20 20 20 20 20  har *zMask;     
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e70: 2a 20 43 6f 70 79 20 6f 66 20 75 70 64 61 74 65  * Copy of update
1e80: 20 6d 61 73 6b 20 75 73 65 64 20 77 69 74 68 20   mask used with 
1e90: 70 55 70 64 61 74 65 20 2a 2f 0a 20 20 73 71 6c  pUpdate */.  sql
1ea0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 55 70 64 61  ite3_stmt *pUpda
1eb0: 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  te;          /* 
1ec0: 4c 61 73 74 20 75 70 64 61 74 65 20 73 74 61 74  Last update stat
1ed0: 65 6d 65 6e 74 20 28 6f 72 20 4e 55 4c 4c 29 20  ement (or NULL) 
1ee0: 2a 2f 0a 20 20 52 62 75 55 70 64 61 74 65 53 74  */.  RbuUpdateSt
1ef0: 6d 74 20 2a 70 4e 65 78 74 3b 0a 7d 3b 0a 0a 2f  mt *pNext;.};../
1f00: 2a 0a 2a 2a 20 41 6e 20 69 74 65 72 61 74 6f 72  *.** An iterator
1f10: 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 69 73   of this type is
1f20: 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
1f30: 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f 62 6a   through all obj
1f40: 65 63 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20 74  ects in.** the t
1f50: 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20 74  arget database t
1f60: 68 61 74 20 72 65 71 75 69 72 65 20 75 70 64 61  hat require upda
1f70: 74 69 6e 67 2e 20 46 6f 72 20 65 61 63 68 20 73  ting. For each s
1f80: 75 63 68 20 74 61 62 6c 65 2c 20 74 68 65 0a 2a  uch table, the.*
1f90: 2a 20 69 74 65 72 61 74 6f 72 20 76 69 73 69 74  * iterator visit
1fa0: 73 2c 20 69 6e 20 6f 72 64 65 72 3a 0a 2a 2a 0a  s, in order:.**.
1fb0: 2a 2a 20 20 20 20 20 2a 20 74 68 65 20 74 61 62  **     * the tab
1fc0: 6c 65 20 69 74 73 65 6c 66 2c 20 0a 2a 2a 20 20  le itself, .**  
1fd0: 20 20 20 2a 20 65 61 63 68 20 69 6e 64 65 78 20     * each index 
1fe0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 28 7a 65  of the table (ze
1ff0: 72 6f 20 6f 72 20 6d 6f 72 65 20 70 6f 69 6e 74  ro or more point
2000: 73 20 74 6f 20 76 69 73 69 74 29 2c 20 61 6e 64  s to visit), and
2010: 0a 2a 2a 20 20 20 20 20 2a 20 61 20 73 70 65 63  .**     * a spec
2020: 69 61 6c 20 22 63 6c 65 61 6e 75 70 20 74 61 62  ial "cleanup tab
2030: 6c 65 22 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  le" state..**.**
2040: 20 61 62 49 6e 64 65 78 65 64 3a 0a 2a 2a 20 20   abIndexed:.**  
2050: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 68 61   If the table ha
2060: 73 20 6e 6f 20 69 6e 64 65 78 65 73 20 6f 6e 20  s no indexes on 
2070: 69 74 2c 20 61 62 49 6e 64 65 78 65 64 20 69 73  it, abIndexed is
2080: 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 20 4f 74   set to NULL. Ot
2090: 68 65 72 77 69 73 65 2c 0a 2a 2a 20 20 20 69 74  herwise,.**   it
20a0: 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 72   points to an ar
20b0: 72 61 79 20 6f 66 20 66 6c 61 67 73 20 6e 54 62  ray of flags nTb
20c0: 6c 43 6f 6c 20 65 6c 65 6d 65 6e 74 73 20 69 6e  lCol elements in
20d0: 20 73 69 7a 65 2e 20 54 68 65 20 66 6c 61 67 20   size. The flag 
20e0: 69 73 0a 2a 2a 20 20 20 73 65 74 20 66 6f 72 20  is.**   set for 
20f0: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 74 68 61 74  each column that
2100: 20 69 73 20 65 69 74 68 65 72 20 61 20 70 61 72   is either a par
2110: 74 20 6f 66 20 74 68 65 20 50 4b 20 6f 72 20 61  t of the PK or a
2120: 20 70 61 72 74 20 6f 66 20 61 6e 0a 2a 2a 20 20   part of an.**  
2130: 20 69 6e 64 65 78 2e 20 4f 72 20 63 6c 65 61 72   index. Or clear
2140: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a   otherwise..**.*
2150: 2a 20 20 20 49 66 20 74 68 65 72 65 20 61 72 65  *   If there are
2160: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 70 61 72   one or more par
2170: 74 69 61 6c 20 69 6e 64 65 78 65 73 20 6f 6e 20  tial indexes on 
2180: 74 68 65 20 74 61 62 6c 65 2c 20 61 6c 6c 20 66  the table, all f
2190: 69 65 6c 64 73 20 6f 66 0a 2a 2a 20 20 20 74 68  ields of.**   th
21a0: 69 73 20 61 72 72 61 79 20 73 65 74 20 73 65 74  is array set set
21b0: 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73 20 62   to 1. This is b
21c0: 65 63 61 75 73 65 20 69 6e 20 74 68 61 74 20 63  ecause in that c
21d0: 61 73 65 2c 20 74 68 65 20 6d 6f 64 75 6c 65 20  ase, the module 
21e0: 68 61 73 0a 2a 2a 20 20 20 6e 6f 20 77 61 79 20  has.**   no way 
21f0: 74 6f 20 74 65 6c 6c 20 77 68 69 63 68 20 66 69  to tell which fi
2200: 65 6c 64 73 20 77 69 6c 6c 20 62 65 20 72 65 71  elds will be req
2210: 75 69 72 65 64 20 74 6f 20 61 64 64 20 61 6e 64  uired to add and
2220: 20 72 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 0a   remove entries.
2230: 2a 2a 20 20 20 66 72 6f 6d 20 74 68 65 20 70 61  **   from the pa
2240: 72 74 69 61 6c 20 69 6e 64 65 78 65 73 2e 0a 2a  rtial indexes..*
2250: 2a 20 20 20 0a 2a 2f 0a 73 74 72 75 63 74 20 52  *   .*/.struct R
2260: 62 75 4f 62 6a 49 74 65 72 20 7b 0a 20 20 73 71  buObjIter {.  sq
2270: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 54 62 6c  lite3_stmt *pTbl
2280: 49 74 65 72 3b 20 20 20 20 20 20 20 20 20 2f 2a  Iter;         /*
2290: 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   Iterate through
22a0: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 73 71 6c   tables */.  sql
22b0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 64 78 49  ite3_stmt *pIdxI
22c0: 74 65 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ter;         /* 
22d0: 49 6e 64 65 78 20 69 74 65 72 61 74 6f 72 20 2a  Index iterator *
22e0: 2f 0a 20 20 69 6e 74 20 6e 54 62 6c 43 6f 6c 3b  /.  int nTblCol;
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2300: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
2310: 7a 54 62 6c 43 6f 6c 5b 5d 20 61 72 72 61 79 20  zTblCol[] array 
2320: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 54 62  */.  char **azTb
2330: 6c 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  lCol;           
2340: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
2350: 20 75 6e 71 75 6f 74 65 64 20 74 61 72 67 65 74   unquoted target
2360: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
2370: 0a 20 20 63 68 61 72 20 2a 2a 61 7a 54 62 6c 54  .  char **azTblT
2380: 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ype;            
2390: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 74     /* Array of t
23a0: 61 72 67 65 74 20 63 6f 6c 75 6d 6e 20 74 79 70  arget column typ
23b0: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 53  es */.  int *aiS
23c0: 72 63 4f 72 64 65 72 3b 20 20 20 20 20 20 20 20  rcOrder;        
23d0: 20 20 20 20 20 20 20 20 2f 2a 20 73 72 63 20 74          /* src t
23e0: 61 62 6c 65 20 63 6f 6c 20 2d 3e 20 74 61 72 67  able col -> targ
23f0: 65 74 20 74 61 62 6c 65 20 63 6f 6c 20 2a 2f 0a  et table col */.
2400: 20 20 75 38 20 2a 61 62 54 62 6c 50 6b 3b 20 20    u8 *abTblPk;  
2410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2420: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 66 6c    /* Array of fl
2430: 61 67 73 2c 20 73 65 74 20 6f 6e 20 74 61 72 67  ags, set on targ
2440: 65 74 20 50 4b 20 63 6f 6c 75 6d 6e 73 20 2a 2f  et PK columns */
2450: 0a 20 20 75 38 20 2a 61 62 4e 6f 74 4e 75 6c 6c  .  u8 *abNotNull
2460: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2470: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 66     /* Array of f
2480: 6c 61 67 73 2c 20 73 65 74 20 6f 6e 20 4e 4f 54  lags, set on NOT
2490: 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f   NULL columns */
24a0: 0a 20 20 75 38 20 2a 61 62 49 6e 64 65 78 65 64  .  u8 *abIndexed
24b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24c0: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 66     /* Array of f
24d0: 6c 61 67 73 2c 20 73 65 74 20 6f 6e 20 69 6e 64  lags, set on ind
24e0: 65 78 65 64 20 26 20 50 4b 20 63 6f 6c 73 20 2a  exed & PK cols *
24f0: 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 3b 20 20  /.  int eType;  
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2510: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 79 70      /* Table typ
2520: 65 20 2d 20 61 6e 20 52 42 55 5f 50 4b 5f 58 58  e - an RBU_PK_XX
2530: 58 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a  X value */..  /*
2540: 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   Output variable
2550: 73 2e 20 7a 54 62 6c 3d 3d 30 20 69 6d 70 6c 69  s. zTbl==0 impli
2560: 65 73 20 45 4f 46 2e 20 2a 2f 0a 20 20 69 6e 74  es EOF. */.  int
2570: 20 62 43 6c 65 61 6e 75 70 3b 20 20 20 20 20 20   bCleanup;      
2580: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2590: 54 72 75 65 20 69 6e 20 22 63 6c 65 61 6e 75 70  True in "cleanup
25a0: 22 20 73 74 61 74 65 20 2a 2f 0a 20 20 63 6f 6e  " state */.  con
25b0: 73 74 20 63 68 61 72 20 2a 7a 54 62 6c 3b 20 20  st char *zTbl;  
25c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25d0: 4e 61 6d 65 20 6f 66 20 74 61 72 67 65 74 20 64  Name of target d
25e0: 62 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e  b table */.  con
25f0: 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61 54 62  st char *zDataTb
2600: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  l;           /* 
2610: 4e 61 6d 65 20 6f 66 20 72 62 75 20 64 62 20 74  Name of rbu db t
2620: 61 62 6c 65 20 28 6f 72 20 6e 75 6c 6c 29 20 2a  able (or null) *
2630: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2640: 7a 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  zIdx;           
2650: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2660: 61 72 67 65 74 20 64 62 20 69 6e 64 65 78 20 28  arget db index (
2670: 6f 72 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e  or null) */.  in
2680: 74 20 69 54 6e 75 6d 3b 20 20 20 20 20 20 20 20  t iTnum;        
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26a0: 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 63 75   Root page of cu
26b0: 72 72 65 6e 74 20 6f 62 6a 65 63 74 20 2a 2f 0a  rrent object */.
26c0: 20 20 69 6e 74 20 69 50 6b 54 6e 75 6d 3b 20 20    int iPkTnum;  
26d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e0: 20 20 2f 2a 20 49 66 20 65 54 79 70 65 3d 3d 45    /* If eType==E
26f0: 58 54 45 52 4e 41 4c 2c 20 72 6f 6f 74 20 6f 66  XTERNAL, root of
2700: 20 50 4b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69   PK index */.  i
2710: 6e 74 20 62 55 6e 69 71 75 65 3b 20 20 20 20 20  nt bUnique;     
2720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2730: 2a 20 43 75 72 72 65 6e 74 20 69 6e 64 65 78 20  * Current index 
2740: 69 73 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 69  is unique */.  i
2750: 6e 74 20 6e 49 6e 64 65 78 3b 20 20 20 20 20 20  nt nIndex;      
2760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2770: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 75 78 2e  * Number of aux.
2780: 20 69 6e 64 65 78 65 73 20 6f 6e 20 74 61 62 6c   indexes on tabl
2790: 65 20 7a 54 62 6c 20 2a 2f 0a 0a 20 20 2f 2a 20  e zTbl */..  /* 
27a0: 53 74 61 74 65 6d 65 6e 74 73 20 63 72 65 61 74  Statements creat
27b0: 65 64 20 62 79 20 72 62 75 4f 62 6a 49 74 65 72  ed by rbuObjIter
27c0: 50 72 65 70 61 72 65 41 6c 6c 28 29 20 2a 2f 0a  PrepareAll() */.
27d0: 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
27e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
2800: 6f 6c 75 6d 6e 73 20 69 6e 20 63 75 72 72 65 6e  olumns in curren
2810: 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71  t object */.  sq
2820: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 65 6c  lite3_stmt *pSel
2830: 65 63 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ect;          /*
2840: 20 53 6f 75 72 63 65 20 64 61 74 61 20 2a 2f 0a   Source data */.
2850: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
2860: 70 49 6e 73 65 72 74 3b 20 20 20 20 20 20 20 20  pInsert;        
2870: 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 66    /* Statement f
2880: 6f 72 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74  or INSERT operat
2890: 69 6f 6e 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ions */.  sqlite
28a0: 33 5f 73 74 6d 74 20 2a 70 44 65 6c 65 74 65 3b  3_stmt *pDelete;
28b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
28c0: 74 65 6d 65 6e 74 20 66 6f 72 20 44 45 4c 45 54  tement for DELET
28d0: 45 20 6f 70 73 20 2a 2f 0a 20 20 73 71 6c 69 74  E ops */.  sqlit
28e0: 65 33 5f 73 74 6d 74 20 2a 70 54 6d 70 49 6e 73  e3_stmt *pTmpIns
28f0: 65 72 74 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e  ert;       /* In
2900: 73 65 72 74 20 69 6e 74 6f 20 72 62 75 5f 74 6d  sert into rbu_tm
2910: 70 5f 24 7a 44 61 74 61 54 62 6c 20 2a 2f 0a 0a  p_$zDataTbl */..
2920: 20 20 2f 2a 20 4c 61 73 74 20 55 50 44 41 54 45    /* Last UPDATE
2930: 20 75 73 65 64 20 28 66 6f 72 20 50 4b 20 62 2d   used (for PK b-
2940: 74 72 65 65 20 75 70 64 61 74 65 73 20 6f 6e 6c  tree updates onl
2950: 79 29 2c 20 6f 72 20 4e 55 4c 4c 2e 20 2a 2f 0a  y), or NULL. */.
2960: 20 20 52 62 75 55 70 64 61 74 65 53 74 6d 74 20    RbuUpdateStmt 
2970: 2a 70 52 62 75 55 70 64 61 74 65 3b 0a 7d 3b 0a  *pRbuUpdate;.};.
2980: 0a 2f 2a 0a 2a 2a 20 56 61 6c 75 65 73 20 66 6f  ./*.** Values fo
2990: 72 20 52 62 75 4f 62 6a 49 74 65 72 2e 65 54 79  r RbuObjIter.eTy
29a0: 70 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20 30 3a 20  pe.**.**     0: 
29b0: 54 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65  Table does not e
29c0: 78 69 73 74 20 28 65 72 72 6f 72 29 0a 2a 2a 20  xist (error).** 
29d0: 20 20 20 20 31 3a 20 54 61 62 6c 65 20 68 61 73      1: Table has
29e0: 20 61 6e 20 69 6d 70 6c 69 63 69 74 20 72 6f 77   an implicit row
29f0: 69 64 2e 0a 2a 2a 20 20 20 20 20 32 3a 20 54 61  id..**     2: Ta
2a00: 62 6c 65 20 68 61 73 20 61 6e 20 65 78 70 6c 69  ble has an expli
2a10: 63 69 74 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e 0a  cit IPK column..
2a20: 2a 2a 20 20 20 20 20 33 3a 20 54 61 62 6c 65 20  **     3: Table 
2a30: 68 61 73 20 61 6e 20 65 78 74 65 72 6e 61 6c 20  has an external 
2a40: 50 4b 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 20  PK index..**    
2a50: 20 34 3a 20 54 61 62 6c 65 20 69 73 20 57 49 54   4: Table is WIT
2a60: 48 4f 55 54 20 52 4f 57 49 44 2e 0a 2a 2a 20 20  HOUT ROWID..**  
2a70: 20 20 20 35 3a 20 54 61 62 6c 65 20 69 73 20 61     5: Table is a
2a80: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
2a90: 2a 2f 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 50  */.#define RBU_P
2aa0: 4b 5f 4e 4f 54 41 42 4c 45 20 20 20 20 20 20 20  K_NOTABLE       
2ab0: 20 30 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 50   0.#define RBU_P
2ac0: 4b 5f 4e 4f 4e 45 20 20 20 20 20 20 20 20 20 20  K_NONE          
2ad0: 20 31 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 50   1.#define RBU_P
2ae0: 4b 5f 49 50 4b 20 20 20 20 20 20 20 20 20 20 20  K_IPK           
2af0: 20 32 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 50   2.#define RBU_P
2b00: 4b 5f 45 58 54 45 52 4e 41 4c 20 20 20 20 20 20  K_EXTERNAL      
2b10: 20 33 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 50   3.#define RBU_P
2b20: 4b 5f 57 49 54 48 4f 55 54 5f 52 4f 57 49 44 20  K_WITHOUT_ROWID 
2b30: 20 34 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 50   4.#define RBU_P
2b40: 4b 5f 56 54 41 42 20 20 20 20 20 20 20 20 20 20  K_VTAB          
2b50: 20 35 0a 0a 0a 2f 2a 0a 2a 2a 20 57 69 74 68 69   5.../*.** Withi
2b60: 6e 20 74 68 65 20 52 42 55 5f 53 54 41 47 45 5f  n the RBU_STAGE_
2b70: 4f 41 4c 20 73 74 61 67 65 2c 20 65 61 63 68 20  OAL stage, each 
2b80: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 72  call to sqlite3r
2b90: 62 75 5f 73 74 65 70 28 29 20 70 65 72 66 6f 72  bu_step() perfor
2ba0: 6d 73 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65  ms.** one of the
2bb0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61   following opera
2bc0: 74 69 6f 6e 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  tions..*/.#defin
2bd0: 65 20 52 42 55 5f 49 4e 53 45 52 54 20 20 20 20  e RBU_INSERT    
2be0: 20 31 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49   1          /* I
2bf0: 6e 73 65 72 74 20 6f 6e 20 61 20 6d 61 69 6e 20  nsert on a main 
2c00: 74 61 62 6c 65 20 62 2d 74 72 65 65 20 2a 2f 0a  table b-tree */.
2c10: 23 64 65 66 69 6e 65 20 52 42 55 5f 44 45 4c 45  #define RBU_DELE
2c20: 54 45 20 20 20 20 20 32 20 20 20 20 20 20 20 20  TE     2        
2c30: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 20 72 6f    /* Delete a ro
2c40: 77 20 66 72 6f 6d 20 61 20 6d 61 69 6e 20 74 61  w from a main ta
2c50: 62 6c 65 20 62 2d 74 72 65 65 20 2a 2f 0a 23 64  ble b-tree */.#d
2c60: 65 66 69 6e 65 20 52 42 55 5f 52 45 50 4c 41 43  efine RBU_REPLAC
2c70: 45 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20  E    3          
2c80: 2f 2a 20 44 65 6c 65 74 65 20 61 6e 64 20 74 68  /* Delete and th
2c90: 65 6e 20 69 6e 73 65 72 74 20 61 20 72 6f 77 20  en insert a row 
2ca0: 2a 2f 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 49  */.#define RBU_I
2cb0: 44 58 5f 44 45 4c 45 54 45 20 34 20 20 20 20 20  DX_DELETE 4     
2cc0: 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 61       /* Delete a
2cd0: 20 72 6f 77 20 66 72 6f 6d 20 61 6e 20 61 75 78   row from an aux
2ce0: 2e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 2a  . index b-tree *
2cf0: 2f 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 49 44  /.#define RBU_ID
2d00: 58 5f 49 4e 53 45 52 54 20 35 20 20 20 20 20 20  X_INSERT 5      
2d10: 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 6f 6e      /* Insert on
2d20: 20 61 6e 20 61 75 78 2e 20 69 6e 64 65 78 20 62   an aux. index b
2d30: 2d 74 72 65 65 20 2a 2f 0a 0a 23 64 65 66 69 6e  -tree */..#defin
2d40: 65 20 52 42 55 5f 55 50 44 41 54 45 20 20 20 20  e RBU_UPDATE    
2d50: 20 36 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55   6          /* U
2d60: 70 64 61 74 65 20 61 20 72 6f 77 20 69 6e 20 61  pdate a row in a
2d70: 20 6d 61 69 6e 20 74 61 62 6c 65 20 62 2d 74 72   main table b-tr
2d80: 65 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 20 73  ee */../*.** A s
2d90: 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e  ingle step of an
2da0: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 63 68 65   incremental che
2db0: 63 6b 70 6f 69 6e 74 20 2d 20 66 72 61 6d 65 20  ckpoint - frame 
2dc0: 69 57 61 6c 46 72 61 6d 65 20 6f 66 20 74 68 65  iWalFrame of the
2dd0: 20 77 61 6c 0a 2a 2a 20 66 69 6c 65 20 73 68 6f   wal.** file sho
2de0: 75 6c 64 20 62 65 20 63 6f 70 69 65 64 20 74 6f  uld be copied to
2df0: 20 70 61 67 65 20 69 44 62 50 61 67 65 20 6f 66   page iDbPage of
2e00: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2e10: 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 52 62  le..*/.struct Rb
2e20: 75 46 72 61 6d 65 20 7b 0a 20 20 75 33 32 20 69  uFrame {.  u32 i
2e30: 44 62 50 61 67 65 3b 0a 20 20 75 33 32 20 69 57  DbPage;.  u32 iW
2e40: 61 6c 46 72 61 6d 65 3b 0a 7d 3b 0a 0a 2f 2a 0a  alFrame;.};../*.
2e50: 2a 2a 20 52 42 55 20 68 61 6e 64 6c 65 2e 0a 2a  ** RBU handle..*
2e60: 2a 0a 2a 2a 20 6e 50 68 61 73 65 4f 6e 65 53 74  *.** nPhaseOneSt
2e70: 65 70 3a 0a 2a 2a 20 20 20 49 66 20 74 68 65 20  ep:.**   If the 
2e80: 52 42 55 20 64 61 74 61 62 61 73 65 20 63 6f 6e  RBU database con
2e90: 74 61 69 6e 73 20 61 6e 20 72 62 75 5f 63 6f 75  tains an rbu_cou
2ea0: 6e 74 20 74 61 62 6c 65 2c 20 74 68 69 73 20 76  nt table, this v
2eb0: 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f 0a 2a  alue is set to.*
2ec0: 2a 20 20 20 61 20 72 75 6e 6e 69 6e 67 20 65 73  *   a running es
2ed0: 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75  timate of the nu
2ee0: 6d 62 65 72 20 6f 66 20 62 2d 74 72 65 65 20 6f  mber of b-tree o
2ef0: 70 65 72 61 74 69 6f 6e 73 20 72 65 71 75 69 72  perations requir
2f00: 65 64 20 74 6f 20 0a 2a 2a 20 20 20 66 69 6e 69  ed to .**   fini
2f10: 73 68 20 70 6f 70 75 6c 61 74 69 6e 67 20 74 68  sh populating th
2f20: 65 20 2a 2d 6f 61 6c 20 66 69 6c 65 2e 20 54 68  e *-oal file. Th
2f30: 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 73 71  is allows the sq
2f40: 6c 69 74 65 33 5f 62 70 5f 70 72 6f 67 72 65 73  lite3_bp_progres
2f50: 73 28 29 0a 2a 2a 20 20 20 41 50 49 20 74 6f 20  s().**   API to 
2f60: 63 61 6c 63 75 6c 61 74 65 20 74 68 65 20 70 65  calculate the pe
2f70: 72 6d 79 72 69 61 64 61 67 65 20 70 72 6f 67 72  rmyriadage progr
2f80: 65 73 73 20 6f 66 20 70 6f 70 75 6c 61 74 69 6e  ess of populatin
2f90: 67 20 74 68 65 20 2a 2d 6f 61 6c 20 66 69 6c 65  g the *-oal file
2fa0: 0a 2a 2a 20 20 20 75 73 69 6e 67 20 74 68 65 20  .**   using the 
2fb0: 66 6f 72 6d 75 6c 61 3a 0a 2a 2a 0a 2a 2a 20 20  formula:.**.**  
2fc0: 20 20 20 70 65 72 6d 79 72 69 61 64 61 67 65 20     permyriadage 
2fd0: 3d 20 28 31 30 30 30 30 20 2a 20 6e 50 72 6f 67  = (10000 * nProg
2fe0: 72 65 73 73 29 20 2f 20 6e 50 68 61 73 65 4f 6e  ress) / nPhaseOn
2ff0: 65 53 74 65 70 0a 2a 2a 0a 2a 2a 20 20 20 6e 50  eStep.**.**   nP
3000: 68 61 73 65 4f 6e 65 53 74 65 70 20 69 73 20 69  haseOneStep is i
3010: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 74 68  nitialized to th
3020: 65 20 73 75 6d 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20  e sum of:.**.** 
3030: 20 20 20 20 6e 52 6f 77 20 2a 20 28 6e 49 6e 64      nRow * (nInd
3040: 65 78 20 2b 20 31 29 0a 2a 2a 0a 2a 2a 20 20 20  ex + 1).**.**   
3050: 66 6f 72 20 61 6c 6c 20 73 6f 75 72 63 65 20 74  for all source t
3060: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 52 42 55  ables in the RBU
3070: 20 64 61 74 61 62 61 73 65 2c 20 77 68 65 72 65   database, where
3080: 20 6e 52 6f 77 20 69 73 20 74 68 65 20 6e 75 6d   nRow is the num
3090: 62 65 72 0a 2a 2a 20 20 20 6f 66 20 72 6f 77 73  ber.**   of rows
30a0: 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65 20 74   in the source t
30b0: 61 62 6c 65 20 61 6e 64 20 6e 49 6e 64 65 78 20  able and nIndex 
30c0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  the number of in
30d0: 64 65 78 65 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  dexes on the.** 
30e0: 20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20    corresponding 
30f0: 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20  target database 
3100: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 54  table..**.**   T
3110: 68 69 73 20 65 73 74 69 6d 61 74 65 20 69 73 20  his estimate is 
3120: 61 63 63 75 72 61 74 65 20 69 66 20 74 68 65 20  accurate if the 
3130: 52 42 55 20 75 70 64 61 74 65 20 63 6f 6e 73 69  RBU update consi
3140: 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 0a  sts entirely of.
3150: 2a 2a 20 20 20 49 4e 53 45 52 54 20 6f 70 65 72  **   INSERT oper
3160: 61 74 69 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c  ations. However,
3170: 20 69 74 20 69 73 20 69 6e 61 63 63 75 72 61 74   it is inaccurat
3180: 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  e if:.**.**     
3190: 2a 20 74 68 65 20 52 42 55 20 75 70 64 61 74 65  * the RBU update
31a0: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 55 50   contains any UP
31b0: 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e  DATE operations.
31c0: 20 49 66 20 74 68 65 20 50 4b 20 73 70 65 63 69   If the PK speci
31d0: 66 69 65 64 0a 2a 2a 20 20 20 20 20 20 20 66 6f  fied.**       fo
31e0: 72 20 61 6e 20 55 50 44 41 54 45 20 6f 70 65 72  r an UPDATE oper
31f0: 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65  ation does not e
3200: 78 69 73 74 20 69 6e 20 74 68 65 20 74 61 72 67  xist in the targ
3210: 65 74 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a  et table, then.*
3220: 2a 20 20 20 20 20 20 20 6e 6f 20 62 2d 74 72 65  *       no b-tre
3230: 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65  e operations are
3240: 20 72 65 71 75 69 72 65 64 20 6f 6e 20 69 6e 64   required on ind
3250: 65 78 20 62 2d 74 72 65 65 73 2e 20 4f 72 20 69  ex b-trees. Or i
3260: 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20  f the .**       
3270: 73 70 65 63 69 66 69 65 64 20 50 4b 20 64 6f 65  specified PK doe
3280: 73 20 65 78 69 73 74 2c 20 74 68 65 6e 20 28 6e  s exist, then (n
3290: 49 6e 64 65 78 2a 32 29 20 73 75 63 68 20 6f 70  Index*2) such op
32a0: 65 72 61 74 69 6f 6e 73 20 61 72 65 0a 2a 2a 20  erations are.** 
32b0: 20 20 20 20 20 20 72 65 71 75 69 72 65 64 20 28        required (
32c0: 6f 6e 65 20 64 65 6c 65 74 65 20 61 6e 64 20 6f  one delete and o
32d0: 6e 65 20 69 6e 73 65 72 74 20 6f 6e 20 65 61 63  ne insert on eac
32e0: 68 20 69 6e 64 65 78 20 62 2d 74 72 65 65 29 2e  h index b-tree).
32f0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 74 68 65  .**.**     * the
3300: 20 52 42 55 20 75 70 64 61 74 65 20 63 6f 6e 74   RBU update cont
3310: 61 69 6e 73 20 61 6e 79 20 44 45 4c 45 54 45 20  ains any DELETE 
3320: 6f 70 65 72 61 74 69 6f 6e 73 20 66 6f 72 20 77  operations for w
3330: 68 69 63 68 20 74 68 65 20 73 70 65 63 69 66 69  hich the specifi
3340: 65 64 0a 2a 2a 20 20 20 20 20 20 20 50 4b 20 64  ed.**       PK d
3350: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 49  oes not exist. I
3360: 6e 20 74 68 69 73 20 63 61 73 65 20 6e 6f 20 6f  n this case no o
3370: 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20 72 65  perations are re
3380: 71 75 69 72 65 64 20 6f 6e 20 69 6e 64 65 78 0a  quired on index.
3390: 2a 2a 20 20 20 20 20 20 20 62 2d 74 72 65 65 73  **       b-trees
33a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 74 68  ..**.**     * th
33b0: 65 20 52 42 55 20 75 70 64 61 74 65 20 63 6f 6e  e RBU update con
33c0: 74 61 69 6e 73 20 52 45 50 4c 41 43 45 20 6f 70  tains REPLACE op
33d0: 65 72 61 74 69 6f 6e 73 2e 20 54 68 65 73 65 20  erations. These 
33e0: 61 72 65 20 73 69 6d 69 6c 61 72 20 74 6f 0a 2a  are similar to.*
33f0: 2a 20 20 20 20 20 20 20 55 50 44 41 54 45 20 6f  *       UPDATE o
3400: 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  perations..**.**
3410: 20 20 20 6e 50 68 61 73 65 4f 6e 65 53 74 65 70     nPhaseOneStep
3420: 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 61   is updated to a
3430: 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 63  ccount for the c
3440: 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20  onditions above 
3450: 64 75 72 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20  during the.**   
3460: 66 69 72 73 74 20 70 61 73 73 20 6f 66 20 65 61  first pass of ea
3470: 63 68 20 73 6f 75 72 63 65 20 74 61 62 6c 65 2e  ch source table.
3480: 20 54 68 65 20 75 70 64 61 74 65 64 20 6e 50 68   The updated nPh
3490: 61 73 65 4f 6e 65 53 74 65 70 20 76 61 6c 75 65  aseOneStep value
34a0: 20 69 73 0a 2a 2a 20 20 20 73 74 6f 72 65 64 20   is.**   stored 
34b0: 69 6e 20 74 68 65 20 72 62 75 5f 73 74 61 74 65  in the rbu_state
34c0: 20 74 61 62 6c 65 20 69 66 20 74 68 65 20 52 42   table if the RB
34d0: 55 20 75 70 64 61 74 65 20 69 73 20 73 75 73 70  U update is susp
34e0: 65 6e 64 65 64 2e 0a 2a 2f 0a 73 74 72 75 63 74  ended..*/.struct
34f0: 20 73 71 6c 69 74 65 33 72 62 75 20 7b 0a 20 20   sqlite3rbu {.  
3500: 69 6e 74 20 65 53 74 61 67 65 3b 20 20 20 20 20  int eStage;     
3510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3520: 2f 2a 20 56 61 6c 75 65 20 6f 66 20 52 42 55 5f  /* Value of RBU_
3530: 53 54 41 54 45 5f 53 54 41 47 45 20 66 69 65 6c  STATE_STAGE fiel
3540: 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  d */.  sqlite3 *
3550: 64 62 4d 61 69 6e 3b 20 20 20 20 20 20 20 20 20  dbMain;         
3560: 20 20 20 20 20 20 20 2f 2a 20 74 61 72 67 65 74         /* target
3570: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
3580: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
3590: 62 52 62 75 3b 20 20 20 20 20 20 20 20 20 20 20  bRbu;           
35a0: 20 20 20 20 20 20 2f 2a 20 72 62 75 20 64 61 74        /* rbu dat
35b0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
35c0: 20 20 63 68 61 72 20 2a 7a 54 61 72 67 65 74 3b    char *zTarget;
35d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35e0: 20 20 2f 2a 20 50 61 74 68 20 74 6f 20 74 61 72    /* Path to tar
35f0: 67 65 74 20 64 62 20 2a 2f 0a 20 20 63 68 61 72  get db */.  char
3600: 20 2a 7a 52 62 75 3b 20 20 20 20 20 20 20 20 20   *zRbu;         
3610: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
3620: 61 74 68 20 74 6f 20 72 62 75 20 64 62 20 2a 2f  ath to rbu db */
3630: 0a 20 20 63 68 61 72 20 2a 7a 53 74 61 74 65 3b  .  char *zState;
3640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3650: 20 20 20 2f 2a 20 50 61 74 68 20 74 6f 20 73 74     /* Path to st
3660: 61 74 65 20 64 62 20 28 6f 72 20 4e 55 4c 4c 20  ate db (or NULL 
3670: 69 66 20 7a 52 62 75 29 20 2a 2f 0a 20 20 63 68  if zRbu) */.  ch
3680: 61 72 20 7a 53 74 61 74 65 44 62 5b 35 5d 3b 20  ar zStateDb[5]; 
3690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36a0: 20 44 62 20 6e 61 6d 65 20 66 6f 72 20 73 74 61   Db name for sta
36b0: 74 65 20 28 22 73 74 61 74 22 20 6f 72 20 22 6d  te ("stat" or "m
36c0: 61 69 6e 22 29 20 2a 2f 0a 20 20 69 6e 74 20 72  ain") */.  int r
36d0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
36e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
36f0: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
3700: 6c 61 73 74 20 72 62 75 5f 73 74 65 70 28 29 20  last rbu_step() 
3710: 63 61 6c 6c 20 2a 2f 0a 20 20 63 68 61 72 20 2a  call */.  char *
3720: 7a 45 72 72 6d 73 67 3b 20 20 20 20 20 20 20 20  zErrmsg;        
3730: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72            /* Err
3740: 6f 72 20 6d 65 73 73 61 67 65 20 69 66 20 72 63  or message if rc
3750: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 2a 2f 0a 20  !=SQLITE_OK */. 
3760: 20 69 6e 74 20 6e 53 74 65 70 3b 20 20 20 20 20   int nStep;     
3770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3780: 20 2f 2a 20 52 6f 77 73 20 70 72 6f 63 65 73 73   /* Rows process
3790: 65 64 20 66 6f 72 20 63 75 72 72 65 6e 74 20 6f  ed for current o
37a0: 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  bject */.  int n
37b0: 50 72 6f 67 72 65 73 73 3b 20 20 20 20 20 20 20  Progress;       
37c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
37d0: 77 73 20 70 72 6f 63 65 73 73 65 64 20 66 6f 72  ws processed for
37e0: 20 61 6c 6c 20 6f 62 6a 65 63 74 73 20 2a 2f 0a   all objects */.
37f0: 20 20 52 62 75 4f 62 6a 49 74 65 72 20 6f 62 6a    RbuObjIter obj
3800: 69 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  iter;           
3810: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f    /* Iterator fo
3820: 72 20 73 6b 69 70 70 69 6e 67 20 74 68 72 6f 75  r skipping throu
3830: 67 68 20 74 62 6c 2f 69 64 78 20 2a 2f 0a 20 20  gh tbl/idx */.  
3840: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73  const char *zVfs
3850: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
3860: 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 75 74 6f 6d  /* Name of autom
3870: 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64  atically created
3880: 20 72 62 75 20 76 66 73 20 2a 2f 0a 20 20 72 62   rbu vfs */.  rb
3890: 75 5f 66 69 6c 65 20 2a 70 54 61 72 67 65 74 46  u_file *pTargetF
38a0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d;            /*
38b0: 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 6f 70 65   File handle ope
38c0: 6e 20 6f 6e 20 74 61 72 67 65 74 20 64 62 20 2a  n on target db *
38d0: 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 50 65 72  /.  int nPagePer
38e0: 53 65 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20  Sector;         
38f0: 20 20 20 20 2f 2a 20 50 61 67 65 73 20 70 65 72      /* Pages per
3900: 20 73 65 63 74 6f 72 20 66 6f 72 20 70 54 61 72   sector for pTar
3910: 67 65 74 46 64 20 2a 2f 0a 20 20 69 36 34 20 69  getFd */.  i64 i
3920: 4f 61 6c 53 7a 3b 0a 20 20 69 36 34 20 6e 50 68  OalSz;.  i64 nPh
3930: 61 73 65 4f 6e 65 53 74 65 70 3b 0a 0a 20 20 2f  aseOneStep;..  /
3940: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
3950: 73 74 61 74 65 20 76 61 72 69 61 62 6c 65 73 20  state variables 
3960: 61 72 65 20 75 73 65 64 20 61 73 20 70 61 72 74  are used as part
3970: 20 6f 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e   of the incremen
3980: 74 61 6c 0a 20 20 2a 2a 20 63 68 65 63 6b 70 6f  tal.  ** checkpo
3990: 69 6e 74 20 73 74 61 67 65 20 28 65 53 74 61 67  int stage (eStag
39a0: 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 43 4b 50  e==RBU_STAGE_CKP
39b0: 54 29 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  T). See comments
39c0: 20 73 75 72 72 6f 75 6e 64 69 6e 67 0a 20 20 2a   surrounding.  *
39d0: 2a 20 66 75 6e 63 74 69 6f 6e 20 72 62 75 53 65  * function rbuSe
39e0: 74 75 70 43 68 65 63 6b 70 6f 69 6e 74 28 29 20  tupCheckpoint() 
39f0: 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 20 2a 2f  for details.  */
3a00: 0a 20 20 75 33 32 20 69 4d 61 78 46 72 61 6d 65  .  u32 iMaxFrame
3a10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3a20: 20 20 20 2f 2a 20 4c 61 72 67 65 73 74 20 69 57     /* Largest iW
3a30: 61 6c 46 72 61 6d 65 20 76 61 6c 75 65 20 69 6e  alFrame value in
3a40: 20 61 46 72 61 6d 65 5b 5d 20 2a 2f 0a 20 20 75   aFrame[] */.  u
3a50: 33 32 20 6d 4c 6f 63 6b 3b 0a 20 20 69 6e 74 20  32 mLock;.  int 
3a60: 6e 46 72 61 6d 65 3b 20 20 20 20 20 20 20 20 20  nFrame;         
3a70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
3a80: 6e 74 72 69 65 73 20 69 6e 20 61 46 72 61 6d 65  ntries in aFrame
3a90: 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e  [] array */.  in
3aa0: 74 20 6e 46 72 61 6d 65 41 6c 6c 6f 63 3b 20 20  t nFrameAlloc;  
3ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3ac0: 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20   Allocated size 
3ad0: 6f 66 20 61 46 72 61 6d 65 5b 5d 20 61 72 72 61  of aFrame[] arra
3ae0: 79 20 2a 2f 0a 20 20 52 62 75 46 72 61 6d 65 20  y */.  RbuFrame 
3af0: 2a 61 46 72 61 6d 65 3b 0a 20 20 69 6e 74 20 70  *aFrame;.  int p
3b00: 67 73 7a 3b 0a 20 20 75 38 20 2a 61 42 75 66 3b  gsz;.  u8 *aBuf;
3b10: 0a 20 20 69 36 34 20 69 57 61 6c 43 6b 73 75 6d  .  i64 iWalCksum
3b20: 3b 0a 20 20 69 36 34 20 73 7a 54 65 6d 70 3b 20  ;.  i64 szTemp; 
3b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b40: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73      /* Current s
3b50: 69 7a 65 20 6f 66 20 61 6c 6c 20 74 65 6d 70 20  ize of all temp 
3b60: 66 69 6c 65 73 20 69 6e 20 75 73 65 20 2a 2f 0a  files in use */.
3b70: 20 20 69 36 34 20 73 7a 54 65 6d 70 4c 69 6d 69    i64 szTempLimi
3b80: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
3b90: 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
3ba0: 6c 69 6d 69 74 20 66 6f 72 20 74 65 6d 70 20 66  limit for temp f
3bb0: 69 6c 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 55 73  iles */..  /* Us
3bc0: 65 64 20 69 6e 20 52 42 55 20 76 61 63 75 75 6d  ed in RBU vacuum
3bd0: 20 6d 6f 64 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20   mode only */.  
3be0: 69 6e 74 20 6e 52 62 75 3b 20 20 20 20 20 20 20  int nRbu;       
3bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c00: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 42 55  /* Number of RBU
3c10: 20 56 46 53 20 69 6e 20 74 68 65 20 73 74 61 63   VFS in the stac
3c20: 6b 20 2a 2f 0a 20 20 72 62 75 5f 66 69 6c 65 20  k */.  rbu_file 
3c30: 2a 70 52 62 75 46 64 3b 20 20 20 20 20 20 20 20  *pRbuFd;        
3c40: 20 20 20 20 20 20 20 2f 2a 20 46 64 20 66 6f 72         /* Fd for
3c50: 20 6d 61 69 6e 20 64 62 20 6f 66 20 64 62 52 62   main db of dbRb
3c60: 75 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  u */.};../*.** A
3c70: 6e 20 72 62 75 20 56 46 53 20 69 73 20 69 6d 70  n rbu VFS is imp
3c80: 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 61  lemented using a
3c90: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
3ca0: 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  is structure..**
3cb0: 0a 2a 2a 20 56 61 72 69 61 62 6c 65 20 70 52 62  .** Variable pRb
3cc0: 75 20 69 73 20 6f 6e 6c 79 20 6e 6f 6e 2d 4e 55  u is only non-NU
3cd0: 4c 4c 20 66 6f 72 20 61 75 74 6f 6d 61 74 69 63  LL for automatic
3ce0: 61 6c 6c 79 20 63 72 65 61 74 65 64 20 52 42 55  ally created RBU
3cf0: 20 56 46 53 20 6f 62 6a 65 63 74 73 2e 0a 2a 2a   VFS objects..**
3d00: 20 49 74 20 69 73 20 4e 55 4c 4c 20 66 6f 72 20   It is NULL for 
3d10: 52 42 55 20 56 46 53 20 6f 62 6a 65 63 74 73 20  RBU VFS objects 
3d20: 63 72 65 61 74 65 64 20 65 78 70 6c 69 63 69 74  created explicit
3d30: 6c 79 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69  ly using.** sqli
3d40: 74 65 33 72 62 75 5f 63 72 65 61 74 65 5f 76 66  te3rbu_create_vf
3d50: 73 28 29 2e 20 49 74 20 69 73 20 75 73 65 64 20  s(). It is used 
3d60: 74 6f 20 74 72 61 63 6b 20 74 68 65 20 74 6f 74  to track the tot
3d70: 61 6c 20 61 6d 6f 75 6e 74 20 6f 66 20 74 65 6d  al amount of tem
3d80: 70 0a 2a 2a 20 73 70 61 63 65 20 75 73 65 64 20  p.** space used 
3d90: 62 79 20 74 68 65 20 52 42 55 20 68 61 6e 64 6c  by the RBU handl
3da0: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 72 62 75  e..*/.struct rbu
3db0: 5f 76 66 73 20 7b 0a 20 20 73 71 6c 69 74 65 33  _vfs {.  sqlite3
3dc0: 5f 76 66 73 20 62 61 73 65 3b 20 20 20 20 20 20  _vfs base;      
3dd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 72 62 75 20           /* rbu 
3de0: 56 46 53 20 73 68 69 6d 20 6d 65 74 68 6f 64 73  VFS shim methods
3df0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66   */.  sqlite3_vf
3e00: 73 20 2a 70 52 65 61 6c 56 66 73 3b 20 20 20 20  s *pRealVfs;    
3e10: 20 20 20 20 20 20 2f 2a 20 55 6e 64 65 72 6c 79        /* Underly
3e20: 69 6e 67 20 56 46 53 20 2a 2f 0a 20 20 73 71 6c  ing VFS */.  sql
3e30: 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
3e40: 78 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x;           /* 
3e50: 4d 75 74 65 78 20 74 6f 20 70 72 6f 74 65 63 74  Mutex to protect
3e60: 20 70 4d 61 69 6e 20 2a 2f 0a 20 20 73 71 6c 69   pMain */.  sqli
3e70: 74 65 33 72 62 75 20 2a 70 52 62 75 3b 20 20 20  te3rbu *pRbu;   
3e80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
3e90: 77 6e 65 72 20 52 42 55 20 6f 62 6a 65 63 74 20  wner RBU object 
3ea0: 2a 2f 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70  */.  rbu_file *p
3eb0: 4d 61 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20  Main;           
3ec0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
3ed0: 6d 61 69 6e 20 64 62 20 66 69 6c 65 73 20 2a 2f  main db files */
3ee0: 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 4d 61  .  rbu_file *pMa
3ef0: 69 6e 52 62 75 3b 20 20 20 20 20 20 20 20 20 20  inRbu;          
3f00: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6d 61     /* List of ma
3f10: 69 6e 20 64 62 20 66 69 6c 65 73 20 77 69 74 68  in db files with
3f20: 20 70 52 62 75 21 3d 30 20 2a 2f 0a 7d 3b 0a 0a   pRbu!=0 */.};..
3f30: 2f 2a 0a 2a 2a 20 45 61 63 68 20 66 69 6c 65 20  /*.** Each file 
3f40: 6f 70 65 6e 65 64 20 62 79 20 61 6e 20 72 62 75  opened by an rbu
3f50: 20 56 46 53 20 69 73 20 72 65 70 72 65 73 65 6e   VFS is represen
3f60: 74 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61 6e  ted by an instan
3f70: 63 65 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 6c  ce of.** the fol
3f80: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
3f90: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
3fa0: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  is a temporary f
3fb0: 69 6c 65 20 28 70 52 62 75 21 3d 30 20 26 26 20  ile (pRbu!=0 && 
3fc0: 66 6c 61 67 73 26 44 45 4c 45 54 45 5f 4f 4e 5f  flags&DELETE_ON_
3fd0: 43 4c 4f 53 45 29 2c 20 76 61 72 69 61 62 6c 65  CLOSE), variable
3fe0: 0a 2a 2a 20 22 73 7a 22 20 69 73 20 73 65 74 20  .** "sz" is set 
3ff0: 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  to the current s
4000: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
4010: 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 72  ase file..*/.str
4020: 75 63 74 20 72 62 75 5f 66 69 6c 65 20 7b 0a 20  uct rbu_file {. 
4030: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 62 61   sqlite3_file ba
4040: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
4050: 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65   /* sqlite3_file
4060: 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 20 20 73 71   methods */.  sq
4070: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 52 65 61  lite3_file *pRea
4080: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  l;            /*
4090: 20 55 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65   Underlying file
40a0: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 72 62 75   handle */.  rbu
40b0: 5f 76 66 73 20 2a 70 52 62 75 56 66 73 3b 20 20  _vfs *pRbuVfs;  
40c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
40d0: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72  Pointer to the r
40e0: 62 75 5f 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f  bu_vfs object */
40f0: 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70  .  sqlite3rbu *p
4100: 52 62 75 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rbu;            
4110: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
4120: 20 72 62 75 20 6f 62 6a 65 63 74 20 28 72 62 75   rbu object (rbu
4130: 20 74 61 72 67 65 74 20 6f 6e 6c 79 29 20 2a 2f   target only) */
4140: 0a 20 20 69 36 34 20 73 7a 3b 20 20 20 20 20 20  .  i64 sz;      
4150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4160: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 66 69     /* Size of fi
4170: 6c 65 20 69 6e 20 62 79 74 65 73 20 28 74 65 6d  le in bytes (tem
4180: 70 20 6f 6e 6c 79 29 20 2a 2f 0a 0a 20 20 69 6e  p only) */..  in
4190: 74 20 6f 70 65 6e 46 6c 61 67 73 3b 20 20 20 20  t openFlags;    
41a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
41b0: 20 46 6c 61 67 73 20 74 68 69 73 20 66 69 6c 65   Flags this file
41c0: 20 77 61 73 20 6f 70 65 6e 65 64 20 77 69 74 68   was opened with
41d0: 20 2a 2f 0a 20 20 75 33 32 20 69 43 6f 6f 6b 69   */.  u32 iCooki
41e0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
41f0: 20 20 20 20 20 20 2f 2a 20 43 6f 6f 6b 69 65 20        /* Cookie 
4200: 76 61 6c 75 65 20 66 6f 72 20 6d 61 69 6e 20 64  value for main d
4210: 62 20 66 69 6c 65 73 20 2a 2f 0a 20 20 75 38 20  b files */.  u8 
4220: 69 57 72 69 74 65 56 65 72 3b 20 20 20 20 20 20  iWriteVer;      
4230: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4240: 22 77 72 69 74 65 2d 76 65 72 73 69 6f 6e 22 20  "write-version" 
4250: 76 61 6c 75 65 20 66 6f 72 20 6d 61 69 6e 20 64  value for main d
4260: 62 20 66 69 6c 65 73 20 2a 2f 0a 20 20 75 38 20  b files */.  u8 
4270: 62 4e 6f 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20  bNolock;        
4280: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4290: 54 72 75 65 20 74 6f 20 66 61 69 6c 20 45 58 43  True to fail EXC
42a0: 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 2a 2f 0a  LUSIVE locks */.
42b0: 0a 20 20 69 6e 74 20 6e 53 68 6d 3b 20 20 20 20  .  int nShm;    
42c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42d0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
42e0: 65 6e 74 72 69 65 73 20 69 6e 20 61 70 53 68 6d  entries in apShm
42f0: 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 63 68  [] array */.  ch
4300: 61 72 20 2a 2a 61 70 53 68 6d 3b 20 20 20 20 20  ar **apShm;     
4310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4320: 20 41 72 72 61 79 20 6f 66 20 6d 6d 61 70 27 64   Array of mmap'd
4330: 20 2a 2d 73 68 6d 20 72 65 67 69 6f 6e 73 20 2a   *-shm regions *
4340: 2f 0a 20 20 63 68 61 72 20 2a 7a 44 65 6c 3b 20  /.  char *zDel; 
4350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4360: 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68      /* Delete th
4370: 69 73 20 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20  is when closing 
4380: 66 69 6c 65 20 2a 2f 0a 0a 20 20 63 6f 6e 73 74  file */..  const
4390: 20 63 68 61 72 20 2a 7a 57 61 6c 3b 20 20 20 20   char *zWal;    
43a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 61             /* Wa
43b0: 6c 20 66 69 6c 65 6e 61 6d 65 20 66 6f 72 20 74  l filename for t
43c0: 68 69 73 20 6d 61 69 6e 20 64 62 20 66 69 6c 65  his main db file
43d0: 20 2a 2f 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a   */.  rbu_file *
43e0: 70 57 61 6c 46 64 3b 20 20 20 20 20 20 20 20 20  pWalFd;         
43f0: 20 20 20 20 20 20 2f 2a 20 57 61 6c 20 66 69 6c        /* Wal fil
4400: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
4410: 20 74 68 69 73 20 6d 61 69 6e 20 64 62 20 2a 2f   this main db */
4420: 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 4d 61  .  rbu_file *pMa
4430: 69 6e 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20  inNext;         
4440: 20 20 20 2f 2a 20 4e 65 78 74 20 4d 41 49 4e 5f     /* Next MAIN_
4450: 44 42 20 66 69 6c 65 20 2a 2f 0a 20 20 72 62 75  DB file */.  rbu
4460: 5f 66 69 6c 65 20 2a 70 4d 61 69 6e 52 62 75 4e  _file *pMainRbuN
4470: 65 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ext;         /* 
4480: 4e 65 78 74 20 4d 41 49 4e 5f 44 42 20 66 69 6c  Next MAIN_DB fil
4490: 65 20 77 69 74 68 20 70 52 62 75 21 3d 30 20 2a  e with pRbu!=0 *
44a0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 65  /.};../*.** True
44b0: 20 66 6f 72 20 61 6e 20 52 42 55 20 76 61 63 75   for an RBU vacu
44c0: 75 6d 20 68 61 6e 64 6c 65 2c 20 6f 72 20 66 61  um handle, or fa
44d0: 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  lse otherwise..*
44e0: 2f 0a 23 64 65 66 69 6e 65 20 72 62 75 49 73 56  /.#define rbuIsV
44f0: 61 63 75 75 6d 28 70 29 20 28 28 70 29 2d 3e 7a  acuum(p) ((p)->z
4500: 54 61 72 67 65 74 3d 3d 30 29 0a 0a 0a 2f 2a 2a  Target==0).../**
4510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4550: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66  *******.** The f
4560: 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 66  ollowing three f
4570: 75 6e 63 74 69 6f 6e 73 2c 20 66 6f 75 6e 64 20  unctions, found 
4580: 62 65 6c 6f 77 3a 0a 2a 2a 0a 2a 2a 20 20 20 72  below:.**.**   r
4590: 62 75 44 65 6c 74 61 47 65 74 49 6e 74 28 29 0a  buDeltaGetInt().
45a0: 2a 2a 20 20 20 72 62 75 44 65 6c 74 61 43 68 65  **   rbuDeltaChe
45b0: 63 6b 73 75 6d 28 29 0a 2a 2a 20 20 20 72 62 75  cksum().**   rbu
45c0: 44 65 6c 74 61 41 70 70 6c 79 28 29 0a 2a 2a 0a  DeltaApply().**.
45d0: 2a 2a 20 61 72 65 20 6c 69 66 74 65 64 20 66 72  ** are lifted fr
45e0: 6f 6d 20 74 68 65 20 66 6f 73 73 69 6c 20 73 6f  om the fossil so
45f0: 75 72 63 65 20 63 6f 64 65 20 28 68 74 74 70 3a  urce code (http:
4600: 2f 2f 66 6f 73 73 69 6c 2d 73 63 6d 2e 6f 72 67  //fossil-scm.org
4610: 29 2e 20 54 68 65 79 0a 2a 2a 20 61 72 65 20 75  ). They.** are u
4620: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
4630: 20 74 68 65 20 73 63 61 6c 61 72 20 53 51 4c 20   the scalar SQL 
4640: 66 75 6e 63 74 69 6f 6e 20 72 62 75 5f 66 6f 73  function rbu_fos
4650: 73 69 6c 5f 64 65 6c 74 61 28 29 2e 0a 2a 2f 0a  sil_delta()..*/.
4660: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 62 79 74 65  ./*.** Read byte
4670: 73 20 66 72 6f 6d 20 2a 70 7a 20 61 6e 64 20 63  s from *pz and c
4680: 6f 6e 76 65 72 74 20 74 68 65 6d 20 69 6e 74 6f  onvert them into
4690: 20 61 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65   a positive inte
46a0: 67 65 72 2e 20 20 57 68 65 6e 0a 2a 2a 20 66 69  ger.  When.** fi
46b0: 6e 69 73 68 65 64 2c 20 6c 65 61 76 65 20 2a 70  nished, leave *p
46c0: 7a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  z pointing to th
46d0: 65 20 66 69 72 73 74 20 63 68 61 72 61 63 74 65  e first characte
46e0: 72 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  r past the end o
46f0: 66 0a 2a 2a 20 74 68 65 20 69 6e 74 65 67 65 72  f.** the integer
4700: 2e 20 20 54 68 65 20 2a 70 4c 65 6e 20 70 61 72  .  The *pLen par
4710: 61 6d 65 74 65 72 20 68 6f 6c 64 73 20 74 68 65  ameter holds the
4720: 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73   length of the s
4730: 74 72 69 6e 67 0a 2a 2a 20 69 6e 20 2a 70 7a 20  tring.** in *pz 
4740: 61 6e 64 20 69 73 20 64 65 63 72 65 6d 65 6e 74  and is decrement
4750: 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
4760: 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 74 68   character in th
4770: 65 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74  e integer..*/.st
4780: 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e  atic unsigned in
4790: 74 20 72 62 75 44 65 6c 74 61 47 65 74 49 6e 74  t rbuDeltaGetInt
47a0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a  (const char **pz
47b0: 2c 20 69 6e 74 20 2a 70 4c 65 6e 29 7b 0a 20 20  , int *pLen){.  
47c0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 69 67  static const sig
47d0: 6e 65 64 20 63 68 61 72 20 7a 56 61 6c 75 65 5b  ned char zValue[
47e0: 5d 20 3d 20 7b 0a 20 20 20 20 2d 31 2c 20 2d 31  ] = {.    -1, -1
47f0: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  , -1, -1, -1, -1
4800: 2c 20 2d 31 2c 20 2d 31 2c 20 20 20 2d 31 2c 20  , -1, -1,   -1, 
4810: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
4820: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 0a 20 20 20 20  -1, -1, -1,.    
4830: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
4840: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
4850: 20 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31    -1, -1, -1, -1
4860: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  , -1, -1, -1, -1
4870: 2c 0a 20 20 20 20 2d 31 2c 20 2d 31 2c 20 2d 31  ,.    -1, -1, -1
4880: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  , -1, -1, -1, -1
4890: 2c 20 2d 31 2c 20 20 20 2d 31 2c 20 2d 31 2c 20  , -1,   -1, -1, 
48a0: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
48b0: 2d 31 2c 20 2d 31 2c 0a 20 20 20 20 20 30 2c 20  -1, -1,.     0, 
48c0: 20 31 2c 20 20 32 2c 20 20 33 2c 20 20 34 2c 20   1,  2,  3,  4, 
48d0: 20 35 2c 20 20 36 2c 20 20 37 2c 20 20 20 20 38   5,  6,  7,    8
48e0: 2c 20 20 39 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  ,  9, -1, -1, -1
48f0: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 0a 20 20  , -1, -1, -1,.  
4900: 20 20 2d 31 2c 20 31 30 2c 20 31 31 2c 20 31 32    -1, 10, 11, 12
4910: 2c 20 31 33 2c 20 31 34 2c 20 31 35 2c 20 31 36  , 13, 14, 15, 16
4920: 2c 20 20 20 31 37 2c 20 31 38 2c 20 31 39 2c 20  ,   17, 18, 19, 
4930: 32 30 2c 20 32 31 2c 20 32 32 2c 20 32 33 2c 20  20, 21, 22, 23, 
4940: 32 34 2c 0a 20 20 20 20 32 35 2c 20 32 36 2c 20  24,.    25, 26, 
4950: 32 37 2c 20 32 38 2c 20 32 39 2c 20 33 30 2c 20  27, 28, 29, 30, 
4960: 33 31 2c 20 33 32 2c 20 20 20 33 33 2c 20 33 34  31, 32,   33, 34
4970: 2c 20 33 35 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  , 35, -1, -1, -1
4980: 2c 20 2d 31 2c 20 33 36 2c 0a 20 20 20 20 2d 31  , -1, 36,.    -1
4990: 2c 20 33 37 2c 20 33 38 2c 20 33 39 2c 20 34 30  , 37, 38, 39, 40
49a0: 2c 20 34 31 2c 20 34 32 2c 20 34 33 2c 20 20 20  , 41, 42, 43,   
49b0: 34 34 2c 20 34 35 2c 20 34 36 2c 20 34 37 2c 20  44, 45, 46, 47, 
49c0: 34 38 2c 20 34 39 2c 20 35 30 2c 20 35 31 2c 0a  48, 49, 50, 51,.
49d0: 20 20 20 20 35 32 2c 20 35 33 2c 20 35 34 2c 20      52, 53, 54, 
49e0: 35 35 2c 20 35 36 2c 20 35 37 2c 20 35 38 2c 20  55, 56, 57, 58, 
49f0: 35 39 2c 20 20 20 36 30 2c 20 36 31 2c 20 36 32  59,   60, 61, 62
4a00: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 36 33  , -1, -1, -1, 63
4a10: 2c 20 2d 31 2c 0a 20 20 7d 3b 0a 20 20 75 6e 73  , -1,.  };.  uns
4a20: 69 67 6e 65 64 20 69 6e 74 20 76 20 3d 20 30 3b  igned int v = 0;
4a30: 0a 20 20 69 6e 74 20 63 3b 0a 20 20 75 6e 73 69  .  int c;.  unsi
4a40: 67 6e 65 64 20 63 68 61 72 20 2a 7a 20 3d 20 28  gned char *z = (
4a50: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 2a  unsigned char*)*
4a60: 70 7a 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  pz;.  unsigned c
4a70: 68 61 72 20 2a 7a 53 74 61 72 74 20 3d 20 7a 3b  har *zStart = z;
4a80: 0a 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a  .  while( (c = z
4a90: 56 61 6c 75 65 5b 30 78 37 66 26 2a 28 7a 2b 2b  Value[0x7f&*(z++
4aa0: 29 5d 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 76  )])>=0 ){.     v
4ab0: 20 3d 20 28 76 3c 3c 36 29 20 2b 20 63 3b 0a 20   = (v<<6) + c;. 
4ac0: 20 7d 0a 20 20 7a 2d 2d 3b 0a 20 20 2a 70 4c 65   }.  z--;.  *pLe
4ad0: 6e 20 2d 3d 20 7a 20 2d 20 7a 53 74 61 72 74 3b  n -= z - zStart;
4ae0: 0a 20 20 2a 70 7a 20 3d 20 28 63 68 61 72 2a 29  .  *pz = (char*)
4af0: 7a 3b 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d  z;.  return v;.}
4b00: 0a 0a 23 69 66 20 52 42 55 5f 45 4e 41 42 4c 45  ..#if RBU_ENABLE
4b10: 5f 44 45 4c 54 41 5f 43 4b 53 55 4d 0a 2f 2a 0a  _DELTA_CKSUM./*.
4b20: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 33 32 2d  ** Compute a 32-
4b30: 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20  bit checksum on 
4b40: 74 68 65 20 4e 2d 62 79 74 65 20 62 75 66 66 65  the N-byte buffe
4b50: 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72  r.  Return the r
4b60: 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  esult..*/.static
4b70: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 72 62   unsigned int rb
4b80: 75 44 65 6c 74 61 43 68 65 63 6b 73 75 6d 28 63  uDeltaChecksum(c
4b90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 2c 20  onst char *zIn, 
4ba0: 73 69 7a 65 5f 74 20 4e 29 7b 0a 20 20 63 6f 6e  size_t N){.  con
4bb0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
4bc0: 20 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73   *z = (const uns
4bd0: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 7a 49 6e  igned char *)zIn
4be0: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 73 75 6d  ;.  unsigned sum
4bf0: 30 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65  0 = 0;.  unsigne
4c00: 64 20 73 75 6d 31 20 3d 20 30 3b 0a 20 20 75 6e  d sum1 = 0;.  un
4c10: 73 69 67 6e 65 64 20 73 75 6d 32 20 3d 20 30 3b  signed sum2 = 0;
4c20: 0a 20 20 75 6e 73 69 67 6e 65 64 20 73 75 6d 33  .  unsigned sum3
4c30: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 4e 20   = 0;.  while(N 
4c40: 3e 3d 20 31 36 29 7b 0a 20 20 20 20 73 75 6d 30  >= 16){.    sum0
4c50: 20 2b 3d 20 28 28 75 6e 73 69 67 6e 65 64 29 7a   += ((unsigned)z
4c60: 5b 30 5d 20 2b 20 7a 5b 34 5d 20 2b 20 7a 5b 38  [0] + z[4] + z[8
4c70: 5d 20 2b 20 7a 5b 31 32 5d 29 3b 0a 20 20 20 20  ] + z[12]);.    
4c80: 73 75 6d 31 20 2b 3d 20 28 28 75 6e 73 69 67 6e  sum1 += ((unsign
4c90: 65 64 29 7a 5b 31 5d 20 2b 20 7a 5b 35 5d 20 2b  ed)z[1] + z[5] +
4ca0: 20 7a 5b 39 5d 20 2b 20 7a 5b 31 33 5d 29 3b 0a   z[9] + z[13]);.
4cb0: 20 20 20 20 73 75 6d 32 20 2b 3d 20 28 28 75 6e      sum2 += ((un
4cc0: 73 69 67 6e 65 64 29 7a 5b 32 5d 20 2b 20 7a 5b  signed)z[2] + z[
4cd0: 36 5d 20 2b 20 7a 5b 31 30 5d 2b 20 7a 5b 31 34  6] + z[10]+ z[14
4ce0: 5d 29 3b 0a 20 20 20 20 73 75 6d 33 20 2b 3d 20  ]);.    sum3 += 
4cf0: 28 28 75 6e 73 69 67 6e 65 64 29 7a 5b 33 5d 20  ((unsigned)z[3] 
4d00: 2b 20 7a 5b 37 5d 20 2b 20 7a 5b 31 31 5d 2b 20  + z[7] + z[11]+ 
4d10: 7a 5b 31 35 5d 29 3b 0a 20 20 20 20 7a 20 2b 3d  z[15]);.    z +=
4d20: 20 31 36 3b 0a 20 20 20 20 4e 20 2d 3d 20 31 36   16;.    N -= 16
4d30: 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 4e 20  ;.  }.  while(N 
4d40: 3e 3d 20 34 29 7b 0a 20 20 20 20 73 75 6d 30 20  >= 4){.    sum0 
4d50: 2b 3d 20 7a 5b 30 5d 3b 0a 20 20 20 20 73 75 6d  += z[0];.    sum
4d60: 31 20 2b 3d 20 7a 5b 31 5d 3b 0a 20 20 20 20 73  1 += z[1];.    s
4d70: 75 6d 32 20 2b 3d 20 7a 5b 32 5d 3b 0a 20 20 20  um2 += z[2];.   
4d80: 20 73 75 6d 33 20 2b 3d 20 7a 5b 33 5d 3b 0a 20   sum3 += z[3];. 
4d90: 20 20 20 7a 20 2b 3d 20 34 3b 0a 20 20 20 20 4e     z += 4;.    N
4da0: 20 2d 3d 20 34 3b 0a 20 20 7d 0a 20 20 73 75 6d   -= 4;.  }.  sum
4db0: 33 20 2b 3d 20 28 73 75 6d 32 20 3c 3c 20 38 29  3 += (sum2 << 8)
4dc0: 20 2b 20 28 73 75 6d 31 20 3c 3c 20 31 36 29 20   + (sum1 << 16) 
4dd0: 2b 20 28 73 75 6d 30 20 3c 3c 20 32 34 29 3b 0a  + (sum0 << 24);.
4de0: 20 20 73 77 69 74 63 68 28 4e 29 7b 0a 20 20 20    switch(N){.   
4df0: 20 63 61 73 65 20 33 3a 20 20 20 73 75 6d 33 20   case 3:   sum3 
4e00: 2b 3d 20 28 7a 5b 32 5d 20 3c 3c 20 38 29 3b 0a  += (z[2] << 8);.
4e10: 20 20 20 20 63 61 73 65 20 32 3a 20 20 20 73 75      case 2:   su
4e20: 6d 33 20 2b 3d 20 28 7a 5b 31 5d 20 3c 3c 20 31  m3 += (z[1] << 1
4e30: 36 29 3b 0a 20 20 20 20 63 61 73 65 20 31 3a 20  6);.    case 1: 
4e40: 20 20 73 75 6d 33 20 2b 3d 20 28 7a 5b 30 5d 20    sum3 += (z[0] 
4e50: 3c 3c 20 32 34 29 3b 0a 20 20 20 20 64 65 66 61  << 24);.    defa
4e60: 75 6c 74 3a 20 20 3b 0a 20 20 7d 0a 20 20 72 65  ult:  ;.  }.  re
4e70: 74 75 72 6e 20 73 75 6d 33 3b 0a 7d 0a 23 65 6e  turn sum3;.}.#en
4e80: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79  dif../*.** Apply
4e90: 20 61 20 64 65 6c 74 61 2e 0a 2a 2a 0a 2a 2a 20   a delta..**.** 
4ea0: 54 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  The output buffe
4eb0: 72 20 73 68 6f 75 6c 64 20 62 65 20 62 69 67 20  r should be big 
4ec0: 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74  enough to hold t
4ed0: 68 65 20 77 68 6f 6c 65 20 6f 75 74 70 75 74 0a  he whole output.
4ee0: 2a 2a 20 66 69 6c 65 20 61 6e 64 20 61 20 4e 55  ** file and a NU
4ef0: 4c 20 74 65 72 6d 69 6e 61 74 6f 72 20 61 74 20  L terminator at 
4f00: 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20 64 65  the end.  The de
4f10: 6c 74 61 5f 6f 75 74 70 75 74 5f 73 69 7a 65 28  lta_output_size(
4f20: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c  ).** routine wil
4f30: 6c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 69 73  l determine this
4f40: 20 73 69 7a 65 20 66 6f 72 20 79 6f 75 2e 0a 2a   size for you..*
4f50: 2a 0a 2a 2a 20 54 68 65 20 64 65 6c 74 61 20 73  *.** The delta s
4f60: 74 72 69 6e 67 20 73 68 6f 75 6c 64 20 62 65 20  tring should be 
4f70: 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64 2e  null-terminated.
4f80: 20 20 42 75 74 20 74 68 65 20 64 65 6c 74 61 20    But the delta 
4f90: 73 74 72 69 6e 67 0a 2a 2a 20 6d 61 79 20 63 6f  string.** may co
4fa0: 6e 74 61 69 6e 20 65 6d 62 65 64 64 65 64 20 4e  ntain embedded N
4fb0: 55 4c 20 63 68 61 72 61 63 74 65 72 73 20 28 69  UL characters (i
4fc0: 66 20 74 68 65 20 69 6e 70 75 74 20 61 6e 64 20  f the input and 
4fd0: 6f 75 74 70 75 74 20 61 72 65 0a 2a 2a 20 62 69  output are.** bi
4fe0: 6e 61 72 79 20 66 69 6c 65 73 29 20 73 6f 20 77  nary files) so w
4ff0: 65 20 61 6c 73 6f 20 68 61 76 65 20 74 6f 20 70  e also have to p
5000: 61 73 73 20 69 6e 20 74 68 65 20 6c 65 6e 67 74  ass in the lengt
5010: 68 20 6f 66 20 74 68 65 20 64 65 6c 74 61 20 69  h of the delta i
5020: 6e 0a 2a 2a 20 74 68 65 20 6c 65 6e 44 65 6c 74  n.** the lenDelt
5030: 61 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a  a parameter..**.
5040: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
5050: 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 69 7a   returns the siz
5060: 65 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 20  e of the output 
5070: 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 28 65  file in bytes (e
5080: 78 63 6c 75 64 69 6e 67 0a 2a 2a 20 74 68 65 20  xcluding.** the 
5090: 66 69 6e 61 6c 20 4e 55 4c 20 74 65 72 6d 69 6e  final NUL termin
50a0: 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 29 2e  ator character).
50b0: 20 20 45 78 63 65 70 74 2c 20 69 66 20 74 68 65    Except, if the
50c0: 20 64 65 6c 74 61 20 73 74 72 69 6e 67 20 69 73   delta string is
50d0: 0a 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 6f 72  .** malformed or
50e0: 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 75 73   intended for us
50f0: 65 20 77 69 74 68 20 61 20 73 6f 75 72 63 65 20  e with a source 
5100: 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20  file other than 
5110: 7a 53 72 63 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  zSrc,.** then th
5120: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
5130: 6e 73 20 2d 31 2e 0a 2a 2a 0a 2a 2a 20 52 65 66  ns -1..**.** Ref
5140: 65 72 20 74 6f 20 74 68 65 20 64 65 6c 74 61 5f  er to the delta_
5150: 63 72 65 61 74 65 28 29 20 64 6f 63 75 6d 65 6e  create() documen
5160: 74 61 74 69 6f 6e 20 61 62 6f 76 65 20 66 6f 72  tation above for
5170: 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 0a 2a   a description.*
5180: 2a 20 6f 66 20 74 68 65 20 64 65 6c 74 61 20 66  * of the delta f
5190: 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2f 0a 73  ile format..*/.s
51a0: 74 61 74 69 63 20 69 6e 74 20 72 62 75 44 65 6c  tatic int rbuDel
51b0: 74 61 41 70 70 6c 79 28 0a 20 20 63 6f 6e 73 74  taApply(.  const
51c0: 20 63 68 61 72 20 2a 7a 53 72 63 2c 20 20 20 20   char *zSrc,    
51d0: 20 20 2f 2a 20 54 68 65 20 73 6f 75 72 63 65 20    /* The source 
51e0: 6f 72 20 70 61 74 74 65 72 6e 20 66 69 6c 65 20  or pattern file 
51f0: 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 53 72 63 2c  */.  int lenSrc,
5200: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
5210: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73 6f 75  ength of the sou
5220: 72 63 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 6f  rce file */.  co
5230: 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 6c 74 61  nst char *zDelta
5240: 2c 20 20 20 20 2f 2a 20 44 65 6c 74 61 20 74 6f  ,    /* Delta to
5250: 20 61 70 70 6c 79 20 74 6f 20 74 68 65 20 70 61   apply to the pa
5260: 74 74 65 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6c  ttern */.  int l
5270: 65 6e 44 65 6c 74 61 2c 20 20 20 20 20 20 20 20  enDelta,        
5280: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74    /* Length of t
5290: 68 65 20 64 65 6c 74 61 20 2a 2f 0a 20 20 63 68  he delta */.  ch
52a0: 61 72 20 2a 7a 4f 75 74 20 20 20 20 20 20 20 20  ar *zOut        
52b0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
52c0: 65 20 6f 75 74 70 75 74 20 69 6e 74 6f 20 74 68  e output into th
52d0: 69 73 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20  is preallocated 
52e0: 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 75  buffer */.){.  u
52f0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 69 6d 69  nsigned int limi
5300: 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  t;.  unsigned in
5310: 74 20 74 6f 74 61 6c 20 3d 20 30 3b 0a 23 69 66  t total = 0;.#if
5320: 20 52 42 55 5f 45 4e 41 42 4c 45 5f 44 45 4c 54   RBU_ENABLE_DELT
5330: 41 5f 43 4b 53 55 4d 0a 20 20 63 68 61 72 20 2a  A_CKSUM.  char *
5340: 7a 4f 72 69 67 4f 75 74 20 3d 20 7a 4f 75 74 3b  zOrigOut = zOut;
5350: 0a 23 65 6e 64 69 66 0a 0a 20 20 6c 69 6d 69 74  .#endif..  limit
5360: 20 3d 20 72 62 75 44 65 6c 74 61 47 65 74 49 6e   = rbuDeltaGetIn
5370: 74 28 26 7a 44 65 6c 74 61 2c 20 26 6c 65 6e 44  t(&zDelta, &lenD
5380: 65 6c 74 61 29 3b 0a 20 20 69 66 28 20 2a 7a 44  elta);.  if( *zD
5390: 65 6c 74 61 21 3d 27 5c 6e 27 20 29 7b 0a 20 20  elta!='\n' ){.  
53a0: 20 20 2f 2a 20 45 52 52 4f 52 3a 20 73 69 7a 65    /* ERROR: size
53b0: 20 69 6e 74 65 67 65 72 20 6e 6f 74 20 74 65 72   integer not ter
53c0: 6d 69 6e 61 74 65 64 20 62 79 20 22 5c 6e 22 20  minated by "\n" 
53d0: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31  */.    return -1
53e0: 3b 0a 20 20 7d 0a 20 20 7a 44 65 6c 74 61 2b 2b  ;.  }.  zDelta++
53f0: 3b 20 6c 65 6e 44 65 6c 74 61 2d 2d 3b 0a 20 20  ; lenDelta--;.  
5400: 77 68 69 6c 65 28 20 2a 7a 44 65 6c 74 61 20 26  while( *zDelta &
5410: 26 20 6c 65 6e 44 65 6c 74 61 3e 30 20 29 7b 0a  & lenDelta>0 ){.
5420: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
5430: 20 63 6e 74 2c 20 6f 66 73 74 3b 0a 20 20 20 20   cnt, ofst;.    
5440: 63 6e 74 20 3d 20 72 62 75 44 65 6c 74 61 47 65  cnt = rbuDeltaGe
5450: 74 49 6e 74 28 26 7a 44 65 6c 74 61 2c 20 26 6c  tInt(&zDelta, &l
5460: 65 6e 44 65 6c 74 61 29 3b 0a 20 20 20 20 73 77  enDelta);.    sw
5470: 69 74 63 68 28 20 7a 44 65 6c 74 61 5b 30 5d 20  itch( zDelta[0] 
5480: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 27 40  ){.      case '@
5490: 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 7a 44 65  ': {.        zDe
54a0: 6c 74 61 2b 2b 3b 20 6c 65 6e 44 65 6c 74 61 2d  lta++; lenDelta-
54b0: 2d 3b 0a 20 20 20 20 20 20 20 20 6f 66 73 74 20  -;.        ofst 
54c0: 3d 20 72 62 75 44 65 6c 74 61 47 65 74 49 6e 74  = rbuDeltaGetInt
54d0: 28 26 7a 44 65 6c 74 61 2c 20 26 6c 65 6e 44 65  (&zDelta, &lenDe
54e0: 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20 69 66  lta);.        if
54f0: 28 20 6c 65 6e 44 65 6c 74 61 3e 30 20 26 26 20  ( lenDelta>0 && 
5500: 7a 44 65 6c 74 61 5b 30 5d 21 3d 27 2c 27 20 29  zDelta[0]!=',' )
5510: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  {.          /* E
5520: 52 52 4f 52 3a 20 63 6f 70 79 20 63 6f 6d 6d 61  RROR: copy comma
5530: 6e 64 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65  nd not terminate
5540: 64 20 62 79 20 27 2c 27 20 2a 2f 0a 20 20 20 20  d by ',' */.    
5550: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
5560: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5570: 20 20 20 7a 44 65 6c 74 61 2b 2b 3b 20 6c 65 6e     zDelta++; len
5580: 44 65 6c 74 61 2d 2d 3b 0a 20 20 20 20 20 20 20  Delta--;.       
5590: 20 74 6f 74 61 6c 20 2b 3d 20 63 6e 74 3b 0a 20   total += cnt;. 
55a0: 20 20 20 20 20 20 20 69 66 28 20 74 6f 74 61 6c         if( total
55b0: 3e 6c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  >limit ){.      
55c0: 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20 63 6f      /* ERROR: co
55d0: 70 79 20 65 78 63 65 65 64 73 20 6f 75 74 70 75  py exceeds outpu
55e0: 74 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20  t file size */. 
55f0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
5600: 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  -1;.        }.  
5610: 20 20 20 20 20 20 69 66 28 20 28 69 6e 74 29 28        if( (int)(
5620: 6f 66 73 74 2b 63 6e 74 29 20 3e 20 6c 65 6e 53  ofst+cnt) > lenS
5630: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
5640: 2f 2a 20 45 52 52 4f 52 3a 20 63 6f 70 79 20 65  /* ERROR: copy e
5650: 78 74 65 6e 64 73 20 70 61 73 74 20 65 6e 64 20  xtends past end 
5660: 6f 66 20 69 6e 70 75 74 20 2a 2f 0a 20 20 20 20  of input */.    
5670: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
5680: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5690: 20 20 20 6d 65 6d 63 70 79 28 7a 4f 75 74 2c 20     memcpy(zOut, 
56a0: 26 7a 53 72 63 5b 6f 66 73 74 5d 2c 20 63 6e 74  &zSrc[ofst], cnt
56b0: 29 3b 0a 20 20 20 20 20 20 20 20 7a 4f 75 74 20  );.        zOut 
56c0: 2b 3d 20 63 6e 74 3b 0a 20 20 20 20 20 20 20 20  += cnt;.        
56d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
56e0: 20 20 20 20 20 63 61 73 65 20 27 3a 27 3a 20 7b       case ':': {
56f0: 0a 20 20 20 20 20 20 20 20 7a 44 65 6c 74 61 2b  .        zDelta+
5700: 2b 3b 20 6c 65 6e 44 65 6c 74 61 2d 2d 3b 0a 20  +; lenDelta--;. 
5710: 20 20 20 20 20 20 20 74 6f 74 61 6c 20 2b 3d 20         total += 
5720: 63 6e 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  cnt;.        if(
5730: 20 74 6f 74 61 6c 3e 6c 69 6d 69 74 20 29 7b 0a   total>limit ){.
5740: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 52 52            /* ERR
5750: 4f 52 3a 20 20 69 6e 73 65 72 74 20 63 6f 6d 6d  OR:  insert comm
5760: 61 6e 64 20 67 69 76 65 73 20 61 6e 20 6f 75 74  and gives an out
5770: 70 75 74 20 6c 61 72 67 65 72 20 74 68 61 6e 20  put larger than 
5780: 70 72 65 64 69 63 74 65 64 20 2a 2f 0a 20 20 20  predicted */.   
5790: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31         return -1
57a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
57b0: 20 20 20 20 69 66 28 20 28 69 6e 74 29 63 6e 74      if( (int)cnt
57c0: 3e 6c 65 6e 44 65 6c 74 61 20 29 7b 0a 20 20 20  >lenDelta ){.   
57d0: 20 20 20 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a         /* ERROR:
57e0: 20 69 6e 73 65 72 74 20 63 6f 75 6e 74 20 65 78   insert count ex
57f0: 63 65 65 64 73 20 73 69 7a 65 20 6f 66 20 64 65  ceeds size of de
5800: 6c 74 61 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  lta */.         
5810: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
5820: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65      }.        me
5830: 6d 63 70 79 28 7a 4f 75 74 2c 20 7a 44 65 6c 74  mcpy(zOut, zDelt
5840: 61 2c 20 63 6e 74 29 3b 0a 20 20 20 20 20 20 20  a, cnt);.       
5850: 20 7a 4f 75 74 20 2b 3d 20 63 6e 74 3b 0a 20 20   zOut += cnt;.  
5860: 20 20 20 20 20 20 7a 44 65 6c 74 61 20 2b 3d 20        zDelta += 
5870: 63 6e 74 3b 0a 20 20 20 20 20 20 20 20 6c 65 6e  cnt;.        len
5880: 44 65 6c 74 61 20 2d 3d 20 63 6e 74 3b 0a 20 20  Delta -= cnt;.  
5890: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
58a0: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
58b0: 27 3b 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 7a  ';': {.        z
58c0: 44 65 6c 74 61 2b 2b 3b 20 6c 65 6e 44 65 6c 74  Delta++; lenDelt
58d0: 61 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7a 4f 75  a--;.        zOu
58e0: 74 5b 30 5d 20 3d 20 30 3b 0a 23 69 66 20 52 42  t[0] = 0;.#if RB
58f0: 55 5f 45 4e 41 42 4c 45 5f 44 45 4c 54 41 5f 43  U_ENABLE_DELTA_C
5900: 4b 53 55 4d 0a 20 20 20 20 20 20 20 20 69 66 28  KSUM.        if(
5910: 20 63 6e 74 21 3d 72 62 75 44 65 6c 74 61 43 68   cnt!=rbuDeltaCh
5920: 65 63 6b 73 75 6d 28 7a 4f 72 69 67 4f 75 74 2c  ecksum(zOrigOut,
5930: 20 74 6f 74 61 6c 29 20 29 7b 0a 20 20 20 20 20   total) ){.     
5940: 20 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20 20       /* ERROR:  
5950: 62 61 64 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a  bad checksum */.
5960: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
5970: 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23   -1;.        }.#
5980: 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 66  endif.        if
5990: 28 20 74 6f 74 61 6c 21 3d 6c 69 6d 69 74 20 29  ( total!=limit )
59a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  {.          /* E
59b0: 52 52 4f 52 3a 20 67 65 6e 65 72 61 74 65 64 20  RROR: generated 
59c0: 73 69 7a 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  size does not ma
59d0: 74 63 68 20 70 72 65 64 69 63 74 65 64 20 73 69  tch predicted si
59e0: 7a 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ze */.          
59f0: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
5a00: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74     }.        ret
5a10: 75 72 6e 20 74 6f 74 61 6c 3b 0a 20 20 20 20 20  urn total;.     
5a20: 20 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74   }.      default
5a30: 3a 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45  : {.        /* E
5a40: 52 52 4f 52 3a 20 75 6e 6b 6e 6f 77 6e 20 64 65  RROR: unknown de
5a50: 6c 74 61 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  lta operator */.
5a60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d          return -
5a70: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
5a80: 0a 20 20 7d 0a 20 20 2f 2a 20 45 52 52 4f 52 3a  .  }.  /* ERROR:
5a90: 20 75 6e 74 65 72 6d 69 6e 61 74 65 64 20 64 65   unterminated de
5aa0: 6c 74 61 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  lta */.  return 
5ab0: 2d 31 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  -1;.}..static in
5ac0: 74 20 72 62 75 44 65 6c 74 61 4f 75 74 70 75 74  t rbuDeltaOutput
5ad0: 53 69 7a 65 28 63 6f 6e 73 74 20 63 68 61 72 20  Size(const char 
5ae0: 2a 7a 44 65 6c 74 61 2c 20 69 6e 74 20 6c 65 6e  *zDelta, int len
5af0: 44 65 6c 74 61 29 7b 0a 20 20 69 6e 74 20 73 69  Delta){.  int si
5b00: 7a 65 3b 0a 20 20 73 69 7a 65 20 3d 20 72 62 75  ze;.  size = rbu
5b10: 44 65 6c 74 61 47 65 74 49 6e 74 28 26 7a 44 65  DeltaGetInt(&zDe
5b20: 6c 74 61 2c 20 26 6c 65 6e 44 65 6c 74 61 29 3b  lta, &lenDelta);
5b30: 0a 20 20 69 66 28 20 2a 7a 44 65 6c 74 61 21 3d  .  if( *zDelta!=
5b40: 27 5c 6e 27 20 29 7b 0a 20 20 20 20 2f 2a 20 45  '\n' ){.    /* E
5b50: 52 52 4f 52 3a 20 73 69 7a 65 20 69 6e 74 65 67  RROR: size integ
5b60: 65 72 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65  er not terminate
5b70: 64 20 62 79 20 22 5c 6e 22 20 2a 2f 0a 20 20 20  d by "\n" */.   
5b80: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
5b90: 20 20 72 65 74 75 72 6e 20 73 69 7a 65 3b 0a 7d    return size;.}
5ba0: 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 63  ../*.** End of c
5bb0: 6f 64 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 66  ode taken from f
5bc0: 6f 73 73 69 6c 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ossil..*********
5bd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5be0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5bf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5c00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5c10: 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  /../*.** Impleme
5c20: 6e 74 61 74 69 6f 6e 20 6f 66 20 53 51 4c 20 73  ntation of SQL s
5c30: 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 72  calar function r
5c40: 62 75 5f 66 6f 73 73 69 6c 5f 64 65 6c 74 61 28  bu_fossil_delta(
5c50: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  )..**.** This fu
5c60: 6e 63 74 69 6f 6e 20 61 70 70 6c 69 65 73 20 61  nction applies a
5c70: 20 66 6f 73 73 69 6c 20 64 65 6c 74 61 20 70 61   fossil delta pa
5c80: 74 63 68 20 74 6f 20 61 20 62 6c 6f 62 2e 20 45  tch to a blob. E
5c90: 78 61 63 74 6c 79 20 74 77 6f 0a 2a 2a 20 61 72  xactly two.** ar
5ca0: 67 75 6d 65 6e 74 73 20 6d 75 73 74 20 62 65 20  guments must be 
5cb0: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
5cc0: 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 66 69 72  unction. The fir
5cd0: 73 74 20 69 73 20 74 68 65 20 62 6c 6f 62 20 74  st is the blob t
5ce0: 6f 0a 2a 2a 20 70 61 74 63 68 20 61 6e 64 20 74  o.** patch and t
5cf0: 68 65 20 73 65 63 6f 6e 64 20 74 68 65 20 70 61  he second the pa
5d00: 74 63 68 20 74 6f 20 61 70 70 6c 79 2e 20 49 66  tch to apply. If
5d10: 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
5d20: 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
5d30: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 70  on returns the p
5d40: 61 74 63 68 65 64 20 62 6c 6f 62 2e 0a 2a 2f 0a  atched blob..*/.
5d50: 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 46  static void rbuF
5d60: 6f 73 73 69 6c 44 65 6c 74 61 46 75 6e 63 28 0a  ossilDeltaFunc(.
5d70: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
5d80: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
5d90: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
5da0: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
5db0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
5dc0: 61 44 65 6c 74 61 3b 0a 20 20 69 6e 74 20 6e 44  aDelta;.  int nD
5dd0: 65 6c 74 61 3b 0a 20 20 63 6f 6e 73 74 20 63 68  elta;.  const ch
5de0: 61 72 20 2a 61 4f 72 69 67 3b 0a 20 20 69 6e 74  ar *aOrig;.  int
5df0: 20 6e 4f 72 69 67 3b 0a 0a 20 20 69 6e 74 20 6e   nOrig;..  int n
5e00: 4f 75 74 3b 0a 20 20 69 6e 74 20 6e 4f 75 74 32  Out;.  int nOut2
5e10: 3b 0a 20 20 63 68 61 72 20 2a 61 4f 75 74 3b 0a  ;.  char *aOut;.
5e20: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
5e30: 3d 32 20 29 3b 0a 0a 20 20 6e 4f 72 69 67 20 3d  =2 );..  nOrig =
5e40: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
5e50: 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ytes(argv[0]);. 
5e60: 20 61 4f 72 69 67 20 3d 20 28 63 6f 6e 73 74 20   aOrig = (const 
5e70: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
5e80: 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d  lue_blob(argv[0]
5e90: 29 3b 0a 20 20 6e 44 65 6c 74 61 20 3d 20 73 71  );.  nDelta = sq
5ea0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
5eb0: 73 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 61 44  s(argv[1]);.  aD
5ec0: 65 6c 74 61 20 3d 20 28 63 6f 6e 73 74 20 63 68  elta = (const ch
5ed0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
5ee0: 65 5f 62 6c 6f 62 28 61 72 67 76 5b 31 5d 29 3b  e_blob(argv[1]);
5ef0: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
5f00: 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
5f10: 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 6e 4f  e output */.  nO
5f20: 75 74 20 3d 20 72 62 75 44 65 6c 74 61 4f 75 74  ut = rbuDeltaOut
5f30: 70 75 74 53 69 7a 65 28 61 44 65 6c 74 61 2c 20  putSize(aDelta, 
5f40: 6e 44 65 6c 74 61 29 3b 0a 20 20 69 66 28 20 6e  nDelta);.  if( n
5f50: 4f 75 74 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  Out<0 ){.    sql
5f60: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
5f70: 72 28 63 6f 6e 74 65 78 74 2c 20 22 63 6f 72 72  r(context, "corr
5f80: 75 70 74 20 66 6f 73 73 69 6c 20 64 65 6c 74 61  upt fossil delta
5f90: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75  ", -1);.    retu
5fa0: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 61 4f 75 74 20  rn;.  }..  aOut 
5fb0: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
5fc0: 28 6e 4f 75 74 2b 31 29 3b 0a 20 20 69 66 28 20  (nOut+1);.  if( 
5fd0: 61 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73  aOut==0 ){.    s
5fe0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
5ff0: 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78  ror_nomem(contex
6000: 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
6010: 20 6e 4f 75 74 32 20 3d 20 72 62 75 44 65 6c 74   nOut2 = rbuDelt
6020: 61 41 70 70 6c 79 28 61 4f 72 69 67 2c 20 6e 4f  aApply(aOrig, nO
6030: 72 69 67 2c 20 61 44 65 6c 74 61 2c 20 6e 44 65  rig, aDelta, nDe
6040: 6c 74 61 2c 20 61 4f 75 74 29 3b 0a 20 20 20 20  lta, aOut);.    
6050: 69 66 28 20 6e 4f 75 74 32 21 3d 6e 4f 75 74 20  if( nOut2!=nOut 
6060: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
6070: 5f 66 72 65 65 28 61 4f 75 74 29 3b 0a 20 20 20  _free(aOut);.   
6080: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
6090: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
60a0: 20 22 63 6f 72 72 75 70 74 20 66 6f 73 73 69 6c   "corrupt fossil
60b0: 20 64 65 6c 74 61 22 2c 20 2d 31 29 3b 0a 20 20   delta", -1);.  
60c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
60d0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c  qlite3_result_bl
60e0: 6f 62 28 63 6f 6e 74 65 78 74 2c 20 61 4f 75 74  ob(context, aOut
60f0: 2c 20 6e 4f 75 74 2c 20 73 71 6c 69 74 65 33 5f  , nOut, sqlite3_
6100: 66 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  free);.    }.  }
6110: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61  .}.../*.** Prepa
6120: 72 65 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  re the SQL state
6130: 6d 65 6e 74 20 69 6e 20 62 75 66 66 65 72 20 7a  ment in buffer z
6140: 53 71 6c 20 61 67 61 69 6e 73 74 20 64 61 74 61  Sql against data
6150: 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a  base handle db..
6160: 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
6170: 2c 20 73 65 74 20 2a 70 70 53 74 6d 74 20 74 6f  , set *ppStmt to
6180: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65   point to the ne
6190: 77 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20  w statement and 
61a0: 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  return.** SQLITE
61b0: 5f 4f 4b 2e 20 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  _OK. .**.** Othe
61c0: 72 77 69 73 65 2c 20 69 66 20 61 6e 20 65 72 72  rwise, if an err
61d0: 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 73  or does occur, s
61e0: 65 74 20 2a 70 70 53 74 6d 74 20 74 6f 20 4e 55  et *ppStmt to NU
61f0: 4c 4c 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  LL and return.**
6200: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
6210: 20 63 6f 64 65 2e 20 41 64 64 69 74 69 6f 6e 61   code. Additiona
6220: 6c 6c 79 2c 20 73 65 74 20 6f 75 74 70 75 74 20  lly, set output 
6230: 76 61 72 69 61 62 6c 65 20 2a 70 7a 45 72 72 6d  variable *pzErrm
6240: 73 67 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74  sg to.** point t
6250: 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
6260: 69 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 6d  ining an error m
6270: 65 73 73 61 67 65 2e 20 49 74 20 69 73 20 74 68  essage. It is th
6280: 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
6290: 0a 2a 2a 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  .** of the calle
62a0: 72 20 74 6f 20 28 65 76 65 6e 74 75 61 6c 6c 79  r to (eventually
62b0: 29 20 66 72 65 65 20 74 68 69 73 20 62 75 66 66  ) free this buff
62c0: 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  er using sqlite3
62d0: 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  _free()..*/.stat
62e0: 69 63 20 69 6e 74 20 70 72 65 70 61 72 65 41 6e  ic int prepareAn
62f0: 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 0a 20  dCollectError(. 
6300: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
6310: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a   sqlite3_stmt **
6320: 70 70 53 74 6d 74 2c 0a 20 20 63 68 61 72 20 2a  ppStmt,.  char *
6330: 2a 70 7a 45 72 72 6d 73 67 2c 0a 20 20 63 6f 6e  *pzErrmsg,.  con
6340: 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 0a 29 7b  st char *zSql.){
6350: 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
6360: 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
6370: 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 70 53  b, zSql, -1, ppS
6380: 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  tmt, 0);.  if( r
6390: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
63a0: 20 20 20 20 2a 70 7a 45 72 72 6d 73 67 20 3d 20      *pzErrmsg = 
63b0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
63c0: 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  "%s", sqlite3_er
63d0: 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 2a  rmsg(db));.    *
63e0: 70 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a  ppStmt = 0;.  }.
63f0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
6400: 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20  /*.** Reset the 
6410: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 70 61  SQL statement pa
6420: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
6430: 74 20 61 72 67 75 6d 65 6e 74 2e 20 52 65 74 75  t argument. Retu
6440: 72 6e 20 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20  rn a copy.** of 
6450: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
6460: 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 72 65  ed by sqlite3_re
6470: 73 65 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  set()..**.** If 
6480: 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  an error has occ
6490: 75 72 72 65 64 2c 20 74 68 65 6e 20 73 65 74 20  urred, then set 
64a0: 2a 70 7a 45 72 72 6d 73 67 20 74 6f 20 70 6f 69  *pzErrmsg to poi
64b0: 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 0a 2a  nt to a buffer.*
64c0: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20  * containing an 
64d0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 49  error message. I
64e0: 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
64f0: 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
6500: 61 6c 6c 65 72 0a 2a 2a 20 74 6f 20 65 76 65 6e  aller.** to even
6510: 74 75 61 6c 6c 79 20 66 72 65 65 20 74 68 69 73  tually free this
6520: 20 62 75 66 66 65 72 20 75 73 69 6e 67 20 73 71   buffer using sq
6530: 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f  lite3_free()..*/
6540: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 65  .static int rese
6550: 74 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72  tAndCollectError
6560: 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70  (sqlite3_stmt *p
6570: 53 74 6d 74 2c 20 63 68 61 72 20 2a 2a 70 7a 45  Stmt, char **pzE
6580: 72 72 6d 73 67 29 7b 0a 20 20 69 6e 74 20 72 63  rrmsg){.  int rc
6590: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
65a0: 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 72  (pStmt);.  if( r
65b0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
65c0: 20 20 20 20 2a 70 7a 45 72 72 6d 73 67 20 3d 20      *pzErrmsg = 
65d0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
65e0: 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  "%s", sqlite3_er
65f0: 72 6d 73 67 28 73 71 6c 69 74 65 33 5f 64 62 5f  rmsg(sqlite3_db_
6600: 68 61 6e 64 6c 65 28 70 53 74 6d 74 29 29 29 3b  handle(pStmt)));
6610: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
6620: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73  ;.}../*.** Unles
6630: 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20 61 72  s it is NULL, ar
6640: 67 75 6d 65 6e 74 20 7a 53 71 6c 20 70 6f 69 6e  gument zSql poin
6650: 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 61  ts to a buffer a
6660: 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 0a 2a  llocated using.*
6670: 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  * sqlite3_malloc
6680: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 53   containing an S
6690: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  QL statement. Th
66a0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 72 65 70  is function prep
66b0: 61 72 65 73 20 74 68 65 20 53 51 4c 0a 2a 2a 20  ares the SQL.** 
66c0: 73 74 61 74 65 6d 65 6e 74 20 61 67 61 69 6e 73  statement agains
66d0: 74 20 64 61 74 61 62 61 73 65 20 64 62 20 61 6e  t database db an
66e0: 64 20 66 72 65 65 73 20 74 68 65 20 62 75 66 66  d frees the buff
66f0: 65 72 2e 20 49 66 20 73 74 61 74 65 6d 65 6e 74  er. If statement
6700: 20 0a 2a 2a 20 63 6f 6d 70 69 6c 61 74 69 6f 6e   .** compilation
6710: 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
6720: 2a 70 70 53 74 6d 74 20 69 73 20 73 65 74 20 74  *ppStmt is set t
6730: 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  o point to the n
6740: 65 77 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a  ew statement .**
6750: 20 68 61 6e 64 6c 65 20 61 6e 64 20 53 51 4c 49   handle and SQLI
6760: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
6770: 64 2e 20 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  d. .**.** Otherw
6780: 69 73 65 2c 20 69 66 20 61 6e 20 65 72 72 6f 72  ise, if an error
6790: 20 6f 63 63 75 72 73 2c 20 2a 70 70 53 74 6d 74   occurs, *ppStmt
67a0: 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   is set to NULL 
67b0: 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
67c0: 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 49  e.** returned. I
67d0: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 2a 70 7a  n this case, *pz
67e0: 45 72 72 6d 73 67 20 6d 61 79 20 61 6c 73 6f 20  Errmsg may also 
67f0: 62 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  be set to point 
6800: 74 6f 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6d  to an error.** m
6810: 65 73 73 61 67 65 2e 20 49 74 20 69 73 20 74 68  essage. It is th
6820: 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
6830: 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
6840: 6f 20 66 72 65 65 20 74 68 69 73 20 65 72 72 6f  o free this erro
6850: 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 62 75 66  r message.** buf
6860: 66 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65  fer using sqlite
6870: 33 5f 66 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  3_free()..**.** 
6880: 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 53 71 6c  If argument zSql
6890: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20 66   is NULL, this f
68a0: 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20  unction assumes 
68b0: 74 68 61 74 20 61 6e 20 4f 4f 4d 20 68 61 73 20  that an OOM has 
68c0: 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20 49 6e 20  occurred..** In 
68d0: 74 68 69 73 20 63 61 73 65 20 53 51 4c 49 54 45  this case SQLITE
68e0: 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
68f0: 65 64 20 61 6e 64 20 2a 70 70 53 74 6d 74 20 73  ed and *ppStmt s
6900: 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  et to NULL..*/.s
6910: 74 61 74 69 63 20 69 6e 74 20 70 72 65 70 61 72  tatic int prepar
6920: 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45  eFreeAndCollectE
6930: 72 72 6f 72 28 0a 20 20 73 71 6c 69 74 65 33 20  rror(.  sqlite3 
6940: 2a 64 62 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f  *db, .  sqlite3_
6950: 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 0a 20  stmt **ppStmt,. 
6960: 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 6d 73 67   char **pzErrmsg
6970: 2c 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 0a 29  ,.  char *zSql.)
6980: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
6990: 73 65 72 74 28 20 2a 70 7a 45 72 72 6d 73 67 3d  sert( *pzErrmsg=
69a0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c  =0 );.  if( zSql
69b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
69c0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
69d0: 20 20 2a 70 70 53 74 6d 74 20 3d 20 30 3b 0a 20    *ppStmt = 0;. 
69e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
69f0: 20 70 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65   prepareAndColle
6a00: 63 74 45 72 72 6f 72 28 64 62 2c 20 70 70 53 74  ctError(db, ppSt
6a10: 6d 74 2c 20 70 7a 45 72 72 6d 73 67 2c 20 7a 53  mt, pzErrmsg, zS
6a20: 71 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ql);.    sqlite3
6a30: 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d  _free(zSql);.  }
6a40: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
6a50: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
6a60: 52 62 75 4f 62 6a 49 74 65 72 2e 61 7a 54 62 6c  RbuObjIter.azTbl
6a70: 43 6f 6c 5b 5d 20 61 6e 64 20 52 62 75 4f 62 6a  Col[] and RbuObj
6a80: 49 74 65 72 2e 61 62 54 62 6c 50 6b 5b 5d 20 61  Iter.abTblPk[] a
6a90: 72 72 61 79 73 20 61 6c 6c 6f 63 61 74 65 64 0a  rrays allocated.
6aa0: 2a 2a 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ** by an earlier
6ab0: 20 63 61 6c 6c 20 74 6f 20 72 62 75 4f 62 6a 49   call to rbuObjI
6ac0: 74 65 72 43 61 63 68 65 54 61 62 6c 65 49 6e 66  terCacheTableInf
6ad0: 6f 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  o()..*/.static v
6ae0: 6f 69 64 20 72 62 75 4f 62 6a 49 74 65 72 46 72  oid rbuObjIterFr
6af0: 65 65 43 6f 6c 73 28 52 62 75 4f 62 6a 49 74 65  eeCols(RbuObjIte
6b00: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74  r *pIter){.  int
6b10: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
6b20: 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b  <pIter->nTblCol;
6b30: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
6b40: 65 33 5f 66 72 65 65 28 70 49 74 65 72 2d 3e 61  e3_free(pIter->a
6b50: 7a 54 62 6c 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20  zTblCol[i]);.   
6b60: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
6b70: 74 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65 5b 69  ter->azTblType[i
6b80: 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ]);.  }.  sqlite
6b90: 33 5f 66 72 65 65 28 70 49 74 65 72 2d 3e 61 7a  3_free(pIter->az
6ba0: 54 62 6c 43 6f 6c 29 3b 0a 20 20 70 49 74 65 72  TblCol);.  pIter
6bb0: 2d 3e 61 7a 54 62 6c 43 6f 6c 20 3d 20 30 3b 0a  ->azTblCol = 0;.
6bc0: 20 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 54 79    pIter->azTblTy
6bd0: 70 65 20 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d  pe = 0;.  pIter-
6be0: 3e 61 69 53 72 63 4f 72 64 65 72 20 3d 20 30 3b  >aiSrcOrder = 0;
6bf0: 0a 20 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50  .  pIter->abTblP
6c00: 6b 20 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e  k = 0;.  pIter->
6c10: 61 62 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20  abNotNull = 0;. 
6c20: 20 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20   pIter->nTblCol 
6c30: 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e 65 54  = 0;.  pIter->eT
6c40: 79 70 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ype = 0;        
6c50: 20 20 20 20 20 20 20 2f 2a 20 49 6e 76 61 6c 69         /* Invali
6c60: 64 20 76 61 6c 75 65 20 2a 2f 0a 7d 0a 0a 2f 2a  d value */.}../*
6c70: 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65 20 61 6c 6c  .** Finalize all
6c80: 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6e 64 20   statements and 
6c90: 66 72 65 65 20 61 6c 6c 20 61 6c 6c 6f 63 61 74  free all allocat
6ca0: 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 73 70  ions that are sp
6cb0: 65 63 69 66 69 63 20 74 6f 0a 2a 2a 20 74 68 65  ecific to.** the
6cc0: 20 63 75 72 72 65 6e 74 20 6f 62 6a 65 63 74 20   current object 
6cd0: 28 74 61 62 6c 65 2f 69 6e 64 65 78 20 70 61 69  (table/index pai
6ce0: 72 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  r)..*/.static vo
6cf0: 69 64 20 72 62 75 4f 62 6a 49 74 65 72 43 6c 65  id rbuObjIterCle
6d00: 61 72 53 74 61 74 65 6d 65 6e 74 73 28 52 62 75  arStatements(Rbu
6d10: 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 29 7b  ObjIter *pIter){
6d20: 0a 20 20 52 62 75 55 70 64 61 74 65 53 74 6d 74  .  RbuUpdateStmt
6d30: 20 2a 70 55 70 3b 0a 0a 20 20 73 71 6c 69 74 65   *pUp;..  sqlite
6d40: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 49 74 65 72  3_finalize(pIter
6d50: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71  ->pSelect);.  sq
6d60: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
6d70: 49 74 65 72 2d 3e 70 49 6e 73 65 72 74 29 3b 0a  Iter->pInsert);.
6d80: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
6d90: 7a 65 28 70 49 74 65 72 2d 3e 70 44 65 6c 65 74  ze(pIter->pDelet
6da0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  e);.  sqlite3_fi
6db0: 6e 61 6c 69 7a 65 28 70 49 74 65 72 2d 3e 70 54  nalize(pIter->pT
6dc0: 6d 70 49 6e 73 65 72 74 29 3b 0a 20 20 70 55 70  mpInsert);.  pUp
6dd0: 20 3d 20 70 49 74 65 72 2d 3e 70 52 62 75 55 70   = pIter->pRbuUp
6de0: 64 61 74 65 3b 0a 20 20 77 68 69 6c 65 28 20 70  date;.  while( p
6df0: 55 70 20 29 7b 0a 20 20 20 20 52 62 75 55 70 64  Up ){.    RbuUpd
6e00: 61 74 65 53 74 6d 74 20 2a 70 54 6d 70 20 3d 20  ateStmt *pTmp = 
6e10: 70 55 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pUp->pNext;.    
6e20: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
6e30: 28 70 55 70 2d 3e 70 55 70 64 61 74 65 29 3b 0a  (pUp->pUpdate);.
6e40: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
6e50: 28 70 55 70 29 3b 0a 20 20 20 20 70 55 70 20 3d  (pUp);.    pUp =
6e60: 20 70 54 6d 70 3b 0a 20 20 7d 0a 20 20 0a 20 20   pTmp;.  }.  .  
6e70: 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 20 3d  pIter->pSelect =
6e80: 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e 70 49 6e   0;.  pIter->pIn
6e90: 73 65 72 74 20 3d 20 30 3b 0a 20 20 70 49 74 65  sert = 0;.  pIte
6ea0: 72 2d 3e 70 44 65 6c 65 74 65 20 3d 20 30 3b 0a  r->pDelete = 0;.
6eb0: 20 20 70 49 74 65 72 2d 3e 70 52 62 75 55 70 64    pIter->pRbuUpd
6ec0: 61 74 65 20 3d 20 30 3b 0a 20 20 70 49 74 65 72  ate = 0;.  pIter
6ed0: 2d 3e 70 54 6d 70 49 6e 73 65 72 74 20 3d 20 30  ->pTmpInsert = 0
6ee0: 3b 0a 20 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 20  ;.  pIter->nCol 
6ef0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  = 0;.}../*.** Cl
6f00: 65 61 6e 20 75 70 20 61 6e 79 20 72 65 73 6f 75  ean up any resou
6f10: 72 63 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  rces allocated a
6f20: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 74  s part of the it
6f30: 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 61  erator object pa
6f40: 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 6f  ssed.** as the o
6f50: 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  nly argument..*/
6f60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
6f70: 4f 62 6a 49 74 65 72 46 69 6e 61 6c 69 7a 65 28  ObjIterFinalize(
6f80: 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65  RbuObjIter *pIte
6f90: 72 29 7b 0a 20 20 72 62 75 4f 62 6a 49 74 65 72  r){.  rbuObjIter
6fa0: 43 6c 65 61 72 53 74 61 74 65 6d 65 6e 74 73 28  ClearStatements(
6fb0: 70 49 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  pIter);.  sqlite
6fc0: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 49 74 65 72  3_finalize(pIter
6fd0: 2d 3e 70 54 62 6c 49 74 65 72 29 3b 0a 20 20 73  ->pTblIter);.  s
6fe0: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
6ff0: 70 49 74 65 72 2d 3e 70 49 64 78 49 74 65 72 29  pIter->pIdxIter)
7000: 3b 0a 20 20 72 62 75 4f 62 6a 49 74 65 72 46 72  ;.  rbuObjIterFr
7010: 65 65 43 6f 6c 73 28 70 49 74 65 72 29 3b 0a 20  eeCols(pIter);. 
7020: 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30   memset(pIter, 0
7030: 2c 20 73 69 7a 65 6f 66 28 52 62 75 4f 62 6a 49  , sizeof(RbuObjI
7040: 74 65 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ter));.}../*.** 
7050: 41 64 76 61 6e 63 65 20 74 68 65 20 69 74 65 72  Advance the iter
7060: 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  ator to the next
7070: 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   position..**.**
7080: 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
7090: 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  urs, SQLITE_OK i
70a0: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
70b0: 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c  he iterator is l
70c0: 65 66 74 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67  eft .** pointing
70d0: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74   to the next ent
70e0: 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61  ry. Otherwise, a
70f0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  n error code and
7100: 20 6d 65 73 73 61 67 65 20 69 73 20 0a 2a 2a 20   message is .** 
7110: 6c 65 66 74 20 69 6e 20 74 68 65 20 52 42 55 20  left in the RBU 
7120: 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73  handle passed as
7130: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
7140: 65 6e 74 2e 20 41 20 63 6f 70 79 20 6f 66 20 74  ent. A copy of t
7150: 68 65 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64  he .** error cod
7160: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
7170: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75  /.static int rbu
7180: 4f 62 6a 49 74 65 72 4e 65 78 74 28 73 71 6c 69  ObjIterNext(sqli
7190: 74 65 33 72 62 75 20 2a 70 2c 20 52 62 75 4f 62  te3rbu *p, RbuOb
71a0: 6a 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  jIter *pIter){. 
71b0: 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b   int rc = p->rc;
71c0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
71d0: 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  E_OK ){..    /* 
71e0: 46 72 65 65 20 61 6e 79 20 53 51 4c 69 74 65 20  Free any SQLite 
71f0: 73 74 61 74 65 6d 65 6e 74 73 20 75 73 65 64 20  statements used 
7200: 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69 6e 67  while processing
7210: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6f 62   the previous ob
7220: 6a 65 63 74 20 2a 2f 20 0a 20 20 20 20 72 62 75  ject */ .    rbu
7230: 4f 62 6a 49 74 65 72 43 6c 65 61 72 53 74 61 74  ObjIterClearStat
7240: 65 6d 65 6e 74 73 28 70 49 74 65 72 29 3b 0a 20  ements(pIter);. 
7250: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 7a 49     if( pIter->zI
7260: 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  dx==0 ){.      r
7270: 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
7280: 28 70 2d 3e 64 62 4d 61 69 6e 2c 0a 20 20 20 20  (p->dbMain,.    
7290: 20 20 20 20 20 20 22 44 52 4f 50 20 54 52 49 47        "DROP TRIG
72a0: 47 45 52 20 49 46 20 45 58 49 53 54 53 20 74 65  GER IF EXISTS te
72b0: 6d 70 2e 72 62 75 5f 69 6e 73 65 72 74 5f 74 72  mp.rbu_insert_tr
72c0: 3b 22 0a 20 20 20 20 20 20 20 20 20 20 22 44 52  ;".          "DR
72d0: 4f 50 20 54 52 49 47 47 45 52 20 49 46 20 45 58  OP TRIGGER IF EX
72e0: 49 53 54 53 20 74 65 6d 70 2e 72 62 75 5f 75 70  ISTS temp.rbu_up
72f0: 64 61 74 65 31 5f 74 72 3b 22 0a 20 20 20 20 20  date1_tr;".     
7300: 20 20 20 20 20 22 44 52 4f 50 20 54 52 49 47 47       "DROP TRIGG
7310: 45 52 20 49 46 20 45 58 49 53 54 53 20 74 65 6d  ER IF EXISTS tem
7320: 70 2e 72 62 75 5f 75 70 64 61 74 65 32 5f 74 72  p.rbu_update2_tr
7330: 3b 22 0a 20 20 20 20 20 20 20 20 20 20 22 44 52  ;".          "DR
7340: 4f 50 20 54 52 49 47 47 45 52 20 49 46 20 45 58  OP TRIGGER IF EX
7350: 49 53 54 53 20 74 65 6d 70 2e 72 62 75 5f 64 65  ISTS temp.rbu_de
7360: 6c 65 74 65 5f 74 72 3b 22 0a 20 20 20 20 20 20  lete_tr;".      
7370: 20 20 20 20 2c 20 30 2c 20 30 2c 20 26 70 2d 3e      , 0, 0, &p->
7380: 7a 45 72 72 6d 73 67 0a 20 20 20 20 20 20 29 3b  zErrmsg.      );
7390: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
73a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
73b0: 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
73c0: 2d 3e 62 43 6c 65 61 6e 75 70 20 29 7b 0a 20 20  ->bCleanup ){.  
73d0: 20 20 20 20 20 20 72 62 75 4f 62 6a 49 74 65 72        rbuObjIter
73e0: 46 72 65 65 43 6f 6c 73 28 70 49 74 65 72 29 3b  FreeCols(pIter);
73f0: 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
7400: 62 43 6c 65 61 6e 75 70 20 3d 20 30 3b 0a 20 20  bCleanup = 0;.  
7410: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
7420: 65 33 5f 73 74 65 70 28 70 49 74 65 72 2d 3e 70  e3_step(pIter->p
7430: 54 62 6c 49 74 65 72 29 3b 0a 20 20 20 20 20 20  TblIter);.      
7440: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
7450: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20  _ROW ){.        
7460: 20 20 72 63 20 3d 20 72 65 73 65 74 41 6e 64 43    rc = resetAndC
7470: 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 49 74 65  ollectError(pIte
7480: 72 2d 3e 70 54 62 6c 49 74 65 72 2c 20 26 70 2d  r->pTblIter, &p-
7490: 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 20  >zErrmsg);.     
74a0: 20 20 20 20 20 70 49 74 65 72 2d 3e 7a 54 62 6c       pIter->zTbl
74b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
74c0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
74d0: 49 74 65 72 2d 3e 7a 54 62 6c 20 3d 20 28 63 6f  Iter->zTbl = (co
74e0: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
74f0: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 49  3_column_text(pI
7500: 74 65 72 2d 3e 70 54 62 6c 49 74 65 72 2c 20 30  ter->pTblIter, 0
7510: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  );.          pIt
7520: 65 72 2d 3e 7a 44 61 74 61 54 62 6c 20 3d 20 28  er->zDataTbl = (
7530: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
7540: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
7550: 70 49 74 65 72 2d 3e 70 54 62 6c 49 74 65 72 2c  pIter->pTblIter,
7560: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  1);.          rc
7570: 20 3d 20 28 70 49 74 65 72 2d 3e 7a 44 61 74 61   = (pIter->zData
7580: 54 62 6c 20 26 26 20 70 49 74 65 72 2d 3e 7a 54  Tbl && pIter->zT
7590: 62 6c 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  bl) ? SQLITE_OK 
75a0: 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  : SQLITE_NOMEM;.
75b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
75c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
75d0: 66 28 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d  f( pIter->zIdx==
75e0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
75f0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 64  qlite3_stmt *pId
7600: 78 20 3d 20 70 49 74 65 72 2d 3e 70 49 64 78 49  x = pIter->pIdxI
7610: 74 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 72  ter;.          r
7620: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
7630: 5f 74 65 78 74 28 70 49 64 78 2c 20 31 2c 20 70  _text(pIdx, 1, p
7640: 49 74 65 72 2d 3e 7a 54 62 6c 2c 20 2d 31 2c 20  Iter->zTbl, -1, 
7650: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
7660: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7670: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
7680: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
7690: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   rc = sqlite3_st
76a0: 65 70 28 70 49 74 65 72 2d 3e 70 49 64 78 49 74  ep(pIter->pIdxIt
76b0: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  er);.          i
76c0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f  f( rc!=SQLITE_RO
76d0: 57 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  W ){.           
76e0: 20 72 63 20 3d 20 72 65 73 65 74 41 6e 64 43 6f   rc = resetAndCo
76f0: 6c 6c 65 63 74 45 72 72 6f 72 28 70 49 74 65 72  llectError(pIter
7700: 2d 3e 70 49 64 78 49 74 65 72 2c 20 26 70 2d 3e  ->pIdxIter, &p->
7710: 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 20 20  zErrmsg);.      
7720: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62 43 6c        pIter->bCl
7730: 65 61 6e 75 70 20 3d 20 31 3b 0a 20 20 20 20 20  eanup = 1;.     
7740: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 7a 49         pIter->zI
7750: 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  dx = 0;.        
7760: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7770: 20 20 20 20 20 70 49 74 65 72 2d 3e 7a 49 64 78       pIter->zIdx
7780: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
7790: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
77a0: 65 78 74 28 70 49 74 65 72 2d 3e 70 49 64 78 49  ext(pIter->pIdxI
77b0: 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ter, 0);.       
77c0: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 54 6e 75       pIter->iTnu
77d0: 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  m = sqlite3_colu
77e0: 6d 6e 5f 69 6e 74 28 70 49 74 65 72 2d 3e 70 49  mn_int(pIter->pI
77f0: 64 78 49 74 65 72 2c 20 31 29 3b 0a 20 20 20 20  dxIter, 1);.    
7800: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62          pIter->b
7810: 55 6e 69 71 75 65 20 3d 20 73 71 6c 69 74 65 33  Unique = sqlite3
7820: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 49 74 65  _column_int(pIte
7830: 72 2d 3e 70 49 64 78 49 74 65 72 2c 20 32 29 3b  r->pIdxIter, 2);
7840: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
7850: 3d 20 70 49 74 65 72 2d 3e 7a 49 64 78 20 3f 20  = pIter->zIdx ? 
7860: 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49  SQLITE_OK : SQLI
7870: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
7880: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
7890: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
78a0: 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  }..  if( rc!=SQL
78b0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 62  ITE_OK ){.    rb
78c0: 75 4f 62 6a 49 74 65 72 46 69 6e 61 6c 69 7a 65  uObjIterFinalize
78d0: 28 70 49 74 65 72 29 3b 0a 20 20 20 20 70 2d 3e  (pIter);.    p->
78e0: 72 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 20 20 72  rc = rc;.  }.  r
78f0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
7900: 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e  .** The implemen
7910: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 62  tation of the rb
7920: 75 5f 74 61 72 67 65 74 5f 6e 61 6d 65 28 29 20  u_target_name() 
7930: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68  SQL function. Th
7940: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  is function.** a
7950: 63 63 65 70 74 73 20 6f 6e 65 20 6f 72 20 74 77  ccepts one or tw
7960: 6f 20 61 72 67 75 6d 65 6e 74 73 2e 20 54 68 65  o arguments. The
7970: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
7980: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
7990: 20 74 61 62 6c 65 20 2d 0a 2a 2a 20 74 68 65 20   table -.** the 
79a0: 6e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20  name of a table 
79b0: 69 6e 20 74 68 65 20 52 42 55 20 64 61 74 61 62  in the RBU datab
79c0: 61 73 65 2e 20 20 54 68 65 20 73 65 63 6f 6e 64  ase.  The second
79d0: 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65  , if it is prese
79e0: 6e 74 2c 20 69 73 20 31 0a 2a 2a 20 66 6f 72 20  nt, is 1.** for 
79f0: 61 20 76 69 65 77 20 6f 72 20 30 20 66 6f 72 20  a view or 0 for 
7a00: 61 20 74 61 62 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  a table. .**.** 
7a10: 46 6f 72 20 61 20 6e 6f 6e 2d 76 61 63 75 75 6d  For a non-vacuum
7a20: 20 52 42 55 20 68 61 6e 64 6c 65 2c 20 69 66 20   RBU handle, if 
7a30: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d  the table name m
7a40: 61 74 63 68 65 73 20 74 68 65 20 70 61 74 74 65  atches the patte
7a50: 72 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 61  rn:.**.**     da
7a60: 74 61 5b 30 2d 39 5d 5f 3c 6e 61 6d 65 3e 0a 2a  ta[0-9]_<name>.*
7a70: 2a 0a 2a 2a 20 77 68 65 72 65 20 3c 6e 61 6d 65  *.** where <name
7a80: 3e 20 69 73 20 61 6e 79 20 73 65 71 75 65 6e 63  > is any sequenc
7a90: 65 20 6f 66 20 31 20 6f 72 20 6d 6f 72 65 20 63  e of 1 or more c
7aa0: 68 61 72 61 63 74 65 72 73 2c 20 3c 6e 61 6d 65  haracters, <name
7ab0: 3e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  > is returned..*
7ac0: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
7ad0: 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  the only argumen
7ae0: 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  t does not match
7af0: 20 74 68 65 20 61 62 6f 76 65 20 70 61 74 74 65   the above patte
7b00: 72 6e 2c 20 61 6e 20 53 51 4c 0a 2a 2a 20 4e 55  rn, an SQL.** NU
7b10: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  LL is returned..
7b20: 2a 2a 0a 2a 2a 20 20 20 20 20 22 64 61 74 61 5f  **.**     "data_
7b30: 74 31 22 20 20 20 20 20 2d 3e 20 22 74 31 22 0a  t1"     -> "t1".
7b40: 2a 2a 20 20 20 20 20 22 64 61 74 61 30 31 32 33  **     "data0123
7b50: 5f 74 32 22 20 2d 3e 20 22 74 32 22 0a 2a 2a 20  _t2" -> "t2".** 
7b60: 20 20 20 20 22 64 61 74 61 41 42 5f 74 33 22 20      "dataAB_t3" 
7b70: 20 20 2d 3e 20 4e 55 4c 4c 0a 2a 2a 0a 2a 2a 20    -> NULL.**.** 
7b80: 46 6f 72 20 61 6e 20 72 62 75 20 76 61 63 75 75  For an rbu vacuu
7b90: 6d 20 68 61 6e 64 6c 65 2c 20 61 20 63 6f 70 79  m handle, a copy
7ba0: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 61 72   of the first ar
7bb0: 67 75 6d 65 6e 74 20 69 73 20 72 65 74 75 72 6e  gument is return
7bc0: 65 64 20 69 66 0a 2a 2a 20 74 68 65 20 73 65 63  ed if.** the sec
7bd0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
7be0: 65 69 74 68 65 72 20 6d 69 73 73 69 6e 67 20 6f  either missing o
7bf0: 72 20 30 20 28 6e 6f 74 20 61 20 76 69 65 77 29  r 0 (not a view)
7c00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7c10: 20 72 62 75 54 61 72 67 65 74 4e 61 6d 65 46 75   rbuTargetNameFu
7c20: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
7c30: 6e 74 65 78 74 20 2a 70 43 74 78 2c 0a 20 20 69  ntext *pCtx,.  i
7c40: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
7c50: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
7c60: 29 7b 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20  ){.  sqlite3rbu 
7c70: 2a 70 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65  *p = sqlite3_use
7c80: 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20  r_data(pCtx);.  
7c90: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 3b  const char *zIn;
7ca0: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
7cb0: 3d 31 20 7c 7c 20 61 72 67 63 3d 3d 32 20 29 3b  =1 || argc==2 );
7cc0: 0a 0a 20 20 7a 49 6e 20 3d 20 28 63 6f 6e 73 74  ..  zIn = (const
7cd0: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
7ce0: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
7cf0: 5d 29 3b 0a 20 20 69 66 28 20 7a 49 6e 20 29 7b  ]);.  if( zIn ){
7d00: 0a 20 20 20 20 69 66 28 20 72 62 75 49 73 56 61  .    if( rbuIsVa
7d10: 63 75 75 6d 28 70 29 20 29 7b 0a 20 20 20 20 20  cuum(p) ){.     
7d20: 20 69 66 28 20 61 72 67 63 3d 3d 31 20 7c 7c 20   if( argc==1 || 
7d30: 30 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  0==sqlite3_value
7d40: 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 20 29 7b  _int(argv[1]) ){
7d50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7d60: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74  _result_text(pCt
7d70: 78 2c 20 7a 49 6e 2c 20 2d 31 2c 20 53 51 4c 49  x, zIn, -1, SQLI
7d80: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
7d90: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
7da0: 20 20 20 20 20 69 66 28 20 73 74 72 6c 65 6e 28       if( strlen(
7db0: 7a 49 6e 29 3e 34 20 26 26 20 6d 65 6d 63 6d 70  zIn)>4 && memcmp
7dc0: 28 22 64 61 74 61 22 2c 20 7a 49 6e 2c 20 34 29  ("data", zIn, 4)
7dd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
7de0: 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f  nt i;.        fo
7df0: 72 28 69 3d 34 3b 20 7a 49 6e 5b 69 5d 3e 3d 27  r(i=4; zIn[i]>='
7e00: 30 27 20 26 26 20 7a 49 6e 5b 69 5d 3c 3d 27 39  0' && zIn[i]<='9
7e10: 27 3b 20 69 2b 2b 29 3b 0a 20 20 20 20 20 20 20  '; i++);.       
7e20: 20 69 66 28 20 7a 49 6e 5b 69 5d 3d 3d 27 5f 27   if( zIn[i]=='_'
7e30: 20 26 26 20 7a 49 6e 5b 69 2b 31 5d 20 29 7b 0a   && zIn[i+1] ){.
7e40: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
7e50: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43  3_result_text(pC
7e60: 74 78 2c 20 26 7a 49 6e 5b 69 2b 31 5d 2c 20 2d  tx, &zIn[i+1], -
7e70: 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
7e80: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
7e90: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
7ea0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
7eb0: 7a 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ze the iterator 
7ec0: 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
7ed0: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
7ee0: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49  rgument..**.** I
7ef0: 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
7f00: 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  s, SQLITE_OK is 
7f10: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
7f20: 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c 65 66   iterator is lef
7f30: 74 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74  t .** pointing t
7f40: 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
7f50: 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  y. Otherwise, an
7f60: 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20   error code and 
7f70: 6d 65 73 73 61 67 65 20 69 73 20 0a 2a 2a 20 6c  message is .** l
7f80: 65 66 74 20 69 6e 20 74 68 65 20 52 42 55 20 68  eft in the RBU h
7f90: 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20  andle passed as 
7fa0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
7fb0: 6e 74 2e 20 41 20 63 6f 70 79 20 6f 66 20 74 68  nt. A copy of th
7fc0: 65 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  e .** error code
7fd0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
7fe0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 4f  .static int rbuO
7ff0: 62 6a 49 74 65 72 46 69 72 73 74 28 73 71 6c 69  bjIterFirst(sqli
8000: 74 65 33 72 62 75 20 2a 70 2c 20 52 62 75 4f 62  te3rbu *p, RbuOb
8010: 6a 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  jIter *pIter){. 
8020: 20 69 6e 74 20 72 63 3b 0a 20 20 6d 65 6d 73 65   int rc;.  memse
8030: 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65  t(pIter, 0, size
8040: 6f 66 28 52 62 75 4f 62 6a 49 74 65 72 29 29 3b  of(RbuObjIter));
8050: 0a 0a 20 20 72 63 20 3d 20 70 72 65 70 61 72 65  ..  rc = prepare
8060: 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  FreeAndCollectEr
8070: 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20 26 70  ror(p->dbRbu, &p
8080: 49 74 65 72 2d 3e 70 54 62 6c 49 74 65 72 2c 20  Iter->pTblIter, 
8090: 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20  &p->zErrmsg, .  
80a0: 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
80b0: 66 28 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54  f(.      "SELECT
80c0: 20 72 62 75 5f 74 61 72 67 65 74 5f 6e 61 6d 65   rbu_target_name
80d0: 28 6e 61 6d 65 2c 20 74 79 70 65 3d 27 76 69 65  (name, type='vie
80e0: 77 27 29 20 41 53 20 74 61 72 67 65 74 2c 20 6e  w') AS target, n
80f0: 61 6d 65 20 22 0a 20 20 20 20 20 20 22 46 52 4f  ame ".      "FRO
8100: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
8110: 22 0a 20 20 20 20 20 20 22 57 48 45 52 45 20 74  ".      "WHERE t
8120: 79 70 65 20 49 4e 20 28 27 74 61 62 6c 65 27 2c  ype IN ('table',
8130: 20 27 76 69 65 77 27 29 20 41 4e 44 20 74 61 72   'view') AND tar
8140: 67 65 74 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20  get IS NOT NULL 
8150: 22 0a 20 20 20 20 20 20 22 20 25 73 20 22 0a 20  ".      " %s ". 
8160: 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 6e       "ORDER BY n
8170: 61 6d 65 22 0a 20 20 2c 20 72 62 75 49 73 56 61  ame".  , rbuIsVa
8180: 63 75 75 6d 28 70 29 20 3f 20 22 41 4e 44 20 72  cuum(p) ? "AND r
8190: 6f 6f 74 70 61 67 65 21 3d 30 20 41 4e 44 20 72  ootpage!=0 AND r
81a0: 6f 6f 74 70 61 67 65 20 49 53 20 4e 4f 54 20 4e  ootpage IS NOT N
81b0: 55 4c 4c 22 20 3a 20 22 22 29 29 3b 0a 0a 20 20  ULL" : ""));..  
81c0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
81d0: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 72  K ){.    rc = pr
81e0: 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45  epareAndCollectE
81f0: 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  rror(p->dbMain, 
8200: 26 70 49 74 65 72 2d 3e 70 49 64 78 49 74 65 72  &pIter->pIdxIter
8210: 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20  , &p->zErrmsg,. 
8220: 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e         "SELECT n
8230: 61 6d 65 2c 20 72 6f 6f 74 70 61 67 65 2c 20 73  ame, rootpage, s
8240: 71 6c 20 49 53 20 4e 55 4c 4c 20 4f 52 20 73 75  ql IS NULL OR su
8250: 62 73 74 72 28 38 2c 20 36 29 3d 3d 27 55 4e 49  bstr(8, 6)=='UNI
8260: 51 55 45 27 20 22 0a 20 20 20 20 20 20 20 20 22  QUE' ".        "
8270: 20 20 46 52 4f 4d 20 6d 61 69 6e 2e 73 71 6c 69    FROM main.sqli
8280: 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20  te_master ".    
8290: 20 20 20 20 22 20 20 57 48 45 52 45 20 74 79 70      "  WHERE typ
82a0: 65 3d 27 69 6e 64 65 78 27 20 41 4e 44 20 74 62  e='index' AND tb
82b0: 6c 5f 6e 61 6d 65 20 3d 20 3f 22 0a 20 20 20 20  l_name = ?".    
82c0: 29 3b 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d  );.  }..  pIter-
82d0: 3e 62 43 6c 65 61 6e 75 70 20 3d 20 31 3b 0a 20  >bCleanup = 1;. 
82e0: 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 72   p->rc = rc;.  r
82f0: 65 74 75 72 6e 20 72 62 75 4f 62 6a 49 74 65 72  eturn rbuObjIter
8300: 4e 65 78 74 28 70 2c 20 70 49 74 65 72 29 3b 0a  Next(p, pIter);.
8310: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
8320: 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e   a wrapper aroun
8330: 64 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  d "sqlite3_mprin
8340: 74 66 28 7a 46 6d 74 2c 20 2e 2e 2e 29 22 2e 20  tf(zFmt, ...)". 
8350: 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73  If an OOM occurs
8360: 2c 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f  ,.** an error co
8370: 64 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  de is stored in 
8380: 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65 20 70  the RBU handle p
8390: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
83a0: 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  st argument..**.
83b0: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68  ** If an error h
83c0: 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
83d0: 72 65 64 20 28 70 2d 3e 72 63 20 69 73 20 61 6c  red (p->rc is al
83e0: 72 65 61 64 79 20 73 65 74 20 74 6f 20 73 6f 6d  ready set to som
83f0: 65 74 68 69 6e 67 20 6f 74 68 65 72 0a 2a 2a 20  ething other.** 
8400: 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 29 2c  than SQLITE_OK),
8410: 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
8420: 69 6f 6e 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  ion returns NULL
8430: 20 77 69 74 68 6f 75 74 20 6d 6f 64 69 66 79 69   without modifyi
8440: 6e 67 20 74 68 65 0a 2a 2a 20 73 74 6f 72 65 64  ng the.** stored
8450: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 6e 20   error code. In 
8460: 74 68 69 73 20 63 61 73 65 20 69 74 20 73 74 69  this case it sti
8470: 6c 6c 20 63 61 6c 6c 73 20 73 71 6c 69 74 65 33  ll calls sqlite3
8480: 5f 66 72 65 65 28 29 20 6f 6e 20 61 6e 79 20 0a  _free() on any .
8490: 2a 2a 20 70 72 69 6e 74 66 28 29 20 70 61 72 61  ** printf() para
84a0: 6d 65 74 65 72 73 20 61 73 73 6f 63 69 61 74 65  meters associate
84b0: 64 20 77 69 74 68 20 25 7a 20 63 6f 6e 76 65 72  d with %z conver
84c0: 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  sions..*/.static
84d0: 20 63 68 61 72 20 2a 72 62 75 4d 50 72 69 6e 74   char *rbuMPrint
84e0: 66 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c  f(sqlite3rbu *p,
84f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d   const char *zFm
8500: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 63 68 61 72 20  t, ...){.  char 
8510: 2a 7a 53 71 6c 20 3d 20 30 3b 0a 20 20 76 61 5f  *zSql = 0;.  va_
8520: 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74  list ap;.  va_st
8530: 61 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20  art(ap, zFmt);. 
8540: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
8550: 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61  vmprintf(zFmt, a
8560: 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  p);.  if( p->rc=
8570: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8580: 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20    if( zSql==0 ) 
8590: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
85a0: 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OMEM;.  }else{. 
85b0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
85c0: 7a 53 71 6c 29 3b 0a 20 20 20 20 7a 53 71 6c 20  zSql);.    zSql 
85d0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 76 61 5f 65 6e  = 0;.  }.  va_en
85e0: 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  d(ap);.  return 
85f0: 7a 53 71 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  zSql;.}../*.** A
8600: 72 67 75 6d 65 6e 74 20 7a 46 6d 74 20 69 73 20  rgument zFmt is 
8610: 61 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  a sqlite3_mprint
8620: 66 28 29 20 73 74 79 6c 65 20 66 6f 72 6d 61 74  f() style format
8630: 20 73 74 72 69 6e 67 2e 20 54 68 65 20 74 72 61   string. The tra
8640: 69 6c 69 6e 67 0a 2a 2a 20 61 72 67 75 6d 65 6e  iling.** argumen
8650: 74 73 20 61 72 65 20 74 68 65 20 75 73 75 61 6c  ts are the usual
8660: 20 73 75 62 73 69 74 75 74 69 6f 6e 20 76 61 6c   subsitution val
8670: 75 65 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ues. This functi
8680: 6f 6e 20 70 65 72 66 6f 72 6d 73 0a 2a 2a 20 74  on performs.** t
8690: 68 65 20 70 72 69 6e 74 66 28 29 20 73 74 79 6c  he printf() styl
86a0: 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20  e substitutions 
86b0: 61 6e 64 20 65 78 65 63 75 74 65 73 20 74 68 65  and executes the
86c0: 20 72 65 73 75 6c 74 20 61 73 20 61 6e 20 53 51   result as an SQ
86d0: 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6f  L.** statement o
86e0: 6e 20 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65  n the RBU handle
86f0: 73 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  s database..**.*
8700: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
8710: 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63  curs, an error c
8720: 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65  ode and error me
8730: 73 73 61 67 65 20 69 73 20 73 74 6f 72 65 64 20  ssage is stored 
8740: 69 6e 20 74 68 65 0a 2a 2a 20 52 42 55 20 68 61  in the.** RBU ha
8750: 6e 64 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f  ndle. If an erro
8760: 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
8770: 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73  curred when this
8780: 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20   function is.** 
8790: 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
87a0: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
87b0: 20 69 6e 74 20 72 62 75 4d 50 72 69 6e 74 66 45   int rbuMPrintfE
87c0: 78 65 63 28 73 71 6c 69 74 65 33 72 62 75 20 2a  xec(sqlite3rbu *
87d0: 70 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  p, sqlite3 *db, 
87e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74  const char *zFmt
87f0: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
8800: 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53  t ap;.  char *zS
8810: 71 6c 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  ql;.  va_start(a
8820: 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 7a 53 71 6c  p, zFmt);.  zSql
8830: 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69   = sqlite3_vmpri
8840: 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20  ntf(zFmt, ap);. 
8850: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
8860: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
8870: 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zSql==0 ){.    
8880: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
8890: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
88a0: 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  e{.      p->rc =
88b0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62   sqlite3_exec(db
88c0: 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 70  , zSql, 0, 0, &p
88d0: 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20  ->zErrmsg);.    
88e0: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
88f0: 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 76 61  free(zSql);.  va
8900: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75  _end(ap);.  retu
8910: 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a  rn p->rc;.}../*.
8920: 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 61 6c  ** Attempt to al
8930: 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72  locate and retur
8940: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
8950: 20 7a 65 72 6f 65 64 20 62 6c 6f 63 6b 20 6f 66   zeroed block of
8960: 20 6e 42 79 74 65 20 0a 2a 2a 20 62 79 74 65 73   nByte .** bytes
8970: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  . .**.** If an e
8980: 72 72 6f 72 20 28 69 2e 65 2e 20 61 6e 20 4f 4f  rror (i.e. an OO
8990: 4d 20 63 6f 6e 64 69 74 69 6f 6e 29 20 6f 63 63  M condition) occ
89a0: 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  urs, return NULL
89b0: 20 61 6e 64 20 6c 65 61 76 65 20 61 6e 20 0a 2a   and leave an .*
89c0: 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 6e 20  * error code in 
89d0: 74 68 65 20 72 62 75 20 68 61 6e 64 6c 65 20 70  the rbu handle p
89e0: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
89f0: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 4f 72 2c  st argument. Or,
8a00: 20 69 66 20 61 6e 20 0a 2a 2a 20 65 72 72 6f 72   if an .** error
8a10: 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
8a20: 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20  urred when this 
8a30: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
8a40: 65 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20  ed, return NULL 
8a50: 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  .** immediately 
8a60: 77 69 74 68 6f 75 74 20 61 74 74 65 6d 70 74 69  without attempti
8a70: 6e 67 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  ng the allocatio
8a80: 6e 20 6f 72 20 6d 6f 64 69 66 79 69 6e 67 20 74  n or modifying t
8a90: 68 65 20 73 74 6f 72 65 64 0a 2a 2a 20 65 72 72  he stored.** err
8aa0: 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
8ab0: 69 63 20 76 6f 69 64 20 2a 72 62 75 4d 61 6c 6c  ic void *rbuMall
8ac0: 6f 63 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  oc(sqlite3rbu *p
8ad0: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
8ae0: 6e 42 79 74 65 29 7b 0a 20 20 76 6f 69 64 20 2a  nByte){.  void *
8af0: 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  pRet = 0;.  if( 
8b00: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
8b10: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
8b20: 6e 42 79 74 65 3e 30 20 29 3b 0a 20 20 20 20 70  nByte>0 );.    p
8b30: 52 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Ret = sqlite3_ma
8b40: 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29 3b 0a 20  lloc64(nByte);. 
8b50: 20 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 29     if( pRet==0 )
8b60: 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
8b70: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
8b80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d    }else{.      m
8b90: 65 6d 73 65 74 28 70 52 65 74 2c 20 30 2c 20 6e  emset(pRet, 0, n
8ba0: 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Byte);.    }.  }
8bb0: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
8bc0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  }.../*.** Alloca
8bd0: 74 65 20 61 6e 64 20 7a 65 72 6f 20 74 68 65 20  te and zero the 
8be0: 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b  pIter->azTblCol[
8bf0: 5d 20 61 6e 64 20 61 62 54 62 6c 50 6b 5b 5d 20  ] and abTblPk[] 
8c00: 61 72 72 61 79 73 20 73 6f 20 74 68 61 74 0a 2a  arrays so that.*
8c10: 2a 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20  * there is room 
8c20: 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6e 43 6f  for at least nCo
8c30: 6c 20 65 6c 65 6d 65 6e 74 73 2e 20 49 66 20 61  l elements. If a
8c40: 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 73 74  n OOM occurs, st
8c50: 6f 72 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20  ore an.** error 
8c60: 63 6f 64 65 20 69 6e 20 74 68 65 20 52 42 55 20  code in the RBU 
8c70: 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73  handle passed as
8c80: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
8c90: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
8ca0: 6f 69 64 20 72 62 75 41 6c 6c 6f 63 61 74 65 49  oid rbuAllocateI
8cb0: 74 65 72 41 72 72 61 79 73 28 73 71 6c 69 74 65  terArrays(sqlite
8cc0: 33 72 62 75 20 2a 70 2c 20 52 62 75 4f 62 6a 49  3rbu *p, RbuObjI
8cd0: 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20  ter *pIter, int 
8ce0: 6e 43 6f 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33  nCol){.  sqlite3
8cf0: 5f 69 6e 74 36 34 20 6e 42 79 74 65 20 3d 20 28  _int64 nByte = (
8d00: 32 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20  2*sizeof(char*) 
8d10: 2b 20 73 69 7a 65 6f 66 28 69 6e 74 29 20 2b 20  + sizeof(int) + 
8d20: 33 2a 73 69 7a 65 6f 66 28 75 38 29 29 20 2a 20  3*sizeof(u8)) * 
8d30: 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 2a 61  nCol;.  char **a
8d40: 7a 4e 65 77 3b 0a 0a 20 20 61 7a 4e 65 77 20 3d  zNew;..  azNew =
8d50: 20 28 63 68 61 72 2a 2a 29 72 62 75 4d 61 6c 6c   (char**)rbuMall
8d60: 6f 63 28 70 2c 20 6e 42 79 74 65 29 3b 0a 20 20  oc(p, nByte);.  
8d70: 69 66 28 20 61 7a 4e 65 77 20 29 7b 0a 20 20 20  if( azNew ){.   
8d80: 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c   pIter->azTblCol
8d90: 20 3d 20 61 7a 4e 65 77 3b 0a 20 20 20 20 70 49   = azNew;.    pI
8da0: 74 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65 20 3d  ter->azTblType =
8db0: 20 26 61 7a 4e 65 77 5b 6e 43 6f 6c 5d 3b 0a 20   &azNew[nCol];. 
8dc0: 20 20 20 70 49 74 65 72 2d 3e 61 69 53 72 63 4f     pIter->aiSrcO
8dd0: 72 64 65 72 20 3d 20 28 69 6e 74 2a 29 26 70 49  rder = (int*)&pI
8de0: 74 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65 5b 6e  ter->azTblType[n
8df0: 43 6f 6c 5d 3b 0a 20 20 20 20 70 49 74 65 72 2d  Col];.    pIter-
8e00: 3e 61 62 54 62 6c 50 6b 20 3d 20 28 75 38 2a 29  >abTblPk = (u8*)
8e10: 26 70 49 74 65 72 2d 3e 61 69 53 72 63 4f 72 64  &pIter->aiSrcOrd
8e20: 65 72 5b 6e 43 6f 6c 5d 3b 0a 20 20 20 20 70 49  er[nCol];.    pI
8e30: 74 65 72 2d 3e 61 62 4e 6f 74 4e 75 6c 6c 20 3d  ter->abNotNull =
8e40: 20 28 75 38 2a 29 26 70 49 74 65 72 2d 3e 61 62   (u8*)&pIter->ab
8e50: 54 62 6c 50 6b 5b 6e 43 6f 6c 5d 3b 0a 20 20 20  TblPk[nCol];.   
8e60: 20 70 49 74 65 72 2d 3e 61 62 49 6e 64 65 78 65   pIter->abIndexe
8e70: 64 20 3d 20 28 75 38 2a 29 26 70 49 74 65 72 2d  d = (u8*)&pIter-
8e80: 3e 61 62 4e 6f 74 4e 75 6c 6c 5b 6e 43 6f 6c 5d  >abNotNull[nCol]
8e90: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
8ea0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
8eb0: 74 20 6d 75 73 74 20 62 65 20 61 20 6e 75 6c 2d  t must be a nul-
8ec0: 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
8ed0: 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  g. This function
8ee0: 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 63 6f  .** returns a co
8ef0: 70 79 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67  py of the string
8f00: 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
8f10: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
8f20: 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 74  _malloc()..** It
8f30: 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
8f40: 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
8f50: 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
8f60: 6c 79 20 66 72 65 65 20 74 68 69 73 20 6d 65 6d  ly free this mem
8f70: 6f 72 79 0a 2a 2a 20 75 73 69 6e 67 20 73 71 6c  ory.** using sql
8f80: 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2a 0a  ite3_free()..**.
8f90: 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e  ** If an OOM con
8fa0: 64 69 74 69 6f 6e 20 69 73 20 65 6e 63 6f 75 6e  dition is encoun
8fb0: 74 65 72 65 64 20 77 68 65 6e 20 61 74 74 65 6d  tered when attem
8fc0: 70 74 69 6e 67 20 74 6f 20 61 6c 6c 6f 63 61 74  pting to allocat
8fd0: 65 20 6d 65 6d 6f 72 79 2c 0a 2a 2a 20 6f 75 74  e memory,.** out
8fe0: 70 75 74 20 76 61 72 69 61 62 6c 65 20 28 2a 70  put variable (*p
8ff0: 52 63 29 20 69 73 20 73 65 74 20 74 6f 20 53 51  Rc) is set to SQ
9000: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 62 65 66 6f 72  LITE_NOMEM befor
9010: 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 4f 74 68  e returning. Oth
9020: 65 72 77 69 73 65 2c 0a 2a 2a 20 69 66 20 74 68  erwise,.** if th
9030: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 75 63  e allocation suc
9040: 63 65 65 64 73 2c 20 28 2a 70 52 63 29 20 69 73  ceeds, (*pRc) is
9050: 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e   left unchanged.
9060: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
9070: 2a 72 62 75 53 74 72 6e 64 75 70 28 63 6f 6e 73  *rbuStrndup(cons
9080: 74 20 63 68 61 72 20 2a 7a 53 74 72 2c 20 69 6e  t char *zStr, in
9090: 74 20 2a 70 52 63 29 7b 0a 20 20 63 68 61 72 20  t *pRc){.  char 
90a0: 2a 7a 52 65 74 20 3d 20 30 3b 0a 0a 20 20 61 73  *zRet = 0;..  as
90b0: 73 65 72 74 28 20 2a 70 52 63 3d 3d 53 51 4c 49  sert( *pRc==SQLI
90c0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 7a  TE_OK );.  if( z
90d0: 53 74 72 20 29 7b 0a 20 20 20 20 73 69 7a 65 5f  Str ){.    size_
90e0: 74 20 6e 43 6f 70 79 20 3d 20 73 74 72 6c 65 6e  t nCopy = strlen
90f0: 28 7a 53 74 72 29 20 2b 20 31 3b 0a 20 20 20 20  (zStr) + 1;.    
9100: 7a 52 65 74 20 3d 20 28 63 68 61 72 2a 29 73 71  zRet = (char*)sq
9110: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e  lite3_malloc64(n
9120: 43 6f 70 79 29 3b 0a 20 20 20 20 69 66 28 20 7a  Copy);.    if( z
9130: 52 65 74 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  Ret ){.      mem
9140: 63 70 79 28 7a 52 65 74 2c 20 7a 53 74 72 2c 20  cpy(zRet, zStr, 
9150: 6e 43 6f 70 79 29 3b 0a 20 20 20 20 7d 65 6c 73  nCopy);.    }els
9160: 65 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20  e{.      *pRc = 
9170: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
9180: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
9190: 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n zRet;.}../*.**
91a0: 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20 73 74   Finalize the st
91b0: 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61  atement passed a
91c0: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
91d0: 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ument..**.** If 
91e0: 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  the sqlite3_fina
91f0: 6c 69 7a 65 28 29 20 63 61 6c 6c 20 69 6e 64 69  lize() call indi
9200: 63 61 74 65 73 20 74 68 61 74 20 61 6e 20 65 72  cates that an er
9210: 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 64 20  ror occurs, and 
9220: 74 68 65 0a 2a 2a 20 72 62 75 20 68 61 6e 64 6c  the.** rbu handl
9230: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
9240: 6e 6f 74 20 61 6c 72 65 61 64 79 20 73 65 74 2c  not already set,
9250: 20 73 65 74 20 74 68 65 20 65 72 72 6f 72 20 63   set the error c
9260: 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 0a 2a 2a  ode and error.**
9270: 20 6d 65 73 73 61 67 65 20 61 63 63 6f 72 64 69   message accordi
9280: 6e 67 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ngly..*/.static 
9290: 76 6f 69 64 20 72 62 75 46 69 6e 61 6c 69 7a 65  void rbuFinalize
92a0: 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20  (sqlite3rbu *p, 
92b0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
92c0: 74 6d 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  tmt){.  sqlite3 
92d0: 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 64 62  *db = sqlite3_db
92e0: 5f 68 61 6e 64 6c 65 28 70 53 74 6d 74 29 3b 0a  _handle(pStmt);.
92f0: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
9300: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
9310: 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  t);.  if( p->rc=
9320: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
9330: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
9340: 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
9350: 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20     p->zErrmsg = 
9360: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
9370: 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  "%s", sqlite3_er
9380: 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d 0a 7d  rmsg(db));.  }.}
9390: 0a 0a 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74  ../* Determine t
93a0: 68 65 20 74 79 70 65 20 6f 66 20 61 20 74 61 62  he type of a tab
93b0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 70 65 54 79  le..**.**   peTy
93c0: 70 65 20 69 73 20 6f 66 20 74 79 70 65 20 28 69  pe is of type (i
93d0: 6e 74 2a 29 2c 20 61 20 70 6f 69 6e 74 65 72 20  nt*), a pointer 
93e0: 74 6f 20 61 6e 20 6f 75 74 70 75 74 20 70 61 72  to an output par
93f0: 61 6d 65 74 65 72 20 6f 66 20 74 79 70 65 0a 2a  ameter of type.*
9400: 2a 20 20 20 28 69 6e 74 29 2e 20 54 68 69 73 20  *   (int). This 
9410: 63 61 6c 6c 20 73 65 74 73 20 74 68 65 20 6f 75  call sets the ou
9420: 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 20 61  tput parameter a
9430: 73 20 66 6f 6c 6c 6f 77 73 2c 20 64 65 70 65 6e  s follows, depen
9440: 64 69 6e 67 0a 2a 2a 20 20 20 6f 6e 20 74 68 65  ding.**   on the
9450: 20 74 79 70 65 20 6f 66 20 74 68 65 20 74 61 62   type of the tab
9460: 6c 65 20 73 70 65 63 69 66 69 65 64 20 62 79 20  le specified by 
9470: 70 61 72 61 6d 65 74 65 72 73 20 64 62 4e 61 6d  parameters dbNam
9480: 65 20 61 6e 64 20 7a 54 62 6c 2e 0a 2a 2a 0a 2a  e and zTbl..**.*
9490: 2a 20 20 20 20 20 52 42 55 5f 50 4b 5f 4e 4f 54  *     RBU_PK_NOT
94a0: 41 42 4c 45 3a 20 20 20 20 20 20 20 4e 6f 20 73  ABLE:       No s
94b0: 75 63 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20  uch table..**   
94c0: 20 20 52 42 55 5f 50 4b 5f 4e 4f 4e 45 3a 20 20    RBU_PK_NONE:  
94d0: 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 68 61          Table ha
94e0: 73 20 61 6e 20 69 6d 70 6c 69 63 69 74 20 72 6f  s an implicit ro
94f0: 77 69 64 2e 0a 2a 2a 20 20 20 20 20 52 42 55 5f  wid..**     RBU_
9500: 50 4b 5f 49 50 4b 3a 20 20 20 20 20 20 20 20 20  PK_IPK:         
9510: 20 20 54 61 62 6c 65 20 68 61 73 20 61 6e 20 65    Table has an e
9520: 78 70 6c 69 63 69 74 20 49 50 4b 20 63 6f 6c 75  xplicit IPK colu
9530: 6d 6e 2e 0a 2a 2a 20 20 20 20 20 52 42 55 5f 50  mn..**     RBU_P
9540: 4b 5f 45 58 54 45 52 4e 41 4c 3a 20 20 20 20 20  K_EXTERNAL:     
9550: 20 54 61 62 6c 65 20 68 61 73 20 61 6e 20 65 78   Table has an ex
9560: 74 65 72 6e 61 6c 20 50 4b 20 69 6e 64 65 78 2e  ternal PK index.
9570: 0a 2a 2a 20 20 20 20 20 52 42 55 5f 50 4b 5f 57  .**     RBU_PK_W
9580: 49 54 48 4f 55 54 5f 52 4f 57 49 44 3a 20 54 61  ITHOUT_ROWID: Ta
9590: 62 6c 65 20 69 73 20 57 49 54 48 4f 55 54 20 52  ble is WITHOUT R
95a0: 4f 57 49 44 2e 0a 2a 2a 20 20 20 20 20 52 42 55  OWID..**     RBU
95b0: 5f 50 4b 5f 56 54 41 42 3a 20 20 20 20 20 20 20  _PK_VTAB:       
95c0: 20 20 20 54 61 62 6c 65 20 69 73 20 61 20 76 69     Table is a vi
95d0: 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a  rtual table..**.
95e0: 2a 2a 20 20 20 41 72 67 75 6d 65 6e 74 20 2a 70  **   Argument *p
95f0: 69 50 6b 20 69 73 20 61 6c 73 6f 20 6f 66 20 74  iPk is also of t
9600: 79 70 65 20 28 69 6e 74 2a 29 2c 20 61 6e 64 20  ype (int*), and 
9610: 61 6c 73 6f 20 70 6f 69 6e 74 73 20 74 6f 20 61  also points to a
9620: 6e 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 70 61  n output.**   pa
9630: 72 61 6d 65 74 65 72 2e 20 55 6e 6c 65 73 73 20  rameter. Unless 
9640: 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e  the table has an
9650: 20 65 78 74 65 72 6e 61 6c 20 70 72 69 6d 61 72   external primar
9660: 79 20 6b 65 79 20 69 6e 64 65 78 20 0a 2a 2a 20  y key index .** 
9670: 20 20 28 69 2e 65 2e 20 75 6e 6c 65 73 73 20 2a    (i.e. unless *
9680: 70 65 54 79 70 65 20 69 73 20 73 65 74 20 74 6f  peType is set to
9690: 20 33 29 2c 20 74 68 65 6e 20 2a 70 69 50 6b 20   3), then *piPk 
96a0: 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
96b0: 4f 72 2c 0a 2a 2a 20 20 20 69 66 20 74 68 65 20  Or,.**   if the 
96c0: 74 61 62 6c 65 20 64 6f 65 73 20 68 61 76 65 20  table does have 
96d0: 61 6e 20 65 78 74 65 72 6e 61 6c 20 70 72 69 6d  an external prim
96e0: 61 72 79 20 6b 65 79 20 69 6e 64 65 78 2c 20 74  ary key index, t
96f0: 68 65 6e 20 2a 70 69 50 6b 0a 2a 2a 20 20 20 69  hen *piPk.**   i
9700: 73 20 73 65 74 20 74 6f 20 74 68 65 20 72 6f 6f  s set to the roo
9710: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  t page number of
9720: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
9730: 20 69 6e 64 65 78 20 62 65 66 6f 72 65 0a 2a 2a   index before.**
9740: 20 20 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a     returning..**
9750: 0a 2a 2a 20 41 4c 47 4f 52 49 54 48 4d 3a 0a 2a  .** ALGORITHM:.*
9760: 2a 0a 2a 2a 20 20 20 69 66 28 20 6e 6f 20 65 6e  *.**   if( no en
9770: 74 72 79 20 65 78 69 73 74 73 20 69 6e 20 73 71  try exists in sq
9780: 6c 69 74 65 5f 6d 61 73 74 65 72 20 29 7b 0a 2a  lite_master ){.*
9790: 2a 20 20 20 20 20 72 65 74 75 72 6e 20 52 42 55  *     return RBU
97a0: 5f 50 4b 5f 4e 4f 54 41 42 4c 45 0a 2a 2a 20 20  _PK_NOTABLE.**  
97b0: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 20 66   }else if( sql f
97c0: 6f 72 20 74 68 65 20 65 6e 74 72 79 20 73 74 61  or the entry sta
97d0: 72 74 73 20 77 69 74 68 20 22 43 52 45 41 54 45  rts with "CREATE
97e0: 20 56 49 52 54 55 41 4c 22 20 29 7b 0a 2a 2a 20   VIRTUAL" ){.** 
97f0: 20 20 20 20 72 65 74 75 72 6e 20 52 42 55 5f 50      return RBU_P
9800: 4b 5f 56 54 41 42 0a 2a 2a 20 20 20 7d 65 6c 73  K_VTAB.**   }els
9810: 65 20 69 66 28 20 22 50 52 41 47 4d 41 20 69 6e  e if( "PRAGMA in
9820: 64 65 78 5f 6c 69 73 74 28 29 22 20 66 6f 72 20  dex_list()" for 
9830: 74 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  the table contai
9840: 6e 73 20 61 20 22 70 6b 22 20 69 6e 64 65 78 20  ns a "pk" index 
9850: 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20 74 68  ){.**     if( th
9860: 65 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 20  e index that is 
9870: 74 68 65 20 70 6b 20 65 78 69 73 74 73 20 69 6e  the pk exists in
9880: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 29   sqlite_master )
9890: 7b 0a 2a 2a 20 20 20 20 20 20 20 2a 70 69 50 4b  {.**       *piPK
98a0: 20 3d 20 72 6f 6f 74 70 61 67 65 20 6f 66 20 74   = rootpage of t
98b0: 68 61 74 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20  hat index..**   
98c0: 20 20 20 20 72 65 74 75 72 6e 20 52 42 55 5f 50      return RBU_P
98d0: 4b 5f 45 58 54 45 52 4e 41 4c 0a 2a 2a 20 20 20  K_EXTERNAL.**   
98e0: 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20 20 20    }else{.**     
98f0: 20 20 72 65 74 75 72 6e 20 52 42 55 5f 50 4b 5f    return RBU_PK_
9900: 57 49 54 48 4f 55 54 5f 52 4f 57 49 44 0a 2a 2a  WITHOUT_ROWID.**
9910: 20 20 20 20 20 7d 0a 2a 2a 20 20 20 7d 65 6c 73       }.**   }els
9920: 65 20 69 66 28 20 22 50 52 41 47 4d 41 20 74 61  e if( "PRAGMA ta
9930: 62 6c 65 5f 69 6e 66 6f 28 29 22 20 6c 69 73 74  ble_info()" list
9940: 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 70  s one or more "p
9950: 6b 22 20 63 6f 6c 75 6d 6e 73 20 29 7b 0a 2a 2a  k" columns ){.**
9960: 20 20 20 20 20 72 65 74 75 72 6e 20 52 42 55 5f       return RBU_
9970: 50 4b 5f 49 50 4b 0a 2a 2a 20 20 20 7d 65 6c 73  PK_IPK.**   }els
9980: 65 7b 0a 2a 2a 20 20 20 20 20 72 65 74 75 72 6e  e{.**     return
9990: 20 52 42 55 5f 50 4b 5f 4e 4f 4e 45 0a 2a 2a 20   RBU_PK_NONE.** 
99a0: 20 20 7d 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f    }.*/.static vo
99b0: 69 64 20 72 62 75 54 61 62 6c 65 54 79 70 65 28  id rbuTableType(
99c0: 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70  .  sqlite3rbu *p
99d0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
99e0: 7a 54 61 62 2c 0a 20 20 69 6e 74 20 2a 70 65 54  zTab,.  int *peT
99f0: 79 70 65 2c 0a 20 20 69 6e 74 20 2a 70 69 54 6e  ype,.  int *piTn
9a00: 75 6d 2c 0a 20 20 69 6e 74 20 2a 70 69 50 6b 0a  um,.  int *piPk.
9a10: 29 7b 0a 20 20 2f 2a 0a 20 20 2a 2a 20 30 29 20  ){.  /*.  ** 0) 
9a20: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
9a30: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
9a40: 65 72 20 77 68 65 72 65 20 6e 61 6d 65 3d 25 51  er where name=%Q
9a50: 20 41 4e 44 20 49 73 56 69 72 74 75 61 6c 28 25   AND IsVirtual(%
9a60: 51 29 0a 20 20 2a 2a 20 31 29 20 50 52 41 47 4d  Q).  ** 1) PRAGM
9a70: 41 20 69 6e 64 65 78 5f 6c 69 73 74 20 3d 20 3f  A index_list = ?
9a80: 0a 20 20 2a 2a 20 32 29 20 53 45 4c 45 43 54 20  .  ** 2) SELECT 
9a90: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 73 71  count(*) FROM sq
9aa0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 77 68 65 72  lite_master wher
9ab0: 65 20 6e 61 6d 65 3d 25 51 20 0a 20 20 2a 2a 20  e name=%Q .  ** 
9ac0: 33 29 20 50 52 41 47 4d 41 20 74 61 62 6c 65 5f  3) PRAGMA table_
9ad0: 69 6e 66 6f 20 3d 20 3f 0a 20 20 2a 2f 0a 20 20  info = ?.  */.  
9ae0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 61 53  sqlite3_stmt *aS
9af0: 74 6d 74 5b 34 5d 20 3d 20 7b 30 2c 20 30 2c 20  tmt[4] = {0, 0, 
9b00: 30 2c 20 30 7d 3b 0a 0a 20 20 2a 70 65 54 79 70  0, 0};..  *peTyp
9b10: 65 20 3d 20 52 42 55 5f 50 4b 5f 4e 4f 54 41 42  e = RBU_PK_NOTAB
9b20: 4c 45 3b 0a 20 20 2a 70 69 50 6b 20 3d 20 30 3b  LE;.  *piPk = 0;
9b30: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ..  assert( p->r
9b40: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
9b50: 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72    p->rc = prepar
9b60: 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45  eFreeAndCollectE
9b70: 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  rror(p->dbMain, 
9b80: 26 61 53 74 6d 74 5b 30 5d 2c 20 26 70 2d 3e 7a  &aStmt[0], &p->z
9b90: 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 73 71 6c  Errmsg, .    sql
9ba0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
9bb0: 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
9bc0: 28 73 71 6c 20 4c 49 4b 45 20 27 63 72 65 61 74  (sql LIKE 'creat
9bd0: 65 20 76 69 72 74 75 61 6c 25 25 27 29 2c 20 72  e virtual%%'), r
9be0: 6f 6f 74 70 61 67 65 22 0a 20 20 20 20 20 20 20  ootpage".       
9bf0: 20 20 20 22 20 20 46 52 4f 4d 20 73 71 6c 69 74     "  FROM sqlit
9c00: 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20  e_master".      
9c10: 20 20 20 20 22 20 57 48 45 52 45 20 6e 61 6d 65      " WHERE name
9c20: 3d 25 51 22 2c 20 7a 54 61 62 0a 20 20 29 29 3b  =%Q", zTab.  ));
9c30: 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51  .  if( p->rc!=SQ
9c40: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74  LITE_OK || sqlit
9c50: 65 33 5f 73 74 65 70 28 61 53 74 6d 74 5b 30 5d  e3_step(aStmt[0]
9c60: 29 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )!=SQLITE_ROW ){
9c70: 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 61  .    /* Either a
9c80: 6e 20 65 72 72 6f 72 2c 20 6f 72 20 6e 6f 20 73  n error, or no s
9c90: 75 63 68 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20  uch table. */.  
9ca0: 20 20 67 6f 74 6f 20 72 62 75 54 61 62 6c 65 54    goto rbuTableT
9cb0: 79 70 65 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69  ype_end;.  }.  i
9cc0: 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  f( sqlite3_colum
9cd0: 6e 5f 69 6e 74 28 61 53 74 6d 74 5b 30 5d 2c 20  n_int(aStmt[0], 
9ce0: 30 29 20 29 7b 0a 20 20 20 20 2a 70 65 54 79 70  0) ){.    *peTyp
9cf0: 65 20 3d 20 52 42 55 5f 50 4b 5f 56 54 41 42 3b  e = RBU_PK_VTAB;
9d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d10: 20 20 20 20 20 2f 2a 20 76 69 72 74 75 61 6c 20       /* virtual 
9d20: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 67 6f 74  table */.    got
9d30: 6f 20 72 62 75 54 61 62 6c 65 54 79 70 65 5f 65  o rbuTableType_e
9d40: 6e 64 3b 0a 20 20 7d 0a 20 20 2a 70 69 54 6e 75  nd;.  }.  *piTnu
9d50: 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  m = sqlite3_colu
9d60: 6d 6e 5f 69 6e 74 28 61 53 74 6d 74 5b 30 5d 2c  mn_int(aStmt[0],
9d70: 20 31 29 3b 0a 0a 20 20 70 2d 3e 72 63 20 3d 20   1);..  p->rc = 
9d80: 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f  prepareFreeAndCo
9d90: 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62  llectError(p->db
9da0: 4d 61 69 6e 2c 20 26 61 53 74 6d 74 5b 31 5d 2c  Main, &aStmt[1],
9db0: 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20   &p->zErrmsg, . 
9dc0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e     sqlite3_mprin
9dd0: 74 66 28 22 50 52 41 47 4d 41 20 69 6e 64 65 78  tf("PRAGMA index
9de0: 5f 6c 69 73 74 3d 25 51 22 2c 7a 54 61 62 29 0a  _list=%Q",zTab).
9df0: 20 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63    );.  if( p->rc
9e00: 20 29 20 67 6f 74 6f 20 72 62 75 54 61 62 6c 65   ) goto rbuTable
9e10: 54 79 70 65 5f 65 6e 64 3b 0a 20 20 77 68 69 6c  Type_end;.  whil
9e20: 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  e( sqlite3_step(
9e30: 61 53 74 6d 74 5b 31 5d 29 3d 3d 53 51 4c 49 54  aStmt[1])==SQLIT
9e40: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e  E_ROW ){.    con
9e50: 73 74 20 75 38 20 2a 7a 4f 72 69 67 20 3d 20 73  st u8 *zOrig = s
9e60: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
9e70: 78 74 28 61 53 74 6d 74 5b 31 5d 2c 20 33 29 3b  xt(aStmt[1], 3);
9e80: 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a  .    const u8 *z
9e90: 49 64 78 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Idx = sqlite3_co
9ea0: 6c 75 6d 6e 5f 74 65 78 74 28 61 53 74 6d 74 5b  lumn_text(aStmt[
9eb0: 31 5d 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20  1], 1);.    if( 
9ec0: 7a 4f 72 69 67 20 26 26 20 7a 49 64 78 20 26 26  zOrig && zIdx &&
9ed0: 20 7a 4f 72 69 67 5b 30 5d 3d 3d 27 70 27 20 29   zOrig[0]=='p' )
9ee0: 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
9ef0: 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f  prepareFreeAndCo
9f00: 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62  llectError(p->db
9f10: 4d 61 69 6e 2c 20 26 61 53 74 6d 74 5b 32 5d 2c  Main, &aStmt[2],
9f20: 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20   &p->zErrmsg, . 
9f30: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
9f40: 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
9f50: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 72 6f        "SELECT ro
9f60: 6f 74 70 61 67 65 20 46 52 4f 4d 20 73 71 6c 69  otpage FROM sqli
9f70: 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20  te_master WHERE 
9f80: 6e 61 6d 65 20 3d 20 25 51 22 2c 20 7a 49 64 78  name = %Q", zIdx
9f90: 0a 20 20 20 20 20 20 29 29 3b 0a 20 20 20 20 20  .      ));.     
9fa0: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
9fb0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
9fc0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65   if( sqlite3_ste
9fd0: 70 28 61 53 74 6d 74 5b 32 5d 29 3d 3d 53 51 4c  p(aStmt[2])==SQL
9fe0: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
9ff0: 20 20 20 20 20 2a 70 69 50 6b 20 3d 20 73 71 6c       *piPk = sql
a000: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
a010: 61 53 74 6d 74 5b 32 5d 2c 20 30 29 3b 0a 20 20  aStmt[2], 0);.  
a020: 20 20 20 20 20 20 20 20 2a 70 65 54 79 70 65 20          *peType 
a030: 3d 20 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41  = RBU_PK_EXTERNA
a040: 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  L;.        }else
a050: 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 65 54  {.          *peT
a060: 79 70 65 20 3d 20 52 42 55 5f 50 4b 5f 57 49 54  ype = RBU_PK_WIT
a070: 48 4f 55 54 5f 52 4f 57 49 44 3b 0a 20 20 20 20  HOUT_ROWID;.    
a080: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
a090: 20 20 20 20 67 6f 74 6f 20 72 62 75 54 61 62 6c      goto rbuTabl
a0a0: 65 54 79 70 65 5f 65 6e 64 3b 0a 20 20 20 20 7d  eType_end;.    }
a0b0: 0a 20 20 7d 0a 0a 20 20 70 2d 3e 72 63 20 3d 20  .  }..  p->rc = 
a0c0: 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f  prepareFreeAndCo
a0d0: 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62  llectError(p->db
a0e0: 4d 61 69 6e 2c 20 26 61 53 74 6d 74 5b 33 5d 2c  Main, &aStmt[3],
a0f0: 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20   &p->zErrmsg, . 
a100: 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e     sqlite3_mprin
a110: 74 66 28 22 50 52 41 47 4d 41 20 74 61 62 6c 65  tf("PRAGMA table
a120: 5f 69 6e 66 6f 3d 25 51 22 2c 7a 54 61 62 29 0a  _info=%Q",zTab).
a130: 20 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63    );.  if( p->rc
a140: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
a150: 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65     while( sqlite
a160: 33 5f 73 74 65 70 28 61 53 74 6d 74 5b 33 5d 29  3_step(aStmt[3])
a170: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
a180: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
a190: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 61 53 74  3_column_int(aSt
a1a0: 6d 74 5b 33 5d 2c 35 29 3e 30 20 29 7b 0a 20 20  mt[3],5)>0 ){.  
a1b0: 20 20 20 20 20 20 2a 70 65 54 79 70 65 20 3d 20        *peType = 
a1c0: 52 42 55 5f 50 4b 5f 49 50 4b 3b 20 20 20 20 20  RBU_PK_IPK;     
a1d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 65 78             /* ex
a1e0: 70 6c 69 63 69 74 20 49 50 4b 20 63 6f 6c 75 6d  plicit IPK colum
a1f0: 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74  n */.        got
a200: 6f 20 72 62 75 54 61 62 6c 65 54 79 70 65 5f 65  o rbuTableType_e
a210: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
a220: 7d 0a 20 20 20 20 2a 70 65 54 79 70 65 20 3d 20  }.    *peType = 
a230: 52 42 55 5f 50 4b 5f 4e 4f 4e 45 3b 0a 20 20 7d  RBU_PK_NONE;.  }
a240: 0a 0a 72 62 75 54 61 62 6c 65 54 79 70 65 5f 65  ..rbuTableType_e
a250: 6e 64 3a 20 7b 0a 20 20 20 20 75 6e 73 69 67 6e  nd: {.    unsign
a260: 65 64 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f  ed int i;.    fo
a270: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
a280: 61 53 74 6d 74 29 2f 73 69 7a 65 6f 66 28 61 53  aStmt)/sizeof(aS
a290: 74 6d 74 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  tmt[0]); i++){. 
a2a0: 20 20 20 20 20 72 62 75 46 69 6e 61 6c 69 7a 65       rbuFinalize
a2b0: 28 70 2c 20 61 53 74 6d 74 5b 69 5d 29 3b 0a 20  (p, aStmt[i]);. 
a2c0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
a2d0: 2a 20 54 68 69 73 20 69 73 20 61 20 68 65 6c 70  * This is a help
a2e0: 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  er function for 
a2f0: 72 62 75 4f 62 6a 49 74 65 72 43 61 63 68 65 54  rbuObjIterCacheT
a300: 61 62 6c 65 49 6e 66 6f 28 29 2e 20 49 74 20 70  ableInfo(). It p
a310: 6f 70 75 6c 61 74 65 73 0a 2a 2a 20 74 68 65 20  opulates.** the 
a320: 70 49 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64  pIter->abIndexed
a330: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  [] array..*/.sta
a340: 74 69 63 20 76 6f 69 64 20 72 62 75 4f 62 6a 49  tic void rbuObjI
a350: 74 65 72 43 61 63 68 65 49 6e 64 65 78 65 64 43  terCacheIndexedC
a360: 6f 6c 73 28 73 71 6c 69 74 65 33 72 62 75 20 2a  ols(sqlite3rbu *
a370: 70 2c 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70  p, RbuObjIter *p
a380: 49 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  Iter){.  sqlite3
a390: 5f 73 74 6d 74 20 2a 70 4c 69 73 74 20 3d 20 30  _stmt *pList = 0
a3a0: 3b 0a 20 20 69 6e 74 20 62 49 6e 64 65 78 20 3d  ;.  int bIndex =
a3b0: 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63   0;..  if( p->rc
a3c0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
a3d0: 20 20 20 6d 65 6d 63 70 79 28 70 49 74 65 72 2d     memcpy(pIter-
a3e0: 3e 61 62 49 6e 64 65 78 65 64 2c 20 70 49 74 65  >abIndexed, pIte
a3f0: 72 2d 3e 61 62 54 62 6c 50 6b 2c 20 73 69 7a 65  r->abTblPk, size
a400: 6f 66 28 75 38 29 2a 70 49 74 65 72 2d 3e 6e 54  of(u8)*pIter->nT
a410: 62 6c 43 6f 6c 29 3b 0a 20 20 20 20 70 2d 3e 72  blCol);.    p->r
a420: 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41  c = prepareFreeA
a430: 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70  ndCollectError(p
a440: 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 4c 69 73 74  ->dbMain, &pList
a450: 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20  , &p->zErrmsg,. 
a460: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
a470: 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20 6d  printf("PRAGMA m
a480: 61 69 6e 2e 69 6e 64 65 78 5f 6c 69 73 74 20 3d  ain.index_list =
a490: 20 25 51 22 2c 20 70 49 74 65 72 2d 3e 7a 54 62   %Q", pIter->zTb
a4a0: 6c 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20  l).    );.  }.. 
a4b0: 20 70 49 74 65 72 2d 3e 6e 49 6e 64 65 78 20 3d   pIter->nIndex =
a4c0: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e   0;.  while( p->
a4d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
a4e0: 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
a4f0: 69 74 65 33 5f 73 74 65 70 28 70 4c 69 73 74 29  ite3_step(pList)
a500: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
a510: 61 72 20 2a 7a 49 64 78 20 3d 20 28 63 6f 6e 73  ar *zIdx = (cons
a520: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
a530: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 4c 69 73  column_text(pLis
a540: 74 2c 20 31 29 3b 0a 20 20 20 20 69 6e 74 20 62  t, 1);.    int b
a550: 50 61 72 74 69 61 6c 20 3d 20 73 71 6c 69 74 65  Partial = sqlite
a560: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 4c 69  3_column_int(pLi
a570: 73 74 2c 20 34 29 3b 0a 20 20 20 20 73 71 6c 69  st, 4);.    sqli
a580: 74 65 33 5f 73 74 6d 74 20 2a 70 58 49 6e 66 6f  te3_stmt *pXInfo
a590: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 49   = 0;.    if( zI
a5a0: 64 78 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  dx==0 ) break;. 
a5b0: 20 20 20 69 66 28 20 62 50 61 72 74 69 61 6c 20     if( bPartial 
a5c0: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
a5d0: 70 49 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64  pIter->abIndexed
a5e0: 2c 20 30 78 30 31 2c 20 73 69 7a 65 6f 66 28 75  , 0x01, sizeof(u
a5f0: 38 29 2a 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f  8)*pIter->nTblCo
a600: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  l);.    }.    p-
a610: 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65  >rc = prepareFre
a620: 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72  eAndCollectError
a630: 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 58 49  (p->dbMain, &pXI
a640: 6e 66 6f 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  nfo, &p->zErrmsg
a650: 2c 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ,.        sqlite
a660: 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d  3_mprintf("PRAGM
a670: 41 20 6d 61 69 6e 2e 69 6e 64 65 78 5f 78 69 6e  A main.index_xin
a680: 66 6f 20 3d 20 25 51 22 2c 20 7a 49 64 78 29 0a  fo = %Q", zIdx).
a690: 20 20 20 20 29 3b 0a 20 20 20 20 77 68 69 6c 65      );.    while
a6a0: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
a6b0: 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57  OK && SQLITE_ROW
a6c0: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
a6d0: 58 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20  XInfo) ){.      
a6e0: 69 6e 74 20 69 43 69 64 20 3d 20 73 71 6c 69 74  int iCid = sqlit
a6f0: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58  e3_column_int(pX
a700: 49 6e 66 6f 2c 20 31 29 3b 0a 20 20 20 20 20 20  Info, 1);.      
a710: 69 66 28 20 69 43 69 64 3e 3d 30 20 29 20 70 49  if( iCid>=0 ) pI
a720: 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64 5b 69  ter->abIndexed[i
a730: 43 69 64 5d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Cid] = 1;.    }.
a740: 20 20 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28      rbuFinalize(
a750: 70 2c 20 70 58 49 6e 66 6f 29 3b 0a 20 20 20 20  p, pXInfo);.    
a760: 62 49 6e 64 65 78 20 3d 20 31 3b 0a 20 20 20 20  bIndex = 1;.    
a770: 70 49 74 65 72 2d 3e 6e 49 6e 64 65 78 2b 2b 3b  pIter->nIndex++;
a780: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 74 65  .  }..  if( pIte
a790: 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
a7a0: 5f 57 49 54 48 4f 55 54 5f 52 4f 57 49 44 20 29  _WITHOUT_ROWID )
a7b0: 7b 0a 20 20 20 20 2f 2a 20 22 50 52 41 47 4d 41  {.    /* "PRAGMA
a7c0: 20 69 6e 64 65 78 5f 6c 69 73 74 22 20 69 6e 63   index_list" inc
a7d0: 6c 75 64 65 73 20 74 68 65 20 6d 61 69 6e 20 50  ludes the main P
a7e0: 4b 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20  K b-tree */.    
a7f0: 70 49 74 65 72 2d 3e 6e 49 6e 64 65 78 2d 2d 3b  pIter->nIndex--;
a800: 0a 20 20 7d 0a 0a 20 20 72 62 75 46 69 6e 61 6c  .  }..  rbuFinal
a810: 69 7a 65 28 70 2c 20 70 4c 69 73 74 29 3b 0a 20  ize(p, pList);. 
a820: 20 69 66 28 20 62 49 6e 64 65 78 3d 3d 30 20 29   if( bIndex==0 )
a830: 20 70 49 74 65 72 2d 3e 61 62 49 6e 64 65 78 65   pIter->abIndexe
a840: 64 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  d = 0;.}.../*.**
a850: 20 49 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74   If they are not
a860: 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74   already populat
a870: 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65  ed, populate the
a880: 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c   pIter->azTblCol
a890: 5b 5d 2c 0a 2a 2a 20 70 49 74 65 72 2d 3e 61 62  [],.** pIter->ab
a8a0: 54 62 6c 50 6b 5b 5d 2c 20 70 49 74 65 72 2d 3e  TblPk[], pIter->
a8b0: 6e 54 62 6c 43 6f 6c 20 61 6e 64 20 70 49 74 65  nTblCol and pIte
a8c0: 72 2d 3e 62 52 6f 77 69 64 20 76 61 72 69 61 62  r->bRowid variab
a8d0: 6c 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  les according to
a8e0: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 28 6e  .** the table (n
a8f0: 6f 74 20 69 6e 64 65 78 29 20 74 68 61 74 20 74  ot index) that t
a900: 68 65 20 69 74 65 72 61 74 6f 72 20 63 75 72 72  he iterator curr
a910: 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e  ently points to.
a920: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
a930: 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65  LITE_OK if succe
a940: 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c  ssful, or an SQL
a950: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  ite error code o
a960: 74 68 65 72 77 69 73 65 2e 20 49 66 0a 2a 2a 20  therwise. If.** 
a970: 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63  an error does oc
a980: 63 75 72 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  cur, an error co
a990: 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73  de and error mes
a9a0: 73 61 67 65 20 61 72 65 20 61 6c 73 6f 20 6c 65  sage are also le
a9b0: 66 74 20 69 6e 20 0a 2a 2a 20 74 68 65 20 52 42  ft in .** the RB
a9c0: 55 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61  U handle..*/.sta
a9d0: 74 69 63 20 69 6e 74 20 72 62 75 4f 62 6a 49 74  tic int rbuObjIt
a9e0: 65 72 43 61 63 68 65 54 61 62 6c 65 49 6e 66 6f  erCacheTableInfo
a9f0: 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20  (sqlite3rbu *p, 
aa00: 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65  RbuObjIter *pIte
aa10: 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72 2d  r){.  if( pIter-
aa20: 3e 61 7a 54 62 6c 43 6f 6c 3d 3d 30 20 29 7b 0a  >azTblCol==0 ){.
aa30: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
aa40: 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20   *pStmt = 0;.   
aa50: 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20   int nCol = 0;. 
aa60: 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
aa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa80: 20 2f 2a 20 66 6f 72 28 29 20 6c 6f 6f 70 20 69   /* for() loop i
aa90: 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
aaa0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 52 62 75   */.    int bRbu
aab0: 52 6f 77 69 64 20 3d 20 30 3b 20 20 20 20 20 20  Rowid = 0;      
aac0: 20 20 20 20 20 20 2f 2a 20 49 66 20 69 6e 70 75        /* If inpu
aad0: 74 20 74 61 62 6c 65 20 68 61 73 20 63 6f 6c 75  t table has colu
aae0: 6d 6e 20 22 72 62 75 5f 72 6f 77 69 64 22 20 2a  mn "rbu_rowid" *
aaf0: 2f 0a 20 20 20 20 69 6e 74 20 69 4f 72 64 65 72  /.    int iOrder
ab00: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 54   = 0;.    int iT
ab10: 6e 75 6d 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  num = 0;..    /*
ab20: 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
ab30: 74 79 70 65 20 6f 66 20 74 61 62 6c 65 20 74 68  type of table th
ab40: 69 73 20 73 74 65 70 20 77 69 6c 6c 20 64 65 61  is step will dea
ab50: 6c 20 77 69 74 68 2e 20 2a 2f 0a 20 20 20 20 61  l with. */.    a
ab60: 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 65 54  ssert( pIter->eT
ab70: 79 70 65 3d 3d 30 20 29 3b 0a 20 20 20 20 72 62  ype==0 );.    rb
ab80: 75 54 61 62 6c 65 54 79 70 65 28 70 2c 20 70 49  uTableType(p, pI
ab90: 74 65 72 2d 3e 7a 54 62 6c 2c 20 26 70 49 74 65  ter->zTbl, &pIte
aba0: 72 2d 3e 65 54 79 70 65 2c 20 26 69 54 6e 75 6d  r->eType, &iTnum
abb0: 2c 20 26 70 49 74 65 72 2d 3e 69 50 6b 54 6e 75  , &pIter->iPkTnu
abc0: 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72  m);.    if( p->r
abd0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
abe0: 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
abf0: 55 5f 50 4b 5f 4e 4f 54 41 42 4c 45 20 29 7b 0a  U_PK_NOTABLE ){.
ac00: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
ac10: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
ac20: 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73    p->zErrmsg = s
ac30: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
ac40: 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25  no such table: %
ac50: 73 22 2c 20 70 49 74 65 72 2d 3e 7a 54 62 6c 29  s", pIter->zTbl)
ac60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
ac70: 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 20 70  p->rc ) return p
ac80: 2d 3e 72 63 3b 0a 20 20 20 20 69 66 28 20 70 49  ->rc;.    if( pI
ac90: 74 65 72 2d 3e 7a 49 64 78 3d 3d 30 20 29 20 70  ter->zIdx==0 ) p
aca0: 49 74 65 72 2d 3e 69 54 6e 75 6d 20 3d 20 69 54  Iter->iTnum = iT
acb0: 6e 75 6d 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  num;..    assert
acc0: 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  ( pIter->eType==
acd0: 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 7c 7c 20 70  RBU_PK_NONE || p
ace0: 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55  Iter->eType==RBU
acf0: 5f 50 4b 5f 49 50 4b 20 0a 20 20 20 20 20 20 20  _PK_IPK .       
ad00: 20 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70    || pIter->eTyp
ad10: 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e  e==RBU_PK_EXTERN
ad20: 41 4c 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79  AL || pIter->eTy
ad30: 70 65 3d 3d 52 42 55 5f 50 4b 5f 57 49 54 48 4f  pe==RBU_PK_WITHO
ad40: 55 54 5f 52 4f 57 49 44 0a 20 20 20 20 20 20 20  UT_ROWID.       
ad50: 20 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70    || pIter->eTyp
ad60: 65 3d 3d 52 42 55 5f 50 4b 5f 56 54 41 42 0a 20  e==RBU_PK_VTAB. 
ad70: 20 20 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f     );..    /* Po
ad80: 70 75 6c 61 74 65 20 74 68 65 20 61 7a 54 62 6c  pulate the azTbl
ad90: 43 6f 6c 5b 5d 20 61 6e 64 20 6e 54 62 6c 43 6f  Col[] and nTblCo
ada0: 6c 20 76 61 72 69 61 62 6c 65 73 20 62 61 73 65  l variables base
adb0: 64 20 6f 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 73  d on the columns
adc0: 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 69  .    ** of the i
add0: 6e 70 75 74 20 74 61 62 6c 65 2e 20 49 67 6e 6f  nput table. Igno
ade0: 72 65 20 61 6e 79 20 69 6e 70 75 74 20 74 61 62  re any input tab
adf0: 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  le columns that 
ae00: 62 65 67 69 6e 20 77 69 74 68 0a 20 20 20 20 2a  begin with.    *
ae10: 2a 20 22 72 62 75 5f 22 2e 20 20 2a 2f 0a 20 20  * "rbu_".  */.  
ae20: 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72    p->rc = prepar
ae30: 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45  eFreeAndCollectE
ae40: 72 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20 26  rror(p->dbRbu, &
ae50: 70 53 74 6d 74 2c 20 26 70 2d 3e 7a 45 72 72 6d  pStmt, &p->zErrm
ae60: 73 67 2c 20 0a 20 20 20 20 20 20 20 20 73 71 6c  sg, .        sql
ae70: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45  ite3_mprintf("SE
ae80: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 27 25 71 27  LECT * FROM '%q'
ae90: 22 2c 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54  ", pIter->zDataT
aea0: 62 6c 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  bl).    );.    i
aeb0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
aec0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 43 6f  _OK ){.      nCo
aed0: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
aee0: 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b  mn_count(pStmt);
aef0: 0a 20 20 20 20 20 20 72 62 75 41 6c 6c 6f 63 61  .      rbuAlloca
af00: 74 65 49 74 65 72 41 72 72 61 79 73 28 70 2c 20  teIterArrays(p, 
af10: 70 49 74 65 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20  pIter, nCol);.  
af20: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
af30: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
af40: 4b 20 26 26 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  K && i<nCol; i++
af50: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
af60: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f  har *zName = (co
af70: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
af80: 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53  3_column_name(pS
af90: 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  tmt, i);.      i
afa0: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  f( sqlite3_strni
afb0: 63 6d 70 28 22 72 62 75 5f 22 2c 20 7a 4e 61 6d  cmp("rbu_", zNam
afc0: 65 2c 20 34 29 20 29 7b 0a 20 20 20 20 20 20 20  e, 4) ){.       
afd0: 20 63 68 61 72 20 2a 7a 43 6f 70 79 20 3d 20 72   char *zCopy = r
afe0: 62 75 53 74 72 6e 64 75 70 28 7a 4e 61 6d 65 2c  buStrndup(zName,
aff0: 20 26 70 2d 3e 72 63 29 3b 0a 20 20 20 20 20 20   &p->rc);.      
b000: 20 20 70 49 74 65 72 2d 3e 61 69 53 72 63 4f 72    pIter->aiSrcOr
b010: 64 65 72 5b 70 49 74 65 72 2d 3e 6e 54 62 6c 43  der[pIter->nTblC
b020: 6f 6c 5d 20 3d 20 70 49 74 65 72 2d 3e 6e 54 62  ol] = pIter->nTb
b030: 6c 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 49  lCol;.        pI
b040: 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 70 49  ter->azTblCol[pI
b050: 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 2b 2b 5d 20  ter->nTblCol++] 
b060: 3d 20 7a 43 6f 70 79 3b 0a 20 20 20 20 20 20 7d  = zCopy;.      }
b070: 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20  .      else if( 
b080: 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63  0==sqlite3_stric
b090: 6d 70 28 22 72 62 75 5f 72 6f 77 69 64 22 2c 20  mp("rbu_rowid", 
b0a0: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
b0b0: 20 20 62 52 62 75 52 6f 77 69 64 20 3d 20 31 3b    bRbuRowid = 1;
b0c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
b0d0: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
b0e0: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
b0f0: 70 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20  pStmt = 0;..    
b100: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
b110: 45 5f 4f 4b 0a 20 20 20 20 20 26 26 20 72 62 75  E_OK.     && rbu
b120: 49 73 56 61 63 75 75 6d 28 70 29 3d 3d 30 0a 20  IsVacuum(p)==0. 
b130: 20 20 20 20 26 26 20 62 52 62 75 52 6f 77 69 64      && bRbuRowid
b140: 21 3d 28 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  !=(pIter->eType=
b150: 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20 7c 7c 20  =RBU_PK_VTAB || 
b160: 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
b170: 55 5f 50 4b 5f 4e 4f 4e 45 29 0a 20 20 20 20 29  U_PK_NONE).    )
b180: 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
b190: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
b1a0: 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d      p->zErrmsg =
b1b0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
b1c0: 28 0a 20 20 20 20 20 20 20 20 20 20 22 74 61 62  (.          "tab
b1d0: 6c 65 20 25 71 20 25 73 20 72 62 75 5f 72 6f 77  le %q %s rbu_row
b1e0: 69 64 20 63 6f 6c 75 6d 6e 22 2c 20 70 49 74 65  id column", pIte
b1f0: 72 2d 3e 7a 44 61 74 61 54 62 6c 2c 0a 20 20 20  r->zDataTbl,.   
b200: 20 20 20 20 20 20 20 28 62 52 62 75 52 6f 77 69         (bRbuRowi
b210: 64 20 3f 20 22 6d 61 79 20 6e 6f 74 20 68 61 76  d ? "may not hav
b220: 65 22 20 3a 20 22 72 65 71 75 69 72 65 73 22 29  e" : "requires")
b230: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
b240: 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  .    /* Check th
b250: 61 74 20 61 6c 6c 20 6e 6f 6e 2d 48 49 44 44 45  at all non-HIDDE
b260: 4e 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  N columns in the
b270: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 61 62   destination tab
b280: 6c 65 20 61 72 65 20 61 6c 73 6f 0a 20 20 20 20  le are also.    
b290: 2a 2a 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  ** present in th
b2a0: 65 20 69 6e 70 75 74 20 74 61 62 6c 65 2e 20 50  e input table. P
b2b0: 6f 70 75 6c 61 74 65 20 74 68 65 20 61 62 54 62  opulate the abTb
b2c0: 6c 50 6b 5b 5d 2c 20 61 7a 54 62 6c 54 79 70 65  lPk[], azTblType
b2d0: 5b 5d 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 69  [] and.    ** ai
b2e0: 54 62 6c 4f 72 64 65 72 5b 5d 20 61 72 72 61 79  TblOrder[] array
b2f0: 73 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  s at the same ti
b300: 6d 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  me.  */.    if( 
b310: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
b320: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
b330: 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64  = prepareFreeAnd
b340: 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e  CollectError(p->
b350: 64 62 4d 61 69 6e 2c 20 26 70 53 74 6d 74 2c 20  dbMain, &pStmt, 
b360: 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20  &p->zErrmsg, .  
b370: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
b380: 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20  mprintf("PRAGMA 
b390: 74 61 62 6c 65 5f 69 6e 66 6f 28 25 51 29 22 2c  table_info(%Q)",
b3a0: 20 70 49 74 65 72 2d 3e 7a 54 62 6c 29 0a 20 20   pIter->zTbl).  
b3b0: 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20      );.    }.   
b3c0: 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53   while( p->rc==S
b3d0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49  QLITE_OK && SQLI
b3e0: 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
b3f0: 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20  step(pStmt) ){. 
b400: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
b410: 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20  *zName = (const 
b420: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
b430: 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
b440: 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a   1);.      if( z
b450: 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Name==0 ) break;
b460: 20 20 2f 2a 20 41 6e 20 4f 4f 4d 20 2d 20 66 69    /* An OOM - fi
b470: 6e 61 6c 69 7a 65 28 29 20 62 65 6c 6f 77 20 72  nalize() below r
b480: 65 74 75 72 6e 73 20 53 5f 4e 4f 4d 45 4d 20 2a  eturns S_NOMEM *
b490: 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 69 4f  /.      for(i=iO
b4a0: 72 64 65 72 3b 20 69 3c 70 49 74 65 72 2d 3e 6e  rder; i<pIter->n
b4b0: 54 62 6c 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  TblCol; i++){.  
b4c0: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72        if( 0==str
b4d0: 63 6d 70 28 7a 4e 61 6d 65 2c 20 70 49 74 65 72  cmp(zName, pIter
b4e0: 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 29 20 29  ->azTblCol[i]) )
b4f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
b500: 20 20 20 20 20 20 69 66 28 20 69 3d 3d 70 49 74        if( i==pIt
b510: 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20 29 7b 0a 20  er->nTblCol ){. 
b520: 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53         p->rc = S
b530: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
b540: 20 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20       p->zErrmsg 
b550: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
b560: 66 28 22 63 6f 6c 75 6d 6e 20 6d 69 73 73 69 6e  f("column missin
b570: 67 20 66 72 6f 6d 20 25 71 3a 20 25 73 22 2c 0a  g from %q: %s",.
b580: 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
b590: 72 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 7a 4e 61  r->zDataTbl, zNa
b5a0: 6d 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  me.        );.  
b5b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b5c0: 20 20 20 69 6e 74 20 69 50 6b 20 3d 20 73 71 6c     int iPk = sql
b5d0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
b5e0: 70 53 74 6d 74 2c 20 35 29 3b 0a 20 20 20 20 20  pStmt, 5);.     
b5f0: 20 20 20 69 6e 74 20 62 4e 6f 74 4e 75 6c 6c 20     int bNotNull 
b600: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
b610: 5f 69 6e 74 28 70 53 74 6d 74 2c 20 33 29 3b 0a  _int(pStmt, 3);.
b620: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
b630: 61 72 20 2a 7a 54 79 70 65 20 3d 20 28 63 6f 6e  ar *zType = (con
b640: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
b650: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
b660: 6d 74 2c 20 32 29 3b 0a 0a 20 20 20 20 20 20 20  mt, 2);..       
b670: 20 69 66 28 20 69 21 3d 69 4f 72 64 65 72 20 29   if( i!=iOrder )
b680: 7b 0a 20 20 20 20 20 20 20 20 20 20 53 57 41 50  {.          SWAP
b690: 28 69 6e 74 2c 20 70 49 74 65 72 2d 3e 61 69 53  (int, pIter->aiS
b6a0: 72 63 4f 72 64 65 72 5b 69 5d 2c 20 70 49 74 65  rcOrder[i], pIte
b6b0: 72 2d 3e 61 69 53 72 63 4f 72 64 65 72 5b 69 4f  r->aiSrcOrder[iO
b6c0: 72 64 65 72 5d 29 3b 0a 20 20 20 20 20 20 20 20  rder]);.        
b6d0: 20 20 53 57 41 50 28 63 68 61 72 2a 2c 20 70 49    SWAP(char*, pI
b6e0: 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d  ter->azTblCol[i]
b6f0: 2c 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f  , pIter->azTblCo
b700: 6c 5b 69 4f 72 64 65 72 5d 29 3b 0a 20 20 20 20  l[iOrder]);.    
b710: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 70      }..        p
b720: 49 74 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65 5b  Iter->azTblType[
b730: 69 4f 72 64 65 72 5d 20 3d 20 72 62 75 53 74 72  iOrder] = rbuStr
b740: 6e 64 75 70 28 7a 54 79 70 65 2c 20 26 70 2d 3e  ndup(zType, &p->
b750: 72 63 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  rc);.        ass
b760: 65 72 74 28 20 69 50 6b 3e 3d 30 20 29 3b 0a 20  ert( iPk>=0 );. 
b770: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 61 62         pIter->ab
b780: 54 62 6c 50 6b 5b 69 4f 72 64 65 72 5d 20 3d 20  TblPk[iOrder] = 
b790: 28 75 38 29 69 50 6b 3b 0a 20 20 20 20 20 20 20  (u8)iPk;.       
b7a0: 20 70 49 74 65 72 2d 3e 61 62 4e 6f 74 4e 75 6c   pIter->abNotNul
b7b0: 6c 5b 69 4f 72 64 65 72 5d 20 3d 20 28 75 38 29  l[iOrder] = (u8)
b7c0: 62 4e 6f 74 4e 75 6c 6c 20 7c 7c 20 28 69 50 6b  bNotNull || (iPk
b7d0: 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 69 4f  !=0);.        iO
b7e0: 72 64 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  rder++;.      }.
b7f0: 20 20 20 20 7d 0a 0a 20 20 20 20 72 62 75 46 69      }..    rbuFi
b800: 6e 61 6c 69 7a 65 28 70 2c 20 70 53 74 6d 74 29  nalize(p, pStmt)
b810: 3b 0a 20 20 20 20 72 62 75 4f 62 6a 49 74 65 72  ;.    rbuObjIter
b820: 43 61 63 68 65 49 6e 64 65 78 65 64 43 6f 6c 73  CacheIndexedCols
b830: 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
b840: 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 65  assert( pIter->e
b850: 54 79 70 65 21 3d 52 42 55 5f 50 4b 5f 56 54 41  Type!=RBU_PK_VTA
b860: 42 20 7c 7c 20 70 49 74 65 72 2d 3e 61 62 49 6e  B || pIter->abIn
b870: 64 65 78 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20  dexed==0 );.    
b880: 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 65  assert( pIter->e
b890: 54 79 70 65 21 3d 52 42 55 5f 50 4b 5f 56 54 41  Type!=RBU_PK_VTA
b8a0: 42 20 7c 7c 20 70 49 74 65 72 2d 3e 6e 49 6e 64  B || pIter->nInd
b8b0: 65 78 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20  ex==0 );.  }..  
b8c0: 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a  return p->rc;.}.
b8d0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
b8e0: 74 69 6f 6e 20 63 6f 6e 73 74 72 75 63 74 73 20  tion constructs 
b8f0: 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 70 6f  and returns a po
b900: 69 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 2d 74  inter to a nul-t
b910: 65 72 6d 69 6e 61 74 65 64 20 0a 2a 2a 20 73 74  erminated .** st
b920: 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ring containing 
b930: 73 6f 6d 65 20 53 51 4c 20 63 6c 61 75 73 65 20  some SQL clause 
b940: 6f 72 20 6c 69 73 74 20 62 61 73 65 64 20 6f 6e  or list based on
b950: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   one or more of 
b960: 74 68 65 20 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e  the .** column n
b970: 61 6d 65 73 20 63 75 72 72 65 6e 74 6c 79 20 73  ames currently s
b980: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70 49 74  tored in the pIt
b990: 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 5d 20 61  er->azTblCol[] a
b9a0: 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rray..*/.static 
b9b0: 63 68 61 72 20 2a 72 62 75 4f 62 6a 49 74 65 72  char *rbuObjIter
b9c0: 47 65 74 43 6f 6c 6c 69 73 74 28 0a 20 20 73 71  GetCollist(.  sq
b9d0: 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 20 20 20  lite3rbu *p,    
b9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b9f0: 20 52 42 55 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   RBU object */. 
ba00: 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74   RbuObjIter *pIt
ba10: 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  er              
ba20: 20 2f 2a 20 4f 62 6a 65 63 74 20 69 74 65 72 61   /* Object itera
ba30: 74 6f 72 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 6e  tor for column n
ba40: 61 6d 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  ames */.){.  cha
ba50: 72 20 2a 7a 4c 69 73 74 20 3d 20 30 3b 0a 20 20  r *zList = 0;.  
ba60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70  const char *zSep
ba70: 20 3d 20 22 22 3b 0a 20 20 69 6e 74 20 69 3b 0a   = "";.  int i;.
ba80: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74    for(i=0; i<pIt
ba90: 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69 2b 2b  er->nTblCol; i++
baa0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
bab0: 72 20 2a 7a 20 3d 20 70 49 74 65 72 2d 3e 61 7a  r *z = pIter->az
bac0: 54 62 6c 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 7a  TblCol[i];.    z
bad0: 4c 69 73 74 20 3d 20 72 62 75 4d 50 72 69 6e 74  List = rbuMPrint
bae0: 66 28 70 2c 20 22 25 7a 25 73 5c 22 25 77 5c 22  f(p, "%z%s\"%w\"
baf0: 22 2c 20 7a 4c 69 73 74 2c 20 7a 53 65 70 2c 20  ", zList, zSep, 
bb00: 7a 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22  z);.    zSep = "
bb10: 2c 20 22 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  , ";.  }.  retur
bb20: 6e 20 7a 4c 69 73 74 3b 0a 7d 0a 0a 73 74 61 74  n zList;.}..stat
bb30: 69 63 20 63 68 61 72 20 2a 72 62 75 4f 62 6a 49  ic char *rbuObjI
bb40: 74 65 72 47 65 74 50 6b 4c 69 73 74 28 0a 20 20  terGetPkList(.  
bb50: 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 20  sqlite3rbu *p,  
bb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb70: 2f 2a 20 52 42 55 20 6f 62 6a 65 63 74 20 2a 2f  /* RBU object */
bb80: 0a 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70  .  RbuObjIter *p
bb90: 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  Iter,           
bba0: 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 69 74 65     /* Object ite
bbb0: 72 61 74 6f 72 20 66 6f 72 20 63 6f 6c 75 6d 6e  rator for column
bbc0: 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 63 6f 6e 73   names */.  cons
bbd0: 74 20 63 68 61 72 20 2a 7a 45 78 74 72 61 0a 29  t char *zExtra.)
bbe0: 7b 0a 20 20 69 6e 74 20 69 50 6b 20 3d 20 31 3b  {.  int iPk = 1;
bbf0: 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20  .  char *zRet = 
bc00: 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  0;.  const char 
bc10: 2a 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 77 68  *zSep = "";.  wh
bc20: 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 6e  ile( 1 ){.    in
bc30: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
bc40: 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43  ; i<pIter->nTblC
bc50: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
bc60: 69 66 28 20 28 69 6e 74 29 70 49 74 65 72 2d 3e  if( (int)pIter->
bc70: 61 62 54 62 6c 50 6b 5b 69 5d 3d 3d 69 50 6b 20  abTblPk[i]==iPk 
bc80: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
bc90: 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 70 49   char *zCol = pI
bca0: 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d  ter->azTblCol[i]
bcb0: 3b 0a 20 20 20 20 20 20 20 20 7a 52 65 74 20 3d  ;.        zRet =
bcc0: 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22   rbuMPrintf(p, "
bcd0: 25 7a 25 73 5c 22 25 77 5c 22 25 73 22 2c 20 7a  %z%s\"%w\"%s", z
bce0: 52 65 74 2c 20 7a 53 65 70 2c 20 7a 43 6f 6c 2c  Ret, zSep, zCol,
bcf0: 20 7a 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20   zExtra);.      
bd00: 20 20 7a 53 65 70 20 3d 20 22 2c 20 22 3b 0a 20    zSep = ", ";. 
bd10: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
bd20: 20 69 66 28 20 69 3d 3d 70 49 74 65 72 2d 3e 6e   if( i==pIter->n
bd30: 54 62 6c 43 6f 6c 20 29 20 62 72 65 61 6b 3b 0a  TblCol ) break;.
bd40: 20 20 20 20 69 50 6b 2b 2b 3b 0a 20 20 7d 0a 20      iPk++;.  }. 
bd50: 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a   return zRet;.}.
bd60: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 62  .static char *rb
bd70: 75 56 61 63 75 75 6d 54 61 62 6c 65 53 74 61 72  uVacuumTableStar
bd80: 74 28 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20  t(.  sqlite3rbu 
bd90: 2a 70 2c 20 0a 20 20 52 62 75 4f 62 6a 49 74 65  *p, .  RbuObjIte
bda0: 72 20 2a 70 49 74 65 72 2c 0a 20 20 69 6e 74 20  r *pIter,.  int 
bdb0: 62 52 6f 77 69 64 2c 0a 20 20 63 6f 6e 73 74 20  bRowid,.  const 
bdc0: 63 68 61 72 20 2a 7a 57 72 69 74 65 0a 29 7b 0a  char *zWrite.){.
bdd0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
bde0: 70 4d 61 78 20 3d 20 30 3b 0a 20 20 63 68 61 72  pMax = 0;.  char
bdf0: 20 2a 7a 52 65 74 20 3d 20 30 3b 0a 20 20 69 66   *zRet = 0;.  if
be00: 28 20 62 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  ( bRowid ){.    
be10: 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46  p->rc = prepareF
be20: 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  reeAndCollectErr
be30: 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70  or(p->dbMain, &p
be40: 4d 61 78 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  Max, &p->zErrmsg
be50: 2c 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  , .        sqlit
be60: 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
be70: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6d 61        "SELECT ma
be80: 78 28 5f 72 6f 77 69 64 5f 29 20 46 52 4f 4d 20  x(_rowid_) FROM 
be90: 5c 22 25 73 25 77 5c 22 22 2c 20 7a 57 72 69 74  \"%s%w\"", zWrit
bea0: 65 2c 20 70 49 74 65 72 2d 3e 7a 54 62 6c 0a 20  e, pIter->zTbl. 
beb0: 20 20 20 20 20 20 20 29 0a 20 20 20 20 29 3b 0a         ).    );.
bec0: 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
bed0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49  QLITE_OK && SQLI
bee0: 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
bef0: 73 74 65 70 28 70 4d 61 78 29 20 29 7b 0a 20 20  step(pMax) ){.  
bf00: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
bf10: 34 20 69 4d 61 78 20 3d 20 73 71 6c 69 74 65 33  4 iMax = sqlite3
bf20: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 4d  _column_int64(pM
bf30: 61 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 7a 52  ax, 0);.      zR
bf40: 65 74 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28  et = rbuMPrintf(
bf50: 70 2c 20 22 20 57 48 45 52 45 20 5f 72 6f 77 69  p, " WHERE _rowi
bf60: 64 5f 20 3e 20 25 6c 6c 64 20 22 2c 20 69 4d 61  d_ > %lld ", iMa
bf70: 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 62  x);.    }.    rb
bf80: 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 4d 61  uFinalize(p, pMa
bf90: 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  x);.  }else{.   
bfa0: 20 63 68 61 72 20 2a 7a 4f 72 64 65 72 20 3d 20   char *zOrder = 
bfb0: 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 65  0;.    char *zSe
bfc0: 6c 65 63 74 20 3d 20 30 3b 0a 20 20 20 20 63 68  lect = 0;.    ch
bfd0: 61 72 20 2a 7a 4c 69 73 74 20 3d 20 30 3b 0a 20  ar *zList = 0;. 
bfe0: 20 20 20 69 6e 74 20 69 50 6b 20 3d 20 31 3b 0a     int iPk = 1;.
bff0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
c000: 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 63  zSep = "";.    c
c010: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70 32  onst char *zSep2
c020: 20 3d 20 22 22 3b 0a 20 20 20 20 77 68 69 6c 65   = "";.    while
c030: 28 20 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ( 1 ){.      int
c040: 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
c050: 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 54 62 6c  0; i<pIter->nTbl
c060: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
c070: 20 20 20 69 66 28 20 28 69 6e 74 29 70 49 74 65     if( (int)pIte
c080: 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 5d 3d 3d 69  r->abTblPk[i]==i
c090: 50 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Pk ){.          
c0a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
c0b0: 20 3d 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43   = pIter->azTblC
c0c0: 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  ol[i];.         
c0d0: 20 7a 4f 72 64 65 72 20 3d 20 72 62 75 4d 50 72   zOrder = rbuMPr
c0e0: 69 6e 74 66 28 70 2c 20 22 25 7a 25 73 5c 22 25  intf(p, "%z%s\"%
c0f0: 77 5c 22 20 44 45 53 43 22 2c 20 7a 4f 72 64 65  w\" DESC", zOrde
c100: 72 2c 20 7a 53 65 70 2c 20 7a 43 6f 6c 29 3b 0a  r, zSep, zCol);.
c110: 20 20 20 20 20 20 20 20 20 20 7a 4c 69 73 74 20            zList 
c120: 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20  = rbuMPrintf(p, 
c130: 22 25 7a 25 73 5c 22 25 77 5c 22 22 2c 20 7a 4c  "%z%s\"%w\"", zL
c140: 69 73 74 2c 20 7a 53 65 70 2c 20 7a 43 6f 6c 29  ist, zSep, zCol)
c150: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 53 65 6c  ;.          zSel
c160: 65 63 74 20 3d 20 72 62 75 4d 50 72 69 6e 74 66  ect = rbuMPrintf
c170: 28 70 2c 20 22 25 7a 25 73 71 75 6f 74 65 28 5c  (p, "%z%squote(\
c180: 22 25 77 5c 22 29 22 2c 20 7a 53 65 6c 65 63 74  "%w\")", zSelect
c190: 2c 20 7a 53 65 70 32 2c 20 7a 43 6f 6c 29 3b 0a  , zSep2, zCol);.
c1a0: 20 20 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d            zSep =
c1b0: 20 22 2c 20 22 3b 0a 20 20 20 20 20 20 20 20 20   ", ";.         
c1c0: 20 7a 53 65 70 32 20 3d 20 22 7c 7c 27 2c 27 7c   zSep2 = "||','|
c1d0: 7c 22 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  |";.          br
c1e0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
c1f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
c200: 20 69 3d 3d 70 49 74 65 72 2d 3e 6e 54 62 6c 43   i==pIter->nTblC
c210: 6f 6c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ol ) break;.    
c220: 20 20 69 50 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 0a    iPk++;.    }..
c230: 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
c240: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
c250: 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72    p->rc = prepar
c260: 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45  eFreeAndCollectE
c270: 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  rror(p->dbMain, 
c280: 26 70 4d 61 78 2c 20 26 70 2d 3e 7a 45 72 72 6d  &pMax, &p->zErrm
c290: 73 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73  sg, .          s
c2a0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
c2b0: 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c              "SEL
c2c0: 45 43 54 20 25 73 20 46 52 4f 4d 20 5c 22 25 73  ECT %s FROM \"%s
c2d0: 25 77 5c 22 20 4f 52 44 45 52 20 42 59 20 25 73  %w\" ORDER BY %s
c2e0: 20 4c 49 4d 49 54 20 31 22 2c 20 0a 20 20 20 20   LIMIT 1", .    
c2f0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 65 6c              zSel
c300: 65 63 74 2c 20 7a 57 72 69 74 65 2c 20 70 49 74  ect, zWrite, pIt
c310: 65 72 2d 3e 7a 54 62 6c 2c 20 7a 4f 72 64 65 72  er->zTbl, zOrder
c320: 0a 20 20 20 20 20 20 20 20 20 20 29 0a 20 20 20  .          ).   
c330: 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20     );.      if( 
c340: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
c350: 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d   && SQLITE_ROW==
c360: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 4d 61  sqlite3_step(pMa
c370: 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  x) ){.        co
c380: 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d  nst char *zVal =
c390: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
c3a0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
c3b0: 74 28 70 4d 61 78 2c 20 30 29 3b 0a 20 20 20 20  t(pMax, 0);.    
c3c0: 20 20 20 20 7a 52 65 74 20 3d 20 72 62 75 4d 50      zRet = rbuMP
c3d0: 72 69 6e 74 66 28 70 2c 20 22 20 57 48 45 52 45  rintf(p, " WHERE
c3e0: 20 28 25 73 29 20 3e 20 28 25 73 29 20 22 2c 20   (%s) > (%s) ", 
c3f0: 7a 4c 69 73 74 2c 20 7a 56 61 6c 29 3b 0a 20 20  zList, zVal);.  
c400: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 62 75 46      }.      rbuF
c410: 69 6e 61 6c 69 7a 65 28 70 2c 20 70 4d 61 78 29  inalize(p, pMax)
c420: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  ;.    }..    sql
c430: 69 74 65 33 5f 66 72 65 65 28 7a 4f 72 64 65 72  ite3_free(zOrder
c440: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
c450: 72 65 65 28 7a 53 65 6c 65 63 74 29 3b 0a 20 20  ree(zSelect);.  
c460: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
c470: 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  List);.  }.  ret
c480: 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 63 68 61  urn zRet;.}..cha
c490: 72 20 2a 72 62 75 56 61 63 75 75 6d 49 6e 64 65  r *rbuVacuumInde
c4a0: 78 53 74 61 72 74 28 0a 20 20 73 71 6c 69 74 65  xStart(.  sqlite
c4b0: 33 72 62 75 20 2a 70 2c 20 0a 20 20 52 62 75 4f  3rbu *p, .  RbuO
c4c0: 62 6a 49 74 65 72 20 2a 70 49 74 65 72 0a 29 7b  bjIter *pIter.){
c4d0: 0a 20 20 63 68 61 72 20 2a 7a 4f 72 64 65 72 20  .  char *zOrder 
c4e0: 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 68  = 0;.  char *zLh
c4f0: 73 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  s = 0;.  char *z
c500: 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 63 68  Select = 0;.  ch
c510: 61 72 20 2a 7a 56 65 63 74 6f 72 20 3d 20 30 3b  ar *zVector = 0;
c520: 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20  .  char *zRet = 
c530: 30 3b 0a 20 20 69 6e 74 20 62 46 61 69 6c 65 64  0;.  int bFailed
c540: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e   = 0;..  if( p->
c550: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
c560: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
c570: 2a 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20  *zSep = "";.    
c580: 69 6e 74 20 69 43 6f 6c 20 3d 20 30 3b 0a 20 20  int iCol = 0;.  
c590: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
c5a0: 70 58 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20  pXInfo = 0;.    
c5b0: 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46  p->rc = prepareF
c5c0: 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  reeAndCollectErr
c5d0: 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70  or(p->dbMain, &p
c5e0: 58 49 6e 66 6f 2c 20 26 70 2d 3e 7a 45 72 72 6d  XInfo, &p->zErrm
c5f0: 73 67 2c 0a 20 20 20 20 20 20 20 20 73 71 6c 69  sg,.        sqli
c600: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41  te3_mprintf("PRA
c610: 47 4d 41 20 6d 61 69 6e 2e 69 6e 64 65 78 5f 78  GMA main.index_x
c620: 69 6e 66 6f 20 3d 20 25 51 22 2c 20 70 49 74 65  info = %Q", pIte
c630: 72 2d 3e 7a 49 64 78 29 0a 20 20 20 20 29 3b 0a  r->zIdx).    );.
c640: 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63      while( p->rc
c650: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53  ==SQLITE_OK && S
c660: 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
c670: 65 33 5f 73 74 65 70 28 70 58 49 6e 66 6f 29 20  e3_step(pXInfo) 
c680: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 69  ){.      int iCi
c690: 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  d = sqlite3_colu
c6a0: 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20 31  mn_int(pXInfo, 1
c6b0: 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  );.      const c
c6c0: 68 61 72 20 2a 7a 43 6f 6c 6c 61 74 65 20 3d 20  har *zCollate = 
c6d0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
c6e0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
c6f0: 28 70 58 49 6e 66 6f 2c 20 34 29 3b 0a 20 20 20  (pXInfo, 4);.   
c700: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
c710: 43 6f 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 73  Col;.      if( s
c720: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
c730: 74 28 70 58 49 6e 66 6f 2c 20 33 29 20 29 7b 0a  t(pXInfo, 3) ){.
c740: 20 20 20 20 20 20 20 20 62 46 61 69 6c 65 64 20          bFailed 
c750: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = 1;.        bre
c760: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
c770: 20 20 20 69 66 28 20 69 43 69 64 3c 30 20 29 7b     if( iCid<0 ){
c780: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74  .        if( pIt
c790: 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
c7a0: 4b 5f 49 50 4b 20 29 7b 0a 20 20 20 20 20 20 20  K_IPK ){.       
c7b0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
c7c0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 70 49 74      for(i=0; pIt
c7d0: 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 5d 3d 3d  er->abTblPk[i]==
c7e0: 30 3b 20 69 2b 2b 29 3b 0a 20 20 20 20 20 20 20  0; i++);.       
c7f0: 20 20 20 61 73 73 65 72 74 28 20 69 3c 70 49 74     assert( i<pIt
c800: 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20 29 3b 0a 20  er->nTblCol );. 
c810: 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20           zCol = 
c820: 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b  pIter->azTblCol[
c830: 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  i];.        }els
c840: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 43 6f  e{.          zCo
c850: 6c 20 3d 20 22 5f 72 6f 77 69 64 5f 22 3b 0a 20  l = "_rowid_";. 
c860: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
c870: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43  else{.        zC
c880: 6f 6c 20 3d 20 70 49 74 65 72 2d 3e 61 7a 54 62  ol = pIter->azTb
c890: 6c 43 6f 6c 5b 69 43 69 64 5d 3b 0a 20 20 20 20  lCol[iCid];.    
c8a0: 20 20 7d 0a 0a 20 20 20 20 20 20 7a 4c 68 73 20    }..      zLhs 
c8b0: 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20  = rbuMPrintf(p, 
c8c0: 22 25 7a 25 73 20 5c 22 25 77 5c 22 20 43 4f 4c  "%z%s \"%w\" COL
c8d0: 4c 41 54 45 20 25 51 22 2c 0a 20 20 20 20 20 20  LATE %Q",.      
c8e0: 20 20 20 20 7a 4c 68 73 2c 20 7a 53 65 70 2c 20      zLhs, zSep, 
c8f0: 7a 43 6f 6c 2c 20 7a 43 6f 6c 6c 61 74 65 0a 20  zCol, zCollate. 
c900: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7a 4f       );.      zO
c910: 72 64 65 72 20 3d 20 72 62 75 4d 50 72 69 6e 74  rder = rbuMPrint
c920: 66 28 70 2c 20 22 25 7a 25 73 20 5c 22 72 62 75  f(p, "%z%s \"rbu
c930: 5f 69 6d 70 5f 25 64 25 77 5c 22 20 43 4f 4c 4c  _imp_%d%w\" COLL
c940: 41 54 45 20 25 51 20 44 45 53 43 22 2c 0a 20 20  ATE %Q DESC",.  
c950: 20 20 20 20 20 20 20 20 7a 4f 72 64 65 72 2c 20          zOrder, 
c960: 7a 53 65 70 2c 20 69 43 6f 6c 2c 20 7a 43 6f 6c  zSep, iCol, zCol
c970: 2c 20 7a 43 6f 6c 6c 61 74 65 0a 20 20 20 20 20  , zCollate.     
c980: 20 29 3b 0a 20 20 20 20 20 20 7a 53 65 6c 65 63   );.      zSelec
c990: 74 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70  t = rbuMPrintf(p
c9a0: 2c 20 22 25 7a 25 73 20 71 75 6f 74 65 28 5c 22  , "%z%s quote(\"
c9b0: 72 62 75 5f 69 6d 70 5f 25 64 25 77 5c 22 29 22  rbu_imp_%d%w\")"
c9c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 7a 53 65 6c  ,.          zSel
c9d0: 65 63 74 2c 20 7a 53 65 70 2c 20 69 43 6f 6c 2c  ect, zSep, iCol,
c9e0: 20 7a 43 6f 6c 0a 20 20 20 20 20 20 29 3b 0a 20   zCol.      );. 
c9f0: 20 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 20 22       zSep = ", "
ca00: 3b 0a 20 20 20 20 20 20 69 43 6f 6c 2b 2b 3b 0a  ;.      iCol++;.
ca10: 20 20 20 20 7d 0a 20 20 20 20 72 62 75 46 69 6e      }.    rbuFin
ca20: 61 6c 69 7a 65 28 70 2c 20 70 58 49 6e 66 6f 29  alize(p, pXInfo)
ca30: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 62 46 61 69  ;.  }.  if( bFai
ca40: 6c 65 64 20 29 20 67 6f 74 6f 20 69 6e 64 65 78  led ) goto index
ca50: 5f 73 74 61 72 74 5f 6f 75 74 3b 0a 0a 20 20 69  _start_out;..  i
ca60: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
ca70: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  _OK ){.    int i
ca80: 43 6f 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Col;.    sqlite3
ca90: 5f 73 74 6d 74 20 2a 70 53 65 6c 20 3d 20 30 3b  _stmt *pSel = 0;
caa0: 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  ..    if( p->rc=
cab0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
cac0: 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70      p->rc = prep
cad0: 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63  areFreeAndCollec
cae0: 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e  tError(p->dbMain
caf0: 2c 20 26 70 53 65 6c 2c 20 26 70 2d 3e 7a 45 72  , &pSel, &p->zEr
cb00: 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20  rmsg,.          
cb10: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
cb20: 22 53 45 4c 45 43 54 20 25 73 20 46 52 4f 4d 20  "SELECT %s FROM 
cb30: 5c 22 72 62 75 5f 69 6d 70 5f 25 77 5c 22 20 4f  \"rbu_imp_%w\" O
cb40: 52 44 45 52 20 42 59 20 25 73 20 4c 49 4d 49 54  RDER BY %s LIMIT
cb50: 20 31 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20   1",.           
cb60: 20 7a 53 65 6c 65 63 74 2c 20 70 49 74 65 72 2d   zSelect, pIter-
cb70: 3e 7a 54 62 6c 2c 20 7a 4f 72 64 65 72 0a 20 20  >zTbl, zOrder.  
cb80: 20 20 20 20 20 20 20 20 29 0a 20 20 20 20 20 20          ).      
cb90: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
cba0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
cbb0: 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d  K && SQLITE_ROW=
cbc0: 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
cbd0: 65 6c 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  el) ){.      con
cbe0: 73 74 20 63 68 61 72 20 2a 7a 53 65 70 20 3d 20  st char *zSep = 
cbf0: 22 22 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 43  "";.      for(iC
cc00: 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 49 74 65 72  ol=0; iCol<pIter
cc10: 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b  ->nCol; iCol++){
cc20: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
cc30: 68 61 72 20 2a 7a 51 75 6f 74 65 64 20 3d 20 28  har *zQuoted = (
cc40: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
cc50: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
cc60: 70 53 65 6c 2c 20 69 43 6f 6c 29 3b 0a 20 20 20  pSel, iCol);.   
cc70: 20 20 20 20 20 69 66 28 20 7a 51 75 6f 74 65 64       if( zQuoted
cc80: 5b 30 5d 3d 3d 27 4e 27 20 29 7b 0a 20 20 20 20  [0]=='N' ){.    
cc90: 20 20 20 20 20 20 62 46 61 69 6c 65 64 20 3d 20        bFailed = 
cca0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
ccb0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
ccc0: 20 20 20 20 20 20 7a 56 65 63 74 6f 72 20 3d 20        zVector = 
ccd0: 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25  rbuMPrintf(p, "%
cce0: 7a 25 73 25 73 22 2c 20 7a 56 65 63 74 6f 72 2c  z%s%s", zVector,
ccf0: 20 7a 53 65 70 2c 20 7a 51 75 6f 74 65 64 29 3b   zSep, zQuoted);
cd00: 0a 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20  .        zSep = 
cd10: 22 2c 20 22 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  ", ";.      }.. 
cd20: 20 20 20 20 20 69 66 28 20 21 62 46 61 69 6c 65       if( !bFaile
cd30: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52 65  d ){.        zRe
cd40: 74 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70  t = rbuMPrintf(p
cd50: 2c 20 22 28 25 73 29 20 3e 20 28 25 73 29 22 2c  , "(%s) > (%s)",
cd60: 20 7a 4c 68 73 2c 20 7a 56 65 63 74 6f 72 29 3b   zLhs, zVector);
cd70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
cd80: 20 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70     rbuFinalize(p
cd90: 2c 20 70 53 65 6c 29 3b 0a 20 20 7d 0a 0a 20 69  , pSel);.  }.. i
cda0: 6e 64 65 78 5f 73 74 61 72 74 5f 6f 75 74 3a 0a  ndex_start_out:.
cdb0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
cdc0: 4f 72 64 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  Order);.  sqlite
cdd0: 33 5f 66 72 65 65 28 7a 53 65 6c 65 63 74 29 3b  3_free(zSelect);
cde0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
cdf0: 7a 56 65 63 74 6f 72 29 3b 0a 20 20 73 71 6c 69  zVector);.  sqli
ce00: 74 65 33 5f 66 72 65 65 28 7a 4c 68 73 29 3b 0a  te3_free(zLhs);.
ce10: 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d    return zRet;.}
ce20: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
ce30: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
ce40: 20 63 72 65 61 74 65 20 61 20 53 45 4c 45 43 54   create a SELECT
ce50: 20 6c 69 73 74 20 28 74 68 65 20 6c 69 73 74 20   list (the list 
ce60: 6f 66 20 53 51 4c 20 0a 2a 2a 20 65 78 70 72 65  of SQL .** expre
ce70: 73 73 69 6f 6e 73 20 74 68 61 74 20 66 6f 6c 6c  ssions that foll
ce80: 6f 77 73 20 61 20 53 45 4c 45 43 54 20 6b 65 79  ows a SELECT key
ce90: 77 6f 72 64 29 20 66 6f 72 20 61 20 53 45 4c 45  word) for a SELE
cea0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a  CT statement .**
ceb0: 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 66 72   used to read fr
cec0: 6f 6d 20 61 6e 20 64 61 74 61 5f 78 78 78 20 6f  om an data_xxx o
ced0: 72 20 72 62 75 5f 74 6d 70 5f 78 78 78 20 74 61  r rbu_tmp_xxx ta
cee0: 62 6c 65 20 77 68 69 6c 65 20 75 70 64 61 74 69  ble while updati
cef0: 6e 67 20 74 68 65 20 0a 2a 2a 20 69 6e 64 65 78  ng the .** index
cf00: 20 6f 62 6a 65 63 74 20 63 75 72 72 65 6e 74 6c   object currentl
cf10: 79 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74  y indicated by t
cf20: 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65  he iterator obje
cf30: 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
cf40: 20 0a 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75   .** second argu
cf50: 6d 65 6e 74 2e 20 41 20 22 50 52 41 47 4d 41 20  ment. A "PRAGMA 
cf60: 69 6e 64 65 78 5f 78 69 6e 66 6f 20 3d 20 3c 69  index_xinfo = <i
cf70: 64 78 6e 61 6d 65 3e 22 20 73 74 61 74 65 6d 65  dxname>" stateme
cf80: 6e 74 20 69 73 20 75 73 65 64 20 0a 2a 2a 20 74  nt is used .** t
cf90: 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 72 65 71  o obtain the req
cfa0: 75 69 72 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f  uired informatio
cfb0: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
cfc0: 69 6e 64 65 78 20 69 73 20 6f 66 20 74 68 65 20  index is of the 
cfd0: 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a  following form:.
cfe0: 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49  **.**   CREATE I
cff0: 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 63 2c  NDEX i1 ON t1(c,
d000: 20 62 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73   b COLLATE nocas
d010: 65 29 3b 0a 2a 2a 0a 2a 2a 20 61 6e 64 20 22 74  e);.**.** and "t
d020: 31 22 20 69 73 20 61 20 74 61 62 6c 65 20 77 69  1" is a table wi
d030: 74 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20 49  th an explicit I
d040: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
d050: 45 59 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 22 69  EY column .** "i
d060: 70 6b 22 2c 20 74 68 65 20 72 65 74 75 72 6e 65  pk", the returne
d070: 64 20 73 74 72 69 6e 67 20 69 73 3a 0a 2a 2a 0a  d string is:.**.
d080: 2a 2a 20 20 20 22 60 63 60 20 43 4f 4c 4c 41 54  **   "`c` COLLAT
d090: 45 20 27 42 49 4e 41 52 59 27 2c 20 60 62 60 20  E 'BINARY', `b` 
d0a0: 43 4f 4c 4c 41 54 45 20 27 4e 4f 43 41 53 45 27  COLLATE 'NOCASE'
d0b0: 2c 20 60 69 70 6b 60 20 43 4f 4c 4c 41 54 45 20  , `ipk` COLLATE 
d0c0: 27 42 49 4e 41 52 59 27 22 0a 2a 2a 0a 2a 2a 20  'BINARY'".**.** 
d0d0: 41 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 72  As well as the r
d0e0: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 2c 20  eturned string, 
d0f0: 74 68 72 65 65 20 6f 74 68 65 72 20 6d 61 6c 6c  three other mall
d100: 6f 63 27 64 20 73 74 72 69 6e 67 73 20 61 72 65  oc'd strings are
d110: 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 76 69   .** returned vi
d120: 61 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74  a output paramet
d130: 65 72 73 2e 20 41 73 20 66 6f 6c 6c 6f 77 73 3a  ers. As follows:
d140: 0a 2a 2a 0a 2a 2a 20 20 20 70 7a 49 6d 70 6f 73  .**.**   pzImpos
d150: 74 65 72 43 6f 6c 73 3a 20 2e 2e 2e 0a 2a 2a 20  terCols: ....** 
d160: 20 20 70 7a 49 6d 70 6f 73 74 65 72 50 6b 3a 20    pzImposterPk: 
d170: 2e 2e 2e 0a 2a 2a 20 20 20 70 7a 57 68 65 72 65  ....**   pzWhere
d180: 3a 20 2e 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  : ....*/.static 
d190: 63 68 61 72 20 2a 72 62 75 4f 62 6a 49 74 65 72  char *rbuObjIter
d1a0: 47 65 74 49 6e 64 65 78 43 6f 6c 73 28 0a 20 20  GetIndexCols(.  
d1b0: 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 20  sqlite3rbu *p,  
d1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1d0: 2f 2a 20 52 42 55 20 6f 62 6a 65 63 74 20 2a 2f  /* RBU object */
d1e0: 0a 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70  .  RbuObjIter *p
d1f0: 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  Iter,           
d200: 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 69 74 65     /* Object ite
d210: 72 61 74 6f 72 20 66 6f 72 20 63 6f 6c 75 6d 6e  rator for column
d220: 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 63 68 61 72   names */.  char
d230: 20 2a 2a 70 7a 49 6d 70 6f 73 74 65 72 43 6f 6c   **pzImposterCol
d240: 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  s,          /* O
d250: 55 54 3a 20 43 6f 6c 75 6d 6e 73 20 66 6f 72 20  UT: Columns for 
d260: 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20 2a  imposter table *
d270: 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 49 6d 70  /.  char **pzImp
d280: 6f 73 74 65 72 50 6b 2c 20 20 20 20 20 20 20 20  osterPk,        
d290: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 49 6d 70 6f      /* OUT: Impo
d2a0: 73 74 65 72 20 50 4b 20 63 6c 61 75 73 65 20 2a  ster PK clause *
d2b0: 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 57 68 65  /.  char **pzWhe
d2c0: 72 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  re,             
d2d0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57 48 45 52      /* OUT: WHER
d2e0: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  E clause */.  in
d2f0: 74 20 2a 70 6e 42 69 6e 64 20 20 20 20 20 20 20  t *pnBind       
d300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d310: 20 4f 55 54 3a 20 54 72 62 75 6c 20 6e 75 6d 62   OUT: Trbul numb
d320: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f  er of columns */
d330: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70  .){.  int rc = p
d340: 2d 3e 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  ->rc;           
d350: 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63        /* Error c
d360: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32  ode */.  int rc2
d370: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d380: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
d390: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 29 20 72  te3_finalize() r
d3a0: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
d3b0: 63 68 61 72 20 2a 7a 52 65 74 20 3d 20 30 3b 20  char *zRet = 0; 
d3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3d0: 2f 2a 20 53 74 72 69 6e 67 20 74 6f 20 72 65 74  /* String to ret
d3e0: 75 72 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  urn */.  char *z
d3f0: 49 6d 70 43 6f 6c 73 20 3d 20 30 3b 20 20 20 20  ImpCols = 0;    
d400: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69           /* Stri
d410: 6e 67 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61  ng to return via
d420: 20 2a 70 7a 49 6d 70 6f 73 74 65 72 43 6f 6c 73   *pzImposterCols
d430: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 49 6d 70   */.  char *zImp
d440: 50 4b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  PK = 0;         
d450: 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20        /* String 
d460: 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70  to return via *p
d470: 7a 49 6d 70 6f 73 74 65 72 50 4b 20 2a 2f 0a 20  zImposterPK */. 
d480: 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20   char *zWhere = 
d490: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
d4a0: 20 2f 2a 20 53 74 72 69 6e 67 20 74 6f 20 72 65   /* String to re
d4b0: 74 75 72 6e 20 76 69 61 20 2a 70 7a 57 68 65 72  turn via *pzWher
d4c0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 69 6e 64  e */.  int nBind
d4d0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
d4e0: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
d4f0: 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70  to return via *p
d500: 6e 42 69 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  nBind */.  const
d510: 20 63 68 61 72 20 2a 7a 43 6f 6d 20 3d 20 22 22   char *zCom = ""
d520: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ;          /* Se
d530: 74 20 74 6f 20 22 2c 20 22 20 6c 61 74 65 72 20  t to ", " later 
d540: 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  on */.  const ch
d550: 61 72 20 2a 7a 41 6e 64 20 3d 20 22 22 3b 20 20  ar *zAnd = "";  
d560: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74          /* Set t
d570: 6f 20 22 20 41 4e 44 20 22 20 6c 61 74 65 72 20  o " AND " later 
d580: 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  on */.  sqlite3_
d590: 73 74 6d 74 20 2a 70 58 49 6e 66 6f 20 3d 20 30  stmt *pXInfo = 0
d5a0: 3b 20 20 20 20 20 20 20 2f 2a 20 50 52 41 47 4d  ;       /* PRAGM
d5b0: 41 20 69 6e 64 65 78 5f 78 69 6e 66 6f 20 3d 20  A index_xinfo = 
d5c0: 3f 20 2a 2f 0a 0a 20 20 69 66 28 20 72 63 3d 3d  ? */..  if( rc==
d5d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d5e0: 20 61 73 73 65 72 74 28 20 70 2d 3e 7a 45 72 72   assert( p->zErr
d5f0: 6d 73 67 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63  msg==0 );.    rc
d600: 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e   = prepareFreeAn
d610: 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d  dCollectError(p-
d620: 3e 64 62 4d 61 69 6e 2c 20 26 70 58 49 6e 66 6f  >dbMain, &pXInfo
d630: 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20  , &p->zErrmsg,. 
d640: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
d650: 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20 6d  printf("PRAGMA m
d660: 61 69 6e 2e 69 6e 64 65 78 5f 78 69 6e 66 6f 20  ain.index_xinfo 
d670: 3d 20 25 51 22 2c 20 70 49 74 65 72 2d 3e 7a 49  = %Q", pIter->zI
d680: 64 78 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a  dx).    );.  }..
d690: 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
d6a0: 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45  ITE_OK && SQLITE
d6b0: 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
d6c0: 65 70 28 70 58 49 6e 66 6f 29 20 29 7b 0a 20 20  ep(pXInfo) ){.  
d6d0: 20 20 69 6e 74 20 69 43 69 64 20 3d 20 73 71 6c    int iCid = sql
d6e0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
d6f0: 70 58 49 6e 66 6f 2c 20 31 29 3b 0a 20 20 20 20  pXInfo, 1);.    
d700: 69 6e 74 20 62 44 65 73 63 20 3d 20 73 71 6c 69  int bDesc = sqli
d710: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
d720: 58 49 6e 66 6f 2c 20 33 29 3b 0a 20 20 20 20 63  XInfo, 3);.    c
d730: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
d740: 61 74 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ate = (const cha
d750: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
d760: 6e 5f 74 65 78 74 28 70 58 49 6e 66 6f 2c 20 34  n_text(pXInfo, 4
d770: 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  );.    const cha
d780: 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 63 6f 6e  r *zCol;.    con
d790: 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a  st char *zType;.
d7a0: 0a 20 20 20 20 69 66 28 20 69 43 69 64 3c 30 20  .    if( iCid<0 
d7b0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 69  ){.      /* An i
d7c0: 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b  nteger primary k
d7d0: 65 79 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65  ey. If the table
d7e0: 20 68 61 73 20 61 6e 20 65 78 70 6c 69 63 69 74   has an explicit
d7f0: 20 49 50 4b 2c 20 75 73 65 0a 20 20 20 20 20 20   IPK, use.      
d800: 2a 2a 20 69 74 73 20 6e 61 6d 65 2e 20 4f 74 68  ** its name. Oth
d810: 65 72 77 69 73 65 2c 20 75 73 65 20 22 72 62 75  erwise, use "rbu
d820: 5f 72 6f 77 69 64 22 2e 20 20 2a 2f 0a 20 20 20  _rowid".  */.   
d830: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 65 54     if( pIter->eT
d840: 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 49 50 4b 20  ype==RBU_PK_IPK 
d850: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
d860: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
d870: 30 3b 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50  0; pIter->abTblP
d880: 6b 5b 69 5d 3d 3d 30 3b 20 69 2b 2b 29 3b 0a 20  k[i]==0; i++);. 
d890: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
d8a0: 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20  <pIter->nTblCol 
d8b0: 29 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  );.        zCol 
d8c0: 3d 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f  = pIter->azTblCo
d8d0: 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  l[i];.      }els
d8e0: 65 20 69 66 28 20 72 62 75 49 73 56 61 63 75 75  e if( rbuIsVacuu
d8f0: 6d 28 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20  m(p) ){.        
d900: 7a 43 6f 6c 20 3d 20 22 5f 72 6f 77 69 64 5f 22  zCol = "_rowid_"
d910: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
d920: 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72         zCol = "r
d930: 62 75 5f 72 6f 77 69 64 22 3b 0a 20 20 20 20 20  bu_rowid";.     
d940: 20 7d 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d   }.      zType =
d950: 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20   "INTEGER";.    
d960: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 43 6f  }else{.      zCo
d970: 6c 20 3d 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c  l = pIter->azTbl
d980: 43 6f 6c 5b 69 43 69 64 5d 3b 0a 20 20 20 20 20  Col[iCid];.     
d990: 20 7a 54 79 70 65 20 3d 20 70 49 74 65 72 2d 3e   zType = pIter->
d9a0: 61 7a 54 62 6c 54 79 70 65 5b 69 43 69 64 5d 3b  azTblType[iCid];
d9b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 7a 52 65 74  .    }..    zRet
d9c0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
d9d0: 74 66 28 22 25 7a 25 73 5c 22 25 77 5c 22 20 43  tf("%z%s\"%w\" C
d9e0: 4f 4c 4c 41 54 45 20 25 51 22 2c 20 7a 52 65 74  OLLATE %Q", zRet
d9f0: 2c 20 7a 43 6f 6d 2c 20 7a 43 6f 6c 2c 20 7a 43  , zCom, zCol, zC
da00: 6f 6c 6c 61 74 65 29 3b 0a 20 20 20 20 69 66 28  ollate);.    if(
da10: 20 70 49 74 65 72 2d 3e 62 55 6e 69 71 75 65 3d   pIter->bUnique=
da20: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 63 6f  =0 || sqlite3_co
da30: 6c 75 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f 2c  lumn_int(pXInfo,
da40: 20 35 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e   5) ){.      con
da50: 73 74 20 63 68 61 72 20 2a 7a 4f 72 64 65 72 20  st char *zOrder 
da60: 3d 20 28 62 44 65 73 63 20 3f 20 22 20 44 45 53  = (bDesc ? " DES
da70: 43 22 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20  C" : "");.      
da80: 7a 49 6d 70 50 4b 20 3d 20 73 71 6c 69 74 65 33  zImpPK = sqlite3
da90: 5f 6d 70 72 69 6e 74 66 28 22 25 7a 25 73 5c 22  _mprintf("%z%s\"
daa0: 72 62 75 5f 69 6d 70 5f 25 64 25 77 5c 22 25 73  rbu_imp_%d%w\"%s
dab0: 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 7a 49  ", .          zI
dac0: 6d 70 50 4b 2c 20 7a 43 6f 6d 2c 20 6e 42 69 6e  mpPK, zCom, nBin
dad0: 64 2c 20 7a 43 6f 6c 2c 20 7a 4f 72 64 65 72 0a  d, zCol, zOrder.
dae0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
daf0: 20 20 20 7a 49 6d 70 43 6f 6c 73 20 3d 20 73 71     zImpCols = sq
db00: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
db10: 7a 25 73 5c 22 72 62 75 5f 69 6d 70 5f 25 64 25  z%s\"rbu_imp_%d%
db20: 77 5c 22 20 25 73 20 43 4f 4c 4c 41 54 45 20 25  w\" %s COLLATE %
db30: 51 22 2c 20 0a 20 20 20 20 20 20 20 20 7a 49 6d  Q", .        zIm
db40: 70 43 6f 6c 73 2c 20 7a 43 6f 6d 2c 20 6e 42 69  pCols, zCom, nBi
db50: 6e 64 2c 20 7a 43 6f 6c 2c 20 7a 54 79 70 65 2c  nd, zCol, zType,
db60: 20 7a 43 6f 6c 6c 61 74 65 0a 20 20 20 20 29 3b   zCollate.    );
db70: 0a 20 20 20 20 7a 57 68 65 72 65 20 3d 20 73 71  .    zWhere = sq
db80: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
db90: 20 20 20 20 20 20 20 22 25 7a 25 73 5c 22 72 62         "%z%s\"rb
dba0: 75 5f 69 6d 70 5f 25 64 25 77 5c 22 20 49 53 20  u_imp_%d%w\" IS 
dbb0: 3f 22 2c 20 7a 57 68 65 72 65 2c 20 7a 41 6e 64  ?", zWhere, zAnd
dbc0: 2c 20 6e 42 69 6e 64 2c 20 7a 43 6f 6c 0a 20 20  , nBind, zCol.  
dbd0: 20 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 65    );.    if( zRe
dbe0: 74 3d 3d 30 20 7c 7c 20 7a 49 6d 70 50 4b 3d 3d  t==0 || zImpPK==
dbf0: 30 20 7c 7c 20 7a 49 6d 70 43 6f 6c 73 3d 3d 30  0 || zImpCols==0
dc00: 20 7c 7c 20 7a 57 68 65 72 65 3d 3d 30 20 29 20   || zWhere==0 ) 
dc10: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
dc20: 4d 3b 0a 20 20 20 20 7a 43 6f 6d 20 3d 20 22 2c  M;.    zCom = ",
dc30: 20 22 3b 0a 20 20 20 20 7a 41 6e 64 20 3d 20 22   ";.    zAnd = "
dc40: 20 41 4e 44 20 22 3b 0a 20 20 20 20 6e 42 69 6e   AND ";.    nBin
dc50: 64 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72 63 32 20  d++;.  }..  rc2 
dc60: 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
dc70: 7a 65 28 70 58 49 6e 66 6f 29 3b 0a 20 20 69 66  ze(pXInfo);.  if
dc80: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
dc90: 29 20 72 63 20 3d 20 72 63 32 3b 0a 0a 20 20 69  ) rc = rc2;..  i
dca0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
dcb0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
dcc0: 66 72 65 65 28 7a 52 65 74 29 3b 0a 20 20 20 20  free(zRet);.    
dcd0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6d  sqlite3_free(zIm
dce0: 70 43 6f 6c 73 29 3b 0a 20 20 20 20 73 71 6c 69  pCols);.    sqli
dcf0: 74 65 33 5f 66 72 65 65 28 7a 49 6d 70 50 4b 29  te3_free(zImpPK)
dd00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
dd10: 65 65 28 7a 57 68 65 72 65 29 3b 0a 20 20 20 20  ee(zWhere);.    
dd20: 7a 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 7a 49  zRet = 0;.    zI
dd30: 6d 70 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 20 20  mpCols = 0;.    
dd40: 7a 49 6d 70 50 4b 20 3d 20 30 3b 0a 20 20 20 20  zImpPK = 0;.    
dd50: 7a 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 20 20  zWhere = 0;.    
dd60: 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 7d 0a  p->rc = rc;.  }.
dd70: 0a 20 20 2a 70 7a 49 6d 70 6f 73 74 65 72 43 6f  .  *pzImposterCo
dd80: 6c 73 20 3d 20 7a 49 6d 70 43 6f 6c 73 3b 0a 20  ls = zImpCols;. 
dd90: 20 2a 70 7a 49 6d 70 6f 73 74 65 72 50 6b 20 3d   *pzImposterPk =
dda0: 20 7a 49 6d 70 50 4b 3b 0a 20 20 2a 70 7a 57 68   zImpPK;.  *pzWh
ddb0: 65 72 65 20 3d 20 7a 57 68 65 72 65 3b 0a 20 20  ere = zWhere;.  
ddc0: 2a 70 6e 42 69 6e 64 20 3d 20 6e 42 69 6e 64 3b  *pnBind = nBind;
ddd0: 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a  .  return zRet;.
dde0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 75 6d 69 6e  }../*.** Assumin
ddf0: 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61  g the current ta
de00: 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  ble columns are 
de10: 22 61 22 2c 20 22 62 22 20 61 6e 64 20 22 63 22  "a", "b" and "c"
de20: 2c 20 61 6e 64 20 74 68 65 20 7a 4f 62 6a 0a 2a  , and the zObj.*
de30: 2a 20 70 61 72 61 6d 74 65 72 20 69 73 20 70 61  * paramter is pa
de40: 73 73 65 64 20 22 6f 6c 64 22 2c 20 72 65 74 75  ssed "old", retu
de50: 72 6e 20 61 20 73 74 72 69 6e 67 20 6f 66 20 74  rn a string of t
de60: 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
de70: 20 20 20 22 6f 6c 64 2e 61 2c 20 6f 6c 64 2e 62     "old.a, old.b
de80: 2c 20 6f 6c 64 2e 62 22 0a 2a 2a 0a 2a 2a 20 57  , old.b".**.** W
de90: 69 74 68 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ith the column n
dea0: 61 6d 65 73 20 65 73 63 61 70 65 64 2e 0a 2a 2a  ames escaped..**
deb0: 0a 2a 2a 20 46 6f 72 20 74 61 62 6c 65 73 20 77  .** For tables w
dec0: 69 74 68 20 69 6d 70 6c 69 63 69 74 20 72 6f 77  ith implicit row
ded0: 69 64 73 20 2d 20 52 42 55 5f 50 4b 5f 45 58 54  ids - RBU_PK_EXT
dee0: 45 52 4e 41 4c 20 61 6e 64 20 52 42 55 5f 50 4b  ERNAL and RBU_PK
def0: 5f 4e 4f 4e 45 2c 20 61 70 70 65 6e 64 0a 2a 2a  _NONE, append.**
df00: 20 74 68 65 20 74 65 78 74 20 22 2c 20 6f 6c 64   the text ", old
df10: 2e 5f 72 6f 77 69 64 5f 22 20 74 6f 20 74 68 65  ._rowid_" to the
df20: 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 2e   returned value.
df30: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
df40: 2a 72 62 75 4f 62 6a 49 74 65 72 47 65 74 4f 6c  *rbuObjIterGetOl
df50: 64 6c 69 73 74 28 0a 20 20 73 71 6c 69 74 65 33  dlist(.  sqlite3
df60: 72 62 75 20 2a 70 2c 20 0a 20 20 52 62 75 4f 62  rbu *p, .  RbuOb
df70: 6a 49 74 65 72 20 2a 70 49 74 65 72 2c 0a 20 20  jIter *pIter,.  
df80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a  const char *zObj
df90: 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 69 73  .){.  char *zLis
dfa0: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  t = 0;.  if( p->
dfb0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
dfc0: 20 70 49 74 65 72 2d 3e 61 62 49 6e 64 65 78 65   pIter->abIndexe
dfd0: 64 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  d ){.    const c
dfe0: 68 61 72 20 2a 7a 53 20 3d 20 22 22 3b 0a 20 20  har *zS = "";.  
dff0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
e000: 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e  (i=0; i<pIter->n
e010: 54 62 6c 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  TblCol; i++){.  
e020: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 61      if( pIter->a
e030: 62 49 6e 64 65 78 65 64 5b 69 5d 20 29 7b 0a 20  bIndexed[i] ){. 
e040: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
e050: 72 20 2a 7a 43 6f 6c 20 3d 20 70 49 74 65 72 2d  r *zCol = pIter-
e060: 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 3b 0a 20 20  >azTblCol[i];.  
e070: 20 20 20 20 20 20 7a 4c 69 73 74 20 3d 20 73 71        zList = sq
e080: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
e090: 7a 25 73 25 73 2e 5c 22 25 77 5c 22 22 2c 20 7a  z%s%s.\"%w\"", z
e0a0: 4c 69 73 74 2c 20 7a 53 2c 20 7a 4f 62 6a 2c 20  List, zS, zObj, 
e0b0: 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c  zCol);.      }el
e0c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 73  se{.        zLis
e0d0: 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  t = sqlite3_mpri
e0e0: 6e 74 66 28 22 25 7a 25 73 4e 55 4c 4c 22 2c 20  ntf("%z%sNULL", 
e0f0: 7a 4c 69 73 74 2c 20 7a 53 29 3b 0a 20 20 20 20  zList, zS);.    
e100: 20 20 7d 0a 20 20 20 20 20 20 7a 53 20 3d 20 22    }.      zS = "
e110: 2c 20 22 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  , ";.      if( z
e120: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  List==0 ){.     
e130: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
e140: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
e150: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
e160: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 6f      }..    /* Fo
e170: 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 69  r a table with i
e180: 6d 70 6c 69 63 69 74 20 72 6f 77 69 64 73 2c 20  mplicit rowids, 
e190: 61 70 70 65 6e 64 20 22 6f 6c 64 2e 5f 72 6f 77  append "old._row
e1a0: 69 64 5f 22 20 74 6f 20 74 68 65 20 6c 69 73 74  id_" to the list
e1b0: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74  . */.    if( pIt
e1c0: 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
e1d0: 4b 5f 45 58 54 45 52 4e 41 4c 20 7c 7c 20 70 49  K_EXTERNAL || pI
e1e0: 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f  ter->eType==RBU_
e1f0: 50 4b 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  PK_NONE ){.     
e200: 20 7a 4c 69 73 74 20 3d 20 72 62 75 4d 50 72 69   zList = rbuMPri
e210: 6e 74 66 28 70 2c 20 22 25 7a 2c 20 25 73 2e 5f  ntf(p, "%z, %s._
e220: 72 6f 77 69 64 5f 22 2c 20 7a 4c 69 73 74 2c 20  rowid_", zList, 
e230: 7a 4f 62 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  zObj);.    }.  }
e240: 0a 20 20 72 65 74 75 72 6e 20 7a 4c 69 73 74 3b  .  return zList;
e250: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
e260: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
e270: 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20  hat can be used 
e280: 69 6e 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  in a WHERE claus
e290: 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 0a 2a  e to match the.*
e2a0: 2a 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 66  * primary key of
e2b0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
e2c0: 6c 65 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  le. For example,
e2d0: 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
e2e0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45  :.**.**   CREATE
e2f0: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20   TABLE t1(a, b, 
e300: 63 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 62  c, PRIMARY KEY(b
e310: 2c 20 63 29 29 3b 0a 2a 2a 0a 2a 2a 20 52 65 74  , c));.**.** Ret
e320: 75 72 6e 20 74 68 65 20 73 74 72 69 6e 67 3a 0a  urn the string:.
e330: 2a 2a 0a 2a 2a 20 20 20 22 62 20 3d 20 3f 31 20  **.**   "b = ?1 
e340: 41 4e 44 20 63 20 3d 20 3f 32 22 0a 2a 2f 0a 73  AND c = ?2".*/.s
e350: 74 61 74 69 63 20 63 68 61 72 20 2a 72 62 75 4f  tatic char *rbuO
e360: 62 6a 49 74 65 72 47 65 74 57 68 65 72 65 28 0a  bjIterGetWhere(.
e370: 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c    sqlite3rbu *p,
e380: 20 0a 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a   .  RbuObjIter *
e390: 70 49 74 65 72 0a 29 7b 0a 20 20 63 68 61 72 20  pIter.){.  char 
e3a0: 2a 7a 4c 69 73 74 20 3d 20 30 3b 0a 20 20 69 66  *zList = 0;.  if
e3b0: 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  ( pIter->eType==
e3c0: 52 42 55 5f 50 4b 5f 56 54 41 42 20 7c 7c 20 70  RBU_PK_VTAB || p
e3d0: 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55  Iter->eType==RBU
e3e0: 5f 50 4b 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  _PK_NONE ){.    
e3f0: 7a 4c 69 73 74 20 3d 20 72 62 75 4d 50 72 69 6e  zList = rbuMPrin
e400: 74 66 28 70 2c 20 22 5f 72 6f 77 69 64 5f 20 3d  tf(p, "_rowid_ =
e410: 20 3f 25 64 22 2c 20 70 49 74 65 72 2d 3e 6e 54   ?%d", pIter->nT
e420: 62 6c 43 6f 6c 2b 31 29 3b 0a 20 20 7d 65 6c 73  blCol+1);.  }els
e430: 65 20 69 66 28 20 70 49 74 65 72 2d 3e 65 54 79  e if( pIter->eTy
e440: 70 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52  pe==RBU_PK_EXTER
e450: 4e 41 4c 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  NAL ){.    const
e460: 20 63 68 61 72 20 2a 7a 53 65 70 20 3d 20 22 22   char *zSep = ""
e470: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
e480: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65   for(i=0; i<pIte
e490: 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69 2b 2b 29  r->nTblCol; i++)
e4a0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  {.      if( pIte
e4b0: 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 5d 20 29 7b  r->abTblPk[i] ){
e4c0: 0a 20 20 20 20 20 20 20 20 7a 4c 69 73 74 20 3d  .        zList =
e4d0: 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22   rbuMPrintf(p, "
e4e0: 25 7a 25 73 63 25 64 3d 3f 25 64 22 2c 20 7a 4c  %z%sc%d=?%d", zL
e4f0: 69 73 74 2c 20 7a 53 65 70 2c 20 69 2c 20 69 2b  ist, zSep, i, i+
e500: 31 29 3b 0a 20 20 20 20 20 20 20 20 7a 53 65 70  1);.        zSep
e510: 20 3d 20 22 20 41 4e 44 20 22 3b 0a 20 20 20 20   = " AND ";.    
e520: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4c    }.    }.    zL
e530: 69 73 74 20 3d 20 72 62 75 4d 50 72 69 6e 74 66  ist = rbuMPrintf
e540: 28 70 2c 20 0a 20 20 20 20 20 20 20 20 22 5f 72  (p, .        "_r
e550: 6f 77 69 64 5f 20 3d 20 28 53 45 4c 45 43 54 20  owid_ = (SELECT 
e560: 69 64 20 46 52 4f 4d 20 72 62 75 5f 69 6d 70 6f  id FROM rbu_impo
e570: 73 74 65 72 32 20 57 48 45 52 45 20 25 7a 29 22  ster2 WHERE %z)"
e580: 2c 20 7a 4c 69 73 74 0a 20 20 20 20 29 3b 0a 0a  , zList.    );..
e590: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e    }else{.    con
e5a0: 73 74 20 63 68 61 72 20 2a 7a 53 65 70 20 3d 20  st char *zSep = 
e5b0: 22 22 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  "";.    int i;. 
e5c0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
e5d0: 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69 2b  ter->nTblCol; i+
e5e0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49  +){.      if( pI
e5f0: 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 5d 20  ter->abTblPk[i] 
e600: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
e610: 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 70 49   char *zCol = pI
e620: 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d  ter->azTblCol[i]
e630: 3b 0a 20 20 20 20 20 20 20 20 7a 4c 69 73 74 20  ;.        zList 
e640: 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20  = rbuMPrintf(p, 
e650: 22 25 7a 25 73 5c 22 25 77 5c 22 3d 3f 25 64 22  "%z%s\"%w\"=?%d"
e660: 2c 20 7a 4c 69 73 74 2c 20 7a 53 65 70 2c 20 7a  , zList, zSep, z
e670: 43 6f 6c 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20  Col, i+1);.     
e680: 20 20 20 7a 53 65 70 20 3d 20 22 20 41 4e 44 20     zSep = " AND 
e690: 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ";.      }.    }
e6a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4c  .  }.  return zL
e6b0: 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ist;.}../*.** Th
e6c0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
e6d0: 6e 74 20 69 74 65 72 61 74 69 6e 67 20 74 68 72  nt iterating thr
e6e0: 6f 75 67 68 20 74 68 65 20 6b 65 79 73 20 66 6f  ough the keys fo
e6f0: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f 62  r the current ob
e700: 6a 65 63 74 0a 2a 2a 20 28 70 2d 3e 6f 62 6a 69  ject.** (p->obji
e710: 74 65 72 2e 70 53 65 6c 65 63 74 29 20 63 75 72  ter.pSelect) cur
e720: 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
e730: 20 61 20 76 61 6c 69 64 20 72 6f 77 2e 20 48 6f   a valid row. Ho
e740: 77 65 76 65 72 2c 20 74 68 65 72 65 0a 2a 2a 20  wever, there.** 
e750: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 77 72 6f  is something wro
e760: 6e 67 20 77 69 74 68 20 74 68 65 20 72 62 75 5f  ng with the rbu_
e770: 63 6f 6e 74 72 6f 6c 20 76 61 6c 75 65 20 69 6e  control value in
e780: 20 74 68 65 20 72 62 75 5f 63 6f 6e 74 72 6f 6c   the rbu_control
e790: 20 76 61 6c 75 65 0a 2a 2a 20 73 74 6f 72 65 64   value.** stored
e7a0: 20 69 6e 20 74 68 65 20 28 70 2d 3e 6e 43 6f 6c   in the (p->nCol
e7b0: 2b 31 29 27 74 68 20 63 6f 6c 75 6d 6e 2e 20 53  +1)'th column. S
e7c0: 65 74 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  et the error cod
e7d0: 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73  e and error mess
e7e0: 61 67 65 0a 2a 2a 20 6f 66 20 74 68 65 20 52 42  age.** of the RB
e7f0: 55 20 68 61 6e 64 6c 65 20 74 6f 20 73 6f 6d 65  U handle to some
e800: 74 68 69 6e 67 20 72 65 66 6c 65 63 74 69 6e 67  thing reflecting
e810: 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   this..*/.static
e820: 20 76 6f 69 64 20 72 62 75 42 61 64 43 6f 6e 74   void rbuBadCont
e830: 72 6f 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33  rolError(sqlite3
e840: 72 62 75 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63  rbu *p){.  p->rc
e850: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
e860: 0a 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20  .  p->zErrmsg = 
e870: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
e880: 22 69 6e 76 61 6c 69 64 20 72 62 75 5f 63 6f 6e  "invalid rbu_con
e890: 74 72 6f 6c 20 76 61 6c 75 65 22 29 3b 0a 7d 0a  trol value");.}.
e8a0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
e8b0: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
e8c0: 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  string containin
e8d0: 67 20 74 68 65 20 63 6f 6d 6d 61 20 73 65 70 61  g the comma sepa
e8e0: 72 61 74 65 64 20 6c 69 73 74 20 6f 66 0a 2a 2a  rated list of.**
e8f0: 20 61 73 73 69 67 6e 6d 65 6e 74 73 20 74 68 61   assignments tha
e900: 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 63 6c  t should be incl
e910: 75 64 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  uded following t
e920: 68 65 20 22 53 45 54 22 20 6b 65 79 77 6f 72 64  he "SET" keyword
e930: 20 6f 66 0a 2a 2a 20 61 6e 20 55 50 44 41 54 45   of.** an UPDATE
e940: 20 73 74 61 74 65 6d 65 6e 74 20 75 73 65 64 20   statement used 
e950: 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 74 61  to update the ta
e960: 62 6c 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20  ble object that 
e970: 74 68 65 20 69 74 65 72 61 74 6f 72 0a 2a 2a 20  the iterator.** 
e980: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
e990: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63 75  cond argument cu
e9a0: 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
e9b0: 6f 20 69 66 20 74 68 65 20 72 62 75 5f 63 6f 6e  o if the rbu_con
e9c0: 74 72 6f 6c 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f  trol.** column o
e9d0: 66 20 74 68 65 20 64 61 74 61 5f 78 78 78 20 74  f the data_xxx t
e9e0: 61 62 6c 65 20 65 6e 74 72 79 20 69 73 20 73 65  able entry is se
e9f0: 74 20 74 6f 20 7a 4d 61 73 6b 2e 0a 2a 2a 0a 2a  t to zMask..**.*
ea00: 2a 20 54 68 65 20 6d 65 6d 6f 72 79 20 66 6f 72  * The memory for
ea10: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
ea20: 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64  ring is obtained
ea30: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
ea40: 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 74 20 69 73  lloc()..** It is
ea50: 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
ea60: 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
ea70: 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
ea80: 66 72 65 65 20 69 74 20 75 73 69 6e 67 0a 2a 2a  free it using.**
ea90: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
eaa0: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f   .**.** If an OO
eab0: 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  M error is encou
eac0: 6e 74 65 72 65 64 20 77 68 65 6e 20 61 6c 6c 6f  ntered when allo
ead0: 63 61 74 69 6e 67 20 73 70 61 63 65 20 66 6f 72  cating space for
eae0: 20 74 68 65 20 6e 65 77 0a 2a 2a 20 73 74 72 69   the new.** stri
eaf0: 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ng, an error cod
eb00: 65 20 69 73 20 6c 65 66 74 20 69 6e 20 74 68 65  e is left in the
eb10: 20 72 62 75 20 68 61 6e 64 6c 65 20 70 61 73 73   rbu handle pass
eb20: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 0a  ed as the first.
eb30: 2a 2a 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20  ** argument and 
eb40: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
eb50: 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f  . Or, if an erro
eb60: 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
eb70: 63 75 72 72 65 64 0a 2a 2a 20 77 68 65 6e 20 74  curred.** when t
eb80: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
eb90: 63 61 6c 6c 65 64 2c 20 4e 55 4c 4c 20 69 73 20  called, NULL is 
eba0: 72 65 74 75 72 6e 65 64 20 69 6d 6d 65 64 69 61  returned immedia
ebb0: 74 65 6c 79 2c 20 77 69 74 68 6f 75 74 0a 2a 2a  tely, without.**
ebc0: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 68 65 20   attempting the 
ebd0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 72 20 6d 6f  allocation or mo
ebe0: 64 69 66 79 69 6e 67 20 74 68 65 20 73 74 6f 72  difying the stor
ebf0: 65 64 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  ed error code..*
ec00: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 72  /.static char *r
ec10: 62 75 4f 62 6a 49 74 65 72 47 65 74 53 65 74 6c  buObjIterGetSetl
ec20: 69 73 74 28 0a 20 20 73 71 6c 69 74 65 33 72 62  ist(.  sqlite3rb
ec30: 75 20 2a 70 2c 0a 20 20 52 62 75 4f 62 6a 49 74  u *p,.  RbuObjIt
ec40: 65 72 20 2a 70 49 74 65 72 2c 0a 20 20 63 6f 6e  er *pIter,.  con
ec50: 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 6b 0a 29  st char *zMask.)
ec60: 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 69 73 74 20  {.  char *zList 
ec70: 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  = 0;.  if( p->rc
ec80: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
ec90: 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 69     int i;..    i
eca0: 66 28 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a  f( (int)strlen(z
ecb0: 4d 61 73 6b 29 21 3d 70 49 74 65 72 2d 3e 6e 54  Mask)!=pIter->nT
ecc0: 62 6c 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 72  blCol ){.      r
ecd0: 62 75 42 61 64 43 6f 6e 74 72 6f 6c 45 72 72 6f  buBadControlErro
ece0: 72 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  r(p);.    }else{
ecf0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
ed00: 72 20 2a 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20  r *zSep = "";.  
ed10: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
ed20: 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69  Iter->nTblCol; i
ed30: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
ed40: 72 20 63 20 3d 20 7a 4d 61 73 6b 5b 70 49 74 65  r c = zMask[pIte
ed50: 72 2d 3e 61 69 53 72 63 4f 72 64 65 72 5b 69 5d  r->aiSrcOrder[i]
ed60: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ];.        if( c
ed70: 3d 3d 27 78 27 20 29 7b 0a 20 20 20 20 20 20 20  =='x' ){.       
ed80: 20 20 20 7a 4c 69 73 74 20 3d 20 72 62 75 4d 50     zList = rbuMP
ed90: 72 69 6e 74 66 28 70 2c 20 22 25 7a 25 73 5c 22  rintf(p, "%z%s\"
eda0: 25 77 5c 22 3d 3f 25 64 22 2c 20 0a 20 20 20 20  %w\"=?%d", .    
edb0: 20 20 20 20 20 20 20 20 20 20 7a 4c 69 73 74 2c            zList,
edc0: 20 7a 53 65 70 2c 20 70 49 74 65 72 2d 3e 61 7a   zSep, pIter->az
edd0: 54 62 6c 43 6f 6c 5b 69 5d 2c 20 69 2b 31 0a 20  TblCol[i], i+1. 
ede0: 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
edf0: 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 20        zSep = ", 
ee00: 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ";.        }.   
ee10: 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 63 3d       else if( c=
ee20: 3d 27 64 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='d' ){.        
ee30: 20 20 7a 4c 69 73 74 20 3d 20 72 62 75 4d 50 72    zList = rbuMPr
ee40: 69 6e 74 66 28 70 2c 20 22 25 7a 25 73 5c 22 25  intf(p, "%z%s\"%
ee50: 77 5c 22 3d 72 62 75 5f 64 65 6c 74 61 28 5c 22  w\"=rbu_delta(\"
ee60: 25 77 5c 22 2c 20 3f 25 64 29 22 2c 20 0a 20 20  %w\", ?%d)", .  
ee70: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4c 69 73              zLis
ee80: 74 2c 20 7a 53 65 70 2c 20 70 49 74 65 72 2d 3e  t, zSep, pIter->
ee90: 61 7a 54 62 6c 43 6f 6c 5b 69 5d 2c 20 70 49 74  azTblCol[i], pIt
eea0: 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 2c  er->azTblCol[i],
eeb0: 20 69 2b 31 0a 20 20 20 20 20 20 20 20 20 20 29   i+1.          )
eec0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 53 65 70  ;.          zSep
eed0: 20 3d 20 22 2c 20 22 3b 0a 20 20 20 20 20 20 20   = ", ";.       
eee0: 20 7d 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20   }.        else 
eef0: 69 66 28 20 63 3d 3d 27 66 27 20 29 7b 0a 20 20  if( c=='f' ){.  
ef00: 20 20 20 20 20 20 20 20 7a 4c 69 73 74 20 3d 20          zList = 
ef10: 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25  rbuMPrintf(p, "%
ef20: 7a 25 73 5c 22 25 77 5c 22 3d 72 62 75 5f 66 6f  z%s\"%w\"=rbu_fo
ef30: 73 73 69 6c 5f 64 65 6c 74 61 28 5c 22 25 77 5c  ssil_delta(\"%w\
ef40: 22 2c 20 3f 25 64 29 22 2c 20 0a 20 20 20 20 20  ", ?%d)", .     
ef50: 20 20 20 20 20 20 20 20 20 7a 4c 69 73 74 2c 20           zList, 
ef60: 7a 53 65 70 2c 20 70 49 74 65 72 2d 3e 61 7a 54  zSep, pIter->azT
ef70: 62 6c 43 6f 6c 5b 69 5d 2c 20 70 49 74 65 72 2d  blCol[i], pIter-
ef80: 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 2c 20 69 2b  >azTblCol[i], i+
ef90: 31 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  1.          );. 
efa0: 20 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20           zSep = 
efb0: 22 2c 20 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ", ";.        }.
efc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
efd0: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4c 69 73 74  }.  return zList
efe0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
eff0: 6e 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  n a nul-terminat
f000: 65 64 20 73 74 72 69 6e 67 20 63 6f 6e 73 69 73  ed string consis
f010: 74 69 6e 67 20 6f 66 20 6e 42 79 74 65 20 63 6f  ting of nByte co
f020: 6d 6d 61 20 73 65 70 61 72 61 74 65 64 0a 2a 2a  mma separated.**
f030: 20 22 3f 22 20 65 78 70 72 65 73 73 69 6f 6e 73   "?" expressions
f040: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
f050: 66 20 6e 42 79 74 65 20 69 73 20 33 2c 20 72 65  f nByte is 3, re
f060: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
f070: 6f 0a 2a 2a 20 61 20 62 75 66 66 65 72 20 63 6f  o.** a buffer co
f080: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 74 72  ntaining the str
f090: 69 6e 67 20 22 3f 2c 3f 2c 3f 22 2e 0a 2a 2a 0a  ing "?,?,?"..**.
f0a0: 2a 2a 20 54 68 65 20 6d 65 6d 6f 72 79 20 66 6f  ** The memory fo
f0b0: 72 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  r the returned s
f0c0: 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65  tring is obtaine
f0d0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
f0e0: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 74 20 69  alloc()..** It i
f0f0: 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
f100: 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
f110: 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
f120: 20 66 72 65 65 20 69 74 20 75 73 69 6e 67 0a 2a   free it using.*
f130: 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  * sqlite3_free()
f140: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f  . .**.** If an O
f150: 4f 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  OM error is enco
f160: 75 6e 74 65 72 65 64 20 77 68 65 6e 20 61 6c 6c  untered when all
f170: 6f 63 61 74 69 6e 67 20 73 70 61 63 65 20 66 6f  ocating space fo
f180: 72 20 74 68 65 20 6e 65 77 0a 2a 2a 20 73 74 72  r the new.** str
f190: 69 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  ing, an error co
f1a0: 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20 74 68  de is left in th
f1b0: 65 20 72 62 75 20 68 61 6e 64 6c 65 20 70 61 73  e rbu handle pas
f1c0: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
f1d0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 61 6e 64  .** argument and
f1e0: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
f1f0: 64 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72  d. Or, if an err
f200: 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  or has already o
f210: 63 63 75 72 72 65 64 0a 2a 2a 20 77 68 65 6e 20  ccurred.** when 
f220: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
f230: 20 63 61 6c 6c 65 64 2c 20 4e 55 4c 4c 20 69 73   called, NULL is
f240: 20 72 65 74 75 72 6e 65 64 20 69 6d 6d 65 64 69   returned immedi
f250: 61 74 65 6c 79 2c 20 77 69 74 68 6f 75 74 0a 2a  ately, without.*
f260: 2a 20 61 74 74 65 6d 70 74 69 6e 67 20 74 68 65  * attempting the
f270: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 72 20 6d   allocation or m
f280: 6f 64 69 66 79 69 6e 67 20 74 68 65 20 73 74 6f  odifying the sto
f290: 72 65 64 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  red error code..
f2a0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
f2b0: 72 62 75 4f 62 6a 49 74 65 72 47 65 74 42 69 6e  rbuObjIterGetBin
f2c0: 64 6c 69 73 74 28 73 71 6c 69 74 65 33 72 62 75  dlist(sqlite3rbu
f2d0: 20 2a 70 2c 20 69 6e 74 20 6e 42 69 6e 64 29 7b   *p, int nBind){
f2e0: 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20  .  char *zRet = 
f2f0: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  0;.  sqlite3_int
f300: 36 34 20 6e 42 79 74 65 20 3d 20 32 2a 28 73 71  64 nByte = 2*(sq
f310: 6c 69 74 65 33 5f 69 6e 74 36 34 29 6e 42 69 6e  lite3_int64)nBin
f320: 64 20 2b 20 31 3b 0a 0a 20 20 7a 52 65 74 20 3d  d + 1;..  zRet =
f330: 20 28 63 68 61 72 2a 29 72 62 75 4d 61 6c 6c 6f   (char*)rbuMallo
f340: 63 28 70 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69  c(p, nByte);.  i
f350: 66 28 20 7a 52 65 74 20 29 7b 0a 20 20 20 20 69  f( zRet ){.    i
f360: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
f370: 30 3b 20 69 3c 6e 42 69 6e 64 3b 20 69 2b 2b 29  0; i<nBind; i++)
f380: 7b 0a 20 20 20 20 20 20 7a 52 65 74 5b 69 2a 32  {.      zRet[i*2
f390: 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20 20 20 7a  ] = '?';.      z
f3a0: 52 65 74 5b 69 2a 32 2b 31 5d 20 3d 20 28 69 2b  Ret[i*2+1] = (i+
f3b0: 31 3d 3d 6e 42 69 6e 64 29 20 3f 20 27 5c 30 27  1==nBind) ? '\0'
f3c0: 20 3a 20 27 2c 27 3b 0a 20 20 20 20 7d 0a 20 20   : ',';.    }.  
f3d0: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b  }.  return zRet;
f3e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 74  .}../*.** The it
f3f0: 65 72 61 74 6f 72 20 63 75 72 72 65 6e 74 6c 79  erator currently
f400: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 74 61 62   points to a tab
f410: 6c 65 20 28 6e 6f 74 20 69 6e 64 65 78 29 20 6f  le (not index) o
f420: 66 20 74 79 70 65 20 0a 2a 2a 20 52 42 55 5f 50  f type .** RBU_P
f430: 4b 5f 57 49 54 48 4f 55 54 5f 52 4f 57 49 44 2e  K_WITHOUT_ROWID.
f440: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
f450: 72 65 61 74 65 73 20 74 68 65 20 50 52 49 4d 41  reates the PRIMA
f460: 52 59 20 4b 45 59 20 0a 2a 2a 20 64 65 63 6c 61  RY KEY .** decla
f470: 72 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 63  ration for the c
f480: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69 6d 70  orresponding imp
f490: 6f 73 74 65 72 20 74 61 62 6c 65 2e 20 46 6f 72  oster table. For
f4a0: 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 69 66 20   example,.** if 
f4b0: 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69  the iterator poi
f4c0: 6e 74 73 20 74 6f 20 61 20 74 61 62 6c 65 20 63  nts to a table c
f4d0: 72 65 61 74 65 64 20 61 73 3a 0a 2a 2a 0a 2a 2a  reated as:.**.**
f4e0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
f4f0: 74 31 28 61 2c 20 62 2c 20 63 2c 20 50 52 49 4d  t1(a, b, c, PRIM
f500: 41 52 59 20 4b 45 59 28 62 2c 20 61 20 44 45 53  ARY KEY(b, a DES
f510: 43 29 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49  C)) WITHOUT ROWI
f520: 44 0a 2a 2a 0a 2a 2a 20 74 68 69 73 20 66 75 6e  D.**.** this fun
f530: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 3a 0a 2a  ction returns:.*
f540: 2a 0a 2a 2a 20 20 20 50 52 49 4d 41 52 59 20 4b  *.**   PRIMARY K
f550: 45 59 28 22 62 22 2c 20 22 61 22 20 44 45 53 43  EY("b", "a" DESC
f560: 29 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ).*/.static char
f570: 20 2a 72 62 75 57 69 74 68 6f 75 74 52 6f 77 69   *rbuWithoutRowi
f580: 64 50 4b 28 73 71 6c 69 74 65 33 72 62 75 20 2a  dPK(sqlite3rbu *
f590: 70 2c 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70  p, RbuObjIter *p
f5a0: 49 74 65 72 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Iter){.  char *z
f5b0: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
f5c0: 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d 30 20 29  pIter->zIdx==0 )
f5d0: 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
f5e0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f5f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70  const char *zSep
f600: 20 3d 20 22 50 52 49 4d 41 52 59 20 4b 45 59 28   = "PRIMARY KEY(
f610: 22 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ";.    sqlite3_s
f620: 74 6d 74 20 2a 70 58 4c 69 73 74 20 3d 20 30 3b  tmt *pXList = 0;
f630: 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 69       /* PRAGMA i
f640: 6e 64 65 78 5f 6c 69 73 74 20 3d 20 28 70 49 74  ndex_list = (pIt
f650: 65 72 2d 3e 7a 54 62 6c 29 20 2a 2f 0a 20 20 20  er->zTbl) */.   
f660: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
f670: 58 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 2f  XInfo = 0;     /
f680: 2a 20 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 78  * PRAGMA index_x
f690: 69 6e 66 6f 20 3d 20 3c 70 6b 2d 69 6e 64 65 78  info = <pk-index
f6a0: 3e 20 2a 2f 0a 20 20 20 0a 20 20 20 20 70 2d 3e  > */.   .    p->
f6b0: 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65  rc = prepareFree
f6c0: 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
f6d0: 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 58 4c 69  p->dbMain, &pXLi
f6e0: 73 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c  st, &p->zErrmsg,
f6f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f700: 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41  _mprintf("PRAGMA
f710: 20 6d 61 69 6e 2e 69 6e 64 65 78 5f 6c 69 73 74   main.index_list
f720: 20 3d 20 25 51 22 2c 20 70 49 74 65 72 2d 3e 7a   = %Q", pIter->z
f730: 54 62 6c 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  Tbl).    );.    
f740: 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51  while( p->rc==SQ
f750: 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54  LITE_OK && SQLIT
f760: 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
f770: 74 65 70 28 70 58 4c 69 73 74 29 20 29 7b 0a 20  tep(pXList) ){. 
f780: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
f790: 2a 7a 4f 72 69 67 20 3d 20 28 63 6f 6e 73 74 20  *zOrig = (const 
f7a0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
f7b0: 6c 75 6d 6e 5f 74 65 78 74 28 70 58 4c 69 73 74  lumn_text(pXList
f7c0: 2c 33 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  ,3);.      if( z
f7d0: 4f 72 69 67 20 26 26 20 73 74 72 63 6d 70 28 7a  Orig && strcmp(z
f7e0: 4f 72 69 67 2c 20 22 70 6b 22 29 3d 3d 30 20 29  Orig, "pk")==0 )
f7f0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
f800: 63 68 61 72 20 2a 7a 49 64 78 20 3d 20 28 63 6f  char *zIdx = (co
f810: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
f820: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 58  3_column_text(pX
f830: 4c 69 73 74 2c 31 29 3b 0a 20 20 20 20 20 20 20  List,1);.       
f840: 20 69 66 28 20 7a 49 64 78 20 29 7b 0a 20 20 20   if( zIdx ){.   
f850: 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70         p->rc = p
f860: 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c  repareFreeAndCol
f870: 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d  lectError(p->dbM
f880: 61 69 6e 2c 20 26 70 58 49 6e 66 6f 2c 20 26 70  ain, &pXInfo, &p
f890: 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20 20  ->zErrmsg,.     
f8a0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
f8b0: 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41  _mprintf("PRAGMA
f8c0: 20 6d 61 69 6e 2e 69 6e 64 65 78 5f 78 69 6e 66   main.index_xinf
f8d0: 6f 20 3d 20 25 51 22 2c 20 7a 49 64 78 29 0a 20  o = %Q", zIdx). 
f8e0: 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
f8f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
f900: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
f910: 20 7d 0a 20 20 20 20 72 62 75 46 69 6e 61 6c 69   }.    rbuFinali
f920: 7a 65 28 70 2c 20 70 58 4c 69 73 74 29 3b 0a 0a  ze(p, pXList);..
f930: 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63      while( p->rc
f940: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53  ==SQLITE_OK && S
f950: 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
f960: 65 33 5f 73 74 65 70 28 70 58 49 6e 66 6f 29 20  e3_step(pXInfo) 
f970: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
f980: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
f990: 70 58 49 6e 66 6f 2c 20 35 29 20 29 7b 0a 20 20  pXInfo, 5) ){.  
f9a0: 20 20 20 20 20 20 2f 2a 20 69 6e 74 20 69 43 69        /* int iCi
f9b0: 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  d = sqlite3_colu
f9c0: 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20 30  mn_int(pXInfo, 0
f9d0: 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f  ); */.        co
f9e0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d  nst char *zCol =
f9f0: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
fa00: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
fa10: 74 28 70 58 49 6e 66 6f 2c 20 32 29 3b 0a 20 20  t(pXInfo, 2);.  
fa20: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
fa30: 20 2a 7a 44 65 73 63 20 3d 20 73 71 6c 69 74 65   *zDesc = sqlite
fa40: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49  3_column_int(pXI
fa50: 6e 66 6f 2c 20 33 29 20 3f 20 22 20 44 45 53 43  nfo, 3) ? " DESC
fa60: 22 20 3a 20 22 22 3b 0a 20 20 20 20 20 20 20 20  " : "";.        
fa70: 7a 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70  z = rbuMPrintf(p
fa80: 2c 20 22 25 7a 25 73 5c 22 25 77 5c 22 25 73 22  , "%z%s\"%w\"%s"
fa90: 2c 20 7a 2c 20 7a 53 65 70 2c 20 7a 43 6f 6c 2c  , z, zSep, zCol,
faa0: 20 7a 44 65 73 63 29 3b 0a 20 20 20 20 20 20 20   zDesc);.       
fab0: 20 7a 53 65 70 20 3d 20 22 2c 20 22 3b 0a 20 20   zSep = ", ";.  
fac0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
fad0: 7a 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70  z = rbuMPrintf(p
fae0: 2c 20 22 25 7a 29 22 2c 20 7a 29 3b 0a 20 20 20  , "%z)", z);.   
faf0: 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20   rbuFinalize(p, 
fb00: 70 58 49 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72  pXInfo);.  }.  r
fb10: 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn z;.}../*.*
fb20: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
fb30: 63 72 65 61 74 65 73 20 74 68 65 20 73 65 63 6f  creates the seco
fb40: 6e 64 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  nd imposter tabl
fb50: 65 20 75 73 65 64 20 77 68 65 6e 20 77 72 69 74  e used when writ
fb60: 69 6e 67 20 74 6f 0a 2a 2a 20 61 20 74 61 62 6c  ing to.** a tabl
fb70: 65 20 62 2d 74 72 65 65 20 77 68 65 72 65 20 74  e b-tree where t
fb80: 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20  he table has an 
fb90: 65 78 74 65 72 6e 61 6c 20 70 72 69 6d 61 72 79  external primary
fba0: 20 6b 65 79 2e 20 49 66 20 74 68 65 0a 2a 2a 20   key. If the.** 
fbb0: 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20  iterator passed 
fbc0: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
fbd0: 67 75 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20  gument does not 
fbe0: 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 20  currently point 
fbf0: 74 6f 0a 2a 2a 20 61 20 74 61 62 6c 65 20 28 6e  to.** a table (n
fc00: 6f 74 20 69 6e 64 65 78 29 20 77 69 74 68 20 61  ot index) with a
fc10: 6e 20 65 78 74 65 72 6e 61 6c 20 70 72 69 6d 61  n external prima
fc20: 72 79 20 6b 65 79 2c 20 74 68 69 73 20 66 75 6e  ry key, this fun
fc30: 63 74 69 6f 6e 20 69 73 20 61 0a 2a 2a 20 6e 6f  ction is a.** no
fc40: 2d 6f 70 2e 20 0a 2a 2a 0a 2a 2a 20 41 73 73 75  -op. .**.** Assu
fc50: 6d 69 6e 67 20 74 68 65 20 69 74 65 72 61 74 6f  ming the iterato
fc60: 72 20 64 6f 65 73 20 70 6f 69 6e 74 20 74 6f 20  r does point to 
fc70: 61 20 74 61 62 6c 65 20 77 69 74 68 20 61 6e 20  a table with an 
fc80: 65 78 74 65 72 6e 61 6c 20 50 4b 2c 20 74 68 69  external PK, thi
fc90: 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 63 72  s.** function cr
fca0: 65 61 74 65 73 20 61 20 57 49 54 48 4f 55 54 20  eates a WITHOUT 
fcb0: 52 4f 57 49 44 20 69 6d 70 6f 73 74 65 72 20 74  ROWID imposter t
fcc0: 61 62 6c 65 20 6e 61 6d 65 64 20 22 72 62 75 5f  able named "rbu_
fcd0: 69 6d 70 6f 73 74 65 72 32 22 0a 2a 2a 20 75 73  imposter2".** us
fce0: 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 61  ed to access tha
fcf0: 74 20 50 4b 20 69 6e 64 65 78 2e 20 46 6f 72 20  t PK index. For 
fd00: 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
fd10: 74 61 72 67 65 74 20 74 61 62 6c 65 20 69 73 0a  target table is.
fd20: 2a 2a 20 64 65 63 6c 61 72 65 64 20 61 73 20 66  ** declared as f
fd30: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
fd40: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
fd50: 61 2c 20 62 20 54 45 58 54 2c 20 63 20 52 45 41  a, b TEXT, c REA
fd60: 4c 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 62  L, PRIMARY KEY(b
fd70: 2c 20 63 29 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65  , c));.**.** the
fd80: 6e 20 74 68 65 20 69 6d 70 6f 73 74 65 72 20 74  n the imposter t
fd90: 61 62 6c 65 20 73 63 68 65 6d 61 20 69 73 3a 0a  able schema is:.
fda0: 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54  **.**   CREATE T
fdb0: 41 42 4c 45 20 72 62 75 5f 69 6d 70 6f 73 74 65  ABLE rbu_imposte
fdc0: 72 32 28 63 31 20 54 45 58 54 2c 20 63 32 20 52  r2(c1 TEXT, c2 R
fdd0: 45 41 4c 2c 20 69 64 20 49 4e 54 45 47 45 52 29  EAL, id INTEGER)
fde0: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 3b 0a   WITHOUT ROWID;.
fdf0: 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  **.*/.static voi
fe00: 64 20 72 62 75 43 72 65 61 74 65 49 6d 70 6f 73  d rbuCreateImpos
fe10: 74 65 72 54 61 62 6c 65 32 28 73 71 6c 69 74 65  terTable2(sqlite
fe20: 33 72 62 75 20 2a 70 2c 20 52 62 75 4f 62 6a 49  3rbu *p, RbuObjI
fe30: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
fe40: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
fe50: 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d 3e 65 54  _OK && pIter->eT
fe60: 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45  ype==RBU_PK_EXTE
fe70: 52 4e 41 4c 20 29 7b 0a 20 20 20 20 69 6e 74 20  RNAL ){.    int 
fe80: 74 6e 75 6d 20 3d 20 70 49 74 65 72 2d 3e 69 50  tnum = pIter->iP
fe90: 6b 54 6e 75 6d 3b 20 20 20 20 2f 2a 20 52 6f 6f  kTnum;    /* Roo
fea0: 74 20 70 61 67 65 20 6f 66 20 50 4b 20 69 6e 64  t page of PK ind
feb0: 65 78 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ex */.    sqlite
fec0: 33 5f 73 74 6d 74 20 2a 70 51 75 65 72 79 20 3d  3_stmt *pQuery =
fed0: 20 30 3b 20 20 20 20 20 2f 2a 20 53 45 4c 45 43   0;     /* SELEC
fee0: 54 20 6e 61 6d 65 20 2e 2e 2e 20 57 48 45 52 45  T name ... WHERE
fef0: 20 72 6f 6f 74 70 61 67 65 20 3d 20 24 74 6e 75   rootpage = $tnu
ff00: 6d 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63  m */.    const c
ff10: 68 61 72 20 2a 7a 49 64 78 20 3d 20 30 3b 20 20  har *zIdx = 0;  
ff20: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
ff30: 66 20 50 4b 20 69 6e 64 65 78 20 2a 2f 0a 20 20  f PK index */.  
ff40: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
ff50: 70 58 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20  pXInfo = 0;     
ff60: 2f 2a 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 69  /* PRAGMA main.i
ff70: 6e 64 65 78 5f 78 69 6e 66 6f 20 3d 20 24 7a 49  ndex_xinfo = $zI
ff80: 64 78 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  dx */.    const 
ff90: 63 68 61 72 20 2a 7a 43 6f 6d 6d 61 20 3d 20 22  char *zComma = "
ffa0: 22 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  ";.    char *zCo
ffb0: 6c 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ls = 0;         
ffc0: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
ffd0: 62 75 69 6c 64 20 75 70 20 6c 69 73 74 20 6f 66  build up list of
ffe0: 20 74 61 62 6c 65 20 63 6f 6c 73 20 2a 2f 0a 20   table cols */. 
fff0: 20 20 20 63 68 61 72 20 2a 7a 50 6b 20 3d 20 30     char *zPk = 0
10000 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10010 20 2f 2a 20 55 73 65 64 20 74 6f 20 62 75 69 6c   /* Used to buil
10020 64 20 75 70 20 74 61 62 6c 65 20 50 4b 20 64 65  d up table PK de
10030 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20  claration */..  
10040 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
10050 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
10060 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65  primary key inde
10070 78 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  x for the curren
10080 74 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20  t table..    ** 
10090 54 68 69 73 20 69 73 20 6e 65 65 64 65 64 20 66  This is needed f
100a0 6f 72 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  or the argument 
100b0 74 6f 20 22 50 52 41 47 4d 41 20 69 6e 64 65 78  to "PRAGMA index
100c0 5f 78 69 6e 66 6f 22 2e 20 53 65 74 0a 20 20 20  _xinfo". Set.   
100d0 20 2a 2a 20 7a 49 64 78 20 74 6f 20 70 6f 69 6e   ** zIdx to poin
100e0 74 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69  t to a nul-termi
100f0 6e 61 74 65 64 20 73 74 72 69 6e 67 20 63 6f 6e  nated string con
10100 74 61 69 6e 69 6e 67 20 74 68 69 73 20 6e 61 6d  taining this nam
10110 65 2e 20 2a 2f 0a 20 20 20 20 70 2d 3e 72 63 20  e. */.    p->rc 
10120 3d 20 70 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c  = prepareAndColl
10130 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61  ectError(p->dbMa
10140 69 6e 2c 20 26 70 51 75 65 72 79 2c 20 26 70 2d  in, &pQuery, &p-
10150 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20  >zErrmsg, .     
10160 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20     "SELECT name 
10170 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
10180 65 72 20 57 48 45 52 45 20 72 6f 6f 74 70 61 67  er WHERE rootpag
10190 65 20 3d 20 3f 22 0a 20 20 20 20 29 3b 0a 20 20  e = ?".    );.  
101a0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
101b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
101c0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
101d0 28 70 51 75 65 72 79 2c 20 31 2c 20 74 6e 75 6d  (pQuery, 1, tnum
101e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  );.      if( SQL
101f0 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
10200 5f 73 74 65 70 28 70 51 75 65 72 79 29 20 29 7b  _step(pQuery) ){
10210 0a 20 20 20 20 20 20 20 20 7a 49 64 78 20 3d 20  .        zIdx = 
10220 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
10230 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
10240 28 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20  (pQuery, 0);.   
10250 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
10260 66 28 20 7a 49 64 78 20 29 7b 0a 20 20 20 20 20  f( zIdx ){.     
10270 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65   p->rc = prepare
10280 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  FreeAndCollectEr
10290 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26  ror(p->dbMain, &
102a0 70 58 49 6e 66 6f 2c 20 26 70 2d 3e 7a 45 72 72  pXInfo, &p->zErr
102b0 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20 73  msg,.          s
102c0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
102d0 50 52 41 47 4d 41 20 6d 61 69 6e 2e 69 6e 64 65  PRAGMA main.inde
102e0 78 5f 78 69 6e 66 6f 20 3d 20 25 51 22 2c 20 7a  x_xinfo = %Q", z
102f0 49 64 78 29 0a 20 20 20 20 20 20 29 3b 0a 20 20  Idx).      );.  
10300 20 20 7d 0a 20 20 20 20 72 62 75 46 69 6e 61 6c    }.    rbuFinal
10310 69 7a 65 28 70 2c 20 70 51 75 65 72 79 29 3b 0a  ize(p, pQuery);.
10320 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72  .    while( p->r
10330 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
10340 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
10350 74 65 33 5f 73 74 65 70 28 70 58 49 6e 66 6f 29  te3_step(pXInfo)
10360 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 4b   ){.      int bK
10370 65 79 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ey = sqlite3_col
10380 75 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20  umn_int(pXInfo, 
10390 35 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4b  5);.      if( bK
103a0 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ey ){.        in
103b0 74 20 69 43 69 64 20 3d 20 73 71 6c 69 74 65 33  t iCid = sqlite3
103c0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49 6e  _column_int(pXIn
103d0 66 6f 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  fo, 1);.        
103e0 69 6e 74 20 62 44 65 73 63 20 3d 20 73 71 6c 69  int bDesc = sqli
103f0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
10400 58 49 6e 66 6f 2c 20 33 29 3b 0a 20 20 20 20 20  XInfo, 3);.     
10410 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
10420 43 6f 6c 6c 61 74 65 20 3d 20 28 63 6f 6e 73 74  Collate = (const
10430 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
10440 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 58 49 6e 66  olumn_text(pXInf
10450 6f 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7a  o, 4);.        z
10460 43 6f 6c 73 20 3d 20 72 62 75 4d 50 72 69 6e 74  Cols = rbuMPrint
10470 66 28 70 2c 20 22 25 7a 25 73 63 25 64 20 25 73  f(p, "%z%sc%d %s
10480 20 43 4f 4c 4c 41 54 45 20 25 51 22 2c 20 7a 43   COLLATE %Q", zC
10490 6f 6c 73 2c 20 7a 43 6f 6d 6d 61 2c 20 0a 20 20  ols, zComma, .  
104a0 20 20 20 20 20 20 20 20 20 20 69 43 69 64 2c 20            iCid, 
104b0 70 49 74 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65  pIter->azTblType
104c0 5b 69 43 69 64 5d 2c 20 7a 43 6f 6c 6c 61 74 65  [iCid], zCollate
104d0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
104e0 20 20 20 20 7a 50 6b 20 3d 20 72 62 75 4d 50 72      zPk = rbuMPr
104f0 69 6e 74 66 28 70 2c 20 22 25 7a 25 73 63 25 64  intf(p, "%z%sc%d
10500 25 73 22 2c 20 7a 50 6b 2c 20 7a 43 6f 6d 6d 61  %s", zPk, zComma
10510 2c 20 69 43 69 64 2c 20 62 44 65 73 63 3f 22 20  , iCid, bDesc?" 
10520 44 45 53 43 22 3a 22 22 29 3b 0a 20 20 20 20 20  DESC":"");.     
10530 20 20 20 7a 43 6f 6d 6d 61 20 3d 20 22 2c 20 22     zComma = ", "
10540 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10550 20 20 20 20 7a 43 6f 6c 73 20 3d 20 72 62 75 4d      zCols = rbuM
10560 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 2c 20 69  Printf(p, "%z, i
10570 64 20 49 4e 54 45 47 45 52 22 2c 20 7a 43 6f 6c  d INTEGER", zCol
10580 73 29 3b 0a 20 20 20 20 72 62 75 46 69 6e 61 6c  s);.    rbuFinal
10590 69 7a 65 28 70 2c 20 70 58 49 6e 66 6f 29 3b 0a  ize(p, pXInfo);.
105a0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73  .    sqlite3_tes
105b0 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
105c0 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54  _TESTCTRL_IMPOST
105d0 45 52 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22  ER, p->dbMain, "
105e0 6d 61 69 6e 22 2c 20 31 2c 20 74 6e 75 6d 29 3b  main", 1, tnum);
105f0 0a 20 20 20 20 72 62 75 4d 50 72 69 6e 74 66 45  .    rbuMPrintfE
10600 78 65 63 28 70 2c 20 70 2d 3e 64 62 4d 61 69 6e  xec(p, p->dbMain
10610 2c 0a 20 20 20 20 20 20 20 20 22 43 52 45 41 54  ,.        "CREAT
10620 45 20 54 41 42 4c 45 20 72 62 75 5f 69 6d 70 6f  E TABLE rbu_impo
10630 73 74 65 72 32 28 25 7a 2c 20 50 52 49 4d 41 52  ster2(%z, PRIMAR
10640 59 20 4b 45 59 28 25 7a 29 29 20 57 49 54 48 4f  Y KEY(%z)) WITHO
10650 55 54 20 52 4f 57 49 44 22 2c 20 0a 20 20 20 20  UT ROWID", .    
10660 20 20 20 20 7a 43 6f 6c 73 2c 20 7a 50 6b 0a 20      zCols, zPk. 
10670 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
10680 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
10690 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
106a0 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 4d 61  MPOSTER, p->dbMa
106b0 69 6e 2c 20 22 6d 61 69 6e 22 2c 20 30 2c 20 30  in, "main", 0, 0
106c0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
106d0 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  If an error has 
106e0 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
106f0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
10700 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
10710 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  t .** immediatel
10720 79 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 28  y returns zero (
10730 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
10740 79 20 77 6f 72 6b 29 2e 20 4f 72 2c 20 69 66 20  y work). Or, if 
10750 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75  an error.** occu
10760 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 65 78  rs during the ex
10770 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20  ecution of this 
10780 66 75 6e 63 74 69 6f 6e 2c 20 69 74 20 73 65 74  function, it set
10790 73 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  s the error code
107a0 0a 2a 2a 20 69 6e 20 74 68 65 20 73 71 6c 69 74  .** in the sqlit
107b0 65 33 72 62 75 20 6f 62 6a 65 63 74 20 69 6e 64  e3rbu object ind
107c0 69 63 61 74 65 64 20 62 79 20 74 68 65 20 66 69  icated by the fi
107d0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 61 6e 64  rst argument and
107e0 20 72 65 74 75 72 6e 73 0a 2a 2a 20 7a 65 72 6f   returns.** zero
107f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72  ..**.** The iter
10800 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  ator passed as t
10810 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
10820 6e 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  nt is guaranteed
10830 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20   to point to.** 
10840 61 20 74 61 62 6c 65 20 28 6e 6f 74 20 61 6e 20  a table (not an 
10850 69 6e 64 65 78 29 20 77 68 65 6e 20 74 68 69 73  index) when this
10860 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
10870 6c 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69  led. This functi
10880 6f 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74  on.** attempts t
10890 6f 20 63 72 65 61 74 65 20 61 6e 79 20 69 6d 70  o create any imp
108a0 6f 73 74 65 72 20 74 61 62 6c 65 20 72 65 71 75  oster table requ
108b0 69 72 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f  ired to write to
108c0 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 74 61 62   the main.** tab
108d0 6c 65 20 62 2d 74 72 65 65 20 6f 66 20 74 68 65  le b-tree of the
108e0 20 74 61 62 6c 65 20 62 65 66 6f 72 65 20 72 65   table before re
108f0 74 75 72 6e 69 6e 67 2e 20 4e 6f 6e 2d 7a 65 72  turning. Non-zer
10900 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  o is returned if
10910 0a 2a 2a 20 61 6e 20 69 6d 70 6f 73 74 65 72 20  .** an imposter 
10920 74 61 62 6c 65 20 61 72 65 20 63 72 65 61 74 65  table are create
10930 64 2c 20 6f 72 20 7a 65 72 6f 20 6f 74 68 65 72  d, or zero other
10940 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69  wise..**.** An i
10950 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20 69 73  mposter table is
10960 20 72 65 71 75 69 72 65 64 20 69 6e 20 61 6c 6c   required in all
10970 20 63 61 73 65 73 20 65 78 63 65 70 74 20 52 42   cases except RB
10980 55 5f 50 4b 5f 56 54 41 42 2e 20 4f 6e 6c 79 0a  U_PK_VTAB. Only.
10990 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ** virtual table
109a0 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 74 6f  s are written to
109b0 20 64 69 72 65 63 74 6c 79 2e 20 54 68 65 20 69   directly. The i
109c0 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20 68 61  mposter table ha
109d0 73 20 74 68 65 20 0a 2a 2a 20 73 61 6d 65 20 73  s the .** same s
109e0 63 68 65 6d 61 20 61 73 20 74 68 65 20 61 63 74  chema as the act
109f0 75 61 6c 20 74 61 72 67 65 74 20 74 61 62 6c 65  ual target table
10a00 20 28 6c 65 73 73 20 61 6e 79 20 55 4e 49 51 55   (less any UNIQU
10a10 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 29 2e 20  E constraints). 
10a20 0a 2a 2a 20 4d 6f 72 65 20 70 72 65 63 69 73 65  .** More precise
10a30 6c 79 2c 20 74 68 65 20 22 73 61 6d 65 20 73 63  ly, the "same sc
10a40 68 65 6d 61 22 20 6d 65 61 6e 73 20 74 68 65 20  hema" means the 
10a50 73 61 6d 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 79  same columns, ty
10a60 70 65 73 2c 20 0a 2a 2a 20 63 6f 6c 6c 61 74 69  pes, .** collati
10a70 6f 6e 20 73 65 71 75 65 6e 63 65 73 2e 20 46 6f  on sequences. Fo
10a80 72 20 74 61 62 6c 65 73 20 74 68 61 74 20 64 6f  r tables that do
10a90 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 65 78 74   not have an ext
10aa0 65 72 6e 61 6c 20 50 52 49 4d 41 52 59 0a 2a 2a  ernal PRIMARY.**
10ab0 20 4b 45 59 2c 20 69 74 20 61 6c 73 6f 20 6d 65   KEY, it also me
10ac0 61 6e 73 20 74 68 65 20 73 61 6d 65 20 50 52 49  ans the same PRI
10ad0 4d 41 52 59 20 4b 45 59 20 64 65 63 6c 61 72 61  MARY KEY declara
10ae0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
10af0 76 6f 69 64 20 72 62 75 43 72 65 61 74 65 49 6d  void rbuCreateIm
10b00 70 6f 73 74 65 72 54 61 62 6c 65 28 73 71 6c 69  posterTable(sqli
10b10 74 65 33 72 62 75 20 2a 70 2c 20 52 62 75 4f 62  te3rbu *p, RbuOb
10b20 6a 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  jIter *pIter){. 
10b30 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
10b40 54 45 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d 3e  TE_OK && pIter->
10b50 65 54 79 70 65 21 3d 52 42 55 5f 50 4b 5f 56 54  eType!=RBU_PK_VT
10b60 41 42 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 6e  AB ){.    int tn
10b70 75 6d 20 3d 20 70 49 74 65 72 2d 3e 69 54 6e 75  um = pIter->iTnu
10b80 6d 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  m;.    const cha
10b90 72 20 2a 7a 43 6f 6d 6d 61 20 3d 20 22 22 3b 0a  r *zComma = "";.
10ba0 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d      char *zSql =
10bb0 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c   0;.    int iCol
10bc0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65  ;.    sqlite3_te
10bd0 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
10be0 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53  E_TESTCTRL_IMPOS
10bf0 54 45 52 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20  TER, p->dbMain, 
10c00 22 6d 61 69 6e 22 2c 20 30 2c 20 31 29 3b 0a 0a  "main", 0, 1);..
10c10 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
10c20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
10c30 20 26 26 20 69 43 6f 6c 3c 70 49 74 65 72 2d 3e   && iCol<pIter->
10c40 6e 54 62 6c 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29  nTblCol; iCol++)
10c50 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
10c60 61 72 20 2a 7a 50 6b 20 3d 20 22 22 3b 0a 20 20  ar *zPk = "";.  
10c70 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
10c80 7a 43 6f 6c 20 3d 20 70 49 74 65 72 2d 3e 61 7a  zCol = pIter->az
10c90 54 62 6c 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20  TblCol[iCol];.  
10ca0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
10cb0 7a 43 6f 6c 6c 20 3d 20 30 3b 0a 0a 20 20 20 20  zColl = 0;..    
10cc0 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
10cd0 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  3_table_column_m
10ce0 65 74 61 64 61 74 61 28 0a 20 20 20 20 20 20 20  etadata(.       
10cf0 20 20 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d     p->dbMain, "m
10d00 61 69 6e 22 2c 20 70 49 74 65 72 2d 3e 7a 54 62  ain", pIter->zTb
10d10 6c 2c 20 7a 43 6f 6c 2c 20 30 2c 20 26 7a 43 6f  l, zCol, 0, &zCo
10d20 6c 6c 2c 20 30 2c 20 30 2c 20 30 0a 20 20 20 20  ll, 0, 0, 0.    
10d30 20 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20    );..      if( 
10d40 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
10d50 55 5f 50 4b 5f 49 50 4b 20 26 26 20 70 49 74 65  U_PK_IPK && pIte
10d60 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 43 6f 6c 5d  r->abTblPk[iCol]
10d70 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
10d80 66 20 74 68 65 20 74 61 72 67 65 74 20 74 61 62  f the target tab
10d90 6c 65 20 63 6f 6c 75 6d 6e 20 69 73 20 61 6e 20  le column is an 
10da0 22 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59  "INTEGER PRIMARY
10db0 20 4b 45 59 22 2c 20 61 64 64 0a 20 20 20 20 20   KEY", add.     
10dc0 20 20 20 2a 2a 20 22 50 52 49 4d 41 52 59 20 4b     ** "PRIMARY K
10dd0 45 59 22 20 74 6f 20 74 68 65 20 69 6d 70 6f 73  EY" to the impos
10de0 74 65 72 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  ter table column
10df0 20 64 65 63 6c 61 72 61 74 69 6f 6e 2e 20 2a 2f   declaration. */
10e00 0a 20 20 20 20 20 20 20 20 7a 50 6b 20 3d 20 22  .        zPk = "
10e10 50 52 49 4d 41 52 59 20 4b 45 59 20 22 3b 0a 20  PRIMARY KEY ";. 
10e20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 53 71       }.      zSq
10e30 6c 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70  l = rbuMPrintf(p
10e40 2c 20 22 25 7a 25 73 5c 22 25 77 5c 22 20 25 73  , "%z%s\"%w\" %s
10e50 20 25 73 43 4f 4c 4c 41 54 45 20 25 51 25 73 22   %sCOLLATE %Q%s"
10e60 2c 20 0a 20 20 20 20 20 20 20 20 20 20 7a 53 71  , .          zSq
10e70 6c 2c 20 7a 43 6f 6d 6d 61 2c 20 7a 43 6f 6c 2c  l, zComma, zCol,
10e80 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 54 79 70   pIter->azTblTyp
10e90 65 5b 69 43 6f 6c 5d 2c 20 7a 50 6b 2c 20 7a 43  e[iCol], zPk, zC
10ea0 6f 6c 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 28  oll,.          (
10eb0 70 49 74 65 72 2d 3e 61 62 4e 6f 74 4e 75 6c 6c  pIter->abNotNull
10ec0 5b 69 43 6f 6c 5d 20 3f 20 22 20 4e 4f 54 20 4e  [iCol] ? " NOT N
10ed0 55 4c 4c 22 20 3a 20 22 22 29 0a 20 20 20 20 20  ULL" : "").     
10ee0 20 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6d 6d 61   );.      zComma
10ef0 20 3d 20 22 2c 20 22 3b 0a 20 20 20 20 7d 0a 0a   = ", ";.    }..
10f00 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 65      if( pIter->e
10f10 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 57 49 54  Type==RBU_PK_WIT
10f20 48 4f 55 54 5f 52 4f 57 49 44 20 29 7b 0a 20 20  HOUT_ROWID ){.  
10f30 20 20 20 20 63 68 61 72 20 2a 7a 50 6b 20 3d 20      char *zPk = 
10f40 72 62 75 57 69 74 68 6f 75 74 52 6f 77 69 64 50  rbuWithoutRowidP
10f50 4b 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  K(p, pIter);.   
10f60 20 20 20 69 66 28 20 7a 50 6b 20 29 7b 0a 20 20     if( zPk ){.  
10f70 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 72 62 75        zSql = rbu
10f80 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 2c 20  MPrintf(p, "%z, 
10f90 25 7a 22 2c 20 7a 53 71 6c 2c 20 7a 50 6b 29 3b  %z", zSql, zPk);
10fa0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
10fb0 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74      sqlite3_test
10fc0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
10fd0 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45  TESTCTRL_IMPOSTE
10fe0 52 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d  R, p->dbMain, "m
10ff0 61 69 6e 22 2c 20 31 2c 20 74 6e 75 6d 29 3b 0a  ain", 1, tnum);.
11000 20 20 20 20 72 62 75 4d 50 72 69 6e 74 66 45 78      rbuMPrintfEx
11010 65 63 28 70 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c  ec(p, p->dbMain,
11020 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 5c   "CREATE TABLE \
11030 22 72 62 75 5f 69 6d 70 5f 25 77 5c 22 28 25 7a  "rbu_imp_%w\"(%z
11040 29 25 73 22 2c 20 0a 20 20 20 20 20 20 20 20 70  )%s", .        p
11050 49 74 65 72 2d 3e 7a 54 62 6c 2c 20 7a 53 71 6c  Iter->zTbl, zSql
11060 2c 20 0a 20 20 20 20 20 20 20 20 28 70 49 74 65  , .        (pIte
11070 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
11080 5f 57 49 54 48 4f 55 54 5f 52 4f 57 49 44 20 3f  _WITHOUT_ROWID ?
11090 20 22 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44   " WITHOUT ROWID
110a0 22 20 3a 20 22 22 29 0a 20 20 20 20 29 3b 0a 20  " : "").    );. 
110b0 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
110c0 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
110d0 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52  ESTCTRL_IMPOSTER
110e0 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61  , p->dbMain, "ma
110f0 69 6e 22 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  in", 0, 0);.  }.
11100 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65  }../*.** Prepare
11110 20 61 20 73 74 61 74 65 6d 65 6e 74 20 75 73 65   a statement use
11120 64 20 74 6f 20 69 6e 73 65 72 74 20 72 6f 77 73  d to insert rows
11130 20 69 6e 74 6f 20 74 68 65 20 22 72 62 75 5f 74   into the "rbu_t
11140 6d 70 5f 78 78 78 22 20 74 61 62 6c 65 2e 0a 2a  mp_xxx" table..*
11150 2a 20 53 70 65 63 69 66 69 63 61 6c 6c 79 20 61  * Specifically a
11160 20 73 74 61 74 65 6d 65 6e 74 20 6f 66 20 74 68   statement of th
11170 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
11180 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 72 62    INSERT INTO rb
11190 75 5f 74 6d 70 5f 78 78 78 20 56 41 4c 55 45 53  u_tmp_xxx VALUES
111a0 28 3f 2c 20 3f 2c 20 3f 20 2e 2e 2e 29 3b 0a 2a  (?, ?, ? ...);.*
111b0 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20  *.** The number 
111c0 6f 66 20 62 6f 75 6e 64 20 76 61 72 69 61 62 6c  of bound variabl
111d0 65 73 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74  es is equal to t
111e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
111f0 75 6d 6e 73 20 69 6e 0a 2a 2a 20 74 68 65 20 74  umns in.** the t
11200 61 72 67 65 74 20 74 61 62 6c 65 2c 20 70 6c 75  arget table, plu
11210 73 20 6f 6e 65 20 28 66 6f 72 20 74 68 65 20 72  s one (for the r
11220 62 75 5f 63 6f 6e 74 72 6f 6c 20 63 6f 6c 75 6d  bu_control colum
11230 6e 29 2c 20 70 6c 75 73 20 6f 6e 65 20 6d 6f 72  n), plus one mor
11240 65 20 0a 2a 2a 20 28 66 6f 72 20 74 68 65 20 72  e .** (for the r
11250 62 75 5f 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 29  bu_rowid column)
11260 20 69 66 20 74 68 65 20 74 61 72 67 65 74 20 74   if the target t
11270 61 62 6c 65 20 69 73 20 61 6e 20 69 6d 70 6c 69  able is an impli
11280 63 69 74 20 49 50 4b 20 6f 72 20 0a 2a 2a 20 76  cit IPK or .** v
11290 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f  irtual table..*/
112a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
112b0 4f 62 6a 49 74 65 72 50 72 65 70 61 72 65 54 6d  ObjIterPrepareTm
112c0 70 49 6e 73 65 72 74 28 0a 20 20 73 71 6c 69 74  pInsert(.  sqlit
112d0 65 33 72 62 75 20 2a 70 2c 20 0a 20 20 52 62 75  e3rbu *p, .  Rbu
112e0 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 2c 0a  ObjIter *pIter,.
112f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
11300 6f 6c 6c 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20  ollist,.  const 
11310 63 68 61 72 20 2a 7a 52 62 75 52 6f 77 69 64 0a  char *zRbuRowid.
11320 29 7b 0a 20 20 69 6e 74 20 62 52 62 75 52 6f 77  ){.  int bRbuRow
11330 69 64 20 3d 20 28 70 49 74 65 72 2d 3e 65 54 79  id = (pIter->eTy
11340 70 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52  pe==RBU_PK_EXTER
11350 4e 41 4c 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54  NAL || pIter->eT
11360 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45  ype==RBU_PK_NONE
11370 29 3b 0a 20 20 63 68 61 72 20 2a 7a 42 69 6e 64  );.  char *zBind
11380 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 47 65 74   = rbuObjIterGet
11390 42 69 6e 64 6c 69 73 74 28 70 2c 20 70 49 74 65  Bindlist(p, pIte
113a0 72 2d 3e 6e 54 62 6c 43 6f 6c 20 2b 20 31 20 2b  r->nTblCol + 1 +
113b0 20 62 52 62 75 52 6f 77 69 64 29 3b 0a 20 20 69   bRbuRowid);.  i
113c0 66 28 20 7a 42 69 6e 64 20 29 7b 0a 20 20 20 20  f( zBind ){.    
113d0 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70  assert( pIter->p
113e0 54 6d 70 49 6e 73 65 72 74 3d 3d 30 20 29 3b 0a  TmpInsert==0 );.
113f0 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70      p->rc = prep
11400 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63  areFreeAndCollec
11410 74 45 72 72 6f 72 28 0a 20 20 20 20 20 20 20 20  tError(.        
11420 70 2d 3e 64 62 52 62 75 2c 20 26 70 49 74 65 72  p->dbRbu, &pIter
11430 2d 3e 70 54 6d 70 49 6e 73 65 72 74 2c 20 26 70  ->pTmpInsert, &p
11440 2d 3e 7a 45 72 72 6d 73 67 2c 20 73 71 6c 69 74  ->zErrmsg, sqlit
11450 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
11460 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e        "INSERT IN
11470 54 4f 20 25 73 2e 27 72 62 75 5f 74 6d 70 5f 25  TO %s.'rbu_tmp_%
11480 71 27 28 72 62 75 5f 63 6f 6e 74 72 6f 6c 2c 25  q'(rbu_control,%
11490 73 25 73 29 20 56 41 4c 55 45 53 28 25 7a 29 22  s%s) VALUES(%z)"
114a0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  , .          p->
114b0 7a 53 74 61 74 65 44 62 2c 20 70 49 74 65 72 2d  zStateDb, pIter-
114c0 3e 7a 44 61 74 61 54 62 6c 2c 20 7a 43 6f 6c 6c  >zDataTbl, zColl
114d0 69 73 74 2c 20 7a 52 62 75 52 6f 77 69 64 2c 20  ist, zRbuRowid, 
114e0 7a 42 69 6e 64 0a 20 20 20 20 29 29 3b 0a 20 20  zBind.    ));.  
114f0 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
11500 20 72 62 75 54 6d 70 49 6e 73 65 72 74 46 75 6e   rbuTmpInsertFun
11510 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
11520 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69  text *pCtx, .  i
11530 6e 74 20 6e 56 61 6c 2c 0a 20 20 73 71 6c 69 74  nt nVal,.  sqlit
11540 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c  e3_value **apVal
11550 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 72 62 75  .){.  sqlite3rbu
11560 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 5f 75 73   *p = sqlite3_us
11570 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20  er_data(pCtx);. 
11580 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
11590 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  _OK;.  int i;.. 
115a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
115b0 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c  _value_int(apVal
115c0 5b 30 5d 29 21 3d 30 0a 20 20 20 20 20 20 7c 7c  [0])!=0.      ||
115d0 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 65 54 79 70   p->objiter.eTyp
115e0 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e  e==RBU_PK_EXTERN
115f0 41 4c 20 0a 20 20 20 20 20 20 7c 7c 20 70 2d 3e  AL .      || p->
11600 6f 62 6a 69 74 65 72 2e 65 54 79 70 65 3d 3d 52  objiter.eType==R
11610 42 55 5f 50 4b 5f 4e 4f 4e 45 20 0a 20 20 29 3b  BU_PK_NONE .  );
11620 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76  .  if( sqlite3_v
11630 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 30  alue_int(apVal[0
11640 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  ])!=0 ){.    p->
11650 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20 2b 3d  nPhaseOneStep +=
11660 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 6e 49 6e 64   p->objiter.nInd
11670 65 78 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69  ex;.  }..  for(i
11680 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
11690 4b 20 26 26 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b  K && i<nVal; i++
116a0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
116b0 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70  te3_bind_value(p
116c0 2d 3e 6f 62 6a 69 74 65 72 2e 70 54 6d 70 49 6e  ->objiter.pTmpIn
116d0 73 65 72 74 2c 20 69 2b 31 2c 20 61 70 56 61 6c  sert, i+1, apVal
116e0 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  [i]);.  }.  if( 
116f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
11700 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65  .    sqlite3_ste
11710 70 28 70 2d 3e 6f 62 6a 69 74 65 72 2e 70 54 6d  p(p->objiter.pTm
11720 70 49 6e 73 65 72 74 29 3b 0a 20 20 20 20 72 63  pInsert);.    rc
11730 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
11740 28 70 2d 3e 6f 62 6a 69 74 65 72 2e 70 54 6d 70  (p->objiter.pTmp
11750 49 6e 73 65 72 74 29 3b 0a 20 20 7d 0a 0a 20 20  Insert);.  }..  
11760 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11770 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
11780 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f  _result_error_co
11790 64 65 28 70 43 74 78 2c 20 72 63 29 3b 0a 20 20  de(pCtx, rc);.  
117a0 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 63 68 61 72  }.}..static char
117b0 20 2a 72 62 75 4f 62 6a 49 74 65 72 47 65 74 49   *rbuObjIterGetI
117c0 6e 64 65 78 57 68 65 72 65 28 73 71 6c 69 74 65  ndexWhere(sqlite
117d0 33 72 62 75 20 2a 70 2c 20 52 62 75 4f 62 6a 49  3rbu *p, RbuObjI
117e0 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 73  ter *pIter){.  s
117f0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
11800 6d 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  mt = 0;.  int rc
11810 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 63 68 61 72   = p->rc;.  char
11820 20 2a 7a 52 65 74 20 3d 20 30 3b 0a 0a 20 20 69   *zRet = 0;..  i
11830 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
11840 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 72 65   ){.    rc = pre
11850 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  pareAndCollectEr
11860 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26  ror(p->dbMain, &
11870 70 53 74 6d 74 2c 20 26 70 2d 3e 7a 45 72 72 6d  pStmt, &p->zErrm
11880 73 67 2c 0a 20 20 20 20 20 20 20 20 22 53 45 4c  sg,.        "SEL
11890 45 43 54 20 74 72 69 6d 28 73 71 6c 29 20 46 52  ECT trim(sql) FR
118a0 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
118b0 20 57 48 45 52 45 20 74 79 70 65 3d 27 69 6e 64   WHERE type='ind
118c0 65 78 27 20 41 4e 44 20 6e 61 6d 65 3d 3f 22 0a  ex' AND name=?".
118d0 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28      );.  }.  if(
118e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
118f0 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20  {.    int rc2;. 
11900 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
11910 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c  bind_text(pStmt,
11920 20 31 2c 20 70 49 74 65 72 2d 3e 7a 49 64 78 2c   1, pIter->zIdx,
11930 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
11940 49 43 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  IC);.    if( rc=
11950 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51  =SQLITE_OK && SQ
11960 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
11970 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b  3_step(pStmt) ){
11980 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
11990 72 20 2a 7a 53 71 6c 20 3d 20 28 63 6f 6e 73 74  r *zSql = (const
119a0 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
119b0 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
119c0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
119d0 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  zSql ){.        
119e0 69 6e 74 20 6e 50 61 72 65 6e 20 3d 20 30 3b 20  int nParen = 0; 
119f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
11a00 62 65 72 20 6f 66 20 6f 70 65 6e 20 70 61 72 65  ber of open pare
11a10 6e 74 68 65 73 69 73 20 2a 2f 0a 20 20 20 20 20  nthesis */.     
11a20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
11a30 20 20 66 6f 72 28 69 3d 30 3b 20 7a 53 71 6c 5b    for(i=0; zSql[
11a40 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
11a50 20 20 20 20 63 68 61 72 20 63 20 3d 20 7a 53 71      char c = zSq
11a60 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  l[i];.          
11a70 69 66 28 20 63 3d 3d 27 28 27 20 29 7b 0a 20 20  if( c=='(' ){.  
11a80 20 20 20 20 20 20 20 20 20 20 6e 50 61 72 65 6e            nParen
11a90 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
11aa0 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 69            else i
11ab0 66 28 20 63 3d 3d 27 29 27 20 29 7b 0a 20 20 20  f( c==')' ){.   
11ac0 20 20 20 20 20 20 20 20 20 6e 50 61 72 65 6e 2d           nParen-
11ad0 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  -;.            i
11ae0 66 28 20 6e 50 61 72 65 6e 3d 3d 30 20 29 7b 0a  f( nParen==0 ){.
11af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 2b                i+
11b00 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  +;.             
11b10 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
11b20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
11b30 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 22 27  }else if( c=='"'
11b40 20 7c 7c 20 63 3d 3d 27 5c 27 27 20 7c 7c 20 63   || c=='\'' || c
11b50 3d 3d 27 60 27 20 29 7b 0a 20 20 20 20 20 20 20  =='`' ){.       
11b60 20 20 20 20 20 66 6f 72 28 69 2b 2b 3b 20 31 3b       for(i++; 1;
11b70 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
11b80 20 20 20 20 20 69 66 28 20 7a 53 71 6c 5b 69 5d       if( zSql[i]
11b90 3d 3d 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==c ){.         
11ba0 20 20 20 20 20 20 20 69 66 28 20 7a 53 71 6c 5b         if( zSql[
11bb0 69 2b 31 5d 21 3d 63 20 29 20 62 72 65 61 6b 3b  i+1]!=c ) break;
11bc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11bd0 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   i++;.          
11be0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
11bf0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
11c00 6c 73 65 20 69 66 28 20 63 3d 3d 27 5b 27 20 29  lse if( c=='[' )
11c10 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  {.            fo
11c20 72 28 69 2b 2b 3b 20 31 3b 20 69 2b 2b 29 7b 0a  r(i++; 1; i++){.
11c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
11c40 28 20 7a 53 71 6c 5b 69 5d 3d 3d 27 5d 27 20 29  ( zSql[i]==']' )
11c50 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
11c60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
11c70 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
11c80 20 20 20 20 69 66 28 20 7a 53 71 6c 5b 69 5d 20      if( zSql[i] 
11c90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 52 65  ){.          zRe
11ca0 74 20 3d 20 72 62 75 53 74 72 6e 64 75 70 28 26  t = rbuStrndup(&
11cb0 7a 53 71 6c 5b 69 5d 2c 20 26 72 63 29 3b 0a 20  zSql[i], &rc);. 
11cc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
11cd0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 32 20  .    }..    rc2 
11ce0 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
11cf0 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69  ze(pStmt);.    i
11d00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
11d10 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d   ) rc = rc2;.  }
11d20 0a 0a 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a  ..  p->rc = rc;.
11d30 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d    return zRet;.}
11d40 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74  ../*.** Ensure t
11d50 68 61 74 20 74 68 65 20 53 51 4c 69 74 65 20 73  hat the SQLite s
11d60 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 73  tatement handles
11d70 20 72 65 71 75 69 72 65 64 20 74 6f 20 75 70 64   required to upd
11d80 61 74 65 20 74 68 65 20 0a 2a 2a 20 74 61 72 67  ate the .** targ
11d90 65 74 20 64 61 74 61 62 61 73 65 20 6f 62 6a 65  et database obje
11da0 63 74 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 64  ct currently ind
11db0 69 63 61 74 65 64 20 62 79 20 74 68 65 20 69 74  icated by the it
11dc0 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 0a 2a  erator passed .*
11dd0 2a 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  * as the second 
11de0 61 72 67 75 6d 65 6e 74 20 61 72 65 20 61 76 61  argument are ava
11df0 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  ilable..*/.stati
11e00 63 20 69 6e 74 20 72 62 75 4f 62 6a 49 74 65 72  c int rbuObjIter
11e10 50 72 65 70 61 72 65 41 6c 6c 28 0a 20 20 73 71  PrepareAll(.  sq
11e20 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 0a 20 20  lite3rbu *p, .  
11e30 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65  RbuObjIter *pIte
11e40 72 2c 0a 20 20 69 6e 74 20 6e 4f 66 66 73 65 74  r,.  int nOffset
11e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e60 20 20 20 20 20 2f 2a 20 41 64 64 20 22 4c 49 4d       /* Add "LIM
11e70 49 54 20 2d 31 20 4f 46 46 53 45 54 20 24 6e 4f  IT -1 OFFSET $nO
11e80 66 66 73 65 74 22 20 74 6f 20 53 45 4c 45 43 54  ffset" to SELECT
11e90 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
11ea0 20 70 49 74 65 72 2d 3e 62 43 6c 65 61 6e 75 70   pIter->bCleanup
11eb0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 49 74  ==0 );.  if( pIt
11ec0 65 72 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 26  er->pSelect==0 &
11ed0 26 20 72 62 75 4f 62 6a 49 74 65 72 43 61 63 68  & rbuObjIterCach
11ee0 65 54 61 62 6c 65 49 6e 66 6f 28 70 2c 20 70 49  eTableInfo(p, pI
11ef0 74 65 72 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ter)==SQLITE_OK 
11f00 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  ){.    const int
11f10 20 74 6e 75 6d 20 3d 20 70 49 74 65 72 2d 3e 69   tnum = pIter->i
11f20 54 6e 75 6d 3b 0a 20 20 20 20 63 68 61 72 20 2a  Tnum;.    char *
11f30 7a 43 6f 6c 6c 69 73 74 20 3d 20 30 3b 20 20 20  zCollist = 0;   
11f40 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
11f50 6f 66 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d  of indexed colum
11f60 6e 73 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  ns */.    char *
11f70 2a 70 7a 20 3d 20 26 70 2d 3e 7a 45 72 72 6d 73  *pz = &p->zErrms
11f80 67 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  g;.    const cha
11f90 72 20 2a 7a 49 64 78 20 3d 20 70 49 74 65 72 2d  r *zIdx = pIter-
11fa0 3e 7a 49 64 78 3b 0a 20 20 20 20 63 68 61 72 20  >zIdx;.    char 
11fb0 2a 7a 4c 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20  *zLimit = 0;..  
11fc0 20 20 69 66 28 20 6e 4f 66 66 73 65 74 20 29 7b    if( nOffset ){
11fd0 0a 20 20 20 20 20 20 7a 4c 69 6d 69 74 20 3d 20  .      zLimit = 
11fe0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
11ff0 22 20 4c 49 4d 49 54 20 2d 31 20 4f 46 46 53 45  " LIMIT -1 OFFSE
12000 54 20 25 64 22 2c 20 6e 4f 66 66 73 65 74 29 3b  T %d", nOffset);
12010 0a 20 20 20 20 20 20 69 66 28 20 21 7a 4c 69 6d  .      if( !zLim
12020 69 74 20 29 20 70 2d 3e 72 63 20 3d 20 53 51 4c  it ) p->rc = SQL
12030 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
12040 0a 0a 20 20 20 20 69 66 28 20 7a 49 64 78 20 29  ..    if( zIdx )
12050 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
12060 61 72 20 2a 7a 54 62 6c 20 3d 20 70 49 74 65 72  ar *zTbl = pIter
12070 2d 3e 7a 54 62 6c 3b 0a 20 20 20 20 20 20 63 68  ->zTbl;.      ch
12080 61 72 20 2a 7a 49 6d 70 6f 73 74 65 72 43 6f 6c  ar *zImposterCol
12090 73 20 3d 20 30 3b 20 20 20 20 2f 2a 20 43 6f 6c  s = 0;    /* Col
120a0 75 6d 6e 73 20 66 6f 72 20 69 6d 70 6f 73 74 65  umns for imposte
120b0 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  r table */.     
120c0 20 63 68 61 72 20 2a 7a 49 6d 70 6f 73 74 65 72   char *zImposter
120d0 50 4b 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  PK = 0;      /* 
120e0 50 72 69 6d 61 72 79 20 6b 65 79 20 64 65 63 6c  Primary key decl
120f0 61 72 61 74 69 6f 6e 20 66 6f 72 20 69 6d 70 6f  aration for impo
12100 73 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 63 68  ster */.      ch
12110 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b 20  ar *zWhere = 0; 
12120 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45            /* WHE
12130 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 50 4b 20  RE clause on PK 
12140 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20  columns */.     
12150 20 63 68 61 72 20 2a 7a 42 69 6e 64 20 3d 20 30   char *zBind = 0
12160 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50  ;.      char *zP
12170 61 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  art = 0;.      i
12180 6e 74 20 6e 42 69 6e 64 20 3d 20 30 3b 0a 0a 20  nt nBind = 0;.. 
12190 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
121a0 65 72 2d 3e 65 54 79 70 65 21 3d 52 42 55 5f 50  er->eType!=RBU_P
121b0 4b 5f 56 54 41 42 20 29 3b 0a 20 20 20 20 20 20  K_VTAB );.      
121c0 7a 43 6f 6c 6c 69 73 74 20 3d 20 72 62 75 4f 62  zCollist = rbuOb
121d0 6a 49 74 65 72 47 65 74 49 6e 64 65 78 43 6f 6c  jIterGetIndexCol
121e0 73 28 0a 20 20 20 20 20 20 20 20 20 20 70 2c 20  s(.          p, 
121f0 70 49 74 65 72 2c 20 26 7a 49 6d 70 6f 73 74 65  pIter, &zImposte
12200 72 43 6f 6c 73 2c 20 26 7a 49 6d 70 6f 73 74 65  rCols, &zImposte
12210 72 50 4b 2c 20 26 7a 57 68 65 72 65 2c 20 26 6e  rPK, &zWhere, &n
12220 42 69 6e 64 0a 20 20 20 20 20 20 29 3b 0a 20 20  Bind.      );.  
12230 20 20 20 20 7a 42 69 6e 64 20 3d 20 72 62 75 4f      zBind = rbuO
12240 62 6a 49 74 65 72 47 65 74 42 69 6e 64 6c 69 73  bjIterGetBindlis
12250 74 28 70 2c 20 6e 42 69 6e 64 29 3b 0a 20 20 20  t(p, nBind);.   
12260 20 20 20 7a 50 61 72 74 20 3d 20 72 62 75 4f 62     zPart = rbuOb
12270 6a 49 74 65 72 47 65 74 49 6e 64 65 78 57 68 65  jIterGetIndexWhe
12280 72 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20  re(p, pIter);.. 
12290 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74       /* Create t
122a0 68 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  he imposter tabl
122b0 65 20 75 73 65 64 20 74 6f 20 77 72 69 74 65 20  e used to write 
122c0 74 6f 20 74 68 69 73 20 69 6e 64 65 78 2e 20 2a  to this index. *
122d0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  /.      sqlite3_
122e0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
122f0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50  ITE_TESTCTRL_IMP
12300 4f 53 54 45 52 2c 20 70 2d 3e 64 62 4d 61 69 6e  OSTER, p->dbMain
12310 2c 20 22 6d 61 69 6e 22 2c 20 30 2c 20 31 29 3b  , "main", 0, 1);
12320 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74  .      sqlite3_t
12330 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
12340 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f  TE_TESTCTRL_IMPO
12350 53 54 45 52 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c  STER, p->dbMain,
12360 20 22 6d 61 69 6e 22 2c 20 31 2c 74 6e 75 6d 29   "main", 1,tnum)
12370 3b 0a 20 20 20 20 20 20 72 62 75 4d 50 72 69 6e  ;.      rbuMPrin
12380 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64 62 4d  tfExec(p, p->dbM
12390 61 69 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 22  ain,.          "
123a0 43 52 45 41 54 45 20 54 41 42 4c 45 20 5c 22 72  CREATE TABLE \"r
123b0 62 75 5f 69 6d 70 5f 25 77 5c 22 28 20 25 73 2c  bu_imp_%w\"( %s,
123c0 20 50 52 49 4d 41 52 59 20 4b 45 59 28 20 25 73   PRIMARY KEY( %s
123d0 20 29 20 29 20 57 49 54 48 4f 55 54 20 52 4f 57   ) ) WITHOUT ROW
123e0 49 44 22 2c 0a 20 20 20 20 20 20 20 20 20 20 7a  ID",.          z
123f0 54 62 6c 2c 20 7a 49 6d 70 6f 73 74 65 72 43 6f  Tbl, zImposterCo
12400 6c 73 2c 20 7a 49 6d 70 6f 73 74 65 72 50 4b 0a  ls, zImposterPK.
12410 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73        );.      s
12420 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
12430 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
12440 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d  TRL_IMPOSTER, p-
12450 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c  >dbMain, "main",
12460 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 2f   0, 0);..      /
12470 2a 20 43 72 65 61 74 65 20 74 68 65 20 73 74 61  * Create the sta
12480 74 65 6d 65 6e 74 20 74 6f 20 69 6e 73 65 72 74  tement to insert
12490 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 2a   index entries *
124a0 2f 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e  /.      pIter->n
124b0 43 6f 6c 20 3d 20 6e 42 69 6e 64 3b 0a 20 20 20  Col = nBind;.   
124c0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
124d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
124e0 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61     p->rc = prepa
124f0 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74  reFreeAndCollect
12500 45 72 72 6f 72 28 0a 20 20 20 20 20 20 20 20 20  Error(.         
12510 20 20 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70     p->dbMain, &p
12520 49 74 65 72 2d 3e 70 49 6e 73 65 72 74 2c 20 26  Iter->pInsert, &
12530 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20  p->zErrmsg,.    
12540 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70        sqlite3_mp
12550 72 69 6e 74 66 28 22 49 4e 53 45 52 54 20 49 4e  rintf("INSERT IN
12560 54 4f 20 5c 22 72 62 75 5f 69 6d 70 5f 25 77 5c  TO \"rbu_imp_%w\
12570 22 20 56 41 4c 55 45 53 28 25 73 29 22 2c 20 7a  " VALUES(%s)", z
12580 54 62 6c 2c 20 7a 42 69 6e 64 29 0a 20 20 20 20  Tbl, zBind).    
12590 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a      );.      }..
125a0 20 20 20 20 20 20 2f 2a 20 41 6e 64 20 74 6f 20        /* And to 
125b0 64 65 6c 65 74 65 20 69 6e 64 65 78 20 65 6e 74  delete index ent
125c0 72 69 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 66  ries */.      if
125d0 28 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 29  ( rbuIsVacuum(p)
125e0 3d 3d 30 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51  ==0 && p->rc==SQ
125f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12600 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61     p->rc = prepa
12610 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74  reFreeAndCollect
12620 45 72 72 6f 72 28 0a 20 20 20 20 20 20 20 20 20  Error(.         
12630 20 20 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70     p->dbMain, &p
12640 49 74 65 72 2d 3e 70 44 65 6c 65 74 65 2c 20 26  Iter->pDelete, &
12650 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20  p->zErrmsg,.    
12660 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70        sqlite3_mp
12670 72 69 6e 74 66 28 22 44 45 4c 45 54 45 20 46 52  rintf("DELETE FR
12680 4f 4d 20 5c 22 72 62 75 5f 69 6d 70 5f 25 77 5c  OM \"rbu_imp_%w\
12690 22 20 57 48 45 52 45 20 25 73 22 2c 20 7a 54 62  " WHERE %s", zTb
126a0 6c 2c 20 7a 57 68 65 72 65 29 0a 20 20 20 20 20  l, zWhere).     
126b0 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20     );.      }.. 
126c0 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74       /* Create t
126d0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
126e0 65 6e 74 20 74 6f 20 72 65 61 64 20 6b 65 79 73  ent to read keys
126f0 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72   in sorted order
12700 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d   */.      if( p-
12710 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
12720 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
12730 7a 53 71 6c 3b 0a 20 20 20 20 20 20 20 20 69 66  zSql;.        if
12740 28 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 29  ( rbuIsVacuum(p)
12750 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   ){.          co
12760 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61 72 74  nst char *zStart
12770 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
12780 69 66 28 20 6e 4f 66 66 73 65 74 20 29 7b 0a 20  if( nOffset ){. 
12790 20 20 20 20 20 20 20 20 20 20 20 7a 53 74 61 72             zStar
127a0 74 20 3d 20 72 62 75 56 61 63 75 75 6d 49 6e 64  t = rbuVacuumInd
127b0 65 78 53 74 61 72 74 28 70 2c 20 70 49 74 65 72  exStart(p, pIter
127c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
127d0 66 28 20 7a 53 74 61 72 74 20 29 7b 0a 20 20 20  f( zStart ){.   
127e0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
127f0 65 33 5f 66 72 65 65 28 7a 4c 69 6d 69 74 29 3b  e3_free(zLimit);
12800 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  .              z
12810 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
12820 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12830 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
12840 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
12850 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
12860 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 25 73        "SELECT %s
12870 2c 20 30 20 41 53 20 72 62 75 5f 63 6f 6e 74 72  , 0 AS rbu_contr
12880 6f 6c 20 46 52 4f 4d 20 27 25 71 27 20 25 73 20  ol FROM '%q' %s 
12890 25 73 20 25 73 20 4f 52 44 45 52 20 42 59 20 25  %s %s ORDER BY %
128a0 73 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s%s",.          
128b0 20 20 20 20 7a 43 6f 6c 6c 69 73 74 2c 20 0a 20      zCollist, . 
128c0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
128d0 65 72 2d 3e 7a 44 61 74 61 54 62 6c 2c 0a 20 20  er->zDataTbl,.  
128e0 20 20 20 20 20 20 20 20 20 20 20 20 7a 50 61 72              zPar
128f0 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  t, .            
12900 20 20 28 7a 53 74 61 72 74 20 3f 20 28 7a 50 61    (zStart ? (zPa
12910 72 74 20 3f 20 22 41 4e 44 22 20 3a 20 22 57 48  rt ? "AND" : "WH
12920 45 52 45 22 29 20 3a 20 22 22 29 2c 20 7a 53 74  ERE") : ""), zSt
12930 61 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  art,.           
12940 20 20 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a 4c 69     zCollist, zLi
12950 6d 69 74 0a 20 20 20 20 20 20 20 20 20 20 29 3b  mit.          );
12960 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
12970 65 33 5f 66 72 65 65 28 7a 53 74 61 72 74 29 3b  e3_free(zStart);
12980 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 0a  .        }else..
12990 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
129a0 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
129b0 5f 45 58 54 45 52 4e 41 4c 20 7c 7c 20 70 49 74  _EXTERNAL || pIt
129c0 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
129d0 4b 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  K_NONE ){.      
129e0 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
129f0 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
12a00 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
12a10 54 20 25 73 2c 20 72 62 75 5f 63 6f 6e 74 72 6f  T %s, rbu_contro
12a20 6c 20 46 52 4f 4d 20 25 73 2e 27 72 62 75 5f 74  l FROM %s.'rbu_t
12a30 6d 70 5f 25 71 27 20 25 73 20 4f 52 44 45 52 20  mp_%q' %s ORDER 
12a40 42 59 20 25 73 25 73 22 2c 0a 20 20 20 20 20 20  BY %s%s",.      
12a50 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74          zCollist
12a60 2c 20 70 2d 3e 7a 53 74 61 74 65 44 62 2c 20 70  , p->zStateDb, p
12a70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 2c 0a  Iter->zDataTbl,.
12a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 50                zP
12a90 61 72 74 2c 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a  art, zCollist, z
12aa0 4c 69 6d 69 74 0a 20 20 20 20 20 20 20 20 20 20  Limit.          
12ab0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
12ac0 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 53 71 6c  {.          zSql
12ad0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
12ae0 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  tf(.            
12af0 20 20 22 53 45 4c 45 43 54 20 25 73 2c 20 72 62    "SELECT %s, rb
12b00 75 5f 63 6f 6e 74 72 6f 6c 20 46 52 4f 4d 20 25  u_control FROM %
12b10 73 2e 27 72 62 75 5f 74 6d 70 5f 25 71 27 20 25  s.'rbu_tmp_%q' %
12b20 73 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  s ".            
12b30 20 20 22 55 4e 49 4f 4e 20 41 4c 4c 20 22 0a 20    "UNION ALL ". 
12b40 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45               "SE
12b50 4c 45 43 54 20 25 73 2c 20 72 62 75 5f 63 6f 6e  LECT %s, rbu_con
12b60 74 72 6f 6c 20 46 52 4f 4d 20 27 25 71 27 20 22  trol FROM '%q' "
12b70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
12b80 25 73 20 25 73 20 74 79 70 65 6f 66 28 72 62 75  %s %s typeof(rbu
12b90 5f 63 6f 6e 74 72 6f 6c 29 3d 27 69 6e 74 65 67  _control)='integ
12ba0 65 72 27 20 41 4e 44 20 72 62 75 5f 63 6f 6e 74  er' AND rbu_cont
12bb0 72 6f 6c 21 3d 31 20 22 0a 20 20 20 20 20 20 20  rol!=1 ".       
12bc0 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59         "ORDER BY
12bd0 20 25 73 25 73 22 2c 0a 20 20 20 20 20 20 20 20   %s%s",.        
12be0 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74 2c 20        zCollist, 
12bf0 70 2d 3e 7a 53 74 61 74 65 44 62 2c 20 70 49 74  p->zStateDb, pIt
12c00 65 72 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 7a 50  er->zDataTbl, zP
12c10 61 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  art,.           
12c20 20 20 20 7a 43 6f 6c 6c 69 73 74 2c 20 70 49 74     zCollist, pIt
12c30 65 72 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 0a 20  er->zDataTbl, . 
12c40 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 50 61               zPa
12c50 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rt,.            
12c60 20 20 28 7a 50 61 72 74 20 3f 20 22 41 4e 44 22    (zPart ? "AND"
12c70 20 3a 20 22 57 48 45 52 45 22 29 2c 0a 20 20 20   : "WHERE"),.   
12c80 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c             zColl
12c90 69 73 74 2c 20 7a 4c 69 6d 69 74 0a 20 20 20 20  ist, zLimit.    
12ca0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
12cb0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
12cc0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
12cd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
12ce0 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65  rc = prepareFree
12cf0 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
12d00 70 2d 3e 64 62 52 62 75 2c 26 70 49 74 65 72 2d  p->dbRbu,&pIter-
12d10 3e 70 53 65 6c 65 63 74 2c 70 7a 2c 7a 53 71 6c  >pSelect,pz,zSql
12d20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
12d30 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
12d40 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
12d50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12d60 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  }..      sqlite3
12d70 5f 66 72 65 65 28 7a 49 6d 70 6f 73 74 65 72 43  _free(zImposterC
12d80 6f 6c 73 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ols);.      sqli
12d90 74 65 33 5f 66 72 65 65 28 7a 49 6d 70 6f 73 74  te3_free(zImpost
12da0 65 72 50 4b 29 3b 0a 20 20 20 20 20 20 73 71 6c  erPK);.      sql
12db0 69 74 65 33 5f 66 72 65 65 28 7a 57 68 65 72 65  ite3_free(zWhere
12dc0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12dd0 5f 66 72 65 65 28 7a 42 69 6e 64 29 3b 0a 20 20  _free(zBind);.  
12de0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
12df0 28 7a 50 61 72 74 29 3b 0a 20 20 20 20 7d 65 6c  (zPart);.    }el
12e00 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 52  se{.      int bR
12e10 62 75 52 6f 77 69 64 20 3d 20 28 70 49 74 65 72  buRowid = (pIter
12e20 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
12e30 56 54 41 42 29 0a 20 20 20 20 20 20 20 20 20 20  VTAB).          
12e40 20 20 20 20 20 20 20 20 20 20 7c 7c 28 70 49 74            ||(pIt
12e50 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
12e60 4b 5f 4e 4f 4e 45 29 0a 20 20 20 20 20 20 20 20  K_NONE).        
12e70 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 28 70              ||(p
12e80 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55  Iter->eType==RBU
12e90 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 26 26 20  _PK_EXTERNAL && 
12ea0 72 62 75 49 73 56 61 63 75 75 6d 28 70 29 29 3b  rbuIsVacuum(p));
12eb0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
12ec0 72 20 2a 7a 54 62 6c 20 3d 20 70 49 74 65 72 2d  r *zTbl = pIter-
12ed0 3e 7a 54 62 6c 3b 20 20 20 20 20 20 20 2f 2a 20  >zTbl;       /* 
12ee0 54 61 62 6c 65 20 74 68 69 73 20 73 74 65 70 20  Table this step 
12ef0 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20  applies to */.  
12f00 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
12f10 7a 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20  zWrite;         
12f20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6d 70            /* Imp
12f30 6f 73 74 65 72 20 74 61 62 6c 65 20 6e 61 6d 65  oster table name
12f40 20 2a 2f 0a 0a 20 20 20 20 20 20 63 68 61 72 20   */..      char 
12f50 2a 7a 42 69 6e 64 69 6e 67 73 20 3d 20 72 62 75  *zBindings = rbu
12f60 4f 62 6a 49 74 65 72 47 65 74 42 69 6e 64 6c 69  ObjIterGetBindli
12f70 73 74 28 70 2c 20 70 49 74 65 72 2d 3e 6e 54 62  st(p, pIter->nTb
12f80 6c 43 6f 6c 20 2b 20 62 52 62 75 52 6f 77 69 64  lCol + bRbuRowid
12f90 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  );.      char *z
12fa0 57 68 65 72 65 20 3d 20 72 62 75 4f 62 6a 49 74  Where = rbuObjIt
12fb0 65 72 47 65 74 57 68 65 72 65 28 70 2c 20 70 49  erGetWhere(p, pI
12fc0 74 65 72 29 3b 0a 20 20 20 20 20 20 63 68 61 72  ter);.      char
12fd0 20 2a 7a 4f 6c 64 6c 69 73 74 20 3d 20 72 62 75   *zOldlist = rbu
12fe0 4f 62 6a 49 74 65 72 47 65 74 4f 6c 64 6c 69 73  ObjIterGetOldlis
12ff0 74 28 70 2c 20 70 49 74 65 72 2c 20 22 6f 6c 64  t(p, pIter, "old
13000 22 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  ");.      char *
13010 7a 4e 65 77 6c 69 73 74 20 3d 20 72 62 75 4f 62  zNewlist = rbuOb
13020 6a 49 74 65 72 47 65 74 4f 6c 64 6c 69 73 74 28  jIterGetOldlist(
13030 70 2c 20 70 49 74 65 72 2c 20 22 6e 65 77 22 29  p, pIter, "new")
13040 3b 0a 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73  ;..      zCollis
13050 74 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 47 65  t = rbuObjIterGe
13060 74 43 6f 6c 6c 69 73 74 28 70 2c 20 70 49 74 65  tCollist(p, pIte
13070 72 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  r);.      pIter-
13080 3e 6e 43 6f 6c 20 3d 20 70 49 74 65 72 2d 3e 6e  >nCol = pIter->n
13090 54 62 6c 43 6f 6c 3b 0a 0a 20 20 20 20 20 20 2f  TblCol;..      /
130a0 2a 20 43 72 65 61 74 65 20 74 68 65 20 69 6d 70  * Create the imp
130b0 6f 73 74 65 72 20 74 61 62 6c 65 20 6f 72 20 74  oster table or t
130c0 61 62 6c 65 73 20 28 69 66 20 72 65 71 75 69 72  ables (if requir
130d0 65 64 29 2e 20 2a 2f 0a 20 20 20 20 20 20 72 62  ed). */.      rb
130e0 75 43 72 65 61 74 65 49 6d 70 6f 73 74 65 72 54  uCreateImposterT
130f0 61 62 6c 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  able(p, pIter);.
13100 20 20 20 20 20 20 72 62 75 43 72 65 61 74 65 49        rbuCreateI
13110 6d 70 6f 73 74 65 72 54 61 62 6c 65 32 28 70 2c  mposterTable2(p,
13120 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7a   pIter);.      z
13130 57 72 69 74 65 20 3d 20 28 70 49 74 65 72 2d 3e  Write = (pIter->
13140 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 56 54  eType==RBU_PK_VT
13150 41 42 20 3f 20 22 22 20 3a 20 22 72 62 75 5f 69  AB ? "" : "rbu_i
13160 6d 70 5f 22 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  mp_");..      /*
13170 20 43 72 65 61 74 65 20 74 68 65 20 49 4e 53 45   Create the INSE
13180 52 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  RT statement to 
13190 77 72 69 74 65 20 74 6f 20 74 68 65 20 74 61 72  write to the tar
131a0 67 65 74 20 50 4b 20 62 2d 74 72 65 65 20 2a 2f  get PK b-tree */
131b0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
131c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
131d0 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70         p->rc = p
131e0 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c  repareFreeAndCol
131f0 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d  lectError(p->dbM
13200 61 69 6e 2c 20 26 70 49 74 65 72 2d 3e 70 49 6e  ain, &pIter->pIn
13210 73 65 72 74 2c 20 70 7a 2c 0a 20 20 20 20 20 20  sert, pz,.      
13220 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70        sqlite3_mp
13230 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
13240 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54       "INSERT INT
13250 4f 20 5c 22 25 73 25 77 5c 22 28 25 73 25 73 29  O \"%s%w\"(%s%s)
13260 20 56 41 4c 55 45 53 28 25 73 29 22 2c 20 0a 20   VALUES(%s)", . 
13270 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 57 72               zWr
13280 69 74 65 2c 20 7a 54 62 6c 2c 20 7a 43 6f 6c 6c  ite, zTbl, zColl
13290 69 73 74 2c 20 28 62 52 62 75 52 6f 77 69 64 20  ist, (bRbuRowid 
132a0 3f 20 22 2c 20 5f 72 6f 77 69 64 5f 22 20 3a 20  ? ", _rowid_" : 
132b0 22 22 29 2c 20 7a 42 69 6e 64 69 6e 67 73 0a 20  ""), zBindings. 
132c0 20 20 20 20 20 20 20 20 20 20 20 29 0a 20 20 20             ).   
132d0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
132e0 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65  .      /* Create
132f0 20 74 68 65 20 44 45 4c 45 54 45 20 73 74 61 74   the DELETE stat
13300 65 6d 65 6e 74 20 74 6f 20 77 72 69 74 65 20 74  ement to write t
13310 6f 20 74 68 65 20 74 61 72 67 65 74 20 50 4b 20  o the target PK 
13320 62 2d 74 72 65 65 2e 0a 20 20 20 20 20 20 2a 2a  b-tree..      **
13330 20 42 65 63 61 75 73 65 20 69 74 20 6f 6e 6c 79   Because it only
13340 20 70 65 72 66 6f 72 6d 73 20 49 4e 53 45 52 54   performs INSERT
13350 20 6f 70 65 72 61 74 69 6f 6e 73 2c 20 74 68 69   operations, thi
13360 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  s is not require
13370 64 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61  d for.      ** a
13380 6e 20 72 62 75 20 76 61 63 75 75 6d 20 68 61 6e  n rbu vacuum han
13390 64 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  dle.  */.      i
133a0 66 28 20 72 62 75 49 73 56 61 63 75 75 6d 28 70  f( rbuIsVacuum(p
133b0 29 3d 3d 30 20 26 26 20 70 2d 3e 72 63 3d 3d 53  )==0 && p->rc==S
133c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
133d0 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70      p->rc = prep
133e0 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63  areFreeAndCollec
133f0 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e  tError(p->dbMain
13400 2c 20 26 70 49 74 65 72 2d 3e 70 44 65 6c 65 74  , &pIter->pDelet
13410 65 2c 20 70 7a 2c 0a 20 20 20 20 20 20 20 20 20  e, pz,.         
13420 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e     sqlite3_mprin
13430 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  tf(.            
13440 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 5c    "DELETE FROM \
13450 22 25 73 25 77 5c 22 20 57 48 45 52 45 20 25 73  "%s%w\" WHERE %s
13460 22 2c 20 7a 57 72 69 74 65 2c 20 7a 54 62 6c 2c  ", zWrite, zTbl,
13470 20 7a 57 68 65 72 65 0a 20 20 20 20 20 20 20 20   zWhere.        
13480 20 20 20 20 29 0a 20 20 20 20 20 20 20 20 29 3b      ).        );
13490 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
134a0 69 66 28 20 72 62 75 49 73 56 61 63 75 75 6d 28  if( rbuIsVacuum(
134b0 70 29 3d 3d 30 20 26 26 20 70 49 74 65 72 2d 3e  p)==0 && pIter->
134c0 61 62 49 6e 64 65 78 65 64 20 29 7b 0a 20 20 20  abIndexed ){.   
134d0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
134e0 2a 7a 52 62 75 52 6f 77 69 64 20 3d 20 22 22 3b  *zRbuRowid = "";
134f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74  .        if( pIt
13500 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
13510 4b 5f 45 58 54 45 52 4e 41 4c 20 7c 7c 20 70 49  K_EXTERNAL || pI
13520 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f  ter->eType==RBU_
13530 50 4b 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  PK_NONE ){.     
13540 20 20 20 20 20 7a 52 62 75 52 6f 77 69 64 20 3d       zRbuRowid =
13550 20 22 2c 20 72 62 75 5f 72 6f 77 69 64 22 3b 0a   ", rbu_rowid";.
13560 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
13570 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65     /* Create the
13580 20 72 62 75 5f 74 6d 70 5f 78 78 78 20 74 61 62   rbu_tmp_xxx tab
13590 6c 65 20 61 6e 64 20 74 68 65 20 74 72 69 67 67  le and the trigg
135a0 65 72 73 20 74 6f 20 70 6f 70 75 6c 61 74 65 20  ers to populate 
135b0 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  it. */.        r
135c0 62 75 4d 50 72 69 6e 74 66 45 78 65 63 28 70 2c  buMPrintfExec(p,
135d0 20 70 2d 3e 64 62 52 62 75 2c 0a 20 20 20 20 20   p->dbRbu,.     
135e0 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54         "CREATE T
135f0 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53  ABLE IF NOT EXIS
13600 54 53 20 25 73 2e 27 72 62 75 5f 74 6d 70 5f 25  TS %s.'rbu_tmp_%
13610 71 27 20 41 53 20 22 0a 20 20 20 20 20 20 20 20  q' AS ".        
13620 20 20 20 20 22 53 45 4c 45 43 54 20 2a 25 73 20      "SELECT *%s 
13630 46 52 4f 4d 20 27 25 71 27 20 57 48 45 52 45 20  FROM '%q' WHERE 
13640 30 3b 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  0;".            
13650 2c 20 70 2d 3e 7a 53 74 61 74 65 44 62 2c 20 70  , p->zStateDb, p
13660 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 0a 20  Iter->zDataTbl. 
13670 20 20 20 20 20 20 20 20 20 20 20 2c 20 28 70 49             , (pI
13680 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f  ter->eType==RBU_
13690 50 4b 5f 45 58 54 45 52 4e 41 4c 20 3f 20 22 2c  PK_EXTERNAL ? ",
136a0 20 30 20 41 53 20 72 62 75 5f 72 6f 77 69 64 22   0 AS rbu_rowid"
136b0 20 3a 20 22 22 29 0a 20 20 20 20 20 20 20 20 20   : "").         
136c0 20 20 20 2c 20 70 49 74 65 72 2d 3e 7a 44 61 74     , pIter->zDat
136d0 61 54 62 6c 0a 20 20 20 20 20 20 20 20 29 3b 0a  aTbl.        );.
136e0 0a 20 20 20 20 20 20 20 20 72 62 75 4d 50 72 69  .        rbuMPri
136f0 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64 62  ntfExec(p, p->db
13700 4d 61 69 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  Main,.          
13710 20 20 22 43 52 45 41 54 45 20 54 45 4d 50 20 54    "CREATE TEMP T
13720 52 49 47 47 45 52 20 72 62 75 5f 64 65 6c 65 74  RIGGER rbu_delet
13730 65 5f 74 72 20 42 45 46 4f 52 45 20 44 45 4c 45  e_tr BEFORE DELE
13740 54 45 20 4f 4e 20 5c 22 25 73 25 77 5c 22 20 22  TE ON \"%s%w\" "
13750 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 42 45  .            "BE
13760 47 49 4e 20 22 0a 20 20 20 20 20 20 20 20 20 20  GIN ".          
13770 20 20 22 20 20 53 45 4c 45 43 54 20 72 62 75 5f    "  SELECT rbu_
13780 74 6d 70 5f 69 6e 73 65 72 74 28 33 2c 20 25 73  tmp_insert(3, %s
13790 29 3b 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  );".            
137a0 22 45 4e 44 3b 22 0a 0a 20 20 20 20 20 20 20 20  "END;"..        
137b0 20 20 20 20 22 43 52 45 41 54 45 20 54 45 4d 50      "CREATE TEMP
137c0 20 54 52 49 47 47 45 52 20 72 62 75 5f 75 70 64   TRIGGER rbu_upd
137d0 61 74 65 31 5f 74 72 20 42 45 46 4f 52 45 20 55  ate1_tr BEFORE U
137e0 50 44 41 54 45 20 4f 4e 20 5c 22 25 73 25 77 5c  PDATE ON \"%s%w\
137f0 22 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  " ".            
13800 22 42 45 47 49 4e 20 22 0a 20 20 20 20 20 20 20  "BEGIN ".       
13810 20 20 20 20 20 22 20 20 53 45 4c 45 43 54 20 72       "  SELECT r
13820 62 75 5f 74 6d 70 5f 69 6e 73 65 72 74 28 33 2c  bu_tmp_insert(3,
13830 20 25 73 29 3b 22 0a 20 20 20 20 20 20 20 20 20   %s);".         
13840 20 20 20 22 45 4e 44 3b 22 0a 0a 20 20 20 20 20     "END;"..     
13850 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54         "CREATE T
13860 45 4d 50 20 54 52 49 47 47 45 52 20 72 62 75 5f  EMP TRIGGER rbu_
13870 75 70 64 61 74 65 32 5f 74 72 20 41 46 54 45 52  update2_tr AFTER
13880 20 55 50 44 41 54 45 20 4f 4e 20 5c 22 25 73 25   UPDATE ON \"%s%
13890 77 5c 22 20 22 0a 20 20 20 20 20 20 20 20 20 20  w\" ".          
138a0 20 20 22 42 45 47 49 4e 20 22 0a 20 20 20 20 20    "BEGIN ".     
138b0 20 20 20 20 20 20 20 22 20 20 53 45 4c 45 43 54         "  SELECT
138c0 20 72 62 75 5f 74 6d 70 5f 69 6e 73 65 72 74 28   rbu_tmp_insert(
138d0 34 2c 20 25 73 29 3b 22 0a 20 20 20 20 20 20 20  4, %s);".       
138e0 20 20 20 20 20 22 45 4e 44 3b 22 2c 0a 20 20 20       "END;",.   
138f0 20 20 20 20 20 20 20 20 20 7a 57 72 69 74 65 2c           zWrite,
13900 20 7a 54 62 6c 2c 20 7a 4f 6c 64 6c 69 73 74 2c   zTbl, zOldlist,
13910 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 57 72  .            zWr
13920 69 74 65 2c 20 7a 54 62 6c 2c 20 7a 4f 6c 64 6c  ite, zTbl, zOldl
13930 69 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ist,.           
13940 20 7a 57 72 69 74 65 2c 20 7a 54 62 6c 2c 20 7a   zWrite, zTbl, z
13950 4e 65 77 6c 69 73 74 0a 20 20 20 20 20 20 20 20  Newlist.        
13960 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  );..        if( 
13970 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
13980 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 7c 7c  U_PK_EXTERNAL ||
13990 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52   pIter->eType==R
139a0 42 55 5f 50 4b 5f 4e 4f 4e 45 20 29 7b 0a 20 20  BU_PK_NONE ){.  
139b0 20 20 20 20 20 20 20 20 72 62 75 4d 50 72 69 6e          rbuMPrin
139c0 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64 62 4d  tfExec(p, p->dbM
139d0 61 69 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ain,.           
139e0 20 20 20 22 43 52 45 41 54 45 20 54 45 4d 50 20     "CREATE TEMP 
139f0 54 52 49 47 47 45 52 20 72 62 75 5f 69 6e 73 65  TRIGGER rbu_inse
13a00 72 74 5f 74 72 20 41 46 54 45 52 20 49 4e 53 45  rt_tr AFTER INSE
13a10 52 54 20 4f 4e 20 5c 22 25 73 25 77 5c 22 20 22  RT ON \"%s%w\" "
13a20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
13a30 42 45 47 49 4e 20 22 0a 20 20 20 20 20 20 20 20  BEGIN ".        
13a40 20 20 20 20 20 20 22 20 20 53 45 4c 45 43 54 20        "  SELECT 
13a50 72 62 75 5f 74 6d 70 5f 69 6e 73 65 72 74 28 30  rbu_tmp_insert(0
13a60 2c 20 25 73 29 3b 22 0a 20 20 20 20 20 20 20 20  , %s);".        
13a70 20 20 20 20 20 20 22 45 4e 44 3b 22 2c 0a 20 20        "END;",.  
13a80 20 20 20 20 20 20 20 20 20 20 20 20 7a 57 72 69              zWri
13a90 74 65 2c 20 7a 54 62 6c 2c 20 7a 4e 65 77 6c 69  te, zTbl, zNewli
13aa0 73 74 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  st.          );.
13ab0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
13ac0 20 20 20 72 62 75 4f 62 6a 49 74 65 72 50 72 65     rbuObjIterPre
13ad0 70 61 72 65 54 6d 70 49 6e 73 65 72 74 28 70 2c  pareTmpInsert(p,
13ae0 20 70 49 74 65 72 2c 20 7a 43 6f 6c 6c 69 73 74   pIter, zCollist
13af0 2c 20 7a 52 62 75 52 6f 77 69 64 29 3b 0a 20 20  , zRbuRowid);.  
13b00 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
13b10 43 72 65 61 74 65 20 74 68 65 20 53 45 4c 45 43  Create the SELEC
13b20 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 72  T statement to r
13b30 65 61 64 20 6b 65 79 73 20 66 72 6f 6d 20 64 61  ead keys from da
13b40 74 61 5f 78 78 78 20 2a 2f 0a 20 20 20 20 20 20  ta_xxx */.      
13b50 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
13b60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
13b70 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 62 75  const char *zRbu
13b80 52 6f 77 69 64 20 3d 20 22 22 3b 0a 20 20 20 20  Rowid = "";.    
13b90 20 20 20 20 63 68 61 72 20 2a 7a 53 74 61 72 74      char *zStart
13ba0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 68   = 0;.        ch
13bb0 61 72 20 2a 7a 4f 72 64 65 72 20 3d 20 30 3b 0a  ar *zOrder = 0;.
13bc0 20 20 20 20 20 20 20 20 69 66 28 20 62 52 62 75          if( bRbu
13bd0 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Rowid ){.       
13be0 20 20 20 7a 52 62 75 52 6f 77 69 64 20 3d 20 72     zRbuRowid = r
13bf0 62 75 49 73 56 61 63 75 75 6d 28 70 29 20 3f 20  buIsVacuum(p) ? 
13c00 22 2c 5f 72 6f 77 69 64 5f 20 22 20 3a 20 22 2c  ",_rowid_ " : ",
13c10 72 62 75 5f 72 6f 77 69 64 22 3b 0a 20 20 20 20  rbu_rowid";.    
13c20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
13c30 66 28 20 72 62 75 49 73 56 61 63 75 75 6d 28 70  f( rbuIsVacuum(p
13c40 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ) ){.          i
13c50 66 28 20 6e 4f 66 66 73 65 74 20 29 7b 0a 20 20  f( nOffset ){.  
13c60 20 20 20 20 20 20 20 20 20 20 7a 53 74 61 72 74            zStart
13c70 20 3d 20 72 62 75 56 61 63 75 75 6d 54 61 62 6c   = rbuVacuumTabl
13c80 65 53 74 61 72 74 28 70 2c 20 70 49 74 65 72 2c  eStart(p, pIter,
13c90 20 62 52 62 75 52 6f 77 69 64 2c 20 7a 57 72 69   bRbuRowid, zWri
13ca0 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  te);.           
13cb0 20 69 66 28 20 7a 53 74 61 72 74 20 29 7b 0a 20   if( zStart ){. 
13cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
13cd0 69 74 65 33 5f 66 72 65 65 28 7a 4c 69 6d 69 74  ite3_free(zLimit
13ce0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
13cf0 20 7a 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20   zLimit = 0;.   
13d00 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
13d10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
13d20 20 69 66 28 20 62 52 62 75 52 6f 77 69 64 20 29   if( bRbuRowid )
13d30 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 4f  {.            zO
13d40 72 64 65 72 20 3d 20 72 62 75 4d 50 72 69 6e 74  rder = rbuMPrint
13d50 66 28 70 2c 20 22 5f 72 6f 77 69 64 5f 22 29 3b  f(p, "_rowid_");
13d60 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
13d70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 4f  {.            zO
13d80 72 64 65 72 20 3d 20 72 62 75 4f 62 6a 49 74 65  rder = rbuObjIte
13d90 72 47 65 74 50 6b 4c 69 73 74 28 70 2c 20 70 49  rGetPkList(p, pI
13da0 74 65 72 2c 20 22 22 29 3b 0a 20 20 20 20 20 20  ter, "");.      
13db0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
13dc0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
13dd0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
13de0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63  .          p->rc
13df0 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e   = prepareFreeAn
13e00 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d  dCollectError(p-
13e10 3e 64 62 52 62 75 2c 20 26 70 49 74 65 72 2d 3e  >dbRbu, &pIter->
13e20 70 53 65 6c 65 63 74 2c 20 70 7a 2c 0a 20 20 20  pSelect, pz,.   
13e30 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
13e40 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
13e50 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c              "SEL
13e60 45 43 54 20 25 73 2c 25 73 20 72 62 75 5f 63 6f  ECT %s,%s rbu_co
13e70 6e 74 72 6f 6c 25 73 20 46 52 4f 4d 20 27 25 71  ntrol%s FROM '%q
13e80 27 25 73 20 25 73 20 25 73 20 25 73 22 2c 0a 20  '%s %s %s %s",. 
13e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
13ea0 43 6f 6c 6c 69 73 74 2c 20 0a 20 20 20 20 20 20  Collist, .      
13eb0 20 20 20 20 20 20 20 20 20 20 28 72 62 75 49 73            (rbuIs
13ec0 56 61 63 75 75 6d 28 70 29 20 3f 20 22 30 20 41  Vacuum(p) ? "0 A
13ed0 53 20 22 20 3a 20 22 22 29 2c 0a 20 20 20 20 20  S " : ""),.     
13ee0 20 20 20 20 20 20 20 20 20 20 20 7a 52 62 75 52             zRbuR
13ef0 6f 77 69 64 2c 0a 20 20 20 20 20 20 20 20 20 20  owid,.          
13f00 20 20 20 20 20 20 70 49 74 65 72 2d 3e 7a 44 61        pIter->zDa
13f10 74 61 54 62 6c 2c 20 28 7a 53 74 61 72 74 20 3f  taTbl, (zStart ?
13f20 20 7a 53 74 61 72 74 20 3a 20 22 22 29 2c 20 0a   zStart : ""), .
13f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f40 28 7a 4f 72 64 65 72 20 3f 20 22 4f 52 44 45 52  (zOrder ? "ORDER
13f50 20 42 59 22 20 3a 20 22 22 29 2c 20 7a 4f 72 64   BY" : ""), zOrd
13f60 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  er,.            
13f70 20 20 20 20 7a 4c 69 6d 69 74 0a 20 20 20 20 20      zLimit.     
13f80 20 20 20 20 20 20 20 20 20 29 0a 20 20 20 20 20           ).     
13f90 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
13fa0 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
13fb0 33 5f 66 72 65 65 28 7a 53 74 61 72 74 29 3b 0a  3_free(zStart);.
13fc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
13fd0 66 72 65 65 28 7a 4f 72 64 65 72 29 3b 0a 20 20  free(zOrder);.  
13fe0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c      }..      sql
13ff0 69 74 65 33 5f 66 72 65 65 28 7a 57 68 65 72 65  ite3_free(zWhere
14000 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14010 5f 66 72 65 65 28 7a 4f 6c 64 6c 69 73 74 29 3b  _free(zOldlist);
14020 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
14030 72 65 65 28 7a 4e 65 77 6c 69 73 74 29 3b 0a 20  ree(zNewlist);. 
14040 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
14050 65 28 7a 42 69 6e 64 69 6e 67 73 29 3b 0a 20 20  e(zBindings);.  
14060 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
14070 66 72 65 65 28 7a 43 6f 6c 6c 69 73 74 29 3b 0a  free(zCollist);.
14080 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
14090 28 7a 4c 69 6d 69 74 29 3b 0a 20 20 7d 0a 20 20  (zLimit);.  }.  
140a0 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b  .  return p->rc;
140b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f 75  .}../*.** Set ou
140c0 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a 70  tput variable *p
140d0 70 53 74 6d 74 20 74 6f 20 70 6f 69 6e 74 20 74  pStmt to point t
140e0 6f 20 61 6e 20 55 50 44 41 54 45 20 73 74 61 74  o an UPDATE stat
140f0 65 6d 65 6e 74 20 74 68 61 74 20 6d 61 79 0a 2a  ement that may.*
14100 2a 20 62 65 20 75 73 65 64 20 74 6f 20 75 70 64  * be used to upd
14110 61 74 65 20 74 68 65 20 69 6d 70 6f 73 74 65 72  ate the imposter
14120 20 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20 6d   table for the m
14130 61 69 6e 20 74 61 62 6c 65 20 62 2d 74 72 65 65  ain table b-tree
14140 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65   of the.** table
14150 20 6f 62 6a 65 63 74 20 74 68 61 74 20 70 49 74   object that pIt
14160 65 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  er currently poi
14170 6e 74 73 20 74 6f 2c 20 61 73 73 75 6d 69 6e 67  nts to, assuming
14180 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 72 62   that the .** rb
14190 75 5f 63 6f 6e 74 72 6f 6c 20 63 6f 6c 75 6d 6e  u_control column
141a0 20 6f 66 20 74 68 65 20 64 61 74 61 5f 78 79 7a   of the data_xyz
141b0 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20   table contains 
141c0 7a 4d 61 73 6b 2e 0a 2a 2a 20 0a 2a 2a 20 49 66  zMask..** .** If
141d0 20 74 68 65 20 7a 4d 61 73 6b 20 73 74 72 69 6e   the zMask strin
141e0 67 20 64 6f 65 73 20 6e 6f 74 20 73 70 65 63 69  g does not speci
141f0 66 79 20 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 74  fy any columns t
14200 6f 20 75 70 64 61 74 65 2c 20 74 68 65 6e 20 74  o update, then t
14210 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 6e  his.** is not an
14220 20 65 72 72 6f 72 2e 20 4f 75 74 70 75 74 20 76   error. Output v
14230 61 72 69 61 62 6c 65 20 2a 70 70 53 74 6d 74 20  ariable *ppStmt 
14240 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69  is set to NULL i
14250 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a  n this case..*/.
14260 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 47 65  static int rbuGe
14270 74 55 70 64 61 74 65 53 74 6d 74 28 0a 20 20 73  tUpdateStmt(.  s
14280 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 20 20  qlite3rbu *p,   
14290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
142a0 2a 20 52 42 55 20 68 61 6e 64 6c 65 20 2a 2f 0a  * RBU handle */.
142b0 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49    RbuObjIter *pI
142c0 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ter,            
142d0 20 20 2f 2a 20 4f 62 6a 65 63 74 20 69 74 65 72    /* Object iter
142e0 61 74 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ator */.  const 
142f0 63 68 61 72 20 2a 7a 4d 61 73 6b 2c 20 20 20 20  char *zMask,    
14300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 62 75            /* rbu
14310 5f 63 6f 6e 74 72 6f 6c 20 76 61 6c 75 65 20 28  _control value (
14320 27 78 2e 78 2e 27 29 20 2a 2f 0a 20 20 73 71 6c  'x.x.') */.  sql
14330 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74  ite3_stmt **ppSt
14340 6d 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  mt           /* 
14350 4f 55 54 3a 20 55 50 44 41 54 45 20 73 74 61 74  OUT: UPDATE stat
14360 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 2a 2f 0a  ement handle */.
14370 29 7b 0a 20 20 52 62 75 55 70 64 61 74 65 53 74  ){.  RbuUpdateSt
14380 6d 74 20 2a 2a 70 70 3b 0a 20 20 52 62 75 55 70  mt **pp;.  RbuUp
14390 64 61 74 65 53 74 6d 74 20 2a 70 55 70 20 3d 20  dateStmt *pUp = 
143a0 30 3b 0a 20 20 69 6e 74 20 6e 55 70 20 3d 20 30  0;.  int nUp = 0
143b0 3b 0a 0a 20 20 2f 2a 20 49 6e 20 63 61 73 65 20  ;..  /* In case 
143c0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
143d0 2a 2f 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20 30  */.  *ppStmt = 0
143e0 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66  ;..  /* Search f
143f0 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73  or an existing s
14400 74 61 74 65 6d 65 6e 74 2e 20 49 66 20 6f 6e 65  tatement. If one
14410 20 69 73 20 66 6f 75 6e 64 2c 20 73 68 69 66 74   is found, shift
14420 20 69 74 20 74 6f 20 74 68 65 20 66 72 6f 6e 74   it to the front
14430 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 4c 52 55  .  ** of the LRU
14440 20 71 75 65 75 65 20 61 6e 64 20 72 65 74 75 72   queue and retur
14450 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 4f  n immediately. O
14460 74 68 65 72 77 69 73 65 2c 20 6c 65 61 76 65 20  therwise, leave 
14470 6e 55 70 20 70 6f 69 6e 74 69 6e 67 0a 20 20 2a  nUp pointing.  *
14480 2a 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  * to the number 
14490 6f 66 20 73 74 61 74 65 6d 65 6e 74 73 20 63 75  of statements cu
144a0 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 63  rrently in the c
144b0 61 63 68 65 20 61 6e 64 20 70 55 70 20 74 6f 20  ache and pUp to 
144c0 74 68 65 0a 20 20 2a 2a 20 6c 61 73 74 20 6f 62  the.  ** last ob
144d0 6a 65 63 74 20 69 6e 20 74 68 65 20 6c 69 73 74  ject in the list
144e0 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 70 70 3d 26  .  */.  for(pp=&
144f0 70 49 74 65 72 2d 3e 70 52 62 75 55 70 64 61 74  pIter->pRbuUpdat
14500 65 3b 20 2a 70 70 3b 20 70 70 3d 26 28 28 2a 70  e; *pp; pp=&((*p
14510 70 29 2d 3e 70 4e 65 78 74 29 29 7b 0a 20 20 20  p)->pNext)){.   
14520 20 70 55 70 20 3d 20 2a 70 70 3b 0a 20 20 20 20   pUp = *pp;.    
14530 69 66 28 20 73 74 72 63 6d 70 28 70 55 70 2d 3e  if( strcmp(pUp->
14540 7a 4d 61 73 6b 2c 20 7a 4d 61 73 6b 29 3d 3d 30  zMask, zMask)==0
14550 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20   ){.      *pp = 
14560 70 55 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pUp->pNext;.    
14570 20 20 70 55 70 2d 3e 70 4e 65 78 74 20 3d 20 70    pUp->pNext = p
14580 49 74 65 72 2d 3e 70 52 62 75 55 70 64 61 74 65  Iter->pRbuUpdate
14590 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70  ;.      pIter->p
145a0 52 62 75 55 70 64 61 74 65 20 3d 20 70 55 70 3b  RbuUpdate = pUp;
145b0 0a 20 20 20 20 20 20 2a 70 70 53 74 6d 74 20 3d  .      *ppStmt =
145c0 20 70 55 70 2d 3e 70 55 70 64 61 74 65 3b 20 0a   pUp->pUpdate; .
145d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
145e0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
145f0 20 20 6e 55 70 2b 2b 3b 0a 20 20 7d 0a 20 20 61    nUp++;.  }.  a
14600 73 73 65 72 74 28 20 70 55 70 3d 3d 30 20 7c 7c  ssert( pUp==0 ||
14610 20 70 55 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29   pUp->pNext==0 )
14620 3b 0a 0a 20 20 69 66 28 20 6e 55 70 3e 3d 53 51  ;..  if( nUp>=SQ
14630 4c 49 54 45 5f 52 42 55 5f 55 50 44 41 54 45 5f  LITE_RBU_UPDATE_
14640 43 41 43 48 45 53 49 5a 45 20 29 7b 0a 20 20 20  CACHESIZE ){.   
14650 20 66 6f 72 28 70 70 3d 26 70 49 74 65 72 2d 3e   for(pp=&pIter->
14660 70 52 62 75 55 70 64 61 74 65 3b 20 2a 70 70 21  pRbuUpdate; *pp!
14670 3d 70 55 70 3b 20 70 70 3d 26 28 28 2a 70 70 29  =pUp; pp=&((*pp)
14680 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20 20 2a  ->pNext));.    *
14690 70 70 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  pp = 0;.    sqli
146a0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 55 70  te3_finalize(pUp
146b0 2d 3e 70 55 70 64 61 74 65 29 3b 0a 20 20 20 20  ->pUpdate);.    
146c0 70 55 70 2d 3e 70 55 70 64 61 74 65 20 3d 20 30  pUp->pUpdate = 0
146d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
146e0 55 70 20 3d 20 28 52 62 75 55 70 64 61 74 65 53  Up = (RbuUpdateS
146f0 74 6d 74 2a 29 72 62 75 4d 61 6c 6c 6f 63 28 70  tmt*)rbuMalloc(p
14700 2c 20 73 69 7a 65 6f 66 28 52 62 75 55 70 64 61  , sizeof(RbuUpda
14710 74 65 53 74 6d 74 29 2b 70 49 74 65 72 2d 3e 6e  teStmt)+pIter->n
14720 54 62 6c 43 6f 6c 2b 31 29 3b 0a 20 20 7d 0a 0a  TblCol+1);.  }..
14730 20 20 69 66 28 20 70 55 70 20 29 7b 0a 20 20 20    if( pUp ){.   
14740 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20   char *zWhere = 
14750 72 62 75 4f 62 6a 49 74 65 72 47 65 74 57 68 65  rbuObjIterGetWhe
14760 72 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  re(p, pIter);.  
14770 20 20 63 68 61 72 20 2a 7a 53 65 74 20 3d 20 72    char *zSet = r
14780 62 75 4f 62 6a 49 74 65 72 47 65 74 53 65 74 6c  buObjIterGetSetl
14790 69 73 74 28 70 2c 20 70 49 74 65 72 2c 20 7a 4d  ist(p, pIter, zM
147a0 61 73 6b 29 3b 0a 20 20 20 20 63 68 61 72 20 2a  ask);.    char *
147b0 7a 55 70 64 61 74 65 20 3d 20 30 3b 0a 0a 20 20  zUpdate = 0;..  
147c0 20 20 70 55 70 2d 3e 7a 4d 61 73 6b 20 3d 20 28    pUp->zMask = (
147d0 63 68 61 72 2a 29 26 70 55 70 5b 31 5d 3b 0a 20  char*)&pUp[1];. 
147e0 20 20 20 6d 65 6d 63 70 79 28 70 55 70 2d 3e 7a     memcpy(pUp->z
147f0 4d 61 73 6b 2c 20 7a 4d 61 73 6b 2c 20 70 49 74  Mask, zMask, pIt
14800 65 72 2d 3e 6e 54 62 6c 43 6f 6c 29 3b 0a 20 20  er->nTblCol);.  
14810 20 20 70 55 70 2d 3e 70 4e 65 78 74 20 3d 20 70    pUp->pNext = p
14820 49 74 65 72 2d 3e 70 52 62 75 55 70 64 61 74 65  Iter->pRbuUpdate
14830 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 52 62  ;.    pIter->pRb
14840 75 55 70 64 61 74 65 20 3d 20 70 55 70 3b 0a 0a  uUpdate = pUp;..
14850 20 20 20 20 69 66 28 20 7a 53 65 74 20 29 7b 0a      if( zSet ){.
14860 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
14870 20 2a 7a 50 72 65 66 69 78 20 3d 20 22 22 3b 0a   *zPrefix = "";.
14880 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
14890 2d 3e 65 54 79 70 65 21 3d 52 42 55 5f 50 4b 5f  ->eType!=RBU_PK_
148a0 56 54 41 42 20 29 20 7a 50 72 65 66 69 78 20 3d  VTAB ) zPrefix =
148b0 20 22 72 62 75 5f 69 6d 70 5f 22 3b 0a 20 20 20   "rbu_imp_";.   
148c0 20 20 20 7a 55 70 64 61 74 65 20 3d 20 73 71 6c     zUpdate = sql
148d0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 55 50  ite3_mprintf("UP
148e0 44 41 54 45 20 5c 22 25 73 25 77 5c 22 20 53 45  DATE \"%s%w\" SE
148f0 54 20 25 73 20 57 48 45 52 45 20 25 73 22 2c 20  T %s WHERE %s", 
14900 0a 20 20 20 20 20 20 20 20 20 20 7a 50 72 65 66  .          zPref
14910 69 78 2c 20 70 49 74 65 72 2d 3e 7a 54 62 6c 2c  ix, pIter->zTbl,
14920 20 7a 53 65 74 2c 20 7a 57 68 65 72 65 0a 20 20   zSet, zWhere.  
14930 20 20 20 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e      );.      p->
14940 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65  rc = prepareFree
14950 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
14960 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 64 62  .          p->db
14970 4d 61 69 6e 2c 20 26 70 55 70 2d 3e 70 55 70 64  Main, &pUp->pUpd
14980 61 74 65 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  ate, &p->zErrmsg
14990 2c 20 7a 55 70 64 61 74 65 0a 20 20 20 20 20 20  , zUpdate.      
149a0 29 3b 0a 20 20 20 20 20 20 2a 70 70 53 74 6d 74  );.      *ppStmt
149b0 20 3d 20 70 55 70 2d 3e 70 55 70 64 61 74 65 3b   = pUp->pUpdate;
149c0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
149d0 65 33 5f 66 72 65 65 28 7a 57 68 65 72 65 29 3b  e3_free(zWhere);
149e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
149f0 65 28 7a 53 65 74 29 3b 0a 20 20 7d 0a 0a 20 20  e(zSet);.  }..  
14a00 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a  return p->rc;.}.
14a10 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 20  .static sqlite3 
14a20 2a 72 62 75 4f 70 65 6e 44 62 68 61 6e 64 6c 65  *rbuOpenDbhandle
14a30 28 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a  (.  sqlite3rbu *
14a40 70 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  p, .  const char
14a50 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20   *zName, .  int 
14a60 62 55 73 65 56 66 73 0a 29 7b 0a 20 20 73 71 6c  bUseVfs.){.  sql
14a70 69 74 65 33 20 2a 64 62 20 3d 20 30 3b 0a 20 20  ite3 *db = 0;.  
14a80 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
14a90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73  E_OK ){.    cons
14aa0 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 53 51  t int flags = SQ
14ab0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
14ac0 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
14ad0 43 52 45 41 54 45 7c 53 51 4c 49 54 45 5f 4f 50  CREATE|SQLITE_OP
14ae0 45 4e 5f 55 52 49 3b 0a 20 20 20 20 70 2d 3e 72  EN_URI;.    p->r
14af0 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  c = sqlite3_open
14b00 5f 76 32 28 7a 4e 61 6d 65 2c 20 26 64 62 2c 20  _v2(zName, &db, 
14b10 66 6c 61 67 73 2c 20 62 55 73 65 56 66 73 20 3f  flags, bUseVfs ?
14b20 20 70 2d 3e 7a 56 66 73 4e 61 6d 65 20 3a 20 30   p->zVfsName : 0
14b30 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
14b40 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72   ){.      p->zEr
14b50 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rmsg = sqlite3_m
14b60 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c  printf("%s", sql
14b70 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29  ite3_errmsg(db))
14b80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
14b90 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20 20 20  close(db);.     
14ba0 20 64 62 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20   db = 0;.    }. 
14bb0 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 3b 0a   }.  return db;.
14bc0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e  }../*.** Free an
14bd0 20 52 62 75 53 74 61 74 65 20 6f 62 6a 65 63 74   RbuState object
14be0 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 72 62   allocated by rb
14bf0 75 4c 6f 61 64 53 74 61 74 65 28 29 2e 0a 2a 2f  uLoadState()..*/
14c00 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
14c10 46 72 65 65 53 74 61 74 65 28 52 62 75 53 74 61  FreeState(RbuSta
14c20 74 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  te *p){.  if( p 
14c30 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
14c40 72 65 65 28 70 2d 3e 7a 54 62 6c 29 3b 0a 20 20  ree(p->zTbl);.  
14c50 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
14c60 2d 3e 7a 44 61 74 61 54 62 6c 29 3b 0a 20 20 20  ->zDataTbl);.   
14c70 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
14c80 3e 7a 49 64 78 29 3b 0a 20 20 20 20 73 71 6c 69  >zIdx);.    sqli
14c90 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d  te3_free(p);.  }
14ca0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
14cb0 74 65 20 61 6e 20 52 62 75 53 74 61 74 65 20 6f  te an RbuState o
14cc0 62 6a 65 63 74 20 61 6e 64 20 6c 6f 61 64 20 74  bject and load t
14cd0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
14ce0 68 65 20 72 62 75 5f 73 74 61 74 65 20 0a 2a 2a  he rbu_state .**
14cf0 20 74 61 62 6c 65 20 69 6e 74 6f 20 69 74 2e 20   table into it. 
14d00 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
14d10 20 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a 65   to the new obje
14d20 63 74 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a  ct. It is the .*
14d30 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  * responsibility
14d40 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
14d50 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  o eventually fre
14d60 65 20 74 68 65 20 6f 62 6a 65 63 74 20 75 73 69  e the object usi
14d70 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 72  ng.** sqlite3_fr
14d80 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ee()..**.** If a
14d90 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
14da0 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 63  leave an error c
14db0 6f 64 65 20 61 6e 64 20 6d 65 73 73 61 67 65 20  ode and message 
14dc0 69 6e 20 74 68 65 20 72 62 75 20 68 61 6e 64 6c  in the rbu handl
14dd0 65 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 20  e.** and return 
14de0 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  NULL..*/.static 
14df0 52 62 75 53 74 61 74 65 20 2a 72 62 75 4c 6f 61  RbuState *rbuLoa
14e00 64 53 74 61 74 65 28 73 71 6c 69 74 65 33 72 62  dState(sqlite3rb
14e10 75 20 2a 70 29 7b 0a 20 20 52 62 75 53 74 61 74  u *p){.  RbuStat
14e20 65 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 73  e *pRet = 0;.  s
14e30 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
14e40 6d 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  mt = 0;.  int rc
14e50 3b 0a 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20  ;.  int rc2;..  
14e60 70 52 65 74 20 3d 20 28 52 62 75 53 74 61 74 65  pRet = (RbuState
14e70 2a 29 72 62 75 4d 61 6c 6c 6f 63 28 70 2c 20 73  *)rbuMalloc(p, s
14e80 69 7a 65 6f 66 28 52 62 75 53 74 61 74 65 29 29  izeof(RbuState))
14e90 3b 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20  ;.  if( pRet==0 
14ea0 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72  ) return 0;..  r
14eb0 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41  c = prepareFreeA
14ec0 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70  ndCollectError(p
14ed0 2d 3e 64 62 52 62 75 2c 20 26 70 53 74 6d 74 2c  ->dbRbu, &pStmt,
14ee0 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20   &p->zErrmsg, . 
14ef0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72       sqlite3_mpr
14f00 69 6e 74 66 28 22 53 45 4c 45 43 54 20 6b 2c 20  intf("SELECT k, 
14f10 76 20 46 52 4f 4d 20 25 73 2e 72 62 75 5f 73 74  v FROM %s.rbu_st
14f20 61 74 65 22 2c 20 70 2d 3e 7a 53 74 61 74 65 44  ate", p->zStateD
14f30 62 29 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28  b).  );.  while(
14f40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
14f50 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  & SQLITE_ROW==sq
14f60 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
14f70 29 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28  ) ){.    switch(
14f80 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
14f90 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 20 29 7b  int(pStmt, 0) ){
14fa0 0a 20 20 20 20 20 20 63 61 73 65 20 52 42 55 5f  .      case RBU_
14fb0 53 54 41 54 45 5f 53 54 41 47 45 3a 0a 20 20 20  STATE_STAGE:.   
14fc0 20 20 20 20 20 70 52 65 74 2d 3e 65 53 74 61 67       pRet->eStag
14fd0 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  e = sqlite3_colu
14fe0 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31 29  mn_int(pStmt, 1)
14ff0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 52  ;.        if( pR
15000 65 74 2d 3e 65 53 74 61 67 65 21 3d 52 42 55 5f  et->eStage!=RBU_
15010 53 54 41 47 45 5f 4f 41 4c 0a 20 20 20 20 20 20  STAGE_OAL.      
15020 20 20 20 26 26 20 70 52 65 74 2d 3e 65 53 74 61     && pRet->eSta
15030 67 65 21 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f  ge!=RBU_STAGE_MO
15040 56 45 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  VE.         && p
15050 52 65 74 2d 3e 65 53 74 61 67 65 21 3d 52 42 55  Ret->eStage!=RBU
15060 5f 53 54 41 47 45 5f 43 4b 50 54 0a 20 20 20 20  _STAGE_CKPT.    
15070 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
15080 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
15090 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20  CORRUPT;.       
150a0 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
150b0 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 52 42  ;..      case RB
150c0 55 5f 53 54 41 54 45 5f 54 42 4c 3a 0a 20 20 20  U_STATE_TBL:.   
150d0 20 20 20 20 20 70 52 65 74 2d 3e 7a 54 62 6c 20       pRet->zTbl 
150e0 3d 20 72 62 75 53 74 72 6e 64 75 70 28 28 63 68  = rbuStrndup((ch
150f0 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
15100 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31  mn_text(pStmt, 1
15110 29 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20  ), &rc);.       
15120 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63   break;..      c
15130 61 73 65 20 52 42 55 5f 53 54 41 54 45 5f 49 44  ase RBU_STATE_ID
15140 58 3a 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d  X:.        pRet-
15150 3e 7a 49 64 78 20 3d 20 72 62 75 53 74 72 6e 64  >zIdx = rbuStrnd
15160 75 70 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65  up((char*)sqlite
15170 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
15180 74 6d 74 2c 20 31 29 2c 20 26 72 63 29 3b 0a 20  tmt, 1), &rc);. 
15190 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20         break;.. 
151a0 20 20 20 20 20 63 61 73 65 20 52 42 55 5f 53 54       case RBU_ST
151b0 41 54 45 5f 52 4f 57 3a 0a 20 20 20 20 20 20 20  ATE_ROW:.       
151c0 20 70 52 65 74 2d 3e 6e 52 6f 77 20 3d 20 73 71   pRet->nRow = sq
151d0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
151e0 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20  (pStmt, 1);.    
151f0 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
15200 20 20 63 61 73 65 20 52 42 55 5f 53 54 41 54 45    case RBU_STATE
15210 5f 50 52 4f 47 52 45 53 53 3a 0a 20 20 20 20 20  _PROGRESS:.     
15220 20 20 20 70 52 65 74 2d 3e 6e 50 72 6f 67 72 65     pRet->nProgre
15230 73 73 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ss = sqlite3_col
15240 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  umn_int64(pStmt,
15250 20 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65   1);.        bre
15260 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20  ak;..      case 
15270 52 42 55 5f 53 54 41 54 45 5f 43 4b 50 54 3a 0a  RBU_STATE_CKPT:.
15280 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 69 57          pRet->iW
15290 61 6c 43 6b 73 75 6d 20 3d 20 73 71 6c 69 74 65  alCksum = sqlite
152a0 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
152b0 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  Stmt, 1);.      
152c0 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
152d0 63 61 73 65 20 52 42 55 5f 53 54 41 54 45 5f 43  case RBU_STATE_C
152e0 4f 4f 4b 49 45 3a 0a 20 20 20 20 20 20 20 20 70  OOKIE:.        p
152f0 52 65 74 2d 3e 69 43 6f 6f 6b 69 65 20 3d 20 28  Ret->iCookie = (
15300 75 33 32 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  u32)sqlite3_colu
15310 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  mn_int64(pStmt, 
15320 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  1);.        brea
15330 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 52  k;..      case R
15340 42 55 5f 53 54 41 54 45 5f 4f 41 4c 53 5a 3a 0a  BU_STATE_OALSZ:.
15350 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 69 4f          pRet->iO
15360 61 6c 53 7a 20 3d 20 28 75 33 32 29 73 71 6c 69  alSz = (u32)sqli
15370 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
15380 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20  (pStmt, 1);.    
15390 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
153a0 20 20 63 61 73 65 20 52 42 55 5f 53 54 41 54 45    case RBU_STATE
153b0 5f 50 48 41 53 45 4f 4e 45 53 54 45 50 3a 0a 20  _PHASEONESTEP:. 
153c0 20 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 50 68         pRet->nPh
153d0 61 73 65 4f 6e 65 53 74 65 70 20 3d 20 73 71 6c  aseOneStep = sql
153e0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
153f0 34 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20  4(pStmt, 1);.   
15400 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
15410 20 20 20 63 61 73 65 20 52 42 55 5f 53 54 41 54     case RBU_STAT
15420 45 5f 44 41 54 41 54 42 4c 3a 0a 20 20 20 20 20  E_DATATBL:.     
15430 20 20 20 70 52 65 74 2d 3e 7a 44 61 74 61 54 62     pRet->zDataTb
15440 6c 20 3d 20 72 62 75 53 74 72 6e 64 75 70 28 28  l = rbuStrndup((
15450 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
15460 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
15470 20 31 29 2c 20 26 72 63 29 3b 0a 20 20 20 20 20   1), &rc);.     
15480 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20     break;..     
15490 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
154a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
154b0 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 62  RRUPT;.        b
154c0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
154d0 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f    rc2 = sqlite3_
154e0 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
154f0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
15500 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b  E_OK ) rc = rc2;
15510 0a 0a 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a  ..  p->rc = rc;.
15520 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
15530 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  .../*.** Open th
15540 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
15550 65 20 61 6e 64 20 61 74 74 61 63 68 20 74 68 65  e and attach the
15560 20 52 42 55 20 64 61 74 61 62 61 73 65 20 61 73   RBU database as
15570 20 22 72 62 75 22 2e 20 49 66 20 61 6e 0a 2a 2a   "rbu". If an.**
15580 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c   error occurs, l
15590 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  eave an error co
155a0 64 65 20 61 6e 64 20 6d 65 73 73 61 67 65 20 69  de and message i
155b0 6e 20 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65  n the RBU handle
155c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
155d0 20 72 62 75 4f 70 65 6e 44 61 74 61 62 61 73 65   rbuOpenDatabase
155e0 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20  (sqlite3rbu *p, 
155f0 69 6e 74 20 2a 70 62 52 65 74 72 79 29 7b 0a 20  int *pbRetry){. 
15600 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 20 7c   assert( p->rc |
15610 7c 20 28 70 2d 3e 64 62 4d 61 69 6e 3d 3d 30 20  | (p->dbMain==0 
15620 26 26 20 70 2d 3e 64 62 52 62 75 3d 3d 30 29 20  && p->dbRbu==0) 
15630 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
15640 72 63 20 7c 7c 20 72 62 75 49 73 56 61 63 75 75  rc || rbuIsVacuu
15650 6d 28 70 29 20 7c 7c 20 70 2d 3e 7a 54 61 72 67  m(p) || p->zTarg
15660 65 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 4f  et!=0 );..  /* O
15670 70 65 6e 20 74 68 65 20 52 42 55 20 64 61 74 61  pen the RBU data
15680 62 61 73 65 20 2a 2f 0a 20 20 70 2d 3e 64 62 52  base */.  p->dbR
15690 62 75 20 3d 20 72 62 75 4f 70 65 6e 44 62 68 61  bu = rbuOpenDbha
156a0 6e 64 6c 65 28 70 2c 20 70 2d 3e 7a 52 62 75 2c  ndle(p, p->zRbu,
156b0 20 31 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72   1);..  if( p->r
156c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
156d0 72 62 75 49 73 56 61 63 75 75 6d 28 70 29 20 29  rbuIsVacuum(p) )
156e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  {.    sqlite3_fi
156f0 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62  le_control(p->db
15700 52 62 75 2c 20 22 6d 61 69 6e 22 2c 20 53 51 4c  Rbu, "main", SQL
15710 49 54 45 5f 46 43 4e 54 4c 5f 52 42 55 43 4e 54  ITE_FCNTL_RBUCNT
15720 2c 20 28 76 6f 69 64 2a 29 70 29 3b 0a 20 20 20  , (void*)p);.   
15730 20 69 66 28 20 70 2d 3e 7a 53 74 61 74 65 3d 3d   if( p->zState==
15740 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  0 ){.      const
15750 20 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 73   char *zFile = s
15760 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61  qlite3_db_filena
15770 6d 65 28 70 2d 3e 64 62 52 62 75 2c 20 22 6d 61  me(p->dbRbu, "ma
15780 69 6e 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e 7a  in");.      p->z
15790 53 74 61 74 65 20 3d 20 72 62 75 4d 50 72 69 6e  State = rbuMPrin
157a0 74 66 28 70 2c 20 22 66 69 6c 65 3a 2f 2f 25 73  tf(p, "file://%s
157b0 2d 76 61 63 75 75 6d 3f 6d 6f 64 65 6f 66 3d 25  -vacuum?modeof=%
157c0 73 22 2c 20 7a 46 69 6c 65 2c 20 7a 46 69 6c 65  s", zFile, zFile
157d0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
157e0 2f 2a 20 49 66 20 75 73 69 6e 67 20 73 65 70 61  /* If using sepa
157f0 72 61 74 65 20 52 42 55 20 61 6e 64 20 73 74 61  rate RBU and sta
15800 74 65 20 64 61 74 61 62 61 73 65 73 2c 20 61 74  te databases, at
15810 74 61 63 68 20 74 68 65 20 73 74 61 74 65 20 64  tach the state d
15820 61 74 61 62 61 73 65 20 74 6f 0a 20 20 2a 2a 20  atabase to.  ** 
15830 74 68 65 20 52 42 55 20 64 62 20 68 61 6e 64 6c  the RBU db handl
15840 65 20 6e 6f 77 2e 20 20 2a 2f 0a 20 20 69 66 28  e now.  */.  if(
15850 20 70 2d 3e 7a 53 74 61 74 65 20 29 7b 0a 20 20   p->zState ){.  
15860 20 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63    rbuMPrintfExec
15870 28 70 2c 20 70 2d 3e 64 62 52 62 75 2c 20 22 41  (p, p->dbRbu, "A
15880 54 54 41 43 48 20 25 51 20 41 53 20 73 74 61 74  TTACH %Q AS stat
15890 22 2c 20 70 2d 3e 7a 53 74 61 74 65 29 3b 0a 20  ", p->zState);. 
158a0 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 7a 53 74     memcpy(p->zSt
158b0 61 74 65 44 62 2c 20 22 73 74 61 74 22 2c 20 34  ateDb, "stat", 4
158c0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
158d0 6d 65 6d 63 70 79 28 70 2d 3e 7a 53 74 61 74 65  memcpy(p->zState
158e0 44 62 2c 20 22 6d 61 69 6e 22 2c 20 34 29 3b 0a  Db, "main", 4);.
158f0 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20 69 66 28    }..#if 0.  if(
15900 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
15910 4b 20 26 26 20 72 62 75 49 73 56 61 63 75 75 6d  K && rbuIsVacuum
15920 28 70 29 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  (p) ){.    p->rc
15930 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
15940 70 2d 3e 64 62 52 62 75 2c 20 22 42 45 47 49 4e  p->dbRbu, "BEGIN
15950 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  ", 0, 0, 0);.  }
15960 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
15970 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c 72 65   it has not alre
15980 61 64 79 20 62 65 65 6e 20 63 72 65 61 74 65 64  ady been created
15990 2c 20 63 72 65 61 74 65 20 74 68 65 20 72 62 75  , create the rbu
159a0 5f 73 74 61 74 65 20 74 61 62 6c 65 20 2a 2f 0a  _state table */.
159b0 20 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63    rbuMPrintfExec
159c0 28 70 2c 20 70 2d 3e 64 62 52 62 75 2c 20 52 42  (p, p->dbRbu, RB
159d0 55 5f 43 52 45 41 54 45 5f 53 54 41 54 45 2c 20  U_CREATE_STATE, 
159e0 70 2d 3e 7a 53 74 61 74 65 44 62 29 3b 0a 0a 23  p->zStateDb);..#
159f0 69 66 20 30 0a 20 20 69 66 28 20 72 62 75 49 73  if 0.  if( rbuIs
15a00 56 61 63 75 75 6d 28 70 29 20 29 7b 0a 20 20 20  Vacuum(p) ){.   
15a10 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
15a20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
15a30 6e 74 20 72 63 32 3b 0a 20 20 20 20 20 20 69 6e  nt rc2;.      in
15a40 74 20 62 4f 6b 20 3d 20 30 3b 0a 20 20 20 20 20  t bOk = 0;.     
15a50 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
15a60 43 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Cnt = 0;.      p
15a70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 41 6e  ->rc = prepareAn
15a80 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d  dCollectError(p-
15a90 3e 64 62 52 62 75 2c 20 26 70 43 6e 74 2c 20 26  >dbRbu, &pCnt, &
15aa0 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20  p->zErrmsg,.    
15ab0 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f        "SELECT co
15ac0 75 6e 74 28 2a 29 20 46 52 4f 4d 20 73 74 61 74  unt(*) FROM stat
15ad0 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a  .sqlite_master".
15ae0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69        );.      i
15af0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
15b00 5f 4f 4b 20 0a 20 20 20 20 20 20 20 26 26 20 73  _OK .       && s
15b10 71 6c 69 74 65 33 5f 73 74 65 70 28 70 43 6e 74  qlite3_step(pCnt
15b20 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 0a 20 20  )==SQLITE_ROW.  
15b30 20 20 20 20 20 26 26 20 31 3d 3d 73 71 6c 69 74       && 1==sqlit
15b40 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 43  e3_column_int(pC
15b50 6e 74 2c 20 30 29 0a 20 20 20 20 20 20 29 7b 0a  nt, 0).      ){.
15b60 20 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 31 3b          bOk = 1;
15b70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
15b80 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e  c2 = sqlite3_fin
15b90 61 6c 69 7a 65 28 70 43 6e 74 29 3b 0a 20 20 20  alize(pCnt);.   
15ba0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
15bb0 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63 20  LITE_OK ) p->rc 
15bc0 3d 20 72 63 32 3b 0a 0a 20 20 20 20 20 20 69 66  = rc2;..      if
15bd0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
15be0 4f 4b 20 26 26 20 62 4f 6b 3d 3d 30 20 29 7b 0a  OK && bOk==0 ){.
15bf0 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
15c00 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
15c10 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67        p->zErrmsg
15c20 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
15c30 74 66 28 22 69 6e 76 61 6c 69 64 20 73 74 61 74  tf("invalid stat
15c40 65 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20  e database");.  
15c50 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 20      }.    .     
15c60 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
15c70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
15c80 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
15c90 5f 65 78 65 63 28 70 2d 3e 64 62 52 62 75 2c 20  _exec(p->dbRbu, 
15ca0 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20  "COMMIT", 0, 0, 
15cb0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
15cc0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
15cd0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
15ce0 45 5f 4f 4b 20 26 26 20 72 62 75 49 73 56 61 63  E_OK && rbuIsVac
15cf0 75 75 6d 28 70 29 20 29 7b 0a 20 20 20 20 69 6e  uum(p) ){.    in
15d00 74 20 62 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20  t bOpen = 0;.   
15d10 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 70 2d 3e   int rc;.    p->
15d20 6e 52 62 75 20 3d 20 30 3b 0a 20 20 20 20 70 2d  nRbu = 0;.    p-
15d30 3e 70 52 62 75 46 64 20 3d 20 30 3b 0a 20 20 20  >pRbuFd = 0;.   
15d40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
15d50 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62  le_control(p->db
15d60 52 62 75 2c 20 22 6d 61 69 6e 22 2c 20 53 51 4c  Rbu, "main", SQL
15d70 49 54 45 5f 46 43 4e 54 4c 5f 52 42 55 43 4e 54  ITE_FCNTL_RBUCNT
15d80 2c 20 28 76 6f 69 64 2a 29 70 29 3b 0a 20 20 20  , (void*)p);.   
15d90 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15da0 4e 4f 54 46 4f 55 4e 44 20 29 20 70 2d 3e 72 63  NOTFOUND ) p->rc
15db0 20 3d 20 72 63 3b 0a 20 20 20 20 69 66 28 20 70   = rc;.    if( p
15dc0 2d 3e 65 53 74 61 67 65 3e 3d 52 42 55 5f 53 54  ->eStage>=RBU_ST
15dd0 41 47 45 5f 4d 4f 56 45 20 29 7b 0a 20 20 20 20  AGE_MOVE ){.    
15de0 20 20 62 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20    bOpen = 1;.   
15df0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 52 62   }else{.      Rb
15e00 75 53 74 61 74 65 20 2a 70 53 74 61 74 65 20 3d  uState *pState =
15e10 20 72 62 75 4c 6f 61 64 53 74 61 74 65 28 70 29   rbuLoadState(p)
15e20 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 74 61  ;.      if( pSta
15e30 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 62 4f  te ){.        bO
15e40 70 65 6e 20 3d 20 28 70 53 74 61 74 65 2d 3e 65  pen = (pState->e
15e50 53 74 61 67 65 3e 3d 52 42 55 5f 53 54 41 47 45  Stage>=RBU_STAGE
15e60 5f 4d 4f 56 45 29 3b 0a 20 20 20 20 20 20 20 20  _MOVE);.        
15e70 72 62 75 46 72 65 65 53 74 61 74 65 28 70 53 74  rbuFreeState(pSt
15e80 61 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ate);.      }.  
15e90 20 20 7d 0a 20 20 20 20 69 66 28 20 62 4f 70 65    }.    if( bOpe
15ea0 6e 20 29 20 70 2d 3e 64 62 4d 61 69 6e 20 3d 20  n ) p->dbMain = 
15eb0 72 62 75 4f 70 65 6e 44 62 68 61 6e 64 6c 65 28  rbuOpenDbhandle(
15ec0 70 2c 20 70 2d 3e 7a 52 62 75 2c 20 70 2d 3e 6e  p, p->zRbu, p->n
15ed0 52 62 75 3c 3d 31 29 3b 0a 20 20 7d 0a 0a 20 20  Rbu<=1);.  }..  
15ee0 70 2d 3e 65 53 74 61 67 65 20 3d 20 30 3b 0a 20  p->eStage = 0;. 
15ef0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
15f00 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 64 62 4d 61  TE_OK && p->dbMa
15f10 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  in==0 ){.    if(
15f20 20 21 72 62 75 49 73 56 61 63 75 75 6d 28 70 29   !rbuIsVacuum(p)
15f30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 64 62 4d   ){.      p->dbM
15f40 61 69 6e 20 3d 20 72 62 75 4f 70 65 6e 44 62 68  ain = rbuOpenDbh
15f50 61 6e 64 6c 65 28 70 2c 20 70 2d 3e 7a 54 61 72  andle(p, p->zTar
15f60 67 65 74 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c  get, 1);.    }el
15f70 73 65 20 69 66 28 20 70 2d 3e 70 52 62 75 46 64  se if( p->pRbuFd
15f80 2d 3e 70 57 61 6c 46 64 20 29 7b 0a 20 20 20 20  ->pWalFd ){.    
15f90 20 20 69 66 28 20 70 62 52 65 74 72 79 20 29 7b    if( pbRetry ){
15fa0 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 52 62 75  .        p->pRbu
15fb0 46 64 2d 3e 62 4e 6f 6c 6f 63 6b 20 3d 20 30 3b  Fd->bNolock = 0;
15fc0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15fd0 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 52 62 75 29  _close(p->dbRbu)
15fe0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
15ff0 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 4d 61 69  3_close(p->dbMai
16000 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 64  n);.        p->d
16010 62 4d 61 69 6e 20 3d 20 30 3b 0a 20 20 20 20 20  bMain = 0;.     
16020 20 20 20 70 2d 3e 64 62 52 62 75 20 3d 20 30 3b     p->dbRbu = 0;
16030 0a 20 20 20 20 20 20 20 20 2a 70 62 52 65 74 72  .        *pbRetr
16040 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  y = 1;.        r
16050 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
16060 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c       p->rc = SQL
16070 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
16080 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71   p->zErrmsg = sq
16090 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 63  lite3_mprintf("c
160a0 61 6e 6e 6f 74 20 76 61 63 75 75 6d 20 77 61 6c  annot vacuum wal
160b0 20 6d 6f 64 65 20 64 61 74 61 62 61 73 65 22 29   mode database")
160c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
160d0 20 20 20 63 68 61 72 20 2a 7a 54 61 72 67 65 74     char *zTarget
160e0 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45  ;.      char *zE
160f0 78 74 72 61 20 3d 20 30 3b 0a 20 20 20 20 20 20  xtra = 0;.      
16100 69 66 28 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 52  if( strlen(p->zR
16110 62 75 29 3e 3d 35 20 26 26 20 30 3d 3d 6d 65 6d  bu)>=5 && 0==mem
16120 63 6d 70 28 22 66 69 6c 65 3a 22 2c 20 70 2d 3e  cmp("file:", p->
16130 7a 52 62 75 2c 20 35 29 20 29 7b 0a 20 20 20 20  zRbu, 5) ){.    
16140 20 20 20 20 7a 45 78 74 72 61 20 3d 20 26 70 2d      zExtra = &p-
16150 3e 7a 52 62 75 5b 35 5d 3b 0a 20 20 20 20 20 20  >zRbu[5];.      
16160 20 20 77 68 69 6c 65 28 20 2a 7a 45 78 74 72 61    while( *zExtra
16170 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
16180 28 20 2a 7a 45 78 74 72 61 2b 2b 3d 3d 27 3f 27  ( *zExtra++=='?'
16190 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
161a0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
161b0 2a 7a 45 78 74 72 61 3d 3d 27 5c 30 27 20 29 20  *zExtra=='\0' ) 
161c0 7a 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 20 20  zExtra = 0;.    
161d0 20 20 7d 0a 0a 20 20 20 20 20 20 7a 54 61 72 67    }..      zTarg
161e0 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  et = sqlite3_mpr
161f0 69 6e 74 66 28 22 66 69 6c 65 3a 25 73 2d 76 61  intf("file:%s-va
16200 63 74 6d 70 3f 72 62 75 5f 6d 65 6d 6f 72 79 3d  ctmp?rbu_memory=
16210 31 25 73 25 73 22 2c 20 0a 20 20 20 20 20 20 20  1%s%s", .       
16220 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 66 69     sqlite3_db_fi
16230 6c 65 6e 61 6d 65 28 70 2d 3e 64 62 52 62 75 2c  lename(p->dbRbu,
16240 20 22 6d 61 69 6e 22 29 2c 0a 20 20 20 20 20 20   "main"),.      
16250 20 20 20 20 28 7a 45 78 74 72 61 3d 3d 30 20 3f      (zExtra==0 ?
16260 20 22 22 20 3a 20 22 26 22 29 2c 20 28 7a 45 78   "" : "&"), (zEx
16270 74 72 61 3d 3d 30 20 3f 20 22 22 20 3a 20 7a 45  tra==0 ? "" : zE
16280 78 74 72 61 29 0a 20 20 20 20 20 20 29 3b 0a 0a  xtra).      );..
16290 20 20 20 20 20 20 69 66 28 20 7a 54 61 72 67 65        if( zTarge
162a0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
162b0 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
162c0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 72 65  OMEM;.        re
162d0 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
162e0 20 20 20 20 70 2d 3e 64 62 4d 61 69 6e 20 3d 20      p->dbMain = 
162f0 72 62 75 4f 70 65 6e 44 62 68 61 6e 64 6c 65 28  rbuOpenDbhandle(
16300 70 2c 20 7a 54 61 72 67 65 74 2c 20 70 2d 3e 6e  p, zTarget, p->n
16310 52 62 75 3c 3d 31 29 3b 0a 20 20 20 20 20 20 73  Rbu<=1);.      s
16320 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 61 72  qlite3_free(zTar
16330 67 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  get);.    }.  }.
16340 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
16350 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
16360 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63  ->rc = sqlite3_c
16370 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70  reate_function(p
16380 2d 3e 64 62 4d 61 69 6e 2c 20 0a 20 20 20 20 20  ->dbMain, .     
16390 20 20 20 22 72 62 75 5f 74 6d 70 5f 69 6e 73 65     "rbu_tmp_inse
163a0 72 74 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  rt", -1, SQLITE_
163b0 55 54 46 38 2c 20 28 76 6f 69 64 2a 29 70 2c 20  UTF8, (void*)p, 
163c0 72 62 75 54 6d 70 49 6e 73 65 72 74 46 75 6e 63  rbuTmpInsertFunc
163d0 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20  , 0, 0.    );.  
163e0 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  }..  if( p->rc==
163f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16400 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
16410 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
16420 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 0a 20 20 20  (p->dbMain, .   
16430 20 20 20 20 20 22 72 62 75 5f 66 6f 73 73 69 6c       "rbu_fossil
16440 5f 64 65 6c 74 61 22 2c 20 32 2c 20 53 51 4c 49  _delta", 2, SQLI
16450 54 45 5f 55 54 46 38 2c 20 30 2c 20 72 62 75 46  TE_UTF8, 0, rbuF
16460 6f 73 73 69 6c 44 65 6c 74 61 46 75 6e 63 2c 20  ossilDeltaFunc, 
16470 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  0, 0.    );.  }.
16480 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
16490 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
164a0 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63  ->rc = sqlite3_c
164b0 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70  reate_function(p
164c0 2d 3e 64 62 52 62 75 2c 20 0a 20 20 20 20 20 20  ->dbRbu, .      
164d0 20 20 22 72 62 75 5f 74 61 72 67 65 74 5f 6e 61    "rbu_target_na
164e0 6d 65 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  me", -1, SQLITE_
164f0 55 54 46 38 2c 20 28 76 6f 69 64 2a 29 70 2c 20  UTF8, (void*)p, 
16500 72 62 75 54 61 72 67 65 74 4e 61 6d 65 46 75 6e  rbuTargetNameFun
16510 63 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20  c, 0, 0.    );. 
16520 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   }..  if( p->rc=
16530 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16540 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
16550 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70  3_file_control(p
16560 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22  ->dbMain, "main"
16570 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 52  , SQLITE_FCNTL_R
16580 42 55 2c 20 28 76 6f 69 64 2a 29 70 29 3b 0a 20  BU, (void*)p);. 
16590 20 7d 0a 20 20 72 62 75 4d 50 72 69 6e 74 66 45   }.  rbuMPrintfE
165a0 78 65 63 28 70 2c 20 70 2d 3e 64 62 4d 61 69 6e  xec(p, p->dbMain
165b0 2c 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  , "SELECT * FROM
165c0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 29   sqlite_master")
165d0 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  ;..  /* Mark the
165e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6a   database file j
165f0 75 73 74 20 6f 70 65 6e 65 64 20 61 73 20 61 6e  ust opened as an
16600 20 52 42 55 20 74 61 72 67 65 74 20 64 61 74 61   RBU target data
16610 62 61 73 65 2e 20 49 66 20 0a 20 20 2a 2a 20 74  base. If .  ** t
16620 68 69 73 20 63 61 6c 6c 20 72 65 74 75 72 6e 73  his call returns
16630 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
16640 2c 20 74 68 65 6e 20 74 68 65 20 52 42 55 20 76  , then the RBU v
16650 66 73 20 69 73 20 6e 6f 74 20 69 6e 20 75 73 65  fs is not in use
16660 2e 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 61  ..  ** This is a
16670 6e 20 65 72 72 6f 72 2e 20 20 2a 2f 0a 20 20 69  n error.  */.  i
16680 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
16690 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  _OK ){.    p->rc
166a0 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
166b0 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62 4d 61 69  control(p->dbMai
166c0 6e 2c 20 22 6d 61 69 6e 22 2c 20 53 51 4c 49 54  n, "main", SQLIT
166d0 45 5f 46 43 4e 54 4c 5f 52 42 55 2c 20 28 76 6f  E_FCNTL_RBU, (vo
166e0 69 64 2a 29 70 29 3b 0a 20 20 7d 0a 0a 20 20 69  id*)p);.  }..  i
166f0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
16700 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20  _NOTFOUND ){.   
16710 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
16720 45 52 52 4f 52 3b 0a 20 20 20 20 70 2d 3e 7a 45  ERROR;.    p->zE
16730 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrmsg = sqlite3_
16740 6d 70 72 69 6e 74 66 28 22 72 62 75 20 76 66 73  mprintf("rbu vfs
16750 20 6e 6f 74 20 66 6f 75 6e 64 22 29 3b 0a 20 20   not found");.  
16760 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
16770 72 6f 75 74 69 6e 65 20 69 73 20 61 20 63 6f 70  routine is a cop
16780 79 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  y of the sqlite3
16790 46 69 6c 65 53 75 66 66 69 78 33 28 29 20 72 6f  FileSuffix3() ro
167a0 75 74 69 6e 65 20 66 72 6f 6d 20 74 68 65 20 63  utine from the c
167b0 6f 72 65 2e 0a 2a 2a 20 49 74 20 69 73 20 61 20  ore..** It is a 
167c0 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 53 51 4c  no-op unless SQL
167d0 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e  ITE_ENABLE_8_3_N
167e0 41 4d 45 53 20 69 73 20 64 65 66 69 6e 65 64 2e  AMES is defined.
167f0 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  .**.** If SQLITE
16800 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45  _ENABLE_8_3_NAME
16810 53 20 69 73 20 73 65 74 20 61 74 20 63 6f 6d 70  S is set at comp
16820 69 6c 65 2d 74 69 6d 65 20 61 6e 64 20 69 66 20  ile-time and if 
16830 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
16840 66 69 6c 65 6e 61 6d 65 20 69 6e 20 7a 42 61 73  filename in zBas
16850 65 46 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 55  eFilename is a U
16860 52 49 20 77 69 74 68 20 74 68 65 20 22 38 5f 33  RI with the "8_3
16870 5f 6e 61 6d 65 73 3d 31 22 20 70 61 72 61 6d 65  _names=1" parame
16880 74 65 72 20 61 6e 64 0a 2a 2a 20 69 66 20 66 69  ter and.** if fi
16890 6c 65 6e 61 6d 65 20 69 6e 20 7a 5b 5d 20 68 61  lename in z[] ha
168a0 73 20 61 20 73 75 66 66 69 78 20 28 61 2e 6b 2e  s a suffix (a.k.
168b0 61 2e 20 22 65 78 74 65 6e 73 69 6f 6e 22 29 20  a. "extension") 
168c0 74 68 61 74 20 69 73 20 6c 6f 6e 67 65 72 20 74  that is longer t
168d0 68 61 6e 0a 2a 2a 20 74 68 72 65 65 20 63 68 61  han.** three cha
168e0 72 61 63 74 65 72 73 2c 20 74 68 65 6e 20 73 68  racters, then sh
168f0 6f 72 74 65 6e 20 74 68 65 20 73 75 66 66 69 78  orten the suffix
16900 20 6f 6e 20 7a 5b 5d 20 74 6f 20 62 65 20 74 68   on z[] to be th
16910 65 20 6c 61 73 74 20 74 68 72 65 65 0a 2a 2a 20  e last three.** 
16920 63 68 61 72 61 63 74 65 72 73 20 6f 66 20 74 68  characters of th
16930 65 20 6f 72 69 67 69 6e 61 6c 20 73 75 66 66 69  e original suffi
16940 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  x..**.** If SQLI
16950 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41  TE_ENABLE_8_3_NA
16960 4d 45 53 20 69 73 20 73 65 74 20 74 6f 20 32 20  MES is set to 2 
16970 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c  at compile-time,
16980 20 74 68 65 6e 20 61 6c 77 61 79 73 0a 2a 2a 20   then always.** 
16990 64 6f 20 74 68 65 20 73 75 66 66 69 78 20 73 68  do the suffix sh
169a0 6f 72 74 65 6e 69 6e 67 20 72 65 67 61 72 64 6c  ortening regardl
169b0 65 73 73 20 6f 66 20 55 52 49 20 70 61 72 61 6d  ess of URI param
169c0 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d  eter..**.** Exam
169d0 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ples:.**.**     
169e0 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20  test.db-journal 
169f0 20 20 20 3d 3e 20 20 20 74 65 73 74 2e 6e 61 6c     =>   test.nal
16a00 0a 2a 2a 20 20 20 20 20 74 65 73 74 2e 64 62 2d  .**     test.db-
16a10 77 61 6c 20 20 20 20 20 20 20 20 3d 3e 20 20 20  wal        =>   
16a20 74 65 73 74 2e 77 61 6c 0a 2a 2a 20 20 20 20 20  test.wal.**     
16a30 74 65 73 74 2e 64 62 2d 73 68 6d 20 20 20 20 20  test.db-shm     
16a40 20 20 20 3d 3e 20 20 20 74 65 73 74 2e 73 68 6d     =>   test.shm
16a50 0a 2a 2a 20 20 20 20 20 74 65 73 74 2e 64 62 2d  .**     test.db-
16a60 6d 6a 37 66 33 33 31 39 66 61 20 3d 3e 20 20 20  mj7f3319fa =>   
16a70 74 65 73 74 2e 39 66 61 0a 2a 2f 0a 73 74 61 74  test.9fa.*/.stat
16a80 69 63 20 76 6f 69 64 20 72 62 75 46 69 6c 65 53  ic void rbuFileS
16a90 75 66 66 69 78 33 28 63 6f 6e 73 74 20 63 68 61  uffix3(const cha
16aa0 72 20 2a 7a 42 61 73 65 2c 20 63 68 61 72 20 2a  r *zBase, char *
16ab0 7a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  z){.#ifdef SQLIT
16ac0 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d  E_ENABLE_8_3_NAM
16ad0 45 53 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  ES.#if SQLITE_EN
16ae0 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 3c 32  ABLE_8_3_NAMES<2
16af0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75  .  if( sqlite3_u
16b00 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 42 61 73 65  ri_boolean(zBase
16b10 2c 20 22 38 5f 33 5f 6e 61 6d 65 73 22 2c 20 30  , "8_3_names", 0
16b20 29 20 29 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20  ) ).#endif.  {. 
16b30 20 20 20 69 6e 74 20 69 2c 20 73 7a 3b 0a 20 20     int i, sz;.  
16b40 20 20 73 7a 20 3d 20 28 69 6e 74 29 73 74 72 6c    sz = (int)strl
16b50 65 6e 28 7a 29 26 30 78 66 66 66 66 66 66 3b 0a  en(z)&0xffffff;.
16b60 20 20 20 20 66 6f 72 28 69 3d 73 7a 2d 31 3b 20      for(i=sz-1; 
16b70 69 3e 30 20 26 26 20 7a 5b 69 5d 21 3d 27 2f 27  i>0 && z[i]!='/'
16b80 20 26 26 20 7a 5b 69 5d 21 3d 27 2e 27 3b 20 69   && z[i]!='.'; i
16b90 2d 2d 29 7b 7d 0a 20 20 20 20 69 66 28 20 7a 5b  --){}.    if( z[
16ba0 69 5d 3d 3d 27 2e 27 20 26 26 20 73 7a 3e 69 2b  i]=='.' && sz>i+
16bb0 34 20 29 20 6d 65 6d 6d 6f 76 65 28 26 7a 5b 69  4 ) memmove(&z[i
16bc0 2b 31 5d 2c 20 26 7a 5b 73 7a 2d 33 5d 2c 20 34  +1], &z[sz-3], 4
16bd0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  );.  }.#endif.}.
16be0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
16bf0 65 20 63 75 72 72 65 6e 74 20 77 61 6c 2d 69 6e  e current wal-in
16c00 64 65 78 20 68 65 61 64 65 72 20 63 68 65 63 6b  dex header check
16c10 73 75 6d 20 66 6f 72 20 74 68 65 20 74 61 72 67  sum for the targ
16c20 65 74 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  et database .** 
16c30 61 73 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65  as a 64-bit inte
16c40 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ger..**.** The c
16c50 68 65 63 6b 73 75 6d 20 69 73 20 73 74 6f 72 65  hecksum is store
16c60 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 70 61   in the first pa
16c70 67 65 20 6f 66 20 78 53 68 6d 4d 61 70 20 6d 65  ge of xShmMap me
16c80 6d 6f 72 79 20 61 73 20 61 6e 20 38 2d 62 79 74  mory as an 8-byt
16c90 65 20 0a 2a 2a 20 62 6c 6f 62 20 73 74 61 72 74  e .** blob start
16ca0 69 6e 67 20 61 74 20 62 79 74 65 20 6f 66 66 73  ing at byte offs
16cb0 65 74 20 34 30 2e 0a 2a 2f 0a 73 74 61 74 69 63  et 40..*/.static
16cc0 20 69 36 34 20 72 62 75 53 68 6d 43 68 65 63 6b   i64 rbuShmCheck
16cd0 73 75 6d 28 73 71 6c 69 74 65 33 72 62 75 20 2a  sum(sqlite3rbu *
16ce0 70 29 7b 0a 20 20 69 36 34 20 69 52 65 74 20 3d  p){.  i64 iRet =
16cf0 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   0;.  if( p->rc=
16d00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16d10 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
16d20 70 44 62 20 3d 20 70 2d 3e 70 54 61 72 67 65 74  pDb = p->pTarget
16d30 46 64 2d 3e 70 52 65 61 6c 3b 0a 20 20 20 20 75  Fd->pReal;.    u
16d40 33 32 20 76 6f 6c 61 74 69 6c 65 20 2a 70 74 72  32 volatile *ptr
16d50 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 44  ;.    p->rc = pD
16d60 62 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68  b->pMethods->xSh
16d70 6d 4d 61 70 28 70 44 62 2c 20 30 2c 20 33 32 2a  mMap(pDb, 0, 32*
16d80 31 30 32 34 2c 20 30 2c 20 28 76 6f 69 64 20 76  1024, 0, (void v
16d90 6f 6c 61 74 69 6c 65 2a 2a 29 26 70 74 72 29 3b  olatile**)&ptr);
16da0 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  .    if( p->rc==
16db0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16dc0 20 20 20 69 52 65 74 20 3d 20 28 28 69 36 34 29     iRet = ((i64)
16dd0 70 74 72 5b 31 30 5d 20 3c 3c 20 33 32 29 20 2b  ptr[10] << 32) +
16de0 20 70 74 72 5b 31 31 5d 3b 0a 20 20 20 20 7d 0a   ptr[11];.    }.
16df0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65    }.  return iRe
16e00 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t;.}../*.** This
16e10 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
16e20 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 69  led as part of i
16e30 6e 69 74 69 61 6c 69 7a 69 6e 67 20 6f 72 20 72  nitializing or r
16e40 65 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 6e  einitializing an
16e50 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  .** incremental 
16e60 63 68 65 63 6b 70 6f 69 6e 74 2e 20 0a 2a 2a 0a  checkpoint. .**.
16e70 2a 2a 20 49 74 20 70 6f 70 75 6c 61 74 65 73 20  ** It populates 
16e80 74 68 65 20 73 71 6c 69 74 65 33 72 62 75 2e 61  the sqlite3rbu.a
16e90 46 72 61 6d 65 5b 5d 20 61 72 72 61 79 20 77 69  Frame[] array wi
16ea0 74 68 20 74 68 65 20 73 65 74 20 6f 66 20 0a 2a  th the set of .*
16eb0 2a 20 28 77 61 6c 20 66 72 61 6d 65 20 2d 3e 20  * (wal frame -> 
16ec0 64 62 20 70 61 67 65 29 20 63 6f 70 79 20 6f 70  db page) copy op
16ed0 65 72 61 74 69 6f 6e 73 20 72 65 71 75 69 72 65  erations require
16ee0 64 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20  d to checkpoint 
16ef0 74 68 65 20 0a 2a 2a 20 63 75 72 72 65 6e 74 20  the .** current 
16f00 77 61 6c 20 66 69 6c 65 2c 20 61 6e 64 20 6f 62  wal file, and ob
16f10 74 61 69 6e 73 20 74 68 65 20 73 65 74 20 6f 66  tains the set of
16f20 20 73 68 6d 20 6c 6f 63 6b 73 20 72 65 71 75 69   shm locks requi
16f30 72 65 64 20 74 6f 20 73 61 66 65 6c 79 20 0a 2a  red to safely .*
16f40 2a 20 70 65 72 66 6f 72 6d 20 74 68 65 20 63 6f  * perform the co
16f50 70 79 20 6f 70 65 72 61 74 69 6f 6e 73 20 64 69  py operations di
16f60 72 65 63 74 6c 79 20 6f 6e 20 74 68 65 20 66 69  rectly on the fi
16f70 6c 65 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a  le-system..**.**
16f80 20 49 66 20 61 72 67 75 6d 65 6e 74 20 70 53 74   If argument pSt
16f90 61 74 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  ate is not NULL,
16fa0 20 74 68 65 6e 20 74 68 65 20 69 6e 63 72 65 6d   then the increm
16fb0 65 6e 74 61 6c 20 63 68 65 63 6b 70 6f 69 6e 74  ental checkpoint
16fc0 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20 72 65 73   is.** being res
16fd0 75 6d 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  umed. In this ca
16fe0 73 65 2c 20 69 66 20 74 68 65 20 63 68 65 63 6b  se, if the check
16ff0 73 75 6d 20 6f 66 20 74 68 65 20 77 61 6c 2d 69  sum of the wal-i
17000 6e 64 65 78 2d 68 65 61 64 65 72 0a 2a 2a 20 66  ndex-header.** f
17010 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65 72  ollowing recover
17020 79 20 69 73 20 6e 6f 74 20 74 68 65 20 73 61 6d  y is not the sam
17030 65 20 61 73 20 74 68 65 20 63 68 65 63 6b 73 75  e as the checksu
17040 6d 20 73 61 76 65 64 20 69 6e 20 74 68 65 20 52  m saved in the R
17050 62 75 53 74 61 74 65 0a 2a 2a 20 6f 62 6a 65 63  buState.** objec
17060 74 2c 20 74 68 65 6e 20 74 68 65 20 72 62 75 20  t, then the rbu 
17070 68 61 6e 64 6c 65 20 69 73 20 73 65 74 20 74 6f  handle is set to
17080 20 44 4f 4e 45 20 73 74 61 74 65 2e 20 54 68 69   DONE state. Thi
17090 73 20 6f 63 63 75 72 73 20 69 66 20 73 6f 6d 65  s occurs if some
170a0 0a 2a 2a 20 6f 74 68 65 72 20 63 6c 69 65 6e 74  .** other client
170b0 20 61 70 70 65 6e 64 73 20 61 20 74 72 61 6e 73   appends a trans
170c0 61 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 77 61  action to the wa
170d0 6c 20 66 69 6c 65 20 69 6e 20 74 68 65 20 6d 69  l file in the mi
170e0 64 64 6c 65 20 6f 66 0a 2a 2a 20 61 6e 20 69 6e  ddle of.** an in
170f0 63 72 65 6d 65 6e 74 61 6c 20 63 68 65 63 6b 70  cremental checkp
17100 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oint..*/.static 
17110 76 6f 69 64 20 72 62 75 53 65 74 75 70 43 68 65  void rbuSetupChe
17120 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 72  ckpoint(sqlite3r
17130 62 75 20 2a 70 2c 20 52 62 75 53 74 61 74 65 20  bu *p, RbuState 
17140 2a 70 53 74 61 74 65 29 7b 0a 0a 20 20 2f 2a 20  *pState){..  /* 
17150 49 66 20 70 53 74 61 74 65 20 69 73 20 4e 55 4c  If pState is NUL
17160 4c 2c 20 74 68 65 6e 20 74 68 65 20 77 61 6c 20  L, then the wal 
17170 66 69 6c 65 20 6d 61 79 20 6e 6f 74 20 68 61 76  file may not hav
17180 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 61 6e  e been opened an
17190 64 0a 20 20 2a 2a 20 72 65 63 6f 76 65 72 65 64  d.  ** recovered
171a0 2e 20 52 75 6e 6e 69 6e 67 20 61 20 72 65 61 64  . Running a read
171b0 2d 73 74 61 74 65 6d 65 6e 74 20 68 65 72 65 20  -statement here 
171c0 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 64  to ensure that d
171d0 6f 69 6e 67 20 73 6f 0a 20 20 2a 2a 20 64 6f 65  oing so.  ** doe
171e0 73 20 6e 6f 74 20 69 6e 74 65 72 66 65 72 65 20  s not interfere 
171f0 77 69 74 68 20 74 68 65 20 22 63 61 70 74 75 72  with the "captur
17200 65 22 20 70 72 6f 63 65 73 73 20 62 65 6c 6f 77  e" process below
17210 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 74 61  .  */.  if( pSta
17220 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  te==0 ){.    p->
17230 65 53 74 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  eStage = 0;.    
17240 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
17250 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
17260 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78  >rc = sqlite3_ex
17270 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 53  ec(p->dbMain, "S
17280 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c  ELECT * FROM sql
17290 69 74 65 5f 6d 61 73 74 65 72 22 2c 20 30 2c 20  ite_master", 0, 
172a0 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 0);.    }.  }
172b0 0a 0a 20 20 2f 2a 20 41 73 73 75 6d 69 6e 67 20  ..  /* Assuming 
172c0 6e 6f 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  no error has occ
172d0 75 72 72 65 64 2c 20 72 75 6e 20 61 20 22 72 65  urred, run a "re
172e0 73 74 61 72 74 22 20 63 68 65 63 6b 70 6f 69 6e  start" checkpoin
172f0 74 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20  t with the.  ** 
17300 73 71 6c 69 74 65 33 72 62 75 2e 65 53 74 61 67  sqlite3rbu.eStag
17310 65 20 76 61 72 69 61 62 6c 65 20 73 65 74 20 74  e variable set t
17320 6f 20 43 41 50 54 55 52 45 2e 20 54 68 69 73 20  o CAPTURE. This 
17330 74 75 72 6e 73 20 6f 6e 20 74 68 65 20 66 6f 6c  turns on the fol
17340 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 73 70 65 63  lowing.  ** spec
17350 69 61 6c 20 62 65 68 61 76 69 6f 75 72 20 69 6e  ial behaviour in
17360 20 74 68 65 20 72 62 75 20 56 46 53 3a 0a 20 20   the rbu VFS:.  
17370 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 49 66 20 74  **.  **   * If t
17380 68 65 20 65 78 63 6c 75 73 69 76 65 20 73 68 6d  he exclusive shm
17390 20 57 52 49 54 45 52 20 6f 72 20 52 45 41 44 30   WRITER or READ0
173a0 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20   lock cannot be 
173b0 6f 62 74 61 69 6e 65 64 2c 0a 20 20 2a 2a 20 20  obtained,.  **  
173c0 20 20 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e     the checkpoin
173d0 74 20 66 61 69 6c 73 20 77 69 74 68 20 53 51 4c  t fails with SQL
173e0 49 54 45 5f 42 55 53 59 20 28 6e 6f 72 6d 61 6c  ITE_BUSY (normal
173f0 6c 79 20 53 51 4c 69 74 65 20 77 6f 75 6c 64 0a  ly SQLite would.
17400 20 20 2a 2a 20 20 20 20 20 70 72 6f 63 65 65 64    **     proceed
17410 20 77 69 74 68 20 72 75 6e 6e 69 6e 67 20 61 20   with running a 
17420 70 61 73 73 69 76 65 20 63 68 65 63 6b 70 6f 69  passive checkpoi
17430 6e 74 20 69 6e 73 74 65 61 64 20 6f 66 20 66 61  nt instead of fa
17440 69 6c 69 6e 67 29 2e 0a 20 20 2a 2a 0a 20 20 2a  iling)..  **.  *
17450 2a 20 20 20 2a 20 41 74 74 65 6d 70 74 73 20 74  *   * Attempts t
17460 6f 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  o read from the 
17470 2a 2d 77 61 6c 20 66 69 6c 65 20 6f 72 20 77 72  *-wal file or wr
17480 69 74 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  ite to the datab
17490 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 20 20  ase file.  **   
174a0 20 20 64 6f 20 6e 6f 74 20 70 65 72 66 6f 72 6d    do not perform
174b0 20 61 6e 79 20 49 4f 2e 20 49 6e 73 74 65 61 64   any IO. Instead
174c0 2c 20 74 68 65 20 66 72 61 6d 65 2f 70 61 67 65  , the frame/page
174d0 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 74 68   combinations th
174e0 61 74 0a 20 20 2a 2a 20 20 20 20 20 77 6f 75 6c  at.  **     woul
174f0 64 20 62 65 20 72 65 61 64 2f 77 72 69 74 74 65  d be read/writte
17500 6e 20 61 72 65 20 72 65 63 6f 72 64 65 64 20 69  n are recorded i
17510 6e 20 74 68 65 20 73 71 6c 69 74 65 33 72 62 75  n the sqlite3rbu
17520 2e 61 46 72 61 6d 65 5b 5d 0a 20 20 2a 2a 20 20  .aFrame[].  **  
17530 20 20 20 61 72 72 61 79 2e 0a 20 20 2a 2a 0a 20     array..  **. 
17540 20 2a 2a 20 20 20 2a 20 43 61 6c 6c 73 20 74 6f   **   * Calls to
17550 20 78 53 68 6d 4c 6f 63 6b 28 55 4e 4c 4f 43 4b   xShmLock(UNLOCK
17560 29 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  ) to release the
17570 20 65 78 63 6c 75 73 69 76 65 20 73 68 6d 20 57   exclusive shm W
17580 52 49 54 45 52 2c 20 0a 20 20 2a 2a 20 20 20 20  RITER, .  **    
17590 20 52 45 41 44 30 20 61 6e 64 20 43 48 45 43 4b   READ0 and CHECK
175a0 50 4f 49 4e 54 20 6c 6f 63 6b 73 20 74 61 6b 65  POINT locks take
175b0 6e 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  n as part of the
175c0 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 72 65 0a   checkpoint are.
175d0 20 20 2a 2a 20 20 20 20 20 6e 6f 2d 6f 70 73 2e    **     no-ops.
175e0 20 54 68 65 73 65 20 6c 6f 63 6b 73 20 77 69 6c   These locks wil
175f0 6c 20 6e 6f 74 20 62 65 20 72 65 6c 65 61 73 65  l not be release
17600 64 20 75 6e 74 69 6c 20 74 68 65 20 63 6f 6e 6e  d until the conn
17610 65 63 74 69 6f 6e 0a 20 20 2a 2a 20 20 20 20 20  ection.  **     
17620 69 73 20 63 6c 6f 73 65 64 2e 0a 20 20 2a 2a 0a  is closed..  **.
17630 20 20 2a 2a 20 20 20 2a 20 41 74 74 65 6d 70 74    **   * Attempt
17640 69 6e 67 20 74 6f 20 78 53 79 6e 63 28 29 20 74  ing to xSync() t
17650 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
17660 20 63 61 75 73 65 73 20 61 6e 20 53 51 4c 49 54   causes an SQLIT
17670 45 5f 49 4e 54 45 52 4e 41 4c 20 0a 20 20 2a 2a  E_INTERNAL .  **
17680 20 20 20 20 20 65 72 72 6f 72 2e 0a 20 20 2a 2a       error..  **
17690 0a 20 20 2a 2a 20 41 73 20 61 20 72 65 73 75 6c  .  ** As a resul
176a0 74 2c 20 75 6e 6c 65 73 73 20 61 6e 20 65 72 72  t, unless an err
176b0 6f 72 20 28 69 2e 65 2e 20 4f 4f 4d 20 6f 72 20  or (i.e. OOM or 
176c0 53 51 4c 49 54 45 5f 42 55 53 59 29 20 6f 63 63  SQLITE_BUSY) occ
176d0 75 72 73 2c 20 74 68 65 0a 20 20 2a 2a 20 63 68  urs, the.  ** ch
176e0 65 63 6b 70 6f 69 6e 74 20 62 65 6c 6f 77 20 66  eckpoint below f
176f0 61 69 6c 73 20 77 69 74 68 20 53 51 4c 49 54 45  ails with SQLITE
17700 5f 49 4e 54 45 52 4e 41 4c 2c 20 61 6e 64 20 6c  _INTERNAL, and l
17710 65 61 76 65 73 20 74 68 65 20 61 46 72 61 6d 65  eaves the aFrame
17720 5b 5d 0a 20 20 2a 2a 20 61 72 72 61 79 20 70 6f  [].  ** array po
17730 70 75 6c 61 74 65 64 20 77 69 74 68 20 61 20 73  pulated with a s
17740 65 74 20 6f 66 20 28 66 72 61 6d 65 20 2d 3e 20  et of (frame -> 
17750 70 61 67 65 29 20 6d 61 70 70 69 6e 67 73 2e 20  page) mappings. 
17760 42 65 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a  Because the .  *
17770 2a 20 57 52 49 54 45 52 2c 20 43 48 45 43 4b 50  * WRITER, CHECKP
17780 4f 49 4e 54 20 61 6e 64 20 52 45 41 44 30 20 6c  OINT and READ0 l
17790 6f 63 6b 73 20 61 72 65 20 73 74 69 6c 6c 20 68  ocks are still h
177a0 65 6c 64 2c 20 69 74 20 69 73 20 73 61 66 65 20  eld, it is safe 
177b0 74 6f 20 63 6f 70 79 20 0a 20 20 2a 2a 20 64 61  to copy .  ** da
177c0 74 61 20 66 72 6f 6d 20 74 68 65 20 77 61 6c 20  ta from the wal 
177d0 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 20 64 61  file into the da
177e0 74 61 62 61 73 65 20 66 69 6c 65 20 61 63 63 6f  tabase file acco
177f0 72 64 69 6e 67 20 74 6f 20 74 68 65 20 0a 20 20  rding to the .  
17800 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  ** contents of a
17810 46 72 61 6d 65 5b 5d 2e 0a 20 20 2a 2f 0a 20 20  Frame[]..  */.  
17820 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
17830 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
17840 72 63 32 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61  rc2;.    p->eSta
17850 67 65 20 3d 20 52 42 55 5f 53 54 41 47 45 5f 43  ge = RBU_STAGE_C
17860 41 50 54 55 52 45 3b 0a 20 20 20 20 72 63 32 20  APTURE;.    rc2 
17870 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  = sqlite3_exec(p
17880 2d 3e 64 62 4d 61 69 6e 2c 20 22 50 52 41 47 4d  ->dbMain, "PRAGM
17890 41 20 6d 61 69 6e 2e 77 61 6c 5f 63 68 65 63 6b  A main.wal_check
178a0 70 6f 69 6e 74 3d 72 65 73 74 61 72 74 22 2c 20  point=restart", 
178b0 30 2c 20 30 2c 30 29 3b 0a 20 20 20 20 69 66 28  0, 0,0);.    if(
178c0 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 49 4e 54   rc2!=SQLITE_INT
178d0 45 52 4e 41 4c 20 29 20 70 2d 3e 72 63 20 3d 20  ERNAL ) p->rc = 
178e0 72 63 32 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  rc2;.  }..  if( 
178f0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
17900 20 26 26 20 70 2d 3e 6e 46 72 61 6d 65 3e 30 20   && p->nFrame>0 
17910 29 7b 0a 20 20 20 20 70 2d 3e 65 53 74 61 67 65  ){.    p->eStage
17920 20 3d 20 52 42 55 5f 53 54 41 47 45 5f 43 4b 50   = RBU_STAGE_CKP
17930 54 3b 0a 20 20 20 20 70 2d 3e 6e 53 74 65 70 20  T;.    p->nStep 
17940 3d 20 28 70 53 74 61 74 65 20 3f 20 70 53 74 61  = (pState ? pSta
17950 74 65 2d 3e 6e 52 6f 77 20 3a 20 30 29 3b 0a 20  te->nRow : 0);. 
17960 20 20 20 70 2d 3e 61 42 75 66 20 3d 20 72 62 75     p->aBuf = rbu
17970 4d 61 6c 6c 6f 63 28 70 2c 20 70 2d 3e 70 67 73  Malloc(p, p->pgs
17980 7a 29 3b 0a 20 20 20 20 70 2d 3e 69 57 61 6c 43  z);.    p->iWalC
17990 6b 73 75 6d 20 3d 20 72 62 75 53 68 6d 43 68 65  ksum = rbuShmChe
179a0 63 6b 73 75 6d 28 70 29 3b 0a 20 20 7d 0a 0a 20  cksum(p);.  }.. 
179b0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
179c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
179d0 20 70 2d 3e 6e 46 72 61 6d 65 3d 3d 30 20 7c 7c   p->nFrame==0 ||
179e0 20 28 70 53 74 61 74 65 20 26 26 20 70 53 74 61   (pState && pSta
179f0 74 65 2d 3e 69 57 61 6c 43 6b 73 75 6d 21 3d 70  te->iWalCksum!=p
17a00 2d 3e 69 57 61 6c 43 6b 73 75 6d 29 20 29 7b 0a  ->iWalCksum) ){.
17a10 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
17a20 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20  LITE_DONE;.     
17a30 20 70 2d 3e 65 53 74 61 67 65 20 3d 20 52 42 55   p->eStage = RBU
17a40 5f 53 54 41 47 45 5f 44 4f 4e 45 3b 0a 20 20 20  _STAGE_DONE;.   
17a50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
17a60 74 20 6e 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20  t nSectorSize;. 
17a70 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c       sqlite3_fil
17a80 65 20 2a 70 44 62 20 3d 20 70 2d 3e 70 54 61 72  e *pDb = p->pTar
17a90 67 65 74 46 64 2d 3e 70 52 65 61 6c 3b 0a 20 20  getFd->pReal;.  
17aa0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
17ab0 20 2a 70 57 61 6c 20 3d 20 70 2d 3e 70 54 61 72   *pWal = p->pTar
17ac0 67 65 74 46 64 2d 3e 70 57 61 6c 46 64 2d 3e 70  getFd->pWalFd->p
17ad0 52 65 61 6c 3b 0a 20 20 20 20 20 20 61 73 73 65  Real;.      asse
17ae0 72 74 28 20 70 2d 3e 6e 50 61 67 65 50 65 72 53  rt( p->nPagePerS
17af0 65 63 74 6f 72 3d 3d 30 20 29 3b 0a 20 20 20 20  ector==0 );.    
17b00 20 20 6e 53 65 63 74 6f 72 53 69 7a 65 20 3d 20    nSectorSize = 
17b10 70 44 62 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  pDb->pMethods->x
17b20 53 65 63 74 6f 72 53 69 7a 65 28 70 44 62 29 3b  SectorSize(pDb);
17b30 0a 20 20 20 20 20 20 69 66 28 20 6e 53 65 63 74  .      if( nSect
17b40 6f 72 53 69 7a 65 3e 70 2d 3e 70 67 73 7a 20 29  orSize>p->pgsz )
17b50 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 50 61  {.        p->nPa
17b60 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20 6e 53  gePerSector = nS
17b70 65 63 74 6f 72 53 69 7a 65 20 2f 20 70 2d 3e 70  ectorSize / p->p
17b80 67 73 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  gsz;.      }else
17b90 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 50 61  {.        p->nPa
17ba0 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20 31 3b  gePerSector = 1;
17bb0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
17bc0 2f 2a 20 43 61 6c 6c 20 78 53 79 6e 63 28 29 20  /* Call xSync() 
17bd0 6f 6e 20 74 68 65 20 77 61 6c 20 66 69 6c 65 2e  on the wal file.
17be0 20 54 68 69 73 20 63 61 75 73 65 73 20 53 51 4c   This causes SQL
17bf0 69 74 65 20 74 6f 20 73 79 6e 63 20 74 68 65 20  ite to sync the 
17c00 0a 20 20 20 20 20 20 2a 2a 20 64 69 72 65 63 74  .      ** direct
17c10 6f 72 79 20 69 6e 20 77 68 69 63 68 20 74 68 65  ory in which the
17c20 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65   target database
17c30 20 61 6e 64 20 74 68 65 20 77 61 6c 20 66 69 6c   and the wal fil
17c40 65 20 72 65 73 69 64 65 2c 20 69 6e 20 0a 20 20  e reside, in .  
17c50 20 20 20 20 2a 2a 20 63 61 73 65 20 69 74 20 68      ** case it h
17c60 61 73 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63  as not been sync
17c70 65 64 20 73 69 6e 63 65 20 74 68 65 20 72 65 6e  ed since the ren
17c80 61 6d 65 28 29 20 63 61 6c 6c 20 69 6e 20 0a 20  ame() call in . 
17c90 20 20 20 20 20 2a 2a 20 72 62 75 4d 6f 76 65 4f       ** rbuMoveO
17ca0 61 6c 46 69 6c 65 28 29 2e 20 2a 2f 0a 20 20 20  alFile(). */.   
17cb0 20 20 20 70 2d 3e 72 63 20 3d 20 70 57 61 6c 2d     p->rc = pWal-
17cc0 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 79 6e 63  >pMethods->xSync
17cd0 28 70 57 61 6c 2c 20 53 51 4c 49 54 45 5f 53 59  (pWal, SQLITE_SY
17ce0 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 20 20  NC_NORMAL);.    
17cf0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  }.  }.}../*.** C
17d00 61 6c 6c 65 64 20 77 68 65 6e 20 69 41 6d 74 20  alled when iAmt 
17d10 62 79 74 65 73 20 61 72 65 20 72 65 61 64 20 66  bytes are read f
17d20 72 6f 6d 20 6f 66 66 73 65 74 20 69 4f 66 66 20  rom offset iOff 
17d30 6f 66 20 74 68 65 20 77 61 6c 20 66 69 6c 65 20  of the wal file 
17d40 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 72 62 75  while.** the rbu
17d50 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 20 63 61   object is in ca
17d60 70 74 75 72 65 20 6d 6f 64 65 2e 20 52 65 63 6f  pture mode. Reco
17d70 72 64 20 74 68 65 20 66 72 61 6d 65 20 6e 75 6d  rd the frame num
17d80 62 65 72 20 6f 66 20 74 68 65 20 66 72 61 6d 65  ber of the frame
17d90 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20 69  .** being read i
17da0 6e 20 74 68 65 20 61 46 72 61 6d 65 5b 5d 20 61  n the aFrame[] a
17db0 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rray..*/.static 
17dc0 69 6e 74 20 72 62 75 43 61 70 74 75 72 65 57 61  int rbuCaptureWa
17dd0 6c 52 65 61 64 28 73 71 6c 69 74 65 33 72 62 75  lRead(sqlite3rbu
17de0 20 2a 70 52 62 75 2c 20 69 36 34 20 69 4f 66 66   *pRbu, i64 iOff
17df0 2c 20 69 6e 74 20 69 41 6d 74 29 7b 0a 20 20 63  , int iAmt){.  c
17e00 6f 6e 73 74 20 75 33 32 20 6d 52 65 71 20 3d 20  onst u32 mReq = 
17e10 28 31 3c 3c 57 41 4c 5f 4c 4f 43 4b 5f 57 52 49  (1<<WAL_LOCK_WRI
17e20 54 45 29 7c 28 31 3c 3c 57 41 4c 5f 4c 4f 43 4b  TE)|(1<<WAL_LOCK
17e30 5f 43 4b 50 54 29 7c 28 31 3c 3c 57 41 4c 5f 4c  _CKPT)|(1<<WAL_L
17e40 4f 43 4b 5f 52 45 41 44 30 29 3b 0a 20 20 75 33  OCK_READ0);.  u3
17e50 32 20 69 46 72 61 6d 65 3b 0a 0a 20 20 69 66 28  2 iFrame;..  if(
17e60 20 70 52 62 75 2d 3e 6d 4c 6f 63 6b 21 3d 6d 52   pRbu->mLock!=mR
17e70 65 71 20 29 7b 0a 20 20 20 20 70 52 62 75 2d 3e  eq ){.    pRbu->
17e80 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
17e90 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
17ea0 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20  ITE_INTERNAL;.  
17eb0 7d 0a 0a 20 20 70 52 62 75 2d 3e 70 67 73 7a 20  }..  pRbu->pgsz 
17ec0 3d 20 69 41 6d 74 3b 0a 20 20 69 66 28 20 70 52  = iAmt;.  if( pR
17ed0 62 75 2d 3e 6e 46 72 61 6d 65 3d 3d 70 52 62 75  bu->nFrame==pRbu
17ee0 2d 3e 6e 46 72 61 6d 65 41 6c 6c 6f 63 20 29 7b  ->nFrameAlloc ){
17ef0 0a 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20  .    int nNew = 
17f00 28 70 52 62 75 2d 3e 6e 46 72 61 6d 65 41 6c 6c  (pRbu->nFrameAll
17f10 6f 63 20 3f 20 70 52 62 75 2d 3e 6e 46 72 61 6d  oc ? pRbu->nFram
17f20 65 41 6c 6c 6f 63 20 3a 20 36 34 29 20 2a 20 32  eAlloc : 64) * 2
17f30 3b 0a 20 20 20 20 52 62 75 46 72 61 6d 65 20 2a  ;.    RbuFrame *
17f40 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d  aNew;.    aNew =
17f50 20 28 52 62 75 46 72 61 6d 65 2a 29 73 71 6c 69   (RbuFrame*)sqli
17f60 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 52  te3_realloc64(pR
17f70 62 75 2d 3e 61 46 72 61 6d 65 2c 20 6e 4e 65 77  bu->aFrame, nNew
17f80 20 2a 20 73 69 7a 65 6f 66 28 52 62 75 46 72 61   * sizeof(RbuFra
17f90 6d 65 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e  me));.    if( aN
17fa0 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ew==0 ) return S
17fb0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
17fc0 20 70 52 62 75 2d 3e 61 46 72 61 6d 65 20 3d 20   pRbu->aFrame = 
17fd0 61 4e 65 77 3b 0a 20 20 20 20 70 52 62 75 2d 3e  aNew;.    pRbu->
17fe0 6e 46 72 61 6d 65 41 6c 6c 6f 63 20 3d 20 6e 4e  nFrameAlloc = nN
17ff0 65 77 3b 0a 20 20 7d 0a 0a 20 20 69 46 72 61 6d  ew;.  }..  iFram
18000 65 20 3d 20 28 75 33 32 29 28 28 69 4f 66 66 2d  e = (u32)((iOff-
18010 33 32 29 20 2f 20 28 69 36 34 29 28 69 41 6d 74  32) / (i64)(iAmt
18020 2b 32 34 29 29 20 2b 20 31 3b 0a 20 20 69 66 28  +24)) + 1;.  if(
18030 20 70 52 62 75 2d 3e 69 4d 61 78 46 72 61 6d 65   pRbu->iMaxFrame
18040 3c 69 46 72 61 6d 65 20 29 20 70 52 62 75 2d 3e  <iFrame ) pRbu->
18050 69 4d 61 78 46 72 61 6d 65 20 3d 20 69 46 72 61  iMaxFrame = iFra
18060 6d 65 3b 0a 20 20 70 52 62 75 2d 3e 61 46 72 61  me;.  pRbu->aFra
18070 6d 65 5b 70 52 62 75 2d 3e 6e 46 72 61 6d 65 5d  me[pRbu->nFrame]
18080 2e 69 57 61 6c 46 72 61 6d 65 20 3d 20 69 46 72  .iWalFrame = iFr
18090 61 6d 65 3b 0a 20 20 70 52 62 75 2d 3e 61 46 72  ame;.  pRbu->aFr
180a0 61 6d 65 5b 70 52 62 75 2d 3e 6e 46 72 61 6d 65  ame[pRbu->nFrame
180b0 5d 2e 69 44 62 50 61 67 65 20 3d 20 30 3b 0a 20  ].iDbPage = 0;. 
180c0 20 70 52 62 75 2d 3e 6e 46 72 61 6d 65 2b 2b 3b   pRbu->nFrame++;
180d0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
180e0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61  _OK;.}../*.** Ca
180f0 6c 6c 65 64 20 77 68 65 6e 20 61 20 70 61 67 65  lled when a page
18100 20 6f 66 20 64 61 74 61 20 69 73 20 77 72 69 74   of data is writ
18110 74 65 6e 20 74 6f 20 6f 66 66 73 65 74 20 69 4f  ten to offset iO
18120 66 66 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ff of the databa
18130 73 65 0a 2a 2a 20 66 69 6c 65 20 77 68 69 6c 65  se.** file while
18140 20 74 68 65 20 72 62 75 20 68 61 6e 64 6c 65 20   the rbu handle 
18150 69 73 20 69 6e 20 63 61 70 74 75 72 65 20 6d 6f  is in capture mo
18160 64 65 2e 20 52 65 63 6f 72 64 20 74 68 65 20 70  de. Record the p
18170 61 67 65 20 6e 75 6d 62 65 72 20 0a 2a 2a 20 6f  age number .** o
18180 66 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67  f the page being
18190 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65 20   written in the 
181a0 61 46 72 61 6d 65 5b 5d 20 61 72 72 61 79 2e 0a  aFrame[] array..
181b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62  */.static int rb
181c0 75 43 61 70 74 75 72 65 44 62 57 72 69 74 65 28  uCaptureDbWrite(
181d0 73 71 6c 69 74 65 33 72 62 75 20 2a 70 52 62 75  sqlite3rbu *pRbu
181e0 2c 20 69 36 34 20 69 4f 66 66 29 7b 0a 20 20 70  , i64 iOff){.  p
181f0 52 62 75 2d 3e 61 46 72 61 6d 65 5b 70 52 62 75  Rbu->aFrame[pRbu
18200 2d 3e 6e 46 72 61 6d 65 2d 31 5d 2e 69 44 62 50  ->nFrame-1].iDbP
18210 61 67 65 20 3d 20 28 75 33 32 29 28 69 4f 66 66  age = (u32)(iOff
18220 20 2f 20 70 52 62 75 2d 3e 70 67 73 7a 29 20 2b   / pRbu->pgsz) +
18230 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   1;.  return SQL
18240 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
18250 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   This is called 
18260 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 69 6e  as part of an in
18270 63 72 65 6d 65 6e 74 61 6c 20 63 68 65 63 6b 70  cremental checkp
18280 6f 69 6e 74 20 6f 70 65 72 61 74 69 6f 6e 2e 20  oint operation. 
18290 43 6f 70 79 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  Copy.** a single
182a0 20 66 72 61 6d 65 20 6f 66 20 64 61 74 61 20 66   frame of data f
182b0 72 6f 6d 20 74 68 65 20 77 61 6c 20 66 69 6c 65  rom the wal file
182c0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
182d0 73 65 20 66 69 6c 65 2c 20 61 73 0a 2a 2a 20 69  se file, as.** i
182e0 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20  ndicated by the 
182f0 52 62 75 46 72 61 6d 65 20 6f 62 6a 65 63 74 2e  RbuFrame object.
18300 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
18310 72 62 75 43 68 65 63 6b 70 6f 69 6e 74 46 72 61  rbuCheckpointFra
18320 6d 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  me(sqlite3rbu *p
18330 2c 20 52 62 75 46 72 61 6d 65 20 2a 70 46 72 61  , RbuFrame *pFra
18340 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66  me){.  sqlite3_f
18350 69 6c 65 20 2a 70 57 61 6c 20 3d 20 70 2d 3e 70  ile *pWal = p->p
18360 54 61 72 67 65 74 46 64 2d 3e 70 57 61 6c 46 64  TargetFd->pWalFd
18370 2d 3e 70 52 65 61 6c 3b 0a 20 20 73 71 6c 69 74  ->pReal;.  sqlit
18380 65 33 5f 66 69 6c 65 20 2a 70 44 62 20 3d 20 70  e3_file *pDb = p
18390 2d 3e 70 54 61 72 67 65 74 46 64 2d 3e 70 52 65  ->pTargetFd->pRe
183a0 61 6c 3b 0a 20 20 69 36 34 20 69 4f 66 66 3b 0a  al;.  i64 iOff;.
183b0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
183c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
183d0 20 69 4f 66 66 20 3d 20 28 69 36 34 29 28 70 46   iOff = (i64)(pF
183e0 72 61 6d 65 2d 3e 69 57 61 6c 46 72 61 6d 65 2d  rame->iWalFrame-
183f0 31 29 20 2a 20 28 70 2d 3e 70 67 73 7a 20 2b 20  1) * (p->pgsz + 
18400 32 34 29 20 2b 20 33 32 20 2b 20 32 34 3b 0a 20  24) + 32 + 24;. 
18410 20 70 2d 3e 72 63 20 3d 20 70 57 61 6c 2d 3e 70   p->rc = pWal->p
18420 4d 65 74 68 6f 64 73 2d 3e 78 52 65 61 64 28 70  Methods->xRead(p
18430 57 61 6c 2c 20 70 2d 3e 61 42 75 66 2c 20 70 2d  Wal, p->aBuf, p-
18440 3e 70 67 73 7a 2c 20 69 4f 66 66 29 3b 0a 20 20  >pgsz, iOff);.  
18450 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75  if( p->rc ) retu
18460 72 6e 3b 0a 0a 20 20 69 4f 66 66 20 3d 20 28 69  rn;..  iOff = (i
18470 36 34 29 28 70 46 72 61 6d 65 2d 3e 69 44 62 50  64)(pFrame->iDbP
18480 61 67 65 2d 31 29 20 2a 20 70 2d 3e 70 67 73 7a  age-1) * p->pgsz
18490 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 70 44 62 2d  ;.  p->rc = pDb-
184a0 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 57 72 69 74  >pMethods->xWrit
184b0 65 28 70 44 62 2c 20 70 2d 3e 61 42 75 66 2c 20  e(pDb, p->aBuf, 
184c0 70 2d 3e 70 67 73 7a 2c 20 69 4f 66 66 29 3b 0a  p->pgsz, iOff);.
184d0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 61 6b 65 20 61  }.../*.** Take a
184e0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
184f0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
18500 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
18510 20 76 6f 69 64 20 72 62 75 4c 6f 63 6b 44 61 74   void rbuLockDat
18520 61 62 61 73 65 28 73 71 6c 69 74 65 33 72 62 75  abase(sqlite3rbu
18530 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f   *p){.  sqlite3_
18540 66 69 6c 65 20 2a 70 52 65 61 6c 20 3d 20 70 2d  file *pReal = p-
18550 3e 70 54 61 72 67 65 74 46 64 2d 3e 70 52 65 61  >pTargetFd->pRea
18560 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  l;.  assert( p->
18570 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
18580 0a 20 20 70 2d 3e 72 63 20 3d 20 70 52 65 61 6c  .  p->rc = pReal
18590 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 4c 6f 63  ->pMethods->xLoc
185a0 6b 28 70 52 65 61 6c 2c 20 53 51 4c 49 54 45 5f  k(pReal, SQLITE_
185b0 4c 4f 43 4b 5f 53 48 41 52 45 44 29 3b 0a 20 20  LOCK_SHARED);.  
185c0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
185d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72  E_OK ){.    p->r
185e0 63 20 3d 20 70 52 65 61 6c 2d 3e 70 4d 65 74 68  c = pReal->pMeth
185f0 6f 64 73 2d 3e 78 4c 6f 63 6b 28 70 52 65 61 6c  ods->xLock(pReal
18600 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 45 58  , SQLITE_LOCK_EX
18610 43 4c 55 53 49 56 45 29 3b 0a 20 20 7d 0a 7d 0a  CLUSIVE);.  }.}.
18620 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49  .#if defined(_WI
18630 4e 33 32 5f 57 43 45 29 0a 73 74 61 74 69 63 20  N32_WCE).static 
18640 4c 50 57 53 54 52 20 72 62 75 57 69 6e 55 74 66  LPWSTR rbuWinUtf
18650 38 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74  8ToUnicode(const
18660 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
18670 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a  ){.  int nChar;.
18680 20 20 4c 50 57 53 54 52 20 7a 57 69 64 65 46 69    LPWSTR zWideFi
18690 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e 43 68 61 72  lename;..  nChar
186a0 20 3d 20 4d 75 6c 74 69 42 79 74 65 54 6f 57 69   = MultiByteToWi
186b0 64 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20  deChar(CP_UTF8, 
186c0 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31  0, zFilename, -1
186d0 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 69 66  , NULL, 0);.  if
186e0 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20  ( nChar==0 ){.  
186f0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
18700 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 20    zWideFilename 
18710 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
18720 36 34 28 20 6e 43 68 61 72 2a 73 69 7a 65 6f 66  64( nChar*sizeof
18730 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 5b 30  (zWideFilename[0
18740 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 57 69 64  ]) );.  if( zWid
18750 65 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a  eFilename==0 ){.
18760 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
18770 7d 0a 20 20 6d 65 6d 73 65 74 28 7a 57 69 64 65  }.  memset(zWide
18780 46 69 6c 65 6e 61 6d 65 2c 20 30 2c 20 6e 43 68  Filename, 0, nCh
18790 61 72 2a 73 69 7a 65 6f 66 28 7a 57 69 64 65 46  ar*sizeof(zWideF
187a0 69 6c 65 6e 61 6d 65 5b 30 5d 29 29 3b 0a 20 20  ilename[0]));.  
187b0 6e 43 68 61 72 20 3d 20 4d 75 6c 74 69 42 79 74  nChar = MultiByt
187c0 65 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55  eToWideChar(CP_U
187d0 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d  TF8, 0, zFilenam
187e0 65 2c 20 2d 31 2c 20 7a 57 69 64 65 46 69 6c 65  e, -1, zWideFile
187f0 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
18800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18810 20 20 20 20 20 20 6e 43 68 61 72 29 3b 0a 20 20        nChar);.  
18820 69 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a  if( nChar==0 ){.
18830 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
18840 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 3b  (zWideFilename);
18850 0a 20 20 20 20 7a 57 69 64 65 46 69 6c 65 6e 61  .    zWideFilena
18860 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  me = 0;.  }.  re
18870 74 75 72 6e 20 7a 57 69 64 65 46 69 6c 65 6e 61  turn zWideFilena
18880 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  me;.}.#endif../*
18890 0a 2a 2a 20 54 68 65 20 52 42 55 20 68 61 6e 64  .** The RBU hand
188a0 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  le is currently 
188b0 69 6e 20 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c  in RBU_STAGE_OAL
188c0 20 73 74 61 74 65 2c 20 77 69 74 68 20 61 20 53   state, with a S
188d0 48 41 52 45 44 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e  HARED lock.** on
188e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
188f0 6c 65 2e 20 54 68 69 73 20 70 72 6f 63 20 6d 6f  le. This proc mo
18900 76 65 73 20 74 68 65 20 2a 2d 6f 61 6c 20 66 69  ves the *-oal fi
18910 6c 65 20 74 6f 20 74 68 65 20 2a 2d 77 61 6c 20  le to the *-wal 
18920 70 61 74 68 2c 0a 2a 2a 20 74 68 65 6e 20 72 65  path,.** then re
18930 6f 70 65 6e 73 20 74 68 65 20 64 61 74 61 62 61  opens the databa
18940 73 65 20 66 69 6c 65 20 28 74 68 69 73 20 74 69  se file (this ti
18950 6d 65 20 69 6e 20 76 61 6e 69 6c 6c 61 2c 20 6e  me in vanilla, n
18960 6f 6e 2d 6f 61 6c 2c 20 57 41 4c 20 6d 6f 64 65  on-oal, WAL mode
18970 29 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  )..** If an erro
18980 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20  r occurs, leave 
18990 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  an error code an
189a0 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  d error message 
189b0 69 6e 20 74 68 65 20 72 62 75 20 0a 2a 2a 20 68  in the rbu .** h
189c0 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
189d0 20 76 6f 69 64 20 72 62 75 4d 6f 76 65 4f 61 6c   void rbuMoveOal
189e0 46 69 6c 65 28 73 71 6c 69 74 65 33 72 62 75 20  File(sqlite3rbu 
189f0 2a 70 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *p){.  const cha
18a00 72 20 2a 7a 42 61 73 65 20 3d 20 73 71 6c 69 74  r *zBase = sqlit
18a10 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28 70  e3_db_filename(p
18a20 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22  ->dbMain, "main"
18a30 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  );.  const char 
18a40 2a 7a 4d 6f 76 65 20 3d 20 7a 42 61 73 65 3b 0a  *zMove = zBase;.
18a50 20 20 63 68 61 72 20 2a 7a 4f 61 6c 3b 0a 20 20    char *zOal;.  
18a60 63 68 61 72 20 2a 7a 57 61 6c 3b 0a 0a 20 20 69  char *zWal;..  i
18a70 66 28 20 72 62 75 49 73 56 61 63 75 75 6d 28 70  f( rbuIsVacuum(p
18a80 29 20 29 7b 0a 20 20 20 20 7a 4d 6f 76 65 20 3d  ) ){.    zMove =
18a90 20 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65   sqlite3_db_file
18aa0 6e 61 6d 65 28 70 2d 3e 64 62 52 62 75 2c 20 22  name(p->dbRbu, "
18ab0 6d 61 69 6e 22 29 3b 0a 20 20 7d 0a 20 20 7a 4f  main");.  }.  zO
18ac0 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  al = sqlite3_mpr
18ad0 69 6e 74 66 28 22 25 73 2d 6f 61 6c 22 2c 20 7a  intf("%s-oal", z
18ae0 4d 6f 76 65 29 3b 0a 20 20 7a 57 61 6c 20 3d 20  Move);.  zWal = 
18af0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
18b00 22 25 73 2d 77 61 6c 22 2c 20 7a 4d 6f 76 65 29  "%s-wal", zMove)
18b10 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
18b20 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47  eStage==RBU_STAG
18b30 45 5f 4d 4f 56 45 20 29 3b 0a 20 20 61 73 73 65  E_MOVE );.  asse
18b40 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
18b50 45 5f 4f 4b 20 26 26 20 70 2d 3e 7a 45 72 72 6d  E_OK && p->zErrm
18b60 73 67 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a  sg==0 );.  if( z
18b70 57 61 6c 3d 3d 30 20 7c 7c 20 7a 4f 61 6c 3d 3d  Wal==0 || zOal==
18b80 30 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  0 ){.    p->rc =
18b90 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
18ba0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d   }else{.    /* M
18bb0 6f 76 65 20 74 68 65 20 2a 2d 6f 61 6c 20 66 69  ove the *-oal fi
18bc0 6c 65 20 74 6f 20 2a 2d 77 61 6c 2e 20 41 74 20  le to *-wal. At 
18bd0 74 68 69 73 20 70 6f 69 6e 74 20 63 6f 6e 6e 65  this point conne
18be0 63 74 69 6f 6e 20 70 2d 3e 64 62 20 69 73 0a 20  ction p->db is. 
18bf0 20 20 20 2a 2a 20 68 6f 6c 64 69 6e 67 20 61 20     ** holding a 
18c00 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SHARED lock on t
18c10 68 65 20 74 61 72 67 65 74 20 64 61 74 61 62 61  he target databa
18c20 73 65 20 66 69 6c 65 20 28 62 65 63 61 75 73 65  se file (because
18c30 20 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 69 6e   it is.    ** in
18c40 20 57 41 4c 20 6d 6f 64 65 29 2e 20 53 6f 20 6e   WAL mode). So n
18c50 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  o other connecti
18c60 6f 6e 20 6d 61 79 20 62 65 20 77 72 69 74 69 6e  on may be writin
18c70 67 20 74 68 65 20 64 62 2e 20 0a 20 20 20 20 2a  g the db. .    *
18c80 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 6f 72 64 65  *.    ** In orde
18c90 72 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  r to ensure that
18ca0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64 61   there are no da
18cb0 74 61 62 61 73 65 20 72 65 61 64 65 72 73 2c 20  tabase readers, 
18cc0 61 6e 20 45 58 43 4c 55 53 49 56 45 0a 20 20 20  an EXCLUSIVE.   
18cd0 20 2a 2a 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61   ** lock is obta
18ce0 69 6e 65 64 20 68 65 72 65 20 62 65 66 6f 72 65  ined here before
18cf0 20 74 68 65 20 2a 2d 6f 61 6c 20 69 73 20 6d 6f   the *-oal is mo
18d00 76 65 64 20 74 6f 20 2a 2d 77 61 6c 2e 0a 20 20  ved to *-wal..  
18d10 20 20 2a 2f 0a 20 20 20 20 72 62 75 4c 6f 63 6b    */.    rbuLock
18d20 44 61 74 61 62 61 73 65 28 70 29 3b 0a 20 20 20  Database(p);.   
18d30 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
18d40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
18d50 62 75 46 69 6c 65 53 75 66 66 69 78 33 28 7a 42  buFileSuffix3(zB
18d60 61 73 65 2c 20 7a 57 61 6c 29 3b 0a 20 20 20 20  ase, zWal);.    
18d70 20 20 72 62 75 46 69 6c 65 53 75 66 66 69 78 33    rbuFileSuffix3
18d80 28 7a 42 61 73 65 2c 20 7a 4f 61 6c 29 3b 0a 0a  (zBase, zOal);..
18d90 20 20 20 20 20 20 2f 2a 20 52 65 2d 6f 70 65 6e        /* Re-open
18da0 20 74 68 65 20 64 61 74 61 62 61 73 65 73 2e 20   the databases. 
18db0 2a 2f 0a 20 20 20 20 20 20 72 62 75 4f 62 6a 49  */.      rbuObjI
18dc0 74 65 72 46 69 6e 61 6c 69 7a 65 28 26 70 2d 3e  terFinalize(&p->
18dd0 6f 62 6a 69 74 65 72 29 3b 0a 20 20 20 20 20 20  objiter);.      
18de0 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d  sqlite3_close(p-
18df0 3e 64 62 52 62 75 29 3b 0a 20 20 20 20 20 20 73  >dbRbu);.      s
18e00 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e  qlite3_close(p->
18e10 64 62 4d 61 69 6e 29 3b 0a 20 20 20 20 20 20 70  dbMain);.      p
18e20 2d 3e 64 62 4d 61 69 6e 20 3d 20 30 3b 0a 20 20  ->dbMain = 0;.  
18e30 20 20 20 20 70 2d 3e 64 62 52 62 75 20 3d 20 30      p->dbRbu = 0
18e40 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  ;..#if defined(_
18e50 57 49 4e 33 32 5f 57 43 45 29 0a 20 20 20 20 20  WIN32_WCE).     
18e60 20 7b 0a 20 20 20 20 20 20 20 20 4c 50 57 53 54   {.        LPWST
18e70 52 20 7a 57 69 64 65 4f 61 6c 3b 0a 20 20 20 20  R zWideOal;.    
18e80 20 20 20 20 4c 50 57 53 54 52 20 7a 57 69 64 65      LPWSTR zWide
18e90 57 61 6c 3b 0a 0a 20 20 20 20 20 20 20 20 7a 57  Wal;..        zW
18ea0 69 64 65 4f 61 6c 20 3d 20 72 62 75 57 69 6e 55  ideOal = rbuWinU
18eb0 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 4f 61  tf8ToUnicode(zOa
18ec0 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  l);.        if( 
18ed0 7a 57 69 64 65 4f 61 6c 20 29 7b 0a 20 20 20 20  zWideOal ){.    
18ee0 20 20 20 20 20 20 7a 57 69 64 65 57 61 6c 20 3d        zWideWal =
18ef0 20 72 62 75 57 69 6e 55 74 66 38 54 6f 55 6e 69   rbuWinUtf8ToUni
18f00 63 6f 64 65 28 7a 57 61 6c 29 3b 0a 20 20 20 20  code(zWal);.    
18f10 20 20 20 20 20 20 69 66 28 20 7a 57 69 64 65 57        if( zWideW
18f20 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  al ){.          
18f30 20 20 69 66 28 20 4d 6f 76 65 46 69 6c 65 57 28    if( MoveFileW(
18f40 7a 57 69 64 65 4f 61 6c 2c 20 7a 57 69 64 65 57  zWideOal, zWideW
18f50 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  al) ){.         
18f60 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c       p->rc = SQL
18f70 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
18f80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18f90 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
18fa0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
18fb0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
18fc0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
18fd0 5f 66 72 65 65 28 7a 57 69 64 65 57 61 6c 29 3b  _free(zWideWal);
18fe0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
18ff0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
19000 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45  >rc = SQLITE_IOE
19010 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  RR_NOMEM;.      
19020 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
19030 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69  sqlite3_free(zWi
19040 64 65 4f 61 6c 29 3b 0a 20 20 20 20 20 20 20 20  deOal);.        
19050 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
19060 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
19070 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
19080 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
19090 65 6c 73 65 0a 20 20 20 20 20 20 70 2d 3e 72 63  else.      p->rc
190a0 20 3d 20 72 65 6e 61 6d 65 28 7a 4f 61 6c 2c 20   = rename(zOal, 
190b0 7a 57 61 6c 29 20 3f 20 53 51 4c 49 54 45 5f 49  zWal) ? SQLITE_I
190c0 4f 45 52 52 20 3a 20 53 51 4c 49 54 45 5f 4f 4b  OERR : SQLITE_OK
190d0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  ;.#endif..      
190e0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
190f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
19100 72 62 75 4f 70 65 6e 44 61 74 61 62 61 73 65 28  rbuOpenDatabase(
19110 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72  p, 0);.        r
19120 62 75 53 65 74 75 70 43 68 65 63 6b 70 6f 69 6e  buSetupCheckpoin
19130 74 28 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  t(p, 0);.      }
19140 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71  .    }.  }..  sq
19150 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 61 6c 29  lite3_free(zWal)
19160 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
19170 28 7a 4f 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (zOal);.}../*.**
19180 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
19190 65 6d 65 6e 74 20 69 74 65 72 61 74 69 6e 67 20  ement iterating 
191a0 74 68 72 6f 75 67 68 20 74 68 65 20 6b 65 79 73  through the keys
191b0 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
191c0 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 70 2d 3e 6f   object.** (p->o
191d0 62 6a 69 74 65 72 2e 70 53 65 6c 65 63 74 29 20  bjiter.pSelect) 
191e0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
191f0 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 2e   to a valid row.
19200 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   This function.*
19210 2a 20 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65  * determines the
19220 20 74 79 70 65 20 6f 66 20 6f 70 65 72 61 74 69   type of operati
19230 6f 6e 20 72 65 71 75 65 73 74 65 64 20 62 79 20  on requested by 
19240 74 68 69 73 20 72 6f 77 20 61 6e 64 20 72 65 74  this row and ret
19250 75 72 6e 73 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74  urns.** one of t
19260 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c  he following val
19270 75 65 73 20 74 6f 20 69 6e 64 69 63 61 74 65 20  ues to indicate 
19280 74 68 65 20 72 65 73 75 6c 74 3a 0a 2a 2a 0a 2a  the result:.**.*
19290 2a 20 20 20 20 20 2a 20 52 42 55 5f 49 4e 53 45  *     * RBU_INSE
192a0 52 54 0a 2a 2a 20 20 20 20 20 2a 20 52 42 55 5f  RT.**     * RBU_
192b0 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20 2a 20  DELETE.**     * 
192c0 52 42 55 5f 49 44 58 5f 44 45 4c 45 54 45 0a 2a  RBU_IDX_DELETE.*
192d0 2a 20 20 20 20 20 2a 20 52 42 55 5f 55 50 44 41  *     * RBU_UPDA
192e0 54 45 0a 2a 2a 0a 2a 2a 20 49 66 20 52 42 55 5f  TE.**.** If RBU_
192f0 55 50 44 41 54 45 20 69 73 20 72 65 74 75 72 6e  UPDATE is return
19300 65 64 2c 20 74 68 65 6e 20 6f 75 74 70 75 74 20  ed, then output 
19310 76 61 72 69 61 62 6c 65 20 2a 70 7a 4d 61 73 6b  variable *pzMask
19320 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 70 6f   is set to.** po
19330 69 6e 74 20 74 6f 20 74 68 65 20 74 65 78 74 20  int to the text 
19340 76 61 6c 75 65 20 69 6e 64 69 63 61 74 69 6e 67  value indicating
19350 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20   the columns to 
19360 75 70 64 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  update..**.** If
19370 20 74 68 65 20 72 62 75 5f 63 6f 6e 74 72 6f 6c   the rbu_control
19380 20 66 69 65 6c 64 20 63 6f 6e 74 61 69 6e 73 20   field contains 
19390 61 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65  an invalid value
193a0 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
193b0 61 6e 64 0a 2a 2a 20 6d 65 73 73 61 67 65 20 61  and.** message a
193c0 72 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 52  re left in the R
193d0 42 55 20 68 61 6e 64 6c 65 20 61 6e 64 20 7a 65  BU handle and ze
193e0 72 6f 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  ro returned..*/.
193f0 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 53 74  static int rbuSt
19400 65 70 54 79 70 65 28 73 71 6c 69 74 65 33 72 62  epType(sqlite3rb
19410 75 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  u *p, const char
19420 20 2a 2a 70 7a 4d 61 73 6b 29 7b 0a 20 20 69 6e   **pzMask){.  in
19430 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6f 62 6a 69  t iCol = p->obji
19440 74 65 72 2e 6e 43 6f 6c 3b 20 20 20 20 20 2f 2a  ter.nCol;     /*
19450 20 49 6e 64 65 78 20 6f 66 20 72 62 75 5f 63 6f   Index of rbu_co
19460 6e 74 72 6f 6c 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  ntrol column */.
19470 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 20 20    int res = 0;  
19480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19490 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
194a0 65 20 2a 2f 0a 0a 20 20 73 77 69 74 63 68 28 20  e */..  switch( 
194b0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
194c0 79 70 65 28 70 2d 3e 6f 62 6a 69 74 65 72 2e 70  ype(p->objiter.p
194d0 53 65 6c 65 63 74 2c 20 69 43 6f 6c 29 20 29 7b  Select, iCol) ){
194e0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
194f0 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
19500 20 20 69 6e 74 20 69 56 61 6c 20 3d 20 73 71 6c    int iVal = sql
19510 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
19520 70 2d 3e 6f 62 6a 69 74 65 72 2e 70 53 65 6c 65  p->objiter.pSele
19530 63 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20  ct, iCol);.     
19540 20 73 77 69 74 63 68 28 20 69 56 61 6c 20 29 7b   switch( iVal ){
19550 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 30 3a  .        case 0:
19560 20 72 65 73 20 3d 20 52 42 55 5f 49 4e 53 45 52   res = RBU_INSER
19570 54 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  T;     break;.  
19580 20 20 20 20 20 20 63 61 73 65 20 31 3a 20 72 65        case 1: re
19590 73 20 3d 20 52 42 55 5f 44 45 4c 45 54 45 3b 20  s = RBU_DELETE; 
195a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
195b0 20 20 20 63 61 73 65 20 32 3a 20 72 65 73 20 3d     case 2: res =
195c0 20 52 42 55 5f 52 45 50 4c 41 43 45 3b 20 20 20   RBU_REPLACE;   
195d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
195e0 63 61 73 65 20 33 3a 20 72 65 73 20 3d 20 52 42  case 3: res = RB
195f0 55 5f 49 44 58 5f 44 45 4c 45 54 45 3b 20 62 72  U_IDX_DELETE; br
19600 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
19610 65 20 34 3a 20 72 65 73 20 3d 20 52 42 55 5f 49  e 4: res = RBU_I
19620 44 58 5f 49 4e 53 45 52 54 3b 20 62 72 65 61 6b  DX_INSERT; break
19630 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19640 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
19650 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
19660 58 54 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73  XT: {.      cons
19670 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
19680 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  *z = sqlite3_col
19690 75 6d 6e 5f 74 65 78 74 28 70 2d 3e 6f 62 6a 69  umn_text(p->obji
196a0 74 65 72 2e 70 53 65 6c 65 63 74 2c 20 69 43 6f  ter.pSelect, iCo
196b0 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 3d  l);.      if( z=
196c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  =0 ){.        p-
196d0 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
196e0 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EM;.      }else{
196f0 0a 20 20 20 20 20 20 20 20 2a 70 7a 4d 61 73 6b  .        *pzMask
19700 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
19710 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  z;.      }.     
19720 20 72 65 73 20 3d 20 52 42 55 5f 55 50 44 41 54   res = RBU_UPDAT
19730 45 3b 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  E;..      break;
19740 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 65 66 61  .    }..    defa
19750 75 6c 74 3a 0a 20 20 20 20 20 20 62 72 65 61 6b  ult:.      break
19760 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 65 73  ;.  }..  if( res
19770 3d 3d 30 20 29 7b 0a 20 20 20 20 72 62 75 42 61  ==0 ){.    rbuBa
19780 64 43 6f 6e 74 72 6f 6c 45 72 72 6f 72 28 70 29  dControlError(p)
19790 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
197a0 65 73 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  es;.}..#ifdef SQ
197b0 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
197c0 20 41 73 73 65 72 74 20 74 68 61 74 20 63 6f 6c   Assert that col
197d0 75 6d 6e 20 69 43 6f 6c 20 6f 66 20 73 74 61 74  umn iCol of stat
197e0 65 6d 65 6e 74 20 70 53 74 6d 74 20 69 73 20 6e  ement pStmt is n
197f0 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73  amed zName..*/.s
19800 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
19810 74 43 6f 6c 75 6d 6e 4e 61 6d 65 28 73 71 6c 69  tColumnName(sqli
19820 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 2c  te3_stmt *pStmt,
19830 20 69 6e 74 20 69 43 6f 6c 2c 20 63 6f 6e 73 74   int iCol, const
19840 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
19850 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
19860 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
19870 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69  mn_name(pStmt, i
19880 43 6f 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Col);.  assert( 
19890 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63  0==sqlite3_stric
198a0 6d 70 28 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 20  mp(zName, zCol) 
198b0 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
198c0 69 6e 65 20 61 73 73 65 72 74 43 6f 6c 75 6d 6e  ine assertColumn
198d0 4e 61 6d 65 28 78 2c 79 2c 7a 29 0a 23 65 6e 64  Name(x,y,z).#end
198e0 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  if../*.** Argume
198f0 6e 74 20 65 54 79 70 65 20 6d 75 73 74 20 62 65  nt eType must be
19900 20 6f 6e 65 20 6f 66 20 52 42 55 5f 49 4e 53 45   one of RBU_INSE
19910 52 54 2c 20 52 42 55 5f 44 45 4c 45 54 45 2c 20  RT, RBU_DELETE, 
19920 52 42 55 5f 49 44 58 5f 49 4e 53 45 52 54 20 6f  RBU_IDX_INSERT o
19930 72 0a 2a 2a 20 52 42 55 5f 49 44 58 5f 44 45 4c  r.** RBU_IDX_DEL
19940 45 54 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ETE. This functi
19950 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20  on performs the 
19960 77 6f 72 6b 20 6f 66 20 61 20 73 69 6e 67 6c 65  work of a single
19970 0a 2a 2a 20 73 71 6c 69 74 65 33 72 62 75 5f 73  .** sqlite3rbu_s
19980 74 65 70 28 29 20 63 61 6c 6c 20 66 6f 72 20 74  tep() call for t
19990 68 65 20 74 79 70 65 20 6f 66 20 6f 70 65 72 61  he type of opera
199a0 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20 62  tion specified b
199b0 79 20 65 54 79 70 65 2e 0a 2a 2f 0a 73 74 61 74  y eType..*/.stat
199c0 69 63 20 76 6f 69 64 20 72 62 75 53 74 65 70 4f  ic void rbuStepO
199d0 6e 65 4f 70 28 73 71 6c 69 74 65 33 72 62 75 20  neOp(sqlite3rbu 
199e0 2a 70 2c 20 69 6e 74 20 65 54 79 70 65 29 7b 0a  *p, int eType){.
199f0 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49    RbuObjIter *pI
19a00 74 65 72 20 3d 20 26 70 2d 3e 6f 62 6a 69 74 65  ter = &p->objite
19a10 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  r;.  sqlite3_val
19a20 75 65 20 2a 70 56 61 6c 3b 0a 20 20 73 71 6c 69  ue *pVal;.  sqli
19a30 74 65 33 5f 73 74 6d 74 20 2a 70 57 72 69 74 65  te3_stmt *pWrite
19a40 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61  r;.  int i;..  a
19a50 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
19a60 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73  LITE_OK );.  ass
19a70 65 72 74 28 20 65 54 79 70 65 21 3d 52 42 55 5f  ert( eType!=RBU_
19a80 44 45 4c 45 54 45 20 7c 7c 20 70 49 74 65 72 2d  DELETE || pIter-
19a90 3e 7a 49 64 78 3d 3d 30 20 29 3b 0a 20 20 61 73  >zIdx==0 );.  as
19aa0 73 65 72 74 28 20 65 54 79 70 65 3d 3d 52 42 55  sert( eType==RBU
19ab0 5f 44 45 4c 45 54 45 20 7c 7c 20 65 54 79 70 65  _DELETE || eType
19ac0 3d 3d 52 42 55 5f 49 44 58 5f 44 45 4c 45 54 45  ==RBU_IDX_DELETE
19ad0 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  .       || eType
19ae0 3d 3d 52 42 55 5f 49 4e 53 45 52 54 20 7c 7c 20  ==RBU_INSERT || 
19af0 65 54 79 70 65 3d 3d 52 42 55 5f 49 44 58 5f 49  eType==RBU_IDX_I
19b00 4e 53 45 52 54 0a 20 20 29 3b 0a 0a 20 20 2f 2a  NSERT.  );..  /*
19b10 20 49 66 20 74 68 69 73 20 69 73 20 61 20 64 65   If this is a de
19b20 6c 65 74 65 2c 20 64 65 63 72 65 6d 65 6e 74 20  lete, decrement 
19b30 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20 62 79  nPhaseOneStep by
19b40 20 6e 49 6e 64 65 78 2e 20 49 66 20 74 68 65 20   nIndex. If the 
19b50 44 45 4c 45 54 45 0a 20 20 2a 2a 20 73 74 61 74  DELETE.  ** stat
19b60 65 6d 65 6e 74 20 62 65 6c 6f 77 20 64 6f 65 73  ement below does
19b70 20 61 63 74 75 61 6c 6c 79 20 64 65 6c 65 74 65   actually delete
19b80 20 61 20 72 6f 77 2c 20 6e 50 68 61 73 65 4f 6e   a row, nPhaseOn
19b90 65 53 74 65 70 20 77 69 6c 6c 20 62 65 0a 20 20  eStep will be.  
19ba0 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62  ** incremented b
19bb0 79 20 74 68 65 20 73 61 6d 65 20 61 6d 6f 75 6e  y the same amoun
19bc0 74 20 77 68 65 6e 20 53 51 4c 20 66 75 6e 63 74  t when SQL funct
19bd0 69 6f 6e 20 72 62 75 5f 74 6d 70 5f 69 6e 73 65  ion rbu_tmp_inse
19be0 72 74 28 29 0a 20 20 2a 2a 20 69 73 20 69 6e 76  rt().  ** is inv
19bf0 6f 6b 65 64 20 62 79 20 74 68 65 20 74 72 69 67  oked by the trig
19c00 67 65 72 2e 20 20 2a 2f 0a 20 20 69 66 28 20 65  ger.  */.  if( e
19c10 54 79 70 65 3d 3d 52 42 55 5f 44 45 4c 45 54 45  Type==RBU_DELETE
19c20 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 50 68 61 73   ){.    p->nPhas
19c30 65 4f 6e 65 53 74 65 70 20 2d 3d 20 70 2d 3e 6f  eOneStep -= p->o
19c40 62 6a 69 74 65 72 2e 6e 49 6e 64 65 78 3b 0a 20  bjiter.nIndex;. 
19c50 20 7d 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d   }..  if( eType=
19c60 3d 52 42 55 5f 49 44 58 5f 44 45 4c 45 54 45 20  =RBU_IDX_DELETE 
19c70 7c 7c 20 65 54 79 70 65 3d 3d 52 42 55 5f 44 45  || eType==RBU_DE
19c80 4c 45 54 45 20 29 7b 0a 20 20 20 20 70 57 72 69  LETE ){.    pWri
19c90 74 65 72 20 3d 20 70 49 74 65 72 2d 3e 70 44 65  ter = pIter->pDe
19ca0 6c 65 74 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  lete;.  }else{. 
19cb0 20 20 20 70 57 72 69 74 65 72 20 3d 20 70 49 74     pWriter = pIt
19cc0 65 72 2d 3e 70 49 6e 73 65 72 74 3b 0a 20 20 7d  er->pInsert;.  }
19cd0 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ..  for(i=0; i<p
19ce0 49 74 65 72 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  Iter->nCol; i++)
19cf0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  {.    /* If this
19d00 20 69 73 20 61 6e 20 49 4e 53 45 52 54 20 69 6e   is an INSERT in
19d10 74 6f 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65  to a table b-tre
19d20 65 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20  e and the table 
19d30 68 61 73 20 61 6e 0a 20 20 20 20 2a 2a 20 65 78  has an.    ** ex
19d40 70 6c 69 63 69 74 20 49 4e 54 45 47 45 52 20 50  plicit INTEGER P
19d50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 68 65 63  RIMARY KEY, chec
19d60 6b 20 74 68 61 74 20 74 68 69 73 20 69 73 20 6e  k that this is n
19d70 6f 74 20 61 6e 20 61 74 74 65 6d 70 74 0a 20 20  ot an attempt.  
19d80 20 20 2a 2a 20 74 6f 20 77 72 69 74 65 20 61 20    ** to write a 
19d90 4e 55 4c 4c 20 69 6e 74 6f 20 74 68 65 20 49 50  NULL into the IP
19da0 4b 20 63 6f 6c 75 6d 6e 2e 20 54 68 61 74 20 69  K column. That i
19db0 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e  s not permitted.
19dc0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 54 79    */.    if( eTy
19dd0 70 65 3d 3d 52 42 55 5f 49 4e 53 45 52 54 20 0a  pe==RBU_INSERT .
19de0 20 20 20 20 20 26 26 20 70 49 74 65 72 2d 3e 7a       && pIter->z
19df0 49 64 78 3d 3d 30 20 26 26 20 70 49 74 65 72 2d  Idx==0 && pIter-
19e00 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 49  >eType==RBU_PK_I
19e10 50 4b 20 26 26 20 70 49 74 65 72 2d 3e 61 62 54  PK && pIter->abT
19e20 62 6c 50 6b 5b 69 5d 20 0a 20 20 20 20 20 26 26  blPk[i] .     &&
19e30 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
19e40 74 79 70 65 28 70 49 74 65 72 2d 3e 70 53 65 6c  type(pIter->pSel
19e50 65 63 74 2c 20 69 29 3d 3d 53 51 4c 49 54 45 5f  ect, i)==SQLITE_
19e60 4e 55 4c 4c 0a 20 20 20 20 29 7b 0a 20 20 20 20  NULL.    ){.    
19e70 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
19e80 5f 4d 49 53 4d 41 54 43 48 3b 0a 20 20 20 20 20  _MISMATCH;.     
19e90 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71   p->zErrmsg = sq
19ea0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 64  lite3_mprintf("d
19eb0 61 74 61 74 79 70 65 20 6d 69 73 6d 61 74 63 68  atatype mismatch
19ec0 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
19ed0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
19ee0 20 65 54 79 70 65 3d 3d 52 42 55 5f 44 45 4c 45   eType==RBU_DELE
19ef0 54 45 20 26 26 20 70 49 74 65 72 2d 3e 61 62 54  TE && pIter->abT
19f00 62 6c 50 6b 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20  blPk[i]==0 ){.  
19f10 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
19f20 20 20 7d 0a 0a 20 20 20 20 70 56 61 6c 20 3d 20    }..    pVal = 
19f30 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76  sqlite3_column_v
19f40 61 6c 75 65 28 70 49 74 65 72 2d 3e 70 53 65 6c  alue(pIter->pSel
19f50 65 63 74 2c 20 69 29 3b 0a 20 20 20 20 70 2d 3e  ect, i);.    p->
19f60 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  rc = sqlite3_bin
19f70 64 5f 76 61 6c 75 65 28 70 57 72 69 74 65 72 2c  d_value(pWriter,
19f80 20 69 2b 31 2c 20 70 56 61 6c 29 3b 0a 20 20 20   i+1, pVal);.   
19f90 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74   if( p->rc ) ret
19fa0 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  urn;.  }.  if( p
19fb0 49 74 65 72 2d 3e 7a 49 64 78 3d 3d 30 20 29 7b  Iter->zIdx==0 ){
19fc0 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
19fd0 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 56 54  eType==RBU_PK_VT
19fe0 41 42 20 0a 20 20 20 20 20 7c 7c 20 70 49 74 65  AB .     || pIte
19ff0 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
1a000 5f 4e 4f 4e 45 20 0a 20 20 20 20 20 7c 7c 20 28  _NONE .     || (
1a010 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
1a020 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 26 26  U_PK_EXTERNAL &&
1a030 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 29 29   rbuIsVacuum(p))
1a040 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f   .    ){.      /
1a050 2a 20 46 6f 72 20 61 20 76 69 72 74 75 61 6c 20  * For a virtual 
1a060 74 61 62 6c 65 2c 20 6f 72 20 61 20 74 61 62 6c  table, or a tabl
1a070 65 20 77 69 74 68 20 6e 6f 20 70 72 69 6d 61 72  e with no primar
1a080 79 20 6b 65 79 2c 20 74 68 65 20 0a 20 20 20 20  y key, the .    
1a090 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74    ** SELECT stat
1a0a0 65 6d 65 6e 74 20 69 73 3a 0a 20 20 20 20 20 20  ement is:.      
1a0b0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 53 45  **.      **   SE
1a0c0 4c 45 43 54 20 3c 63 6f 6c 73 3e 2c 20 72 62 75  LECT <cols>, rbu
1a0d0 5f 63 6f 6e 74 72 6f 6c 2c 20 72 62 75 5f 72 6f  _control, rbu_ro
1a0e0 77 69 64 20 46 52 4f 4d 20 2e 2e 2e 2e 0a 20 20  wid FROM .....  
1a0f0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
1a100 48 65 6e 63 65 20 63 6f 6c 75 6d 6e 5f 76 61 6c  Hence column_val
1a110 75 65 28 70 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31  ue(pIter->nCol+1
1a120 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  )..      */.    
1a130 20 20 61 73 73 65 72 74 43 6f 6c 75 6d 6e 4e 61    assertColumnNa
1a140 6d 65 28 70 49 74 65 72 2d 3e 70 53 65 6c 65 63  me(pIter->pSelec
1a150 74 2c 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31  t, pIter->nCol+1
1a160 2c 20 0a 20 20 20 20 20 20 20 20 20 20 72 62 75  , .          rbu
1a170 49 73 56 61 63 75 75 6d 28 70 29 20 3f 20 22 72  IsVacuum(p) ? "r
1a180 6f 77 69 64 22 20 3a 20 22 72 62 75 5f 72 6f 77  owid" : "rbu_row
1a190 69 64 22 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  id".      );.   
1a1a0 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65     pVal = sqlite
1a1b0 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70  3_column_value(p
1a1c0 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 2c 20 70  Iter->pSelect, p
1a1d0 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31 29 3b 0a 20  Iter->nCol+1);. 
1a1e0 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c       p->rc = sql
1a1f0 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28  ite3_bind_value(
1a200 70 57 72 69 74 65 72 2c 20 70 49 74 65 72 2d 3e  pWriter, pIter->
1a210 6e 43 6f 6c 2b 31 2c 20 70 56 61 6c 29 3b 0a 20  nCol+1, pVal);. 
1a220 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
1a230 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1a240 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
1a250 74 65 70 28 70 57 72 69 74 65 72 29 3b 0a 20 20  tep(pWriter);.  
1a260 20 20 70 2d 3e 72 63 20 3d 20 72 65 73 65 74 41    p->rc = resetA
1a270 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70  ndCollectError(p
1a280 57 72 69 74 65 72 2c 20 26 70 2d 3e 7a 45 72 72  Writer, &p->zErr
1a290 6d 73 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  msg);.  }.}../*.
1a2a0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1a2b0 20 64 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 66   does the work f
1a2c0 6f 72 20 61 6e 20 73 71 6c 69 74 65 33 72 62 75  or an sqlite3rbu
1a2d0 5f 73 74 65 70 28 29 20 63 61 6c 6c 2e 0a 2a 2a  _step() call..**
1a2e0 0a 2a 2a 20 54 68 65 20 6f 62 6a 65 63 74 2d 69  .** The object-i
1a2f0 74 65 72 61 74 6f 72 20 28 70 2d 3e 6f 62 6a 69  terator (p->obji
1a300 74 65 72 29 20 63 75 72 72 65 6e 74 6c 79 20 70  ter) currently p
1a310 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 69 64  oints to a valid
1a320 20 6f 62 6a 65 63 74 2c 0a 2a 2a 20 61 6e 64 20   object,.** and 
1a330 74 68 65 20 69 6e 70 75 74 20 63 75 72 73 6f 72  the input cursor
1a340 20 28 70 2d 3e 6f 62 6a 69 74 65 72 2e 70 53 65   (p->objiter.pSe
1a350 6c 65 63 74 29 20 63 75 72 72 65 6e 74 6c 79 20  lect) currently 
1a360 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 69  points to a vali
1a370 64 0a 2a 2a 20 69 6e 70 75 74 20 72 6f 77 2e 20  d.** input row. 
1a380 50 65 72 66 6f 72 6d 20 77 68 61 74 65 76 65 72  Perform whatever
1a390 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20 72   processing is r
1a3a0 65 71 75 69 72 65 64 20 61 6e 64 20 72 65 74 75  equired and retu
1a3b0 72 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20  rn..**.** If no 
1a3c0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53   error occurs, S
1a3d0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1a3e0 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
1a3f0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a   an error code.*
1a400 2a 20 61 6e 64 20 6d 65 73 73 61 67 65 20 69 73  * and message is
1a410 20 6c 65 66 74 20 69 6e 20 74 68 65 20 52 42 55   left in the RBU
1a420 20 68 61 6e 64 6c 65 20 61 6e 64 20 61 20 63 6f   handle and a co
1a430 70 79 20 6f 66 20 74 68 65 20 65 72 72 6f 72 20  py of the error 
1a440 63 6f 64 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64  code.** returned
1a450 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1a460 72 62 75 53 74 65 70 28 73 71 6c 69 74 65 33 72  rbuStep(sqlite3r
1a470 62 75 20 2a 70 29 7b 0a 20 20 52 62 75 4f 62 6a  bu *p){.  RbuObj
1a480 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70  Iter *pIter = &p
1a490 2d 3e 6f 62 6a 69 74 65 72 3b 0a 20 20 63 6f 6e  ->objiter;.  con
1a4a0 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 6b 20 3d  st char *zMask =
1a4b0 20 30 3b 0a 20 20 69 6e 74 20 65 54 79 70 65 20   0;.  int eType 
1a4c0 3d 20 72 62 75 53 74 65 70 54 79 70 65 28 70 2c  = rbuStepType(p,
1a4d0 20 26 7a 4d 61 73 6b 29 3b 0a 0a 20 20 69 66 28   &zMask);..  if(
1a4e0 20 65 54 79 70 65 20 29 7b 0a 20 20 20 20 61 73   eType ){.    as
1a4f0 73 65 72 74 28 20 65 54 79 70 65 3d 3d 52 42 55  sert( eType==RBU
1a500 5f 49 4e 53 45 52 54 20 20 20 20 20 7c 7c 20 65  _INSERT     || e
1a510 54 79 70 65 3d 3d 52 42 55 5f 44 45 4c 45 54 45  Type==RBU_DELETE
1a520 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 65 54 79  .         || eTy
1a530 70 65 3d 3d 52 42 55 5f 52 45 50 4c 41 43 45 20  pe==RBU_REPLACE 
1a540 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 52 42 55     || eType==RBU
1a550 5f 49 44 58 5f 44 45 4c 45 54 45 0a 20 20 20 20  _IDX_DELETE.    
1a560 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 52       || eType==R
1a570 42 55 5f 49 44 58 5f 49 4e 53 45 52 54 20 7c 7c  BU_IDX_INSERT ||
1a580 20 65 54 79 70 65 3d 3d 52 42 55 5f 55 50 44 41   eType==RBU_UPDA
1a590 54 45 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73  TE.    );.    as
1a5a0 73 65 72 74 28 20 65 54 79 70 65 21 3d 52 42 55  sert( eType!=RBU
1a5b0 5f 55 50 44 41 54 45 20 7c 7c 20 70 49 74 65 72  _UPDATE || pIter
1a5c0 2d 3e 7a 49 64 78 3d 3d 30 20 29 3b 0a 0a 20 20  ->zIdx==0 );..  
1a5d0 20 20 69 66 28 20 70 49 74 65 72 2d 3e 7a 49 64    if( pIter->zId
1a5e0 78 3d 3d 30 20 26 26 20 28 65 54 79 70 65 3d 3d  x==0 && (eType==
1a5f0 52 42 55 5f 49 44 58 5f 44 45 4c 45 54 45 20 7c  RBU_IDX_DELETE |
1a600 7c 20 65 54 79 70 65 3d 3d 52 42 55 5f 49 44 58  | eType==RBU_IDX
1a610 5f 49 4e 53 45 52 54 29 20 29 7b 0a 20 20 20 20  _INSERT) ){.    
1a620 20 20 72 62 75 42 61 64 43 6f 6e 74 72 6f 6c 45    rbuBadControlE
1a630 72 72 6f 72 28 70 29 3b 0a 20 20 20 20 7d 0a 20  rror(p);.    }. 
1a640 20 20 20 65 6c 73 65 20 69 66 28 20 65 54 79 70     else if( eTyp
1a650 65 3d 3d 52 42 55 5f 52 45 50 4c 41 43 45 20 29  e==RBU_REPLACE )
1a660 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  {.      if( pIte
1a670 72 2d 3e 7a 49 64 78 3d 3d 30 20 29 7b 0a 20 20  r->zIdx==0 ){.  
1a680 20 20 20 20 20 20 70 2d 3e 6e 50 68 61 73 65 4f        p->nPhaseO
1a690 6e 65 53 74 65 70 20 2b 3d 20 70 2d 3e 6f 62 6a  neStep += p->obj
1a6a0 69 74 65 72 2e 6e 49 6e 64 65 78 3b 0a 20 20 20  iter.nIndex;.   
1a6b0 20 20 20 20 20 72 62 75 53 74 65 70 4f 6e 65 4f       rbuStepOneO
1a6c0 70 28 70 2c 20 52 42 55 5f 44 45 4c 45 54 45 29  p(p, RBU_DELETE)
1a6d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1a6e0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1a6f0 45 5f 4f 4b 20 29 20 72 62 75 53 74 65 70 4f 6e  E_OK ) rbuStepOn
1a700 65 4f 70 28 70 2c 20 52 42 55 5f 49 4e 53 45 52  eOp(p, RBU_INSER
1a710 54 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c  T);.    }.    el
1a720 73 65 20 69 66 28 20 65 54 79 70 65 21 3d 52 42  se if( eType!=RB
1a730 55 5f 55 50 44 41 54 45 20 29 7b 0a 20 20 20 20  U_UPDATE ){.    
1a740 20 20 72 62 75 53 74 65 70 4f 6e 65 4f 70 28 70    rbuStepOneOp(p
1a750 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 7d 0a  , eType);.    }.
1a760 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
1a770 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
1a780 56 61 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Val;.      sqlit
1a790 65 33 5f 73 74 6d 74 20 2a 70 55 70 64 61 74 65  e3_stmt *pUpdate
1a7a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
1a7b0 72 74 28 20 65 54 79 70 65 3d 3d 52 42 55 5f 55  rt( eType==RBU_U
1a7c0 50 44 41 54 45 20 29 3b 0a 20 20 20 20 20 20 70  PDATE );.      p
1a7d0 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20  ->nPhaseOneStep 
1a7e0 2d 3d 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 6e 49  -= p->objiter.nI
1a7f0 6e 64 65 78 3b 0a 20 20 20 20 20 20 72 62 75 47  ndex;.      rbuG
1a800 65 74 55 70 64 61 74 65 53 74 6d 74 28 70 2c 20  etUpdateStmt(p, 
1a810 70 49 74 65 72 2c 20 7a 4d 61 73 6b 2c 20 26 70  pIter, zMask, &p
1a820 55 70 64 61 74 65 29 3b 0a 20 20 20 20 20 20 69  Update);.      i
1a830 66 28 20 70 55 70 64 61 74 65 20 29 7b 0a 20 20  f( pUpdate ){.  
1a840 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
1a850 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d       for(i=0; p-
1a860 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
1a870 26 20 69 3c 70 49 74 65 72 2d 3e 6e 43 6f 6c 3b  & i<pIter->nCol;
1a880 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
1a890 20 63 68 61 72 20 63 20 3d 20 7a 4d 61 73 6b 5b   char c = zMask[
1a8a0 70 49 74 65 72 2d 3e 61 69 53 72 63 4f 72 64 65  pIter->aiSrcOrde
1a8b0 72 5b 69 5d 5d 3b 0a 20 20 20 20 20 20 20 20 20  r[i]];.         
1a8c0 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f   pVal = sqlite3_
1a8d0 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 49 74  column_value(pIt
1a8e0 65 72 2d 3e 70 53 65 6c 65 63 74 2c 20 69 29 3b  er->pSelect, i);
1a8f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1a900 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 5d  Iter->abTblPk[i]
1a910 20 7c 7c 20 63 21 3d 27 2e 27 20 29 7b 0a 20 20   || c!='.' ){.  
1a920 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
1a930 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76  = sqlite3_bind_v
1a940 61 6c 75 65 28 70 55 70 64 61 74 65 2c 20 69 2b  alue(pUpdate, i+
1a950 31 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20 20 20  1, pVal);.      
1a960 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1a970 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
1a980 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20  c==SQLITE_OK .  
1a990 20 20 20 20 20 20 20 26 26 20 28 70 49 74 65 72         && (pIter
1a9a0 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
1a9b0 56 54 41 42 20 7c 7c 20 70 49 74 65 72 2d 3e 65  VTAB || pIter->e
1a9c0 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e  Type==RBU_PK_NON
1a9d0 45 29 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  E) .        ){. 
1a9e0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 6e 64           /* Bind
1a9f0 20 74 68 65 20 72 62 75 5f 72 6f 77 69 64 20 76   the rbu_rowid v
1aa00 61 6c 75 65 20 74 6f 20 63 6f 6c 75 6d 6e 20 5f  alue to column _
1aa10 72 6f 77 69 64 5f 20 2a 2f 0a 20 20 20 20 20 20  rowid_ */.      
1aa20 20 20 20 20 61 73 73 65 72 74 43 6f 6c 75 6d 6e      assertColumn
1aa30 4e 61 6d 65 28 70 49 74 65 72 2d 3e 70 53 65 6c  Name(pIter->pSel
1aa40 65 63 74 2c 20 70 49 74 65 72 2d 3e 6e 43 6f 6c  ect, pIter->nCol
1aa50 2b 31 2c 20 22 72 62 75 5f 72 6f 77 69 64 22 29  +1, "rbu_rowid")
1aa60 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 6c  ;.          pVal
1aa70 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
1aa80 6e 5f 76 61 6c 75 65 28 70 49 74 65 72 2d 3e 70  n_value(pIter->p
1aa90 53 65 6c 65 63 74 2c 20 70 49 74 65 72 2d 3e 6e  Select, pIter->n
1aaa0 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  Col+1);.        
1aab0 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
1aac0 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70 55 70  3_bind_value(pUp
1aad0 64 61 74 65 2c 20 70 49 74 65 72 2d 3e 6e 43 6f  date, pIter->nCo
1aae0 6c 2b 31 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20  l+1, pVal);.    
1aaf0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1ab00 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1ab10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1ab20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 55 70  sqlite3_step(pUp
1ab30 64 61 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20  date);.         
1ab40 20 70 2d 3e 72 63 20 3d 20 72 65 73 65 74 41 6e   p->rc = resetAn
1ab50 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 55  dCollectError(pU
1ab60 70 64 61 74 65 2c 20 26 70 2d 3e 7a 45 72 72 6d  pdate, &p->zErrm
1ab70 73 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  sg);.        }. 
1ab80 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1ab90 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b  .  return p->rc;
1aba0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d  .}../*.** Increm
1abb0 65 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20 63  ent the schema c
1abc0 6f 6f 6b 69 65 20 6f 66 20 74 68 65 20 6d 61 69  ookie of the mai
1abd0 6e 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65  n database opene
1abe0 64 20 62 79 20 70 2d 3e 64 62 4d 61 69 6e 2e 0a  d by p->dbMain..
1abf0 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 69  **.** Or, if thi
1ac00 73 20 69 73 20 61 6e 20 52 42 55 20 76 61 63 75  s is an RBU vacu
1ac10 75 6d 2c 20 73 65 74 20 74 68 65 20 73 63 68 65  um, set the sche
1ac20 6d 61 20 63 6f 6f 6b 69 65 20 6f 66 20 74 68 65  ma cookie of the
1ac30 20 6d 61 69 6e 20 64 62 0a 2a 2a 20 6f 70 65 6e   main db.** open
1ac40 65 64 20 62 79 20 70 2d 3e 64 62 4d 61 69 6e 20  ed by p->dbMain 
1ac50 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e  to one more than
1ac60 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
1ac70 69 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 0a 2a  ie of the main.*
1ac80 2a 20 64 62 20 6f 70 65 6e 65 64 20 62 79 20 70  * db opened by p
1ac90 2d 3e 64 62 52 62 75 2e 0a 2a 2f 0a 73 74 61 74  ->dbRbu..*/.stat
1aca0 69 63 20 76 6f 69 64 20 72 62 75 49 6e 63 72 53  ic void rbuIncrS
1acb0 63 68 65 6d 61 43 6f 6f 6b 69 65 28 73 71 6c 69  chemaCookie(sqli
1acc0 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 69 66  te3rbu *p){.  if
1acd0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1ace0 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
1acf0 33 20 2a 64 62 72 65 61 64 20 3d 20 28 72 62 75  3 *dbread = (rbu
1ad00 49 73 56 61 63 75 75 6d 28 70 29 20 3f 20 70 2d  IsVacuum(p) ? p-
1ad10 3e 64 62 52 62 75 20 3a 20 70 2d 3e 64 62 4d 61  >dbRbu : p->dbMa
1ad20 69 6e 29 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f  in);.    int iCo
1ad30 6f 6b 69 65 20 3d 20 31 30 30 30 30 30 30 3b 0a  okie = 1000000;.
1ad40 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
1ad50 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 20 20 70 2d   *pStmt;..    p-
1ad60 3e 72 63 20 3d 20 70 72 65 70 61 72 65 41 6e 64  >rc = prepareAnd
1ad70 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 64 62 72  CollectError(dbr
1ad80 65 61 64 2c 20 26 70 53 74 6d 74 2c 20 26 70 2d  ead, &pStmt, &p-
1ad90 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20  >zErrmsg, .     
1ada0 20 20 20 22 50 52 41 47 4d 41 20 73 63 68 65 6d     "PRAGMA schem
1adb0 61 5f 76 65 72 73 69 6f 6e 22 0a 20 20 20 20 29  a_version".    )
1adc0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  ;.    if( p->rc=
1add0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ade0 20 20 20 20 2f 2a 20 43 6f 76 65 72 61 67 65 3a      /* Coverage:
1adf0 20 69 74 20 6d 61 79 20 62 65 20 74 68 61 74 20   it may be that 
1ae00 74 68 69 73 20 73 71 6c 69 74 65 33 5f 73 74 65  this sqlite3_ste
1ae10 70 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e  p() cannot fail.
1ae20 20 54 68 65 72 65 0a 20 20 20 20 20 20 2a 2a 20   There.      ** 
1ae30 69 73 20 61 6c 72 65 61 64 79 20 61 20 74 72 61  is already a tra
1ae40 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 73  nsaction open, s
1ae50 6f 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  o the prepared s
1ae60 74 61 74 65 6d 65 6e 74 20 63 61 6e 6e 6f 74 0a  tatement cannot.
1ae70 20 20 20 20 20 20 2a 2a 20 74 68 72 6f 77 20 61        ** throw a
1ae80 6e 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 20  n SQLITE_SCHEMA 
1ae90 65 78 63 65 70 74 69 6f 6e 2e 20 54 68 65 20 6f  exception. The o
1aea0 6e 6c 79 20 64 61 74 61 62 61 73 65 20 70 61 67  nly database pag
1aeb0 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73  e the.      ** s
1aec0 74 61 74 65 6d 65 6e 74 20 72 65 61 64 73 20 69  tatement reads i
1aed0 73 20 70 61 67 65 20 31 2c 20 77 68 69 63 68 20  s page 1, which 
1aee0 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
1aef0 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65   be in the cache
1af00 2e 0a 20 20 20 20 20 20 2a 2a 20 41 6e 64 20 6e  ..      ** And n
1af10 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  o memory allocat
1af20 69 6f 6e 73 20 61 72 65 20 72 65 71 75 69 72 65  ions are require
1af30 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  d.  */.      if(
1af40 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
1af50 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
1af60 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43 6f 6f   ){.        iCoo
1af70 6b 69 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  kie = sqlite3_co
1af80 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20  lumn_int(pStmt, 
1af90 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
1afa0 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c    rbuFinalize(p,
1afb0 20 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20   pStmt);.    }. 
1afc0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
1afd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1afe0 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63 28   rbuMPrintfExec(
1aff0 70 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 50  p, p->dbMain, "P
1b000 52 41 47 4d 41 20 73 63 68 65 6d 61 5f 76 65 72  RAGMA schema_ver
1b010 73 69 6f 6e 20 3d 20 25 64 22 2c 20 69 43 6f 6f  sion = %d", iCoo
1b020 6b 69 65 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20  kie+1);.    }.  
1b030 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74  }.}../*.** Updat
1b040 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
1b050 66 20 74 68 65 20 72 62 75 5f 73 74 61 74 65 20  f the rbu_state 
1b060 74 61 62 6c 65 20 77 69 74 68 69 6e 20 74 68 65  table within the
1b070 20 72 62 75 20 64 61 74 61 62 61 73 65 2e 20 54   rbu database. T
1b080 68 65 0a 2a 2a 20 76 61 6c 75 65 20 73 74 6f 72  he.** value stor
1b090 65 64 20 69 6e 20 74 68 65 20 52 42 55 5f 53 54  ed in the RBU_ST
1b0a0 41 54 45 5f 53 54 41 47 45 20 63 6f 6c 75 6d 6e  ATE_STAGE column
1b0b0 20 69 73 20 65 53 74 61 67 65 2e 20 41 6c 6c 20   is eStage. All 
1b0c0 6f 74 68 65 72 20 76 61 6c 75 65 73 0a 2a 2a 20  other values.** 
1b0d0 61 72 65 20 64 65 74 65 72 6d 69 6e 65 64 20 62  are determined b
1b0e0 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65  y inspecting the
1b0f0 20 72 62 75 20 68 61 6e 64 6c 65 20 70 61 73 73   rbu handle pass
1b100 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
1b110 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
1b120 74 69 63 20 76 6f 69 64 20 72 62 75 53 61 76 65  tic void rbuSave
1b130 53 74 61 74 65 28 73 71 6c 69 74 65 33 72 62 75  State(sqlite3rbu
1b140 20 2a 70 2c 20 69 6e 74 20 65 53 74 61 67 65 29   *p, int eStage)
1b150 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
1b160 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72  QLITE_OK || p->r
1b170 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
1b180 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  {.    sqlite3_st
1b190 6d 74 20 2a 70 49 6e 73 65 72 74 20 3d 20 30 3b  mt *pInsert = 0;
1b1a0 0a 20 20 20 20 72 62 75 5f 66 69 6c 65 20 2a 70  .    rbu_file *p
1b1b0 46 64 20 3d 20 28 72 62 75 49 73 56 61 63 75 75  Fd = (rbuIsVacuu
1b1c0 6d 28 70 29 20 3f 20 70 2d 3e 70 52 62 75 46 64  m(p) ? p->pRbuFd
1b1d0 20 3a 20 70 2d 3e 70 54 61 72 67 65 74 46 64 29   : p->pTargetFd)
1b1e0 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ;.    int rc;.. 
1b1f0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a 45     assert( p->zE
1b200 72 72 6d 73 67 3d 3d 30 20 29 3b 0a 20 20 20 20  rrmsg==0 );.    
1b210 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65  rc = prepareFree
1b220 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
1b230 70 2d 3e 64 62 52 62 75 2c 20 26 70 49 6e 73 65  p->dbRbu, &pInse
1b240 72 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c  rt, &p->zErrmsg,
1b250 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
1b260 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
1b270 20 20 20 20 20 22 49 4e 53 45 52 54 20 4f 52 20       "INSERT OR 
1b280 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 25 73 2e  REPLACE INTO %s.
1b290 72 62 75 5f 73 74 61 74 65 28 6b 2c 20 76 29 20  rbu_state(k, v) 
1b2a0 56 41 4c 55 45 53 20 22 0a 20 20 20 20 20 20 20  VALUES ".       
1b2b0 20 20 20 22 28 25 64 2c 20 25 64 29 2c 20 22 0a     "(%d, %d), ".
1b2c0 20 20 20 20 20 20 20 20 20 20 22 28 25 64 2c 20            "(%d, 
1b2d0 25 51 29 2c 20 22 0a 20 20 20 20 20 20 20 20 20  %Q), ".         
1b2e0 20 22 28 25 64 2c 20 25 51 29 2c 20 22 0a 20 20   "(%d, %Q), ".  
1b2f0 20 20 20 20 20 20 20 20 22 28 25 64 2c 20 25 64          "(%d, %d
1b300 29 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 22  ), ".          "
1b310 28 25 64 2c 20 25 64 29 2c 20 22 0a 20 20 20 20  (%d, %d), ".    
1b320 20 20 20 20 20 20 22 28 25 64 2c 20 25 6c 6c 64        "(%d, %lld
1b330 29 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 22  ), ".          "
1b340 28 25 64 2c 20 25 6c 6c 64 29 2c 20 22 0a 20 20  (%d, %lld), ".  
1b350 20 20 20 20 20 20 20 20 22 28 25 64 2c 20 25 6c          "(%d, %l
1b360 6c 64 29 2c 20 22 0a 20 20 20 20 20 20 20 20 20  ld), ".         
1b370 20 22 28 25 64 2c 20 25 6c 6c 64 29 2c 20 22 0a   "(%d, %lld), ".
1b380 20 20 20 20 20 20 20 20 20 20 22 28 25 64 2c 20            "(%d, 
1b390 25 51 29 20 20 22 2c 0a 20 20 20 20 20 20 20 20  %Q)  ",.        
1b3a0 20 20 70 2d 3e 7a 53 74 61 74 65 44 62 2c 0a 20    p->zStateDb,. 
1b3b0 20 20 20 20 20 20 20 20 20 52 42 55 5f 53 54 41           RBU_STA
1b3c0 54 45 5f 53 54 41 47 45 2c 20 65 53 74 61 67 65  TE_STAGE, eStage
1b3d0 2c 0a 20 20 20 20 20 20 20 20 20 20 52 42 55 5f  ,.          RBU_
1b3e0 53 54 41 54 45 5f 54 42 4c 2c 20 70 2d 3e 6f 62  STATE_TBL, p->ob
1b3f0 6a 69 74 65 72 2e 7a 54 62 6c 2c 20 0a 20 20 20  jiter.zTbl, .   
1b400 20 20 20 20 20 20 20 52 42 55 5f 53 54 41 54 45         RBU_STATE
1b410 5f 49 44 58 2c 20 70 2d 3e 6f 62 6a 69 74 65 72  _IDX, p->objiter
1b420 2e 7a 49 64 78 2c 20 0a 20 20 20 20 20 20 20 20  .zIdx, .        
1b430 20 20 52 42 55 5f 53 54 41 54 45 5f 52 4f 57 2c    RBU_STATE_ROW,
1b440 20 70 2d 3e 6e 53 74 65 70 2c 20 0a 20 20 20 20   p->nStep, .    
1b450 20 20 20 20 20 20 52 42 55 5f 53 54 41 54 45 5f        RBU_STATE_
1b460 50 52 4f 47 52 45 53 53 2c 20 70 2d 3e 6e 50 72  PROGRESS, p->nPr
1b470 6f 67 72 65 73 73 2c 0a 20 20 20 20 20 20 20 20  ogress,.        
1b480 20 20 52 42 55 5f 53 54 41 54 45 5f 43 4b 50 54    RBU_STATE_CKPT
1b490 2c 20 70 2d 3e 69 57 61 6c 43 6b 73 75 6d 2c 0a  , p->iWalCksum,.
1b4a0 20 20 20 20 20 20 20 20 20 20 52 42 55 5f 53 54            RBU_ST
1b4b0 41 54 45 5f 43 4f 4f 4b 49 45 2c 20 28 69 36 34  ATE_COOKIE, (i64
1b4c0 29 70 46 64 2d 3e 69 43 6f 6f 6b 69 65 2c 0a 20  )pFd->iCookie,. 
1b4d0 20 20 20 20 20 20 20 20 20 52 42 55 5f 53 54 41           RBU_STA
1b4e0 54 45 5f 4f 41 4c 53 5a 2c 20 70 2d 3e 69 4f 61  TE_OALSZ, p->iOa
1b4f0 6c 53 7a 2c 0a 20 20 20 20 20 20 20 20 20 20 52  lSz,.          R
1b500 42 55 5f 53 54 41 54 45 5f 50 48 41 53 45 4f 4e  BU_STATE_PHASEON
1b510 45 53 54 45 50 2c 20 70 2d 3e 6e 50 68 61 73 65  ESTEP, p->nPhase
1b520 4f 6e 65 53 74 65 70 2c 0a 20 20 20 20 20 20 20  OneStep,.       
1b530 20 20 20 52 42 55 5f 53 54 41 54 45 5f 44 41 54     RBU_STATE_DAT
1b540 41 54 42 4c 2c 20 70 2d 3e 6f 62 6a 69 74 65 72  ATBL, p->objiter
1b550 2e 7a 44 61 74 61 54 62 6c 0a 20 20 20 20 20 20  .zDataTbl.      
1b560 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73  ).    );.    ass
1b570 65 72 74 28 20 70 49 6e 73 65 72 74 3d 3d 30 20  ert( pInsert==0 
1b580 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  || rc==SQLITE_OK
1b590 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d   );..    if( rc=
1b5a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b5b0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70      sqlite3_step
1b5c0 28 70 49 6e 73 65 72 74 29 3b 0a 20 20 20 20 20  (pInsert);.     
1b5d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
1b5e0 6e 61 6c 69 7a 65 28 70 49 6e 73 65 72 74 29 3b  nalize(pInsert);
1b5f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1b600 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70  c!=SQLITE_OK ) p
1b610 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 7d  ->rc = rc;.  }.}
1b620 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63  .../*.** The sec
1b630 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 70 61 73  ond argument pas
1b640 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
1b650 74 69 6f 6e 20 69 73 20 74 68 65 20 6e 61 6d 65  tion is the name
1b660 20 6f 66 20 61 20 50 52 41 47 4d 41 20 0a 2a 2a   of a PRAGMA .**
1b670 20 73 65 74 74 69 6e 67 20 2d 20 22 70 61 67 65   setting - "page
1b680 5f 73 69 7a 65 22 2c 20 22 61 75 74 6f 5f 76 61  _size", "auto_va
1b690 63 75 75 6d 22 2c 20 22 75 73 65 72 5f 76 65 72  cuum", "user_ver
1b6a0 73 69 6f 6e 22 20 6f 72 20 22 61 70 70 6c 69 63  sion" or "applic
1b6b0 61 74 69 6f 6e 5f 69 64 22 2e 0a 2a 2a 20 54 68  ation_id"..** Th
1b6c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 78 65 63  is function exec
1b6d0 75 74 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  utes the followi
1b6e0 6e 67 20 6f 6e 20 73 71 6c 69 74 65 33 72 62 75  ng on sqlite3rbu
1b6f0 2e 64 62 52 62 75 3a 0a 2a 2a 0a 2a 2a 20 20 20  .dbRbu:.**.**   
1b700 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 24 7a 50  "PRAGMA main.$zP
1b710 72 61 67 6d 61 22 0a 2a 2a 0a 2a 2a 20 77 68 65  ragma".**.** whe
1b720 72 65 20 24 7a 50 72 61 67 6d 61 20 69 73 20 74  re $zPragma is t
1b730 68 65 20 73 74 72 69 6e 67 20 70 61 73 73 65 64  he string passed
1b740 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
1b750 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e 0a 2a 2a  rgument, then.**
1b760 20 6f 6e 20 73 71 6c 69 74 65 33 72 62 75 2e 64   on sqlite3rbu.d
1b770 62 4d 61 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 22  bMain:.**.**   "
1b780 50 52 41 47 4d 41 20 6d 61 69 6e 2e 24 7a 50 72  PRAGMA main.$zPr
1b790 61 67 6d 61 20 3d 20 24 76 61 6c 22 0a 2a 2a 0a  agma = $val".**.
1b7a0 2a 2a 20 77 68 65 72 65 20 24 76 61 6c 20 69 73  ** where $val is
1b7b0 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
1b7c0 6e 65 64 20 62 79 20 74 68 65 20 66 69 72 73 74  ned by the first
1b7d0 20 50 52 41 47 4d 41 20 69 6e 76 6f 63 61 74 69   PRAGMA invocati
1b7e0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 73 68 6f  on..**.** In sho
1b7f0 72 74 2c 20 69 74 20 63 6f 70 69 65 73 20 74 68  rt, it copies th
1b800 65 20 76 61 6c 75 65 20 20 6f 66 20 74 68 65 20  e value  of the 
1b810 73 70 65 63 69 66 69 65 64 20 50 52 41 47 4d 41  specified PRAGMA
1b820 20 73 65 74 74 69 6e 67 20 66 72 6f 6d 0a 2a 2a   setting from.**
1b830 20 64 62 52 62 75 20 74 6f 20 64 62 4d 61 69 6e   dbRbu to dbMain
1b840 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1b850 20 72 62 75 43 6f 70 79 50 72 61 67 6d 61 28 73   rbuCopyPragma(s
1b860 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 63 6f  qlite3rbu *p, co
1b870 6e 73 74 20 63 68 61 72 20 2a 7a 50 72 61 67 6d  nst char *zPragm
1b880 61 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  a){.  if( p->rc=
1b890 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b8a0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1b8b0 70 50 72 61 67 6d 61 20 3d 20 30 3b 0a 20 20 20  pPragma = 0;.   
1b8c0 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65   p->rc = prepare
1b8d0 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  FreeAndCollectEr
1b8e0 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20 26 70  ror(p->dbRbu, &p
1b8f0 50 72 61 67 6d 61 2c 20 26 70 2d 3e 7a 45 72 72  Pragma, &p->zErr
1b900 6d 73 67 2c 20 0a 20 20 20 20 20 20 20 20 73 71  msg, .        sq
1b910 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50  lite3_mprintf("P
1b920 52 41 47 4d 41 20 6d 61 69 6e 2e 25 73 22 2c 20  RAGMA main.%s", 
1b930 7a 50 72 61 67 6d 61 29 0a 20 20 20 20 29 3b 0a  zPragma).    );.
1b940 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
1b950 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49  QLITE_OK && SQLI
1b960 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
1b970 73 74 65 70 28 70 50 72 61 67 6d 61 29 20 29 7b  step(pPragma) ){
1b980 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72  .      p->rc = r
1b990 62 75 4d 50 72 69 6e 74 66 45 78 65 63 28 70 2c  buMPrintfExec(p,
1b9a0 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 50 52 41   p->dbMain, "PRA
1b9b0 47 4d 41 20 6d 61 69 6e 2e 25 73 20 3d 20 25 64  GMA main.%s = %d
1b9c0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 7a 50 72  ",.          zPr
1b9d0 61 67 6d 61 2c 20 73 71 6c 69 74 65 33 5f 63 6f  agma, sqlite3_co
1b9e0 6c 75 6d 6e 5f 69 6e 74 28 70 50 72 61 67 6d 61  lumn_int(pPragma
1b9f0 2c 20 30 29 0a 20 20 20 20 20 20 29 3b 0a 20 20  , 0).      );.  
1ba00 20 20 7d 0a 20 20 20 20 72 62 75 46 69 6e 61 6c    }.    rbuFinal
1ba10 69 7a 65 28 70 2c 20 70 50 72 61 67 6d 61 29 3b  ize(p, pPragma);
1ba20 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
1ba30 65 20 52 42 55 20 68 61 6e 64 6c 65 20 70 61 73  e RBU handle pas
1ba40 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
1ba50 61 72 67 75 6d 65 6e 74 20 68 61 73 20 6a 75 73  argument has jus
1ba60 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 61 6e  t been opened an
1ba70 64 20 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20  d .** the state 
1ba80 64 61 74 61 62 61 73 65 20 69 73 20 65 6d 70 74  database is empt
1ba90 79 2e 20 49 66 20 74 68 69 73 20 52 42 55 20 68  y. If this RBU h
1baa0 61 6e 64 6c 65 20 77 61 73 20 6f 70 65 6e 65 64  andle was opened
1bab0 20 66 6f 72 20 61 6e 0a 2a 2a 20 52 42 55 20 76   for an.** RBU v
1bac0 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2c  acuum operation,
1bad0 20 63 72 65 61 74 65 20 74 68 65 20 73 63 68 65   create the sche
1bae0 6d 61 20 69 6e 20 74 68 65 20 74 61 72 67 65 74  ma in the target
1baf0 20 64 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76   db..*/.static v
1bb00 6f 69 64 20 72 62 75 43 72 65 61 74 65 54 61 72  oid rbuCreateTar
1bb10 67 65 74 53 63 68 65 6d 61 28 73 71 6c 69 74 65  getSchema(sqlite
1bb20 33 72 62 75 20 2a 70 29 7b 0a 20 20 73 71 6c 69  3rbu *p){.  sqli
1bb30 74 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c 20 3d  te3_stmt *pSql =
1bb40 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   0;.  sqlite3_st
1bb50 6d 74 20 2a 70 49 6e 73 65 72 74 20 3d 20 30 3b  mt *pInsert = 0;
1bb60 0a 0a 20 20 61 73 73 65 72 74 28 20 72 62 75 49  ..  assert( rbuI
1bb70 73 56 61 63 75 75 6d 28 70 29 20 29 3b 0a 20 20  sVacuum(p) );.  
1bb80 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
1bb90 65 78 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  exec(p->dbMain, 
1bba0 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65  "PRAGMA writable
1bbb0 5f 73 63 68 65 6d 61 3d 31 22 2c 20 30 2c 30 2c  _schema=1", 0,0,
1bbc0 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20   &p->zErrmsg);. 
1bbd0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1bbe0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e  TE_OK ){.    p->
1bbf0 72 63 20 3d 20 70 72 65 70 61 72 65 41 6e 64 43  rc = prepareAndC
1bc00 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64  ollectError(p->d
1bc10 62 52 62 75 2c 20 26 70 53 71 6c 2c 20 26 70 2d  bRbu, &pSql, &p-
1bc20 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20  >zErrmsg, .     
1bc30 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f   "SELECT sql FRO
1bc40 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
1bc50 57 48 45 52 45 20 73 71 6c 21 3d 27 27 20 41 4e  WHERE sql!='' AN
1bc60 44 20 72 6f 6f 74 70 61 67 65 21 3d 30 22 0a 20  D rootpage!=0". 
1bc70 20 20 20 20 20 22 20 41 4e 44 20 6e 61 6d 65 21       " AND name!
1bc80 3d 27 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  ='sqlite_sequenc
1bc90 65 27 20 22 0a 20 20 20 20 20 20 22 20 4f 52 44  e' ".      " ORD
1bca0 45 52 20 42 59 20 74 79 70 65 20 44 45 53 43 22  ER BY type DESC"
1bcb0 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 77  .    );.  }..  w
1bcc0 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
1bcd0 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74 65  ITE_OK && sqlite
1bce0 33 5f 73 74 65 70 28 70 53 71 6c 29 3d 3d 53 51  3_step(pSql)==SQ
1bcf0 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
1bd00 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
1bd10 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
1bd20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
1bd30 65 78 74 28 70 53 71 6c 2c 20 30 29 3b 0a 20 20  ext(pSql, 0);.  
1bd40 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
1bd50 33 5f 65 78 65 63 28 70 2d 3e 64 62 4d 61 69 6e  3_exec(p->dbMain
1bd60 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 70  , zSql, 0, 0, &p
1bd70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 7d 0a  ->zErrmsg);.  }.
1bd80 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c    rbuFinalize(p,
1bd90 20 70 53 71 6c 29 3b 0a 20 20 69 66 28 20 70 2d   pSql);.  if( p-
1bda0 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc!=SQLITE_OK )
1bdb0 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20   return;..  if( 
1bdc0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1bdd0 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
1bde0 70 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63  prepareAndCollec
1bdf0 74 45 72 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c  tError(p->dbRbu,
1be00 20 26 70 53 71 6c 2c 20 26 70 2d 3e 7a 45 72 72   &pSql, &p->zErr
1be10 6d 73 67 2c 20 0a 20 20 20 20 20 20 20 20 22 53  msg, .        "S
1be20 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c  ELECT * FROM sql
1be30 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45  ite_master WHERE
1be40 20 72 6f 6f 74 70 61 67 65 3d 30 20 4f 52 20 72   rootpage=0 OR r
1be50 6f 6f 74 70 61 67 65 20 49 53 20 4e 55 4c 4c 22  ootpage IS NULL"
1be60 20 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20   .    );.  }..  
1be70 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1be80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72  E_OK ){.    p->r
1be90 63 20 3d 20 70 72 65 70 61 72 65 41 6e 64 43 6f  c = prepareAndCo
1bea0 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62  llectError(p->db
1beb0 4d 61 69 6e 2c 20 26 70 49 6e 73 65 72 74 2c 20  Main, &pInsert, 
1bec0 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20  &p->zErrmsg, .  
1bed0 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e        "INSERT IN
1bee0 54 4f 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  TO sqlite_master
1bef0 20 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f 2c 3f 2c   VALUES(?,?,?,?,
1bf00 3f 29 22 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a  ?)".    );.  }..
1bf10 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
1bf20 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c  SQLITE_OK && sql
1bf30 69 74 65 33 5f 73 74 65 70 28 70 53 71 6c 29 3d  ite3_step(pSql)=
1bf40 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
1bf50 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
1bf60 72 28 69 3d 30 3b 20 69 3c 35 3b 20 69 2b 2b 29  r(i=0; i<5; i++)
1bf70 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
1bf80 62 69 6e 64 5f 76 61 6c 75 65 28 70 49 6e 73 65  bind_value(pInse
1bf90 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65 33  rt, i+1, sqlite3
1bfa0 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 53  _column_value(pS
1bfb0 71 6c 2c 20 69 29 29 3b 0a 20 20 20 20 7d 0a 20  ql, i));.    }. 
1bfc0 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28     sqlite3_step(
1bfd0 70 49 6e 73 65 72 74 29 3b 0a 20 20 20 20 70 2d  pInsert);.    p-
1bfe0 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  >rc = sqlite3_re
1bff0 73 65 74 28 70 49 6e 73 65 72 74 29 3b 0a 20 20  set(pInsert);.  
1c000 7d 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  }.  if( p->rc==S
1c010 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c020 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
1c030 65 78 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  exec(p->dbMain, 
1c040 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65  "PRAGMA writable
1c050 5f 73 63 68 65 6d 61 3d 30 22 2c 30 2c 30 2c 26  _schema=0",0,0,&
1c060 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 7d  p->zErrmsg);.  }
1c070 0a 0a 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28  ..  rbuFinalize(
1c080 70 2c 20 70 53 71 6c 29 3b 0a 20 20 72 62 75 46  p, pSql);.  rbuF
1c090 69 6e 61 6c 69 7a 65 28 70 2c 20 70 49 6e 73 65  inalize(p, pInse
1c0a0 72 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74  rt);.}../*.** St
1c0b0 65 70 20 74 68 65 20 52 42 55 20 6f 62 6a 65 63  ep the RBU objec
1c0c0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
1c0d0 33 72 62 75 5f 73 74 65 70 28 73 71 6c 69 74 65  3rbu_step(sqlite
1c0e0 33 72 62 75 20 2a 70 29 7b 0a 20 20 69 66 28 20  3rbu *p){.  if( 
1c0f0 70 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28  p ){.    switch(
1c100 20 70 2d 3e 65 53 74 61 67 65 20 29 7b 0a 20 20   p->eStage ){.  
1c110 20 20 20 20 63 61 73 65 20 52 42 55 5f 53 54 41      case RBU_STA
1c120 47 45 5f 4f 41 4c 3a 20 7b 0a 20 20 20 20 20 20  GE_OAL: {.      
1c130 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49    RbuObjIter *pI
1c140 74 65 72 20 3d 20 26 70 2d 3e 6f 62 6a 69 74 65  ter = &p->objite
1c150 72 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 49  r;..        /* I
1c160 66 20 74 68 69 73 20 69 73 20 61 6e 20 52 42 55  f this is an RBU
1c170 20 76 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f   vacuum operatio
1c180 6e 20 61 6e 64 20 74 68 65 20 73 74 61 74 65 20  n and the state 
1c190 74 61 62 6c 65 20 77 61 73 20 65 6d 70 74 79 0a  table was empty.
1c1a0 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20          ** when 
1c1b0 74 68 69 73 20 68 61 6e 64 6c 65 20 77 61 73 20  this handle was 
1c1c0 6f 70 65 6e 65 64 2c 20 63 72 65 61 74 65 20 74  opened, create t
1c1d0 68 65 20 74 61 72 67 65 74 20 64 61 74 61 62 61  he target databa
1c1e0 73 65 20 73 63 68 65 6d 61 2e 20 2a 2f 0a 20 20  se schema. */.  
1c1f0 20 20 20 20 20 20 69 66 28 20 72 62 75 49 73 56        if( rbuIsV
1c200 61 63 75 75 6d 28 70 29 20 26 26 20 70 2d 3e 6e  acuum(p) && p->n
1c210 50 72 6f 67 72 65 73 73 3d 3d 30 20 26 26 20 70  Progress==0 && p
1c220 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1c230 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 62 75  ){.          rbu
1c240 43 72 65 61 74 65 54 61 72 67 65 74 53 63 68 65  CreateTargetSche
1c250 6d 61 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ma(p);.         
1c260 20 72 62 75 43 6f 70 79 50 72 61 67 6d 61 28 70   rbuCopyPragma(p
1c270 2c 20 22 75 73 65 72 5f 76 65 72 73 69 6f 6e 22  , "user_version"
1c280 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 62 75  );.          rbu
1c290 43 6f 70 79 50 72 61 67 6d 61 28 70 2c 20 22 61  CopyPragma(p, "a
1c2a0 70 70 6c 69 63 61 74 69 6f 6e 5f 69 64 22 29 3b  pplication_id");
1c2b0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1c2c0 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63      while( p->rc
1c2d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1c2e0 49 74 65 72 2d 3e 7a 54 62 6c 20 29 7b 0a 0a 20  Iter->zTbl ){.. 
1c2f0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74           if( pIt
1c300 65 72 2d 3e 62 43 6c 65 61 6e 75 70 20 29 7b 0a  er->bCleanup ){.
1c310 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1c320 6c 65 61 6e 20 75 70 20 74 68 65 20 72 62 75 5f  lean up the rbu_
1c330 74 6d 70 5f 78 78 78 20 74 61 62 6c 65 20 66 6f  tmp_xxx table fo
1c340 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 74  r the previous t
1c350 61 62 6c 65 2e 20 49 74 20 0a 20 20 20 20 20 20  able. It .      
1c360 20 20 20 20 20 20 2a 2a 20 63 61 6e 6e 6f 74 20        ** cannot 
1c370 62 65 20 64 72 6f 70 70 65 64 20 61 73 20 74 68  be dropped as th
1c380 65 72 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c  ere are currentl
1c390 79 20 61 63 74 69 76 65 20 53 51 4c 20 73 74 61  y active SQL sta
1c3a0 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 20 20 20  tements..       
1c3b0 20 20 20 20 20 2a 2a 20 42 75 74 20 74 68 65 20       ** But the 
1c3c0 63 6f 6e 74 65 6e 74 73 20 63 61 6e 20 62 65 20  contents can be 
1c3d0 64 65 6c 65 74 65 64 2e 20 20 2a 2f 0a 20 20 20  deleted.  */.   
1c3e0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 62 75           if( rbu
1c3f0 49 73 56 61 63 75 75 6d 28 70 29 3d 3d 30 20 26  IsVacuum(p)==0 &
1c400 26 20 70 49 74 65 72 2d 3e 61 62 49 6e 64 65 78  & pIter->abIndex
1c410 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ed ){.          
1c420 20 20 20 20 72 62 75 4d 50 72 69 6e 74 66 45 78      rbuMPrintfEx
1c430 65 63 28 70 2c 20 70 2d 3e 64 62 52 62 75 2c 20  ec(p, p->dbRbu, 
1c440 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c450 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
1c460 25 73 2e 27 72 62 75 5f 74 6d 70 5f 25 71 27 22  %s.'rbu_tmp_%q'"
1c470 2c 20 70 2d 3e 7a 53 74 61 74 65 44 62 2c 20 70  , p->zStateDb, p
1c480 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 0a 20  Iter->zDataTbl. 
1c490 20 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a               );.
1c4a0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1c4b0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1c4c0 20 20 20 20 20 20 20 20 20 20 20 72 62 75 4f 62             rbuOb
1c4d0 6a 49 74 65 72 50 72 65 70 61 72 65 41 6c 6c 28  jIterPrepareAll(
1c4e0 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 0a 20  p, pIter, 0);.. 
1c4f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
1c500 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
1c510 74 20 72 6f 77 20 74 6f 20 70 72 6f 63 65 73 73  t row to process
1c520 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
1c530 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1c540 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1c550 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20         int rc = 
1c560 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 49 74  sqlite3_step(pIt
1c570 65 72 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  er->pSelect);.  
1c580 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1c590 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  rc==SQLITE_ROW )
1c5a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1c5b0 20 20 70 2d 3e 6e 50 72 6f 67 72 65 73 73 2b 2b    p->nProgress++
1c5c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1c5d0 20 20 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 20 20    p->nStep++;.  
1c5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1c5f0 74 75 72 6e 20 72 62 75 53 74 65 70 28 70 29 3b  turn rbuStep(p);
1c600 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1c610 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1c620 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72  ->rc = sqlite3_r
1c630 65 73 65 74 28 70 49 74 65 72 2d 3e 70 53 65 6c  eset(pIter->pSel
1c640 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ect);.          
1c650 20 20 20 20 70 2d 3e 6e 53 74 65 70 20 3d 20 30      p->nStep = 0
1c660 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1c670 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
1c680 20 20 20 20 20 20 20 72 62 75 4f 62 6a 49 74 65         rbuObjIte
1c690 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72 29 3b  rNext(p, pIter);
1c6a0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1c6b0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
1c6c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c6d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
1c6e0 74 65 72 2d 3e 7a 54 62 6c 3d 3d 30 20 29 3b 0a  ter->zTbl==0 );.
1c6f0 20 20 20 20 20 20 20 20 20 20 72 62 75 53 61 76            rbuSav
1c700 65 53 74 61 74 65 28 70 2c 20 52 42 55 5f 53 54  eState(p, RBU_ST
1c710 41 47 45 5f 4d 4f 56 45 29 3b 0a 20 20 20 20 20  AGE_MOVE);.     
1c720 20 20 20 20 20 72 62 75 49 6e 63 72 53 63 68 65       rbuIncrSche
1c730 6d 61 43 6f 6f 6b 69 65 28 70 29 3b 0a 20 20 20  maCookie(p);.   
1c740 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63         if( p->rc
1c750 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1c760 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63             p->rc
1c770 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
1c780 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 43 4f 4d 4d  p->dbMain, "COMM
1c790 49 54 22 2c 20 30 2c 20 30 2c 20 26 70 2d 3e 7a  IT", 0, 0, &p->z
1c7a0 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 20 20 20  Errmsg);.       
1c7b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
1c7c0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1c7d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1c7e0 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
1c7f0 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 52 62 75  e3_exec(p->dbRbu
1c800 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30  , "COMMIT", 0, 0
1c810 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a  , &p->zErrmsg);.
1c820 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1c830 20 20 20 20 20 20 70 2d 3e 65 53 74 61 67 65 20        p->eStage 
1c840 3d 20 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45  = RBU_STAGE_MOVE
1c850 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1c860 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1c870 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20 52   }..      case R
1c880 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 3a 20 7b  BU_STAGE_MOVE: {
1c890 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
1c8a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1c8b0 0a 20 20 20 20 20 20 20 20 20 20 72 62 75 4d 6f  .          rbuMo
1c8c0 76 65 4f 61 6c 46 69 6c 65 28 70 29 3b 0a 20 20  veOalFile(p);.  
1c8d0 20 20 20 20 20 20 20 20 70 2d 3e 6e 50 72 6f 67          p->nProg
1c8e0 72 65 73 73 2b 2b 3b 0a 20 20 20 20 20 20 20 20  ress++;.        
1c8f0 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
1c900 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1c910 63 61 73 65 20 52 42 55 5f 53 54 41 47 45 5f 43  case RBU_STAGE_C
1c920 4b 50 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  KPT: {.        i
1c930 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1c940 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1c950 20 69 66 28 20 70 2d 3e 6e 53 74 65 70 3e 3d 70   if( p->nStep>=p
1c960 2d 3e 6e 46 72 61 6d 65 20 29 7b 0a 20 20 20 20  ->nFrame ){.    
1c970 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1c980 66 69 6c 65 20 2a 70 44 62 20 3d 20 70 2d 3e 70  file *pDb = p->p
1c990 54 61 72 67 65 74 46 64 2d 3e 70 52 65 61 6c 3b  TargetFd->pReal;
1c9a0 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  .  .            
1c9b0 2f 2a 20 53 79 6e 63 20 74 68 65 20 64 62 20 66  /* Sync the db f
1c9c0 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ile */.         
1c9d0 20 20 20 70 2d 3e 72 63 20 3d 20 70 44 62 2d 3e     p->rc = pDb->
1c9e0 70 4d 65 74 68 6f 64 73 2d 3e 78 53 79 6e 63 28  pMethods->xSync(
1c9f0 70 44 62 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  pDb, SQLITE_SYNC
1ca00 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 0a 20 20 20  _NORMAL);.  .   
1ca10 20 20 20 20 20 20 20 20 20 2f 2a 20 55 70 64 61           /* Upda
1ca20 74 65 20 6e 42 61 63 6b 66 69 6c 6c 20 2a 2f 0a  te nBackfill */.
1ca30 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1ca40 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1ca50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1ca60 20 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20    void volatile 
1ca70 2a 70 74 72 3b 0a 20 20 20 20 20 20 20 20 20 20  *ptr;.          
1ca80 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 44 62 2d      p->rc = pDb-
1ca90 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4d  >pMethods->xShmM
1caa0 61 70 28 70 44 62 2c 20 30 2c 20 33 32 2a 31 30  ap(pDb, 0, 32*10
1cab0 32 34 2c 20 30 2c 20 26 70 74 72 29 3b 0a 20 20  24, 0, &ptr);.  
1cac0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1cad0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1cae0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1caf0 20 20 20 20 28 28 75 33 32 20 76 6f 6c 61 74 69      ((u32 volati
1cb00 6c 65 2a 29 70 74 72 29 5b 32 34 5d 20 3d 20 70  le*)ptr)[24] = p
1cb10 2d 3e 69 4d 61 78 46 72 61 6d 65 3b 0a 20 20 20  ->iMaxFrame;.   
1cb20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1cb30 20 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20           }.  .  
1cb40 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
1cb50 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1cb60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1cb70 70 2d 3e 65 53 74 61 67 65 20 3d 20 52 42 55 5f  p->eStage = RBU_
1cb80 53 54 41 47 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  STAGE_DONE;.    
1cb90 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
1cba0 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
1cbb0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1cbc0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1cbd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20            /* At 
1cbe0 6f 6e 65 20 70 6f 69 6e 74 20 74 68 65 20 66 6f  one point the fo
1cbf0 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 63 6f  llowing block co
1cc00 70 69 65 64 20 61 20 73 69 6e 67 6c 65 20 66 72  pied a single fr
1cc10 61 6d 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 20  ame from the.   
1cc20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 61 6c 20           ** wal 
1cc30 66 69 6c 65 20 74 6f 20 74 68 65 20 64 61 74 61  file to the data
1cc40 62 61 73 65 20 66 69 6c 65 2e 20 53 6f 20 74 68  base file. So th
1cc50 61 74 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 73  at one call to s
1cc60 71 6c 69 74 65 33 72 62 75 5f 73 74 65 70 28 29  qlite3rbu_step()
1cc70 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1cc80 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 61 20 73  checkpointed a s
1cc90 69 6e 67 6c 65 20 66 72 61 6d 65 2e 20 0a 20 20  ingle frame. .  
1cca0 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20            **.   
1ccb0 20 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65           ** Howe
1ccc0 76 65 72 2c 20 69 66 20 74 68 65 20 73 65 63 74  ver, if the sect
1ccd0 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65  or-size is large
1cce0 72 20 74 68 61 6e 20 74 68 65 20 70 61 67 65 2d  r than the page-
1ccf0 73 69 7a 65 2c 20 61 6e 64 20 74 68 65 0a 20 20  size, and the.  
1cd00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70            ** app
1cd10 6c 69 63 61 74 69 6f 6e 20 63 61 6c 6c 73 20 73  lication calls s
1cd20 71 6c 69 74 65 33 72 62 75 5f 73 61 76 65 73 74  qlite3rbu_savest
1cd30 61 74 65 28 29 20 6f 72 20 63 6c 6f 73 65 28 29  ate() or close()
1cd40 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 20 20 20   immediately.   
1cd50 20 20 20 20 20 20 20 20 20 2a 2a 20 61 66 74 65           ** afte
1cd60 72 20 74 68 69 73 20 73 74 65 70 2c 20 74 68 65  r this step, the
1cd70 6e 20 72 62 75 5f 73 74 65 70 28 29 20 61 67 61  n rbu_step() aga
1cd80 69 6e 2c 20 74 68 65 6e 20 61 20 70 6f 77 65 72  in, then a power
1cd90 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2c   failure occurs,
1cda0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1cdb0 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  then the databas
1cdc0 65 20 70 61 67 65 20 77 72 69 74 74 65 6e 20 68  e page written h
1cdd0 65 72 65 20 6d 61 79 20 62 65 20 64 61 6d 61 67  ere may be damag
1cde0 65 64 2e 20 57 6f 72 6b 20 61 72 6f 75 6e 64 0a  ed. Work around.
1cdf0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
1ce00 68 69 73 20 62 79 20 63 68 65 63 6b 70 6f 69 6e  his by checkpoin
1ce10 74 69 6e 67 20 66 72 61 6d 65 73 20 75 6e 74 69  ting frames unti
1ce20 6c 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  l the next page 
1ce30 69 6e 20 74 68 65 20 61 46 72 61 6d 65 5b 5d 0a  in the aFrame[].
1ce40 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6c              ** l
1ce50 69 65 73 20 6f 6e 20 61 20 64 69 66 66 65 72 65  ies on a differe
1ce60 6e 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 74  nt disk sector t
1ce70 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f 6e  o the current on
1ce80 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e. */.          
1ce90 20 20 75 33 32 20 69 53 65 63 74 6f 72 3b 0a 20    u32 iSector;. 
1cea0 20 20 20 20 20 20 20 20 20 20 20 64 6f 7b 0a 20             do{. 
1ceb0 20 20 20 20 20 20 20 20 20 20 20 20 20 52 62 75               Rbu
1cec0 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 20 3d 20  Frame *pFrame = 
1ced0 26 70 2d 3e 61 46 72 61 6d 65 5b 70 2d 3e 6e 53  &p->aFrame[p->nS
1cee0 74 65 70 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  tep];.          
1cef0 20 20 20 20 69 53 65 63 74 6f 72 20 3d 20 28 70      iSector = (p
1cf00 46 72 61 6d 65 2d 3e 69 44 62 50 61 67 65 2d 31  Frame->iDbPage-1
1cf10 29 20 2f 20 70 2d 3e 6e 50 61 67 65 50 65 72 53  ) / p->nPagePerS
1cf20 65 63 74 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  ector;.         
1cf30 20 20 20 20 20 72 62 75 43 68 65 63 6b 70 6f 69       rbuCheckpoi
1cf40 6e 74 46 72 61 6d 65 28 70 2c 20 70 46 72 61 6d  ntFrame(p, pFram
1cf50 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
1cf60 20 20 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 20 20    p->nStep++;.  
1cf70 20 20 20 20 20 20 20 20 20 20 7d 77 68 69 6c 65            }while
1cf80 28 20 70 2d 3e 6e 53 74 65 70 3c 70 2d 3e 6e 46  ( p->nStep<p->nF
1cf90 72 61 6d 65 20 0a 20 20 20 20 20 20 20 20 20 20  rame .          
1cfa0 20 20 20 20 20 20 20 26 26 20 69 53 65 63 74 6f         && iSecto
1cfb0 72 3d 3d 28 28 70 2d 3e 61 46 72 61 6d 65 5b 70  r==((p->aFrame[p
1cfc0 2d 3e 6e 53 74 65 70 5d 2e 69 44 62 50 61 67 65  ->nStep].iDbPage
1cfd0 2d 31 29 20 2f 20 70 2d 3e 6e 50 61 67 65 50 65  -1) / p->nPagePe
1cfe0 72 53 65 63 74 6f 72 29 0a 20 20 20 20 20 20 20  rSector).       
1cff0 20 20 20 20 20 20 20 20 20 20 26 26 20 70 2d 3e            && p->
1d000 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  rc==SQLITE_OK.  
1d010 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
1d020 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1d030 20 20 20 70 2d 3e 6e 50 72 6f 67 72 65 73 73 2b     p->nProgress+
1d040 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
1d050 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1d060 20 20 7d 0a 0a 20 20 20 20 20 20 64 65 66 61 75    }..      defau
1d070 6c 74 3a 0a 20 20 20 20 20 20 20 20 62 72 65 61  lt:.        brea
1d080 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  k;.    }.    ret
1d090 75 72 6e 20 70 2d 3e 72 63 3b 0a 20 20 7d 65 6c  urn p->rc;.  }el
1d0a0 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  se{.    return S
1d0b0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
1d0c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  .}../*.** Compar
1d0d0 65 20 73 74 72 69 6e 67 73 20 7a 31 20 61 6e 64  e strings z1 and
1d0e0 20 7a 32 2c 20 72 65 74 75 72 6e 69 6e 67 20 30   z2, returning 0
1d0f0 20 69 66 20 74 68 65 79 20 61 72 65 20 69 64 65   if they are ide
1d100 6e 74 69 63 61 6c 2c 20 6f 72 20 6e 6f 6e 2d 7a  ntical, or non-z
1d110 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65  ero.** otherwise
1d120 2e 20 45 69 74 68 65 72 20 6f 72 20 62 6f 74 68  . Either or both
1d130 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 20 62 65   argument may be
1d140 20 4e 55 4c 4c 2e 20 54 77 6f 20 4e 55 4c 4c 20   NULL. Two NULL 
1d150 76 61 6c 75 65 73 20 61 72 65 0a 2a 2a 20 63 6f  values are.** co
1d160 6e 73 69 64 65 72 65 64 20 65 71 75 61 6c 2c 20  nsidered equal, 
1d170 61 6e 64 20 4e 55 4c 4c 20 69 73 20 63 6f 6e 73  and NULL is cons
1d180 69 64 65 72 65 64 20 64 69 73 74 69 6e 63 74 20  idered distinct 
1d190 66 72 6f 6d 20 61 6c 6c 20 6f 74 68 65 72 20 76  from all other v
1d1a0 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  alues..*/.static
1d1b0 20 69 6e 74 20 72 62 75 53 74 72 43 6f 6d 70 61   int rbuStrCompa
1d1c0 72 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  re(const char *z
1d1d0 31 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  1, const char *z
1d1e0 32 29 7b 0a 20 20 69 66 28 20 7a 31 3d 3d 30 20  2){.  if( z1==0 
1d1f0 26 26 20 7a 32 3d 3d 30 20 29 20 72 65 74 75 72  && z2==0 ) retur
1d200 6e 20 30 3b 0a 20 20 69 66 28 20 7a 31 3d 3d 30  n 0;.  if( z1==0
1d210 20 7c 7c 20 7a 32 3d 3d 30 20 29 20 72 65 74 75   || z2==0 ) retu
1d220 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 28  rn 1;.  return (
1d230 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
1d240 7a 31 2c 20 7a 32 29 21 3d 30 29 3b 0a 7d 0a 0a  z1, z2)!=0);.}..
1d250 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1d260 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 73  ion is called as
1d270 20 70 61 72 74 20 6f 66 20 73 71 6c 69 74 65 33   part of sqlite3
1d280 72 62 75 5f 6f 70 65 6e 28 29 20 77 68 65 6e 20  rbu_open() when 
1d290 69 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 2a 2a 20  initializing.** 
1d2a0 61 6e 20 72 62 75 20 68 61 6e 64 6c 65 20 69 6e  an rbu handle in
1d2b0 20 4f 41 4c 20 73 74 61 67 65 2e 20 49 66 20 74   OAL stage. If t
1d2c0 68 65 20 72 62 75 20 75 70 64 61 74 65 20 68 61  he rbu update ha
1d2d0 73 20 6e 6f 74 20 73 74 61 72 74 65 64 20 28 69  s not started (i
1d2e0 2e 65 2e 0a 2a 2a 20 74 68 65 20 72 62 75 5f 73  .e..** the rbu_s
1d2f0 74 61 74 65 20 74 61 62 6c 65 20 77 61 73 20 65  tate table was e
1d300 6d 70 74 79 29 20 69 74 20 69 73 20 61 20 6e 6f  mpty) it is a no
1d310 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  -op. Otherwise, 
1d320 69 74 20 61 72 72 61 6e 67 65 73 0a 2a 2a 20 74  it arranges.** t
1d330 68 69 6e 67 73 20 73 6f 20 74 68 61 74 20 74 68  hings so that th
1d340 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 73  e next call to s
1d350 71 6c 69 74 65 33 72 62 75 5f 73 74 65 70 28 29  qlite3rbu_step()
1d360 20 63 6f 6e 74 69 6e 75 65 73 20 6f 6e 20 66 72   continues on fr
1d370 6f 6d 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20  om.** where the 
1d380 70 72 65 76 69 6f 75 73 20 72 62 75 20 68 61 6e  previous rbu han
1d390 64 6c 65 20 6c 65 66 74 20 6f 66 66 2e 0a 2a 2a  dle left off..**
1d3a0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
1d3b0 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72  occurs, an error
1d3c0 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20   code and error 
1d3d0 6d 65 73 73 61 67 65 20 61 72 65 20 6c 65 66 74  message are left
1d3e0 20 69 6e 20 74 68 65 0a 2a 2a 20 72 62 75 20 68   in the.** rbu h
1d3f0 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20  andle passed as 
1d400 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
1d410 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
1d420 69 64 20 72 62 75 53 65 74 75 70 4f 61 6c 28 73  id rbuSetupOal(s
1d430 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62  qlite3rbu *p, Rb
1d440 75 53 74 61 74 65 20 2a 70 53 74 61 74 65 29 7b  uState *pState){
1d450 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
1d460 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
1d470 20 69 66 28 20 70 53 74 61 74 65 2d 3e 7a 54 62   if( pState->zTb
1d480 6c 20 29 7b 0a 20 20 20 20 52 62 75 4f 62 6a 49  l ){.    RbuObjI
1d490 74 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70 2d  ter *pIter = &p-
1d4a0 3e 6f 62 6a 69 74 65 72 3b 0a 20 20 20 20 69 6e  >objiter;.    in
1d4b0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1d4c0 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63  ;..    while( rc
1d4d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1d4e0 49 74 65 72 2d 3e 7a 54 62 6c 20 26 26 20 28 70  Iter->zTbl && (p
1d4f0 49 74 65 72 2d 3e 62 43 6c 65 61 6e 75 70 20 0a  Iter->bCleanup .
1d500 20 20 20 20 20 20 20 7c 7c 20 72 62 75 53 74 72         || rbuStr
1d510 43 6f 6d 70 61 72 65 28 70 49 74 65 72 2d 3e 7a  Compare(pIter->z
1d520 49 64 78 2c 20 70 53 74 61 74 65 2d 3e 7a 49 64  Idx, pState->zId
1d530 78 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 53  x).       || (pS
1d540 74 61 74 65 2d 3e 7a 44 61 74 61 54 62 6c 3d 3d  tate->zDataTbl==
1d550 30 20 26 26 20 72 62 75 53 74 72 43 6f 6d 70 61  0 && rbuStrCompa
1d560 72 65 28 70 49 74 65 72 2d 3e 7a 54 62 6c 2c 20  re(pIter->zTbl, 
1d570 70 53 74 61 74 65 2d 3e 7a 54 62 6c 29 29 0a 20  pState->zTbl)). 
1d580 20 20 20 20 20 20 7c 7c 20 28 70 53 74 61 74 65        || (pState
1d590 2d 3e 7a 44 61 74 61 54 62 6c 20 26 26 20 72 62  ->zDataTbl && rb
1d5a0 75 53 74 72 43 6f 6d 70 61 72 65 28 70 49 74 65  uStrCompare(pIte
1d5b0 72 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 70 53 74  r->zDataTbl, pSt
1d5c0 61 74 65 2d 3e 7a 44 61 74 61 54 62 6c 29 29 0a  ate->zDataTbl)).
1d5d0 20 20 20 20 29 29 7b 0a 20 20 20 20 20 20 72 63      )){.      rc
1d5e0 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 4e 65 78   = rbuObjIterNex
1d5f0 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  t(p, pIter);.   
1d600 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   }..    if( rc==
1d610 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 49  SQLITE_OK && !pI
1d620 74 65 72 2d 3e 7a 54 62 6c 20 29 7b 0a 20 20 20  ter->zTbl ){.   
1d630 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
1d640 52 52 4f 52 3b 0a 20 20 20 20 20 20 70 2d 3e 7a  RROR;.      p->z
1d650 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33  Errmsg = sqlite3
1d660 5f 6d 70 72 69 6e 74 66 28 22 72 62 75 5f 73 74  _mprintf("rbu_st
1d670 61 74 65 20 6d 69 73 6d 61 74 63 68 20 65 72 72  ate mismatch err
1d680 6f 72 22 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  or");.    }..   
1d690 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d6a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  OK ){.      p->n
1d6b0 53 74 65 70 20 3d 20 70 53 74 61 74 65 2d 3e 6e  Step = pState->n
1d6c0 52 6f 77 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Row;.      rc = 
1d6d0 72 62 75 4f 62 6a 49 74 65 72 50 72 65 70 61 72  rbuObjIterPrepar
1d6e0 65 41 6c 6c 28 70 2c 20 26 70 2d 3e 6f 62 6a 69  eAll(p, &p->obji
1d6f0 74 65 72 2c 20 70 2d 3e 6e 53 74 65 70 29 3b 0a  ter, p->nStep);.
1d700 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e 72 63      }..    p->rc
1d710 20 3d 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   = rc;.  }.}../*
1d720 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20  .** If there is 
1d730 61 20 22 2a 2d 6f 61 6c 22 20 66 69 6c 65 20 69  a "*-oal" file i
1d740 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
1d750 6d 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  m corresponding 
1d760 74 6f 20 74 68 65 0a 2a 2a 20 74 61 72 67 65 74  to the.** target
1d770 20 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65   database in the
1d780 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 64 65   file-system, de
1d790 6c 65 74 65 20 69 74 2e 20 49 66 20 61 6e 20 65  lete it. If an e
1d7a0 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20  rror occurs,.** 
1d7b0 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 63  leave an error c
1d7c0 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65  ode and error me
1d7d0 73 73 61 67 65 20 69 6e 20 74 68 65 20 72 62 75  ssage in the rbu
1d7e0 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74   handle..*/.stat
1d7f0 69 63 20 76 6f 69 64 20 72 62 75 44 65 6c 65 74  ic void rbuDelet
1d800 65 4f 61 6c 46 69 6c 65 28 73 71 6c 69 74 65 33  eOalFile(sqlite3
1d810 72 62 75 20 2a 70 29 7b 0a 20 20 63 68 61 72 20  rbu *p){.  char 
1d820 2a 7a 4f 61 6c 20 3d 20 72 62 75 4d 50 72 69 6e  *zOal = rbuMPrin
1d830 74 66 28 70 2c 20 22 25 73 2d 6f 61 6c 22 2c 20  tf(p, "%s-oal", 
1d840 70 2d 3e 7a 54 61 72 67 65 74 29 3b 0a 20 20 69  p->zTarget);.  i
1d850 66 28 20 7a 4f 61 6c 20 29 7b 0a 20 20 20 20 73  f( zOal ){.    s
1d860 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1d870 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66   = sqlite3_vfs_f
1d880 69 6e 64 28 30 29 3b 0a 20 20 20 20 61 73 73 65  ind(0);.    asse
1d890 72 74 28 20 70 56 66 73 20 26 26 20 70 2d 3e 72  rt( pVfs && p->r
1d8a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1d8b0 70 2d 3e 7a 45 72 72 6d 73 67 3d 3d 30 20 29 3b  p->zErrmsg==0 );
1d8c0 0a 20 20 20 20 70 56 66 73 2d 3e 78 44 65 6c 65  .    pVfs->xDele
1d8d0 74 65 28 70 56 66 73 2c 20 7a 4f 61 6c 2c 20 30  te(pVfs, zOal, 0
1d8e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
1d8f0 72 65 65 28 7a 4f 61 6c 29 3b 0a 20 20 7d 0a 7d  ree(zOal);.  }.}
1d900 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
1d910 20 61 20 70 72 69 76 61 74 65 20 72 62 75 20 56   a private rbu V
1d920 46 53 20 66 6f 72 20 74 68 65 20 72 62 75 20 68  FS for the rbu h
1d930 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20  andle passed as 
1d940 74 68 65 20 6f 6e 6c 79 0a 2a 2a 20 61 72 67 75  the only.** argu
1d950 6d 65 6e 74 2e 20 54 68 69 73 20 56 46 53 20 77  ment. This VFS w
1d960 69 6c 6c 20 62 65 20 75 73 65 64 20 75 6e 6c 65  ill be used unle
1d970 73 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  ss the call to s
1d980 71 6c 69 74 65 33 72 62 75 5f 6f 70 65 6e 28 29  qlite3rbu_open()
1d990 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 61 20  .** specified a 
1d9a0 55 52 49 20 77 69 74 68 20 61 20 76 66 73 3d 3f  URI with a vfs=?
1d9b0 20 6f 70 74 69 6f 6e 20 69 6e 20 70 6c 61 63 65   option in place
1d9c0 20 6f 66 20 61 20 74 61 72 67 65 74 20 64 61 74   of a target dat
1d9d0 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 6e 61  abase.** file na
1d9e0 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  me..*/.static vo
1d9f0 69 64 20 72 62 75 43 72 65 61 74 65 56 66 73 28  id rbuCreateVfs(
1da00 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a  sqlite3rbu *p){.
1da10 20 20 69 6e 74 20 72 6e 64 3b 0a 20 20 63 68 61    int rnd;.  cha
1da20 72 20 7a 52 6e 64 5b 36 34 5d 3b 0a 0a 20 20 61  r zRnd[64];..  a
1da30 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
1da40 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c  LITE_OK );.  sql
1da50 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
1da60 73 69 7a 65 6f 66 28 69 6e 74 29 2c 20 28 76 6f  sizeof(int), (vo
1da70 69 64 2a 29 26 72 6e 64 29 3b 0a 20 20 73 71 6c  id*)&rnd);.  sql
1da80 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
1da90 7a 65 6f 66 28 7a 52 6e 64 29 2c 20 7a 52 6e 64  zeof(zRnd), zRnd
1daa0 2c 20 22 72 62 75 5f 76 66 73 5f 25 64 22 2c 20  , "rbu_vfs_%d", 
1dab0 72 6e 64 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20  rnd);.  p->rc = 
1dac0 73 71 6c 69 74 65 33 72 62 75 5f 63 72 65 61 74  sqlite3rbu_creat
1dad0 65 5f 76 66 73 28 7a 52 6e 64 2c 20 30 29 3b 0a  e_vfs(zRnd, 0);.
1dae0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1daf0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
1db00 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
1db10 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  = sqlite3_vfs_fi
1db20 6e 64 28 7a 52 6e 64 29 3b 0a 20 20 20 20 61 73  nd(zRnd);.    as
1db30 73 65 72 74 28 20 70 56 66 73 20 29 3b 0a 20 20  sert( pVfs );.  
1db40 20 20 70 2d 3e 7a 56 66 73 4e 61 6d 65 20 3d 20    p->zVfsName = 
1db50 70 56 66 73 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pVfs->zName;.   
1db60 20 28 28 72 62 75 5f 76 66 73 2a 29 70 56 66 73   ((rbu_vfs*)pVfs
1db70 29 2d 3e 70 52 62 75 20 3d 20 70 3b 0a 20 20 7d  )->pRbu = p;.  }
1db80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f  .}../*.** Destro
1db90 79 20 74 68 65 20 70 72 69 76 61 74 65 20 56 46  y the private VF
1dba0 53 20 63 72 65 61 74 65 64 20 66 6f 72 20 74 68  S created for th
1dbb0 65 20 72 62 75 20 68 61 6e 64 6c 65 20 70 61 73  e rbu handle pas
1dbc0 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 0a  sed as the only.
1dbd0 2a 2a 20 61 72 67 75 6d 65 6e 74 20 62 79 20 61  ** argument by a
1dbe0 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74  n earlier call t
1dbf0 6f 20 72 62 75 43 72 65 61 74 65 56 66 73 28 29  o rbuCreateVfs()
1dc00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1dc10 20 72 62 75 44 65 6c 65 74 65 56 66 73 28 73 71   rbuDeleteVfs(sq
1dc20 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20  lite3rbu *p){.  
1dc30 69 66 28 20 70 2d 3e 7a 56 66 73 4e 61 6d 65 20  if( p->zVfsName 
1dc40 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 72 62  ){.    sqlite3rb
1dc50 75 5f 64 65 73 74 72 6f 79 5f 76 66 73 28 70 2d  u_destroy_vfs(p-
1dc60 3e 7a 56 66 73 4e 61 6d 65 29 3b 0a 20 20 20 20  >zVfsName);.    
1dc70 70 2d 3e 7a 56 66 73 4e 61 6d 65 20 3d 20 30 3b  p->zVfsName = 0;
1dc80 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
1dc90 69 73 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  is user-defined 
1dca0 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  SQL function is 
1dcb0 69 6e 76 6f 6b 65 64 20 77 69 74 68 20 61 20 73  invoked with a s
1dcc0 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 2d  ingle argument -
1dcd0 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20   the.** name of 
1dce0 61 20 74 61 62 6c 65 20 65 78 70 65 63 74 65 64  a table expected
1dcf0 20 74 6f 20 61 70 70 65 61 72 20 69 6e 20 74 68   to appear in th
1dd00 65 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73  e target databas
1dd10 65 2e 20 49 74 20 72 65 74 75 72 6e 73 0a 2a 2a  e. It returns.**
1dd20 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
1dd30 75 78 69 6c 6c 69 61 72 79 20 69 6e 64 65 78 65  uxilliary indexe
1dd40 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  s on the table..
1dd50 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
1dd60 62 75 49 6e 64 65 78 43 6e 74 46 75 6e 63 28 0a  buIndexCntFunc(.
1dd70 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
1dd80 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20  t *pCtx, .  int 
1dd90 6e 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f  nVal,.  sqlite3_
1dda0 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b  value **apVal.){
1ddb0 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70  .  sqlite3rbu *p
1ddc0 20 3d 20 28 73 71 6c 69 74 65 33 72 62 75 2a 29   = (sqlite3rbu*)
1ddd0 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
1dde0 61 28 70 43 74 78 29 3b 0a 20 20 73 71 6c 69 74  a(pCtx);.  sqlit
1ddf0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
1de00 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72   0;.  char *zErr
1de10 6d 73 67 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  msg = 0;.  int r
1de20 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 56  c;..  assert( nV
1de30 61 6c 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 72 63  al==1 );.  .  rc
1de40 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e   = prepareFreeAn
1de50 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d  dCollectError(p-
1de60 3e 64 62 4d 61 69 6e 2c 20 26 70 53 74 6d 74 2c  >dbMain, &pStmt,
1de70 20 26 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20   &zErrmsg, .    
1de80 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
1de90 66 28 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28  f("SELECT count(
1dea0 2a 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  *) FROM sqlite_m
1deb0 61 73 74 65 72 20 22 0a 20 20 20 20 20 20 20 20  aster ".        
1dec0 22 57 48 45 52 45 20 74 79 70 65 3d 27 69 6e 64  "WHERE type='ind
1ded0 65 78 27 20 41 4e 44 20 74 62 6c 5f 6e 61 6d 65  ex' AND tbl_name
1dee0 20 3d 20 25 51 22 2c 20 73 71 6c 69 74 65 33 5f   = %Q", sqlite3_
1def0 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c  value_text(apVal
1df00 5b 30 5d 29 29 0a 20 20 29 3b 0a 20 20 69 66 28  [0])).  );.  if(
1df10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1df20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
1df30 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c  sult_error(pCtx,
1df40 20 7a 45 72 72 6d 73 67 2c 20 2d 31 29 3b 0a 20   zErrmsg, -1);. 
1df50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
1df60 6e 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20  nIndex = 0;.    
1df70 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  if( SQLITE_ROW==
1df80 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
1df90 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 49 6e  mt) ){.      nIn
1dfa0 64 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  dex = sqlite3_co
1dfb0 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20  lumn_int(pStmt, 
1dfc0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  0);.    }.    rc
1dfd0 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   = sqlite3_final
1dfe0 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
1dff0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1e000 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
1e010 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 70 43  e3_result_int(pC
1e020 74 78 2c 20 6e 49 6e 64 65 78 29 3b 0a 20 20 20  tx, nIndex);.   
1e030 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
1e040 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
1e050 6f 72 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33  or(pCtx, sqlite3
1e060 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 4d 61 69  _errmsg(p->dbMai
1e070 6e 29 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20  n), -1);.    }. 
1e080 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   }..  sqlite3_fr
1e090 65 65 28 7a 45 72 72 6d 73 67 29 3b 0a 7d 0a 0a  ee(zErrmsg);.}..
1e0a0 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 52 42 55  /*.** If the RBU
1e0b0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
1e0c0 6e 73 20 74 68 65 20 72 62 75 5f 63 6f 75 6e 74  ns the rbu_count
1e0d0 20 74 61 62 6c 65 2c 20 75 73 65 20 69 74 20 74   table, use it t
1e0e0 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 2a 2a 20  o initialize.** 
1e0f0 74 68 65 20 73 71 6c 69 74 65 33 72 62 75 2e 6e  the sqlite3rbu.n
1e100 50 68 61 73 65 4f 6e 65 53 74 65 70 20 76 61 72  PhaseOneStep var
1e110 69 61 62 6c 65 2e 20 54 68 65 20 73 63 68 65 6d  iable. The schem
1e120 61 20 6f 66 20 74 68 65 20 72 62 75 5f 63 6f 75  a of the rbu_cou
1e130 6e 74 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20 61  nt table.** is a
1e140 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69  ssumed to contai
1e150 6e 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d  n the same colum
1e160 6e 73 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 43  ns as:.**.**   C
1e170 52 45 41 54 45 20 54 41 42 4c 45 20 72 62 75 5f  REATE TABLE rbu_
1e180 63 6f 75 6e 74 28 74 62 6c 20 54 45 58 54 20 50  count(tbl TEXT P
1e190 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 6e 74 20  RIMARY KEY, cnt 
1e1a0 49 4e 54 45 47 45 52 29 20 57 49 54 48 4f 55 54  INTEGER) WITHOUT
1e1b0 20 52 4f 57 49 44 3b 0a 2a 2a 0a 2a 2a 20 54 68   ROWID;.**.** Th
1e1c0 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e  ere should be on
1e1d0 65 20 72 6f 77 20 69 6e 20 74 68 65 20 74 61 62  e row in the tab
1e1e0 6c 65 20 66 6f 72 20 65 61 63 68 20 64 61 74 61  le for each data
1e1f0 5f 78 78 78 20 74 61 62 6c 65 20 69 6e 20 74 68  _xxx table in th
1e200 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54  e.** database. T
1e210 68 65 20 27 74 62 6c 27 20 63 6f 6c 75 6d 6e 20  he 'tbl' column 
1e220 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 20 74  should contain t
1e230 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74  he name of a dat
1e240 61 5f 78 78 78 20 74 61 62 6c 65 2c 0a 2a 2a 20  a_xxx table,.** 
1e250 61 6e 64 20 74 68 65 20 63 6e 74 20 63 6f 6c 75  and the cnt colu
1e260 6d 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  mn the number of
1e270 20 72 6f 77 73 20 69 74 20 63 6f 6e 74 61 69 6e   rows it contain
1e280 73 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33  s..**.** sqlite3
1e290 72 62 75 2e 6e 50 68 61 73 65 4f 6e 65 53 74 65  rbu.nPhaseOneSte
1e2a0 70 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  p is initialized
1e2b0 20 74 6f 20 74 68 65 20 73 75 6d 20 6f 66 20 28   to the sum of (
1e2c0 31 20 2b 20 6e 49 6e 64 65 78 29 20 2a 20 63 6e  1 + nIndex) * cn
1e2d0 74 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 72 6f 77  t.** for all row
1e2e0 73 20 69 6e 20 74 68 65 20 72 62 75 5f 63 6f 75  s in the rbu_cou
1e2f0 6e 74 20 74 61 62 6c 65 2c 20 77 68 65 72 65 20  nt table, where 
1e300 6e 49 6e 64 65 78 20 69 73 20 74 68 65 20 6e 75  nIndex is the nu
1e310 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 69 6e 64 65  mber of .** inde
1e320 78 65 73 20 6f 6e 20 74 68 65 20 63 6f 72 72 65  xes on the corre
1e330 73 70 6f 6e 64 69 6e 67 20 74 61 72 67 65 74 20  sponding target 
1e340 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a  database table..
1e350 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
1e360 62 75 49 6e 69 74 50 68 61 73 65 4f 6e 65 53 74  buInitPhaseOneSt
1e370 65 70 73 28 73 71 6c 69 74 65 33 72 62 75 20 2a  eps(sqlite3rbu *
1e380 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  p){.  if( p->rc=
1e390 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e3a0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1e3b0 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 69  pStmt = 0;.    i
1e3c0 6e 74 20 62 45 78 69 73 74 73 20 3d 20 30 3b 20  nt bExists = 0; 
1e3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e3e0 2a 20 54 72 75 65 20 69 66 20 72 62 75 5f 63 6f  * True if rbu_co
1e3f0 75 6e 74 20 65 78 69 73 74 73 20 2a 2f 0a 0a 20  unt exists */.. 
1e400 20 20 20 70 2d 3e 6e 50 68 61 73 65 4f 6e 65 53     p->nPhaseOneS
1e410 74 65 70 20 3d 20 2d 31 3b 0a 0a 20 20 20 20 70  tep = -1;..    p
1e420 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63  ->rc = sqlite3_c
1e430 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70  reate_function(p
1e440 2d 3e 64 62 52 62 75 2c 20 0a 20 20 20 20 20 20  ->dbRbu, .      
1e450 20 20 22 72 62 75 5f 69 6e 64 65 78 5f 63 6e 74    "rbu_index_cnt
1e460 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
1e470 38 2c 20 28 76 6f 69 64 2a 29 70 2c 20 72 62 75  8, (void*)p, rbu
1e480 49 6e 64 65 78 43 6e 74 46 75 6e 63 2c 20 30 2c  IndexCntFunc, 0,
1e490 20 30 0a 20 20 20 20 29 3b 0a 20 20 0a 20 20 20   0.    );.  .   
1e4a0 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 74 68   /* Check for th
1e4b0 65 20 72 62 75 5f 63 6f 75 6e 74 20 74 61 62 6c  e rbu_count tabl
1e4c0 65 2e 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f  e. If it does no
1e4d0 74 20 65 78 69 73 74 2c 20 6f 72 20 69 66 20 61  t exist, or if a
1e4e0 6e 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20 6f  n error.    ** o
1e4f0 63 63 75 72 73 2c 20 6e 50 68 61 73 65 4f 6e 65  ccurs, nPhaseOne
1e500 53 74 65 70 20 77 69 6c 6c 20 62 65 20 6c 65 66  Step will be lef
1e510 74 20 73 65 74 20 74 6f 20 2d 31 2e 20 2a 2f 0a  t set to -1. */.
1e520 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
1e530 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e540 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72    p->rc = prepar
1e550 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72  eAndCollectError
1e560 28 70 2d 3e 64 62 52 62 75 2c 20 26 70 53 74 6d  (p->dbRbu, &pStm
1e570 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a  t, &p->zErrmsg,.
1e580 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
1e590 54 20 31 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  T 1 FROM sqlite_
1e5a0 6d 61 73 74 65 72 20 57 48 45 52 45 20 74 62 6c  master WHERE tbl
1e5b0 5f 6e 61 6d 65 20 3d 20 27 72 62 75 5f 63 6f 75  _name = 'rbu_cou
1e5c0 6e 74 27 22 0a 20 20 20 20 20 20 29 3b 0a 20 20  nt'".      );.  
1e5d0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 72    }.    if( p->r
1e5e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1e5f0 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
1e600 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
1e610 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20  ep(pStmt) ){.   
1e620 20 20 20 20 20 62 45 78 69 73 74 73 20 3d 20 31       bExists = 1
1e630 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e640 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
1e650 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
1e660 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
1e670 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1e680 4f 4b 20 26 26 20 62 45 78 69 73 74 73 20 29 7b  OK && bExists ){
1e690 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70  .      p->rc = p
1e6a0 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74  repareAndCollect
1e6b0 45 72 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20  Error(p->dbRbu, 
1e6c0 26 70 53 74 6d 74 2c 20 26 70 2d 3e 7a 45 72 72  &pStmt, &p->zErr
1e6d0 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20 22  msg,.          "
1e6e0 53 45 4c 45 43 54 20 73 75 6d 28 63 6e 74 20 2a  SELECT sum(cnt *
1e6f0 20 28 31 20 2b 20 72 62 75 5f 69 6e 64 65 78 5f   (1 + rbu_index_
1e700 63 6e 74 28 72 62 75 5f 74 61 72 67 65 74 5f 6e  cnt(rbu_target_n
1e710 61 6d 65 28 74 62 6c 29 29 29 29 22 0a 20 20 20  ame(tbl))))".   
1e720 20 20 20 20 20 20 20 22 46 52 4f 4d 20 72 62 75         "FROM rbu
1e730 5f 63 6f 75 6e 74 22 0a 20 20 20 20 20 20 29 3b  _count".      );
1e740 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
1e750 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1e760 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54         if( SQLIT
1e770 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
1e780 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20  tep(pStmt) ){.  
1e790 20 20 20 20 20 20 20 20 70 2d 3e 6e 50 68 61 73          p->nPhas
1e7a0 65 4f 6e 65 53 74 65 70 20 3d 20 73 71 6c 69 74  eOneStep = sqlit
1e7b0 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  e3_column_int64(
1e7c0 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20  pStmt, 0);.     
1e7d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e     }.        p->
1e7e0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e  rc = sqlite3_fin
1e7f0 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
1e800 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1e810 7d 0a 0a 0a 73 74 61 74 69 63 20 73 71 6c 69 74  }...static sqlit
1e820 65 33 72 62 75 20 2a 6f 70 65 6e 52 62 75 48 61  e3rbu *openRbuHa
1e830 6e 64 6c 65 28 0a 20 20 63 6f 6e 73 74 20 63 68  ndle(.  const ch
1e840 61 72 20 2a 7a 54 61 72 67 65 74 2c 20 0a 20 20  ar *zTarget, .  
1e850 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 62 75  const char *zRbu
1e860 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
1e870 7a 53 74 61 74 65 0a 29 7b 0a 20 20 73 71 6c 69  zState.){.  sqli
1e880 74 65 33 72 62 75 20 2a 70 3b 0a 20 20 73 69 7a  te3rbu *p;.  siz
1e890 65 5f 74 20 6e 54 61 72 67 65 74 20 3d 20 7a 54  e_t nTarget = zT
1e8a0 61 72 67 65 74 20 3f 20 73 74 72 6c 65 6e 28 7a  arget ? strlen(z
1e8b0 54 61 72 67 65 74 29 20 3a 20 30 3b 0a 20 20 73  Target) : 0;.  s
1e8c0 69 7a 65 5f 74 20 6e 52 62 75 20 3d 20 73 74 72  ize_t nRbu = str
1e8d0 6c 65 6e 28 7a 52 62 75 29 3b 0a 20 20 73 69 7a  len(zRbu);.  siz
1e8e0 65 5f 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  e_t nByte = size
1e8f0 6f 66 28 73 71 6c 69 74 65 33 72 62 75 29 20 2b  of(sqlite3rbu) +
1e900 20 6e 54 61 72 67 65 74 2b 31 20 2b 20 6e 52 62   nTarget+1 + nRb
1e910 75 2b 31 3b 0a 0a 20 20 70 20 3d 20 28 73 71 6c  u+1;..  p = (sql
1e920 69 74 65 33 72 62 75 2a 29 73 71 6c 69 74 65 33  ite3rbu*)sqlite3
1e930 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29  _malloc64(nByte)
1e940 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
1e950 20 52 62 75 53 74 61 74 65 20 2a 70 53 74 61 74   RbuState *pStat
1e960 65 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43  e = 0;..    /* C
1e970 72 65 61 74 65 20 74 68 65 20 63 75 73 74 6f 6d  reate the custom
1e980 20 56 46 53 2e 20 2a 2f 0a 20 20 20 20 6d 65 6d   VFS. */.    mem
1e990 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
1e9a0 28 73 71 6c 69 74 65 33 72 62 75 29 29 3b 0a 20  (sqlite3rbu));. 
1e9b0 20 20 20 72 62 75 43 72 65 61 74 65 56 66 73 28     rbuCreateVfs(
1e9c0 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e  p);..    /* Open
1e9d0 20 74 68 65 20 74 61 72 67 65 74 2c 20 52 42 55   the target, RBU
1e9e0 20 61 6e 64 20 73 74 61 74 65 20 64 61 74 61 62   and state datab
1e9f0 61 73 65 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ases */.    if( 
1ea00 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1ea10 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
1ea20 70 43 73 72 20 3d 20 28 63 68 61 72 2a 29 26 70  pCsr = (char*)&p
1ea30 5b 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 62  [1];.      int b
1ea40 52 65 74 72 79 20 3d 20 30 3b 0a 20 20 20 20 20  Retry = 0;.     
1ea50 20 69 66 28 20 7a 54 61 72 67 65 74 20 29 7b 0a   if( zTarget ){.
1ea60 20 20 20 20 20 20 20 20 70 2d 3e 7a 54 61 72 67          p->zTarg
1ea70 65 74 20 3d 20 70 43 73 72 3b 0a 20 20 20 20 20  et = pCsr;.     
1ea80 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 7a 54 61     memcpy(p->zTa
1ea90 72 67 65 74 2c 20 7a 54 61 72 67 65 74 2c 20 6e  rget, zTarget, n
1eaa0 54 61 72 67 65 74 2b 31 29 3b 0a 20 20 20 20 20  Target+1);.     
1eab0 20 20 20 70 43 73 72 20 2b 3d 20 6e 54 61 72 67     pCsr += nTarg
1eac0 65 74 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  et+1;.      }.  
1ead0 20 20 20 20 70 2d 3e 7a 52 62 75 20 3d 20 70 43      p->zRbu = pC
1eae0 73 72 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  sr;.      memcpy
1eaf0 28 70 2d 3e 7a 52 62 75 2c 20 7a 52 62 75 2c 20  (p->zRbu, zRbu, 
1eb00 6e 52 62 75 2b 31 29 3b 0a 20 20 20 20 20 20 70  nRbu+1);.      p
1eb10 43 73 72 20 2b 3d 20 6e 52 62 75 2b 31 3b 0a 20  Csr += nRbu+1;. 
1eb20 20 20 20 20 20 69 66 28 20 7a 53 74 61 74 65 20       if( zState 
1eb30 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 53  ){.        p->zS
1eb40 74 61 74 65 20 3d 20 72 62 75 4d 50 72 69 6e 74  tate = rbuMPrint
1eb50 66 28 70 2c 20 22 25 73 22 2c 20 7a 53 74 61 74  f(p, "%s", zStat
1eb60 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  e);.      }..   
1eb70 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 72     /* If the fir
1eb80 73 74 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 70  st attempt to op
1eb90 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  en the database 
1eba0 66 69 6c 65 20 66 61 69 6c 73 20 61 6e 64 20 74  file fails and t
1ebb0 68 65 20 62 52 65 74 72 79 0a 20 20 20 20 20 20  he bRetry.      
1ebc0 2a 2a 20 66 6c 61 67 20 69 74 20 73 65 74 2c 20  ** flag it set, 
1ebd0 74 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  this means that 
1ebe0 74 68 65 20 64 62 20 77 61 73 20 6e 6f 74 20 6f  the db was not o
1ebf0 70 65 6e 65 64 20 62 65 63 61 75 73 65 20 69 74  pened because it
1ec00 20 73 65 65 6d 65 64 0a 20 20 20 20 20 20 2a 2a   seemed.      **
1ec10 20 74 6f 20 62 65 20 61 20 77 61 6c 2d 6d 6f 64   to be a wal-mod
1ec20 65 20 64 62 2e 20 42 75 74 2c 20 74 68 69 73 20  e db. But, this 
1ec30 6d 61 79 20 68 61 76 65 20 68 61 70 70 65 6e 65  may have happene
1ec40 64 20 64 75 65 20 74 6f 20 61 6e 20 65 61 72 6c  d due to an earl
1ec50 69 65 72 0a 20 20 20 20 20 20 2a 2a 20 52 42 55  ier.      ** RBU
1ec60 20 76 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f   vacuum operatio
1ec70 6e 20 6c 65 61 76 69 6e 67 20 61 6e 20 6f 6c 64  n leaving an old
1ec80 20 77 61 6c 20 66 69 6c 65 20 69 6e 20 74 68 65   wal file in the
1ec90 20 64 69 72 65 63 74 6f 72 79 2e 0a 20 20 20 20   directory..    
1eca0 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
1ecb0 74 68 65 20 63 61 73 65 2c 20 69 74 20 77 69 6c  the case, it wil
1ecc0 6c 20 68 61 76 65 20 62 65 65 6e 20 63 68 65 63  l have been chec
1ecd0 6b 70 6f 69 6e 74 65 64 20 61 6e 64 20 64 65 6c  kpointed and del
1ece0 65 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 77 68  eted.      ** wh
1ecf0 65 6e 20 74 68 65 20 68 61 6e 64 6c 65 20 77 61  en the handle wa
1ed00 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 61 20 73  s closed and a s
1ed10 65 63 6f 6e 64 20 61 74 74 65 6d 70 74 20 74 6f  econd attempt to
1ed20 20 6f 70 65 6e 20 74 68 65 20 0a 20 20 20 20 20   open the .     
1ed30 20 2a 2a 20 64 61 74 61 62 61 73 65 20 6d 61 79   ** database may
1ed40 20 73 75 63 63 65 65 64 2e 20 20 2a 2f 0a 20 20   succeed.  */.  
1ed50 20 20 20 20 72 62 75 4f 70 65 6e 44 61 74 61 62      rbuOpenDatab
1ed60 61 73 65 28 70 2c 20 26 62 52 65 74 72 79 29 3b  ase(p, &bRetry);
1ed70 0a 20 20 20 20 20 20 69 66 28 20 62 52 65 74 72  .      if( bRetr
1ed80 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72 62 75  y ){.        rbu
1ed90 4f 70 65 6e 44 61 74 61 62 61 73 65 28 70 2c 20  OpenDatabase(p, 
1eda0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
1edb0 7d 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  }..    if( p->rc
1edc0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1edd0 20 20 20 20 20 70 53 74 61 74 65 20 3d 20 72 62       pState = rb
1ede0 75 4c 6f 61 64 53 74 61 74 65 28 70 29 3b 0a 20  uLoadState(p);. 
1edf0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74       assert( pSt
1ee00 61 74 65 20 7c 7c 20 70 2d 3e 72 63 21 3d 53 51  ate || p->rc!=SQ
1ee10 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
1ee20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1ee30 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 20 20  TE_OK ){..      
1ee40 20 20 69 66 28 20 70 53 74 61 74 65 2d 3e 65 53    if( pState->eS
1ee50 74 61 67 65 3d 3d 30 20 29 7b 20 0a 20 20 20 20  tage==0 ){ .    
1ee60 20 20 20 20 20 20 72 62 75 44 65 6c 65 74 65 4f        rbuDeleteO
1ee70 61 6c 46 69 6c 65 28 70 29 3b 0a 20 20 20 20 20  alFile(p);.     
1ee80 20 20 20 20 20 72 62 75 49 6e 69 74 50 68 61 73       rbuInitPhas
1ee90 65 4f 6e 65 53 74 65 70 73 28 70 29 3b 0a 20 20  eOneSteps(p);.  
1eea0 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 67          p->eStag
1eeb0 65 20 3d 20 52 42 55 5f 53 54 41 47 45 5f 4f 41  e = RBU_STAGE_OA
1eec0 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  L;.        }else
1eed0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 65  {.          p->e
1eee0 53 74 61 67 65 20 3d 20 70 53 74 61 74 65 2d 3e  Stage = pState->
1eef0 65 53 74 61 67 65 3b 0a 20 20 20 20 20 20 20 20  eStage;.        
1ef00 20 20 70 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74    p->nPhaseOneSt
1ef10 65 70 20 3d 20 70 53 74 61 74 65 2d 3e 6e 50 68  ep = pState->nPh
1ef20 61 73 65 4f 6e 65 53 74 65 70 3b 0a 20 20 20 20  aseOneStep;.    
1ef30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d      }.        p-
1ef40 3e 6e 50 72 6f 67 72 65 73 73 20 3d 20 70 53 74  >nProgress = pSt
1ef50 61 74 65 2d 3e 6e 50 72 6f 67 72 65 73 73 3b 0a  ate->nProgress;.
1ef60 20 20 20 20 20 20 20 20 70 2d 3e 69 4f 61 6c 53          p->iOalS
1ef70 7a 20 3d 20 70 53 74 61 74 65 2d 3e 69 4f 61 6c  z = pState->iOal
1ef80 53 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Sz;.      }.    
1ef90 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  }.    assert( p-
1efa0 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc!=SQLITE_OK |
1efb0 7c 20 70 2d 3e 65 53 74 61 67 65 21 3d 30 20 29  | p->eStage!=0 )
1efc0 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  ;..    if( p->rc
1efd0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1efe0 2d 3e 70 54 61 72 67 65 74 46 64 2d 3e 70 57 61  ->pTargetFd->pWa
1eff0 6c 46 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28  lFd ){.      if(
1f000 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f   p->eStage==RBU_
1f010 53 54 41 47 45 5f 4f 41 4c 20 29 7b 0a 20 20 20  STAGE_OAL ){.   
1f020 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c       p->rc = SQL
1f030 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
1f040 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20     p->zErrmsg = 
1f050 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
1f060 22 63 61 6e 6e 6f 74 20 75 70 64 61 74 65 20 77  "cannot update w
1f070 61 6c 20 6d 6f 64 65 20 64 61 74 61 62 61 73 65  al mode database
1f080 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ");.      }else 
1f090 69 66 28 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52  if( p->eStage==R
1f0a0 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 20 29 7b  BU_STAGE_MOVE ){
1f0b0 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
1f0c0 67 65 20 3d 20 52 42 55 5f 53 54 41 47 45 5f 43  ge = RBU_STAGE_C
1f0d0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  KPT;.        p->
1f0e0 6e 53 74 65 70 20 3d 20 30 3b 0a 20 20 20 20 20  nStep = 0;.     
1f0f0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66   }.    }..    if
1f100 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1f110 4f 4b 20 0a 20 20 20 20 20 26 26 20 28 70 2d 3e  OK .     && (p->
1f120 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47  eStage==RBU_STAG
1f130 45 5f 4f 41 4c 20 7c 7c 20 70 2d 3e 65 53 74 61  E_OAL || p->eSta
1f140 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f  ge==RBU_STAGE_MO
1f150 56 45 29 0a 20 20 20 20 20 26 26 20 70 53 74 61  VE).     && pSta
1f160 74 65 2d 3e 65 53 74 61 67 65 21 3d 30 0a 20 20  te->eStage!=0.  
1f170 20 20 29 7b 0a 20 20 20 20 20 20 72 62 75 5f 66    ){.      rbu_f
1f180 69 6c 65 20 2a 70 46 64 20 3d 20 28 72 62 75 49  ile *pFd = (rbuI
1f190 73 56 61 63 75 75 6d 28 70 29 20 3f 20 70 2d 3e  sVacuum(p) ? p->
1f1a0 70 52 62 75 46 64 20 3a 20 70 2d 3e 70 54 61 72  pRbuFd : p->pTar
1f1b0 67 65 74 46 64 29 3b 0a 20 20 20 20 20 20 69 66  getFd);.      if
1f1c0 28 20 70 46 64 2d 3e 69 43 6f 6f 6b 69 65 21 3d  ( pFd->iCookie!=
1f1d0 70 53 74 61 74 65 2d 3e 69 43 6f 6f 6b 69 65 20  pState->iCookie 
1f1e0 29 7b 20 20 20 0a 20 20 20 20 20 20 20 20 2f 2a  ){   .        /*
1f1f0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 28   At this point (
1f200 70 54 61 72 67 65 74 46 64 2d 3e 69 43 6f 6f 6b  pTargetFd->iCook
1f210 69 65 29 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ie) contains the
1f220 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 20 20   value of the.  
1f230 20 20 20 20 20 20 2a 2a 20 63 68 61 6e 67 65 2d        ** change-
1f240 63 6f 75 6e 74 65 72 20 63 6f 6f 6b 69 65 20 28  counter cookie (
1f250 74 68 65 20 74 68 69 6e 67 20 74 68 61 74 20 67  the thing that g
1f260 65 74 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20  ets incremented 
1f270 77 68 65 6e 20 61 20 0a 20 20 20 20 20 20 20 20  when a .        
1f280 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
1f290 73 20 63 6f 6d 6d 69 74 74 65 64 20 69 6e 20 72  s committed in r
1f2a0 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 29 20 63 75  ollback mode) cu
1f2b0 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 6f  rrently stored o
1f2c0 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  n .        ** pa
1f2d0 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61  ge 1 of the data
1f2e0 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
1f2f0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
1f300 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
1f310 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20     p->zErrmsg = 
1f320 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
1f330 22 64 61 74 61 62 61 73 65 20 6d 6f 64 69 66 69  "database modifi
1f340 65 64 20 64 75 72 69 6e 67 20 72 62 75 20 25 73  ed during rbu %s
1f350 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  ",.            (
1f360 72 62 75 49 73 56 61 63 75 75 6d 28 70 29 20 3f  rbuIsVacuum(p) ?
1f370 20 22 76 61 63 75 75 6d 22 20 3a 20 22 75 70 64   "vacuum" : "upd
1f380 61 74 65 22 29 0a 20 20 20 20 20 20 20 20 29 3b  ate").        );
1f390 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1f3a0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
1f3b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f3c0 20 20 69 66 28 20 70 2d 3e 65 53 74 61 67 65 3d    if( p->eStage=
1f3d0 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 29  =RBU_STAGE_OAL )
1f3e0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1f3f0 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 4d 61 69  3 *db = p->dbMai
1f400 6e 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63  n;.        p->rc
1f410 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
1f420 70 2d 3e 64 62 52 62 75 2c 20 22 42 45 47 49 4e  p->dbRbu, "BEGIN
1f430 22 2c 20 30 2c 20 30 2c 20 26 70 2d 3e 7a 45 72  ", 0, 0, &p->zEr
1f440 72 6d 73 67 29 3b 0a 0a 20 20 20 20 20 20 20 20  rmsg);..        
1f450 2f 2a 20 50 6f 69 6e 74 20 74 68 65 20 6f 62 6a  /* Point the obj
1f460 65 63 74 20 69 74 65 72 61 74 6f 72 20 61 74 20  ect iterator at 
1f470 74 68 65 20 66 69 72 73 74 20 6f 62 6a 65 63 74  the first object
1f480 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
1f490 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1f4a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
1f4b0 3e 72 63 20 3d 20 72 62 75 4f 62 6a 49 74 65 72  >rc = rbuObjIter
1f4c0 46 69 72 73 74 28 70 2c 20 26 70 2d 3e 6f 62 6a  First(p, &p->obj
1f4d0 69 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  iter);.        }
1f4e0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ..        /* If 
1f4f0 74 68 65 20 52 42 55 20 64 61 74 61 62 61 73 65  the RBU database
1f500 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74   contains no dat
1f510 61 5f 78 78 78 20 74 61 62 6c 65 73 2c 20 64 65  a_xxx tables, de
1f520 63 6c 61 72 65 20 74 68 65 20 52 42 55 0a 20 20  clare the RBU.  
1f530 20 20 20 20 20 20 2a 2a 20 75 70 64 61 74 65 20        ** update 
1f540 66 69 6e 69 73 68 65 64 2e 20 20 2a 2f 0a 20 20  finished.  */.  
1f550 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
1f560 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d  =SQLITE_OK && p-
1f570 3e 6f 62 6a 69 74 65 72 2e 7a 54 62 6c 3d 3d 30  >objiter.zTbl==0
1f580 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
1f590 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e  >rc = SQLITE_DON
1f5a0 45 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  E;.          p->
1f5b0 65 53 74 61 67 65 20 3d 20 52 42 55 5f 53 54 41  eStage = RBU_STA
1f5c0 47 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 20  GE_DONE;.       
1f5d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1f5e0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1f5f0 49 54 45 5f 4f 4b 20 26 26 20 70 53 74 61 74 65  ITE_OK && pState
1f600 2d 3e 65 53 74 61 67 65 3d 3d 30 20 26 26 20 72  ->eStage==0 && r
1f610 62 75 49 73 56 61 63 75 75 6d 28 70 29 20 29 7b  buIsVacuum(p) ){
1f620 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 62 75  .            rbu
1f630 43 6f 70 79 50 72 61 67 6d 61 28 70 2c 20 22 70  CopyPragma(p, "p
1f640 61 67 65 5f 73 69 7a 65 22 29 3b 0a 20 20 20 20  age_size");.    
1f650 20 20 20 20 20 20 20 20 72 62 75 43 6f 70 79 50          rbuCopyP
1f660 72 61 67 6d 61 28 70 2c 20 22 61 75 74 6f 5f 76  ragma(p, "auto_v
1f670 61 63 75 75 6d 22 29 3b 0a 20 20 20 20 20 20 20  acuum");.       
1f680 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
1f690 2f 2a 20 4f 70 65 6e 20 74 72 61 6e 73 61 63 74  /* Open transact
1f6a0 69 6f 6e 73 20 62 6f 74 68 20 64 61 74 61 62 61  ions both databa
1f6b0 73 65 73 2e 20 54 68 65 20 2a 2d 6f 61 6c 20 66  ses. The *-oal f
1f6c0 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 6f 72  ile is opened or
1f6d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 72  .          ** cr
1f6e0 65 61 74 65 64 20 61 74 20 74 68 69 73 20 70 6f  eated at this po
1f6f0 69 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  int. */.        
1f700 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1f710 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1f720 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71        p->rc = sq
1f730 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 22  lite3_exec(db, "
1f740 42 45 47 49 4e 20 49 4d 4d 45 44 49 41 54 45 22  BEGIN IMMEDIATE"
1f750 2c 20 30 2c 20 30 2c 20 26 70 2d 3e 7a 45 72 72  , 0, 0, &p->zErr
1f760 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  msg);.          
1f770 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  }..          /* 
1f780 43 68 65 63 6b 20 69 66 20 74 68 65 20 6d 61 69  Check if the mai
1f790 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20  n database is a 
1f7a0 7a 69 70 76 66 73 20 64 62 2e 20 49 66 20 69 74  zipvfs db. If it
1f7b0 20 69 73 2c 20 73 65 74 20 74 68 65 20 75 70 70   is, set the upp
1f7c0 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  er.          ** 
1f7d0 6c 65 76 65 6c 20 70 61 67 65 72 20 74 6f 20 75  level pager to u
1f7e0 73 65 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  se "journal_mode
1f7f0 3d 6f 66 66 22 2e 20 54 68 69 73 20 70 72 65 76  =off". This prev
1f800 65 6e 74 73 20 69 74 20 66 72 6f 6d 20 0a 20 20  ents it from .  
1f810 20 20 20 20 20 20 20 20 2a 2a 20 67 65 6e 65 72          ** gener
1f820 61 74 69 6e 67 20 61 20 6c 61 72 67 65 20 6a 6f  ating a large jo
1f830 75 72 6e 61 6c 20 75 73 69 6e 67 20 61 20 74 65  urnal using a te
1f840 6d 70 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20  mp file.  */.   
1f850 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63         if( p->rc
1f860 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1f870 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66             int f
1f880 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
1f890 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 6d  e_control(db, "m
1f8a0 61 69 6e 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e  ain", SQLITE_FCN
1f8b0 54 4c 5f 5a 49 50 56 46 53 2c 20 30 29 3b 0a 20  TL_ZIPVFS, 0);. 
1f8c0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 66             if( f
1f8d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1f8e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1f8f0 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65  ->rc = sqlite3_e
1f900 78 65 63 28 0a 20 20 20 20 20 20 20 20 20 20 20  xec(.           
1f910 20 20 20 20 20 64 62 2c 20 22 50 52 41 47 4d 41       db, "PRAGMA
1f920 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66   journal_mode=of
1f930 66 22 2c 30 2c 30 2c 26 70 2d 3e 7a 45 72 72 6d  f",0,0,&p->zErrm
1f940 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  sg);.           
1f950 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a   }.          }..
1f960 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
1f970 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1f980 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 62  {.            rb
1f990 75 53 65 74 75 70 4f 61 6c 28 70 2c 20 70 53 74  uSetupOal(p, pSt
1f9a0 61 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ate);.          
1f9b0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1f9c0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65    }else if( p->e
1f9d0 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45  Stage==RBU_STAGE
1f9e0 5f 4d 4f 56 45 20 29 7b 0a 20 20 20 20 20 20 20  _MOVE ){.       
1f9f0 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20   /* no-op */.   
1fa00 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
1fa10 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47  eStage==RBU_STAG
1fa20 45 5f 43 4b 50 54 20 29 7b 0a 20 20 20 20 20 20  E_CKPT ){.      
1fa30 20 20 72 62 75 53 65 74 75 70 43 68 65 63 6b 70    rbuSetupCheckp
1fa40 6f 69 6e 74 28 70 2c 20 70 53 74 61 74 65 29 3b  oint(p, pState);
1fa50 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1fa60 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f   p->eStage==RBU_
1fa70 53 54 41 47 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  STAGE_DONE ){.  
1fa80 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
1fa90 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20  LITE_DONE;.     
1faa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1fab0 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43  p->rc = SQLITE_C
1fac0 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a  ORRUPT;.      }.
1fad0 20 20 20 20 7d 0a 0a 20 20 20 20 72 62 75 46 72      }..    rbuFr
1fae0 65 65 53 74 61 74 65 28 70 53 74 61 74 65 29 3b  eeState(pState);
1faf0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
1fb00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
1fb10 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ate and return a
1fb20 6e 20 52 42 55 20 68 61 6e 64 6c 65 20 77 69 74  n RBU handle wit
1fb30 68 20 61 6c 6c 20 66 69 65 6c 64 73 20 7a 65 72  h all fields zer
1fb40 6f 65 64 20 65 78 63 65 70 74 20 66 6f 72 20 74  oed except for t
1fb50 68 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  he.** error code
1fb60 2c 20 77 68 69 63 68 20 69 73 20 73 65 74 20 74  , which is set t
1fb70 6f 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2e  o SQLITE_MISUSE.
1fb80 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
1fb90 65 33 72 62 75 20 2a 72 62 75 4d 69 73 75 73 65  e3rbu *rbuMisuse
1fba0 45 72 72 6f 72 28 76 6f 69 64 29 7b 0a 20 20 73  Error(void){.  s
1fbb0 71 6c 69 74 65 33 72 62 75 20 2a 70 52 65 74 3b  qlite3rbu *pRet;
1fbc0 0a 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65  .  pRet = sqlite
1fbd0 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 69 7a 65 6f  3_malloc64(sizeo
1fbe0 66 28 73 71 6c 69 74 65 33 72 62 75 29 29 3b 0a  f(sqlite3rbu));.
1fbf0 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20    if( pRet ){.  
1fc00 20 20 6d 65 6d 73 65 74 28 70 52 65 74 2c 20 30    memset(pRet, 0
1fc10 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33  , sizeof(sqlite3
1fc20 72 62 75 29 29 3b 0a 20 20 20 20 70 52 65 74 2d  rbu));.    pRet-
1fc30 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4d 49 53  >rc = SQLITE_MIS
1fc40 55 53 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  USE;.  }.  retur
1fc50 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
1fc60 20 4f 70 65 6e 20 61 6e 64 20 72 65 74 75 72 6e   Open and return
1fc70 20 61 20 6e 65 77 20 52 42 55 20 68 61 6e 64 6c   a new RBU handl
1fc80 65 2e 20 0a 2a 2f 0a 73 71 6c 69 74 65 33 72 62  e. .*/.sqlite3rb
1fc90 75 20 2a 73 71 6c 69 74 65 33 72 62 75 5f 6f 70  u *sqlite3rbu_op
1fca0 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  en(.  const char
1fcb0 20 2a 7a 54 61 72 67 65 74 2c 20 0a 20 20 63 6f   *zTarget, .  co
1fcc0 6e 73 74 20 63 68 61 72 20 2a 7a 52 62 75 2c 0a  nst char *zRbu,.
1fcd0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
1fce0 74 61 74 65 0a 29 7b 0a 20 20 69 66 28 20 7a 54  tate.){.  if( zT
1fcf0 61 72 67 65 74 3d 3d 30 20 7c 7c 20 7a 52 62 75  arget==0 || zRbu
1fd00 3d 3d 30 20 29 7b 20 72 65 74 75 72 6e 20 72 62  ==0 ){ return rb
1fd10 75 4d 69 73 75 73 65 45 72 72 6f 72 28 29 3b 20  uMisuseError(); 
1fd20 7d 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65  }.  /* TODO: Che
1fd30 63 6b 20 74 68 61 74 20 7a 54 61 72 67 65 74 20  ck that zTarget 
1fd40 61 6e 64 20 7a 52 62 75 20 61 72 65 20 6e 6f 6e  and zRbu are non
1fd50 2d 4e 55 4c 4c 20 2a 2f 0a 20 20 72 65 74 75 72  -NULL */.  retur
1fd60 6e 20 6f 70 65 6e 52 62 75 48 61 6e 64 6c 65 28  n openRbuHandle(
1fd70 7a 54 61 72 67 65 74 2c 20 7a 52 62 75 2c 20 7a  zTarget, zRbu, z
1fd80 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  State);.}../*.**
1fd90 20 4f 70 65 6e 20 61 20 68 61 6e 64 6c 65 20 74   Open a handle t
1fda0 6f 20 62 65 67 69 6e 20 6f 72 20 72 65 73 75 6d  o begin or resum
1fdb0 65 20 61 6e 20 52 42 55 20 56 41 43 55 55 4d 20  e an RBU VACUUM 
1fdc0 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 71  operation..*/.sq
1fdd0 6c 69 74 65 33 72 62 75 20 2a 73 71 6c 69 74 65  lite3rbu *sqlite
1fde0 33 72 62 75 5f 76 61 63 75 75 6d 28 0a 20 20 63  3rbu_vacuum(.  c
1fdf0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 72 67  onst char *zTarg
1fe00 65 74 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  et, .  const cha
1fe10 72 20 2a 7a 53 74 61 74 65 0a 29 7b 0a 20 20 69  r *zState.){.  i
1fe20 66 28 20 7a 54 61 72 67 65 74 3d 3d 30 20 29 7b  f( zTarget==0 ){
1fe30 20 72 65 74 75 72 6e 20 72 62 75 4d 69 73 75 73   return rbuMisus
1fe40 65 45 72 72 6f 72 28 29 3b 20 7d 0a 20 20 69 66  eError(); }.  if
1fe50 28 20 7a 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ( zState ){.    
1fe60 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a  int n = strlen(z
1fe70 53 74 61 74 65 29 3b 0a 20 20 20 20 69 66 28 20  State);.    if( 
1fe80 6e 3e 3d 37 20 26 26 20 30 3d 3d 6d 65 6d 63 6d  n>=7 && 0==memcm
1fe90 70 28 22 2d 76 61 63 74 6d 70 22 2c 20 26 7a 53  p("-vactmp", &zS
1fea0 74 61 74 65 5b 6e 2d 37 5d 2c 20 37 29 20 29 7b  tate[n-7], 7) ){
1feb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 62  .      return rb
1fec0 75 4d 69 73 75 73 65 45 72 72 6f 72 28 29 3b 0a  uMisuseError();.
1fed0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 54      }.  }.  /* T
1fee0 4f 44 4f 3a 20 43 68 65 63 6b 20 74 68 61 74 20  ODO: Check that 
1fef0 62 6f 74 68 20 61 72 67 75 6d 65 6e 74 73 20 61  both arguments a
1ff00 72 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 2a 2f 0a 20  re non-NULL */. 
1ff10 20 72 65 74 75 72 6e 20 6f 70 65 6e 52 62 75 48   return openRbuH
1ff20 61 6e 64 6c 65 28 30 2c 20 7a 54 61 72 67 65 74  andle(0, zTarget
1ff30 2c 20 7a 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a  , zState);.}../*
1ff40 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
1ff50 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 75  atabase handle u
1ff60 73 65 64 20 62 79 20 70 52 62 75 2e 0a 2a 2f 0a  sed by pRbu..*/.
1ff70 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33  sqlite3 *sqlite3
1ff80 72 62 75 5f 64 62 28 73 71 6c 69 74 65 33 72 62  rbu_db(sqlite3rb
1ff90 75 20 2a 70 52 62 75 2c 20 69 6e 74 20 62 52 62  u *pRbu, int bRb
1ffa0 75 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  u){.  sqlite3 *d
1ffb0 62 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 52 62  b = 0;.  if( pRb
1ffc0 75 20 29 7b 0a 20 20 20 20 64 62 20 3d 20 28 62  u ){.    db = (b
1ffd0 52 62 75 20 3f 20 70 52 62 75 2d 3e 64 62 52 62  Rbu ? pRbu->dbRb
1ffe0 75 20 3a 20 70 52 62 75 2d 3e 64 62 4d 61 69 6e  u : pRbu->dbMain
1fff0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
20000 64 62 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66  db;.}.../*.** If
20010 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
20020 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64  currently stored
20030 20 69 6e 20 74 68 65 20 52 42 55 20 68 61 6e 64   in the RBU hand
20040 6c 65 20 69 73 20 53 51 4c 49 54 45 5f 43 4f 4e  le is SQLITE_CON
20050 53 54 52 41 49 4e 54 2c 0a 2a 2a 20 74 68 65 6e  STRAINT,.** then
20060 20 65 64 69 74 20 61 6e 79 20 65 72 72 6f 72 20   edit any error 
20070 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67 20 73  message string s
20080 6f 20 61 73 20 74 6f 20 72 65 6d 6f 76 65 20 61  o as to remove a
20090 6c 6c 20 6f 63 63 75 72 72 65 6e 63 65 73 20 6f  ll occurrences o
200a0 66 0a 2a 2a 20 74 68 65 20 70 61 74 74 65 72 6e  f.** the pattern
200b0 20 22 72 62 75 5f 69 6d 70 5f 5b 30 2d 39 5d 2a   "rbu_imp_[0-9]*
200c0 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  "..*/.static voi
200d0 64 20 72 62 75 45 64 69 74 45 72 72 6d 73 67 28  d rbuEditErrmsg(
200e0 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a  sqlite3rbu *p){.
200f0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
20100 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26  ITE_CONSTRAINT &
20110 26 20 70 2d 3e 7a 45 72 72 6d 73 67 20 29 7b 0a  & p->zErrmsg ){.
20120 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
20130 20 69 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6e   i;.    size_t n
20140 45 72 72 6d 73 67 20 3d 20 73 74 72 6c 65 6e 28  Errmsg = strlen(
20150 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20  p->zErrmsg);.   
20160 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 6e 45 72   for(i=0; i<(nEr
20170 72 6d 73 67 2d 38 29 3b 20 69 2b 2b 29 7b 0a 20  rmsg-8); i++){. 
20180 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28       if( memcmp(
20190 26 70 2d 3e 7a 45 72 72 6d 73 67 5b 69 5d 2c 20  &p->zErrmsg[i], 
201a0 22 72 62 75 5f 69 6d 70 5f 22 2c 20 38 29 3d 3d  "rbu_imp_", 8)==
201b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  0 ){.        int
201c0 20 6e 44 65 6c 20 3d 20 38 3b 0a 20 20 20 20 20   nDel = 8;.     
201d0 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 7a 45 72     while( p->zEr
201e0 72 6d 73 67 5b 69 2b 6e 44 65 6c 5d 3e 3d 27 30  rmsg[i+nDel]>='0
201f0 27 20 26 26 20 70 2d 3e 7a 45 72 72 6d 73 67 5b  ' && p->zErrmsg[
20200 69 2b 6e 44 65 6c 5d 3c 3d 27 39 27 20 29 20 6e  i+nDel]<='9' ) n
20210 44 65 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6d  Del++;.        m
20220 65 6d 6d 6f 76 65 28 26 70 2d 3e 7a 45 72 72 6d  emmove(&p->zErrm
20230 73 67 5b 69 5d 2c 20 26 70 2d 3e 7a 45 72 72 6d  sg[i], &p->zErrm
20240 73 67 5b 69 2b 6e 44 65 6c 5d 2c 20 6e 45 72 72  sg[i+nDel], nErr
20250 6d 73 67 20 2b 20 31 20 2d 20 69 20 2d 20 6e 44  msg + 1 - i - nD
20260 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 6e 45 72  el);.        nEr
20270 72 6d 73 67 20 2d 3d 20 6e 44 65 6c 3b 0a 20 20  rmsg -= nDel;.  
20280 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
20290 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74  }../*.** Close t
202a0 68 65 20 52 42 55 20 68 61 6e 64 6c 65 2e 0a 2a  he RBU handle..*
202b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 72 62 75  /.int sqlite3rbu
202c0 5f 63 6c 6f 73 65 28 73 71 6c 69 74 65 33 72 62  _close(sqlite3rb
202d0 75 20 2a 70 2c 20 63 68 61 72 20 2a 2a 70 7a 45  u *p, char **pzE
202e0 72 72 6d 73 67 29 7b 0a 20 20 69 6e 74 20 72 63  rrmsg){.  int rc
202f0 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 0a 20 20  ;.  if( p ){..  
20300 20 20 2f 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20    /* Commit the 
20310 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 74  transaction to t
20320 68 65 20 2a 2d 6f 61 6c 20 66 69 6c 65 2e 20 2a  he *-oal file. *
20330 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  /.    if( p->rc=
20340 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d  =SQLITE_OK && p-
20350 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41  >eStage==RBU_STA
20360 47 45 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 20 20  GE_OAL ){.      
20370 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
20380 65 78 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  exec(p->dbMain, 
20390 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20  "COMMIT", 0, 0, 
203a0 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20  &p->zErrmsg);.  
203b0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63    }..    /* Sync
203c0 20 74 68 65 20 64 62 20 66 69 6c 65 20 69 66 20   the db file if 
203d0 63 75 72 72 65 6e 74 6c 79 20 64 6f 69 6e 67 20  currently doing 
203e0 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 63  an incremental c
203f0 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a 20 20 20  heckpoint */.   
20400 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
20410 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 65 53 74 61  TE_OK && p->eSta
20420 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 43 4b  ge==RBU_STAGE_CK
20430 50 54 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  PT ){.      sqli
20440 74 65 33 5f 66 69 6c 65 20 2a 70 44 62 20 3d 20  te3_file *pDb = 
20450 70 2d 3e 70 54 61 72 67 65 74 46 64 2d 3e 70 52  p->pTargetFd->pR
20460 65 61 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 72 63  eal;.      p->rc
20470 20 3d 20 70 44 62 2d 3e 70 4d 65 74 68 6f 64 73   = pDb->pMethods
20480 2d 3e 78 53 79 6e 63 28 70 44 62 2c 20 53 51 4c  ->xSync(pDb, SQL
20490 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
204a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 62 75  ;.    }..    rbu
204b0 53 61 76 65 53 74 61 74 65 28 70 2c 20 70 2d 3e  SaveState(p, p->
204c0 65 53 74 61 67 65 29 3b 0a 0a 20 20 20 20 69 66  eStage);..    if
204d0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
204e0 4f 4b 20 26 26 20 70 2d 3e 65 53 74 61 67 65 3d  OK && p->eStage=
204f0 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 29  =RBU_STAGE_OAL )
20500 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
20510 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
20520 64 62 52 62 75 2c 20 22 43 4f 4d 4d 49 54 22 2c  dbRbu, "COMMIT",
20530 20 30 2c 20 30 2c 20 26 70 2d 3e 7a 45 72 72 6d   0, 0, &p->zErrm
20540 73 67 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  sg);.    }..    
20550 2f 2a 20 43 6c 6f 73 65 20 61 6e 79 20 6f 70 65  /* Close any ope
20560 6e 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64  n statement hand
20570 6c 65 73 2e 20 2a 2f 0a 20 20 20 20 72 62 75 4f  les. */.    rbuO
20580 62 6a 49 74 65 72 46 69 6e 61 6c 69 7a 65 28 26  bjIterFinalize(&
20590 70 2d 3e 6f 62 6a 69 74 65 72 29 3b 0a 0a 20 20  p->objiter);..  
205a0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
205b0 61 6e 20 52 42 55 20 76 61 63 75 75 6d 20 68 61  an RBU vacuum ha
205c0 6e 64 6c 65 20 61 6e 64 20 74 68 65 20 76 61 63  ndle and the vac
205d0 75 75 6d 20 68 61 73 20 65 69 74 68 65 72 20 66  uum has either f
205e0 69 6e 69 73 68 65 64 0a 20 20 20 20 2a 2a 20 73  inished.    ** s
205f0 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 72 20 65  uccessfully or e
20600 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 20 65 72  ncountered an er
20610 72 6f 72 2c 20 64 65 6c 65 74 65 20 74 68 65 20  ror, delete the 
20620 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
20630 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 20 74 61  .    ** state ta
20640 62 6c 65 2e 20 54 68 69 73 20 63 61 75 73 65 73  ble. This causes
20650 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74   the next call t
20660 6f 20 73 71 6c 69 74 65 33 72 62 75 5f 76 61 63  o sqlite3rbu_vac
20670 75 75 6d 28 29 20 0a 20 20 20 20 2a 2a 20 73 70  uum() .    ** sp
20680 65 63 69 66 79 69 6e 67 20 74 68 65 20 63 75 72  ecifying the cur
20690 72 65 6e 74 20 74 61 72 67 65 74 20 61 6e 64 20  rent target and 
206a0 73 74 61 74 65 20 64 61 74 61 62 61 73 65 73 20  state databases 
206b0 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 0a 20  to start a new. 
206c0 20 20 20 2a 2a 20 76 61 63 75 75 6d 20 66 72 6f     ** vacuum fro
206d0 6d 20 73 63 72 61 74 63 68 2e 20 20 2a 2f 0a 20  m scratch.  */. 
206e0 20 20 20 69 66 28 20 72 62 75 49 73 56 61 63 75     if( rbuIsVacu
206f0 75 6d 28 70 29 20 26 26 20 70 2d 3e 72 63 21 3d  um(p) && p->rc!=
20700 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e  SQLITE_OK && p->
20710 64 62 52 62 75 20 29 7b 0a 20 20 20 20 20 20 69  dbRbu ){.      i
20720 6e 74 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33  nt rc2 = sqlite3
20730 5f 65 78 65 63 28 70 2d 3e 64 62 52 62 75 2c 20  _exec(p->dbRbu, 
20740 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 73 74 61  "DELETE FROM sta
20750 74 2e 72 62 75 5f 73 74 61 74 65 22 2c 20 30 2c  t.rbu_state", 0,
20760 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
20770 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
20780 44 4f 4e 45 20 26 26 20 72 63 32 21 3d 53 51 4c  DONE && rc2!=SQL
20790 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63 20 3d  ITE_OK ) p->rc =
207a0 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   rc2;.    }..   
207b0 20 2f 2a 20 43 6c 6f 73 65 20 74 68 65 20 6f 70   /* Close the op
207c0 65 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  en database hand
207d0 6c 65 20 61 6e 64 20 56 46 53 20 6f 62 6a 65 63  le and VFS objec
207e0 74 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  t. */.    sqlite
207f0 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 52 62 75  3_close(p->dbRbu
20800 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
20810 6c 6f 73 65 28 70 2d 3e 64 62 4d 61 69 6e 29 3b  lose(p->dbMain);
20820 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
20830 73 7a 54 65 6d 70 3d 3d 30 20 29 3b 0a 20 20 20  szTemp==0 );.   
20840 20 72 62 75 44 65 6c 65 74 65 56 66 73 28 70 29   rbuDeleteVfs(p)
20850 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
20860 65 65 28 70 2d 3e 61 42 75 66 29 3b 0a 20 20 20  ee(p->aBuf);.   
20870 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
20880 3e 61 46 72 61 6d 65 29 3b 0a 0a 20 20 20 20 72  >aFrame);..    r
20890 62 75 45 64 69 74 45 72 72 6d 73 67 28 70 29 3b  buEditErrmsg(p);
208a0 0a 20 20 20 20 72 63 20 3d 20 70 2d 3e 72 63 3b  .    rc = p->rc;
208b0 0a 20 20 20 20 69 66 28 20 70 7a 45 72 72 6d 73  .    if( pzErrms
208c0 67 20 29 7b 0a 20 20 20 20 20 20 2a 70 7a 45 72  g ){.      *pzEr
208d0 72 6d 73 67 20 3d 20 70 2d 3e 7a 45 72 72 6d 73  rmsg = p->zErrms
208e0 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  g;.    }else{.  
208f0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
20900 28 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20  (p->zErrmsg);.  
20910 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
20920 66 72 65 65 28 70 2d 3e 7a 53 74 61 74 65 29 3b  free(p->zState);
20930 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
20940 65 28 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  e(p);.  }else{. 
20950 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
20960 4f 4d 45 4d 3b 0a 20 20 20 20 2a 70 7a 45 72 72  OMEM;.    *pzErr
20970 6d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  msg = 0;.  }.  r
20980 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
20990 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f  ** Return the to
209a0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6b 65  tal number of ke
209b0 79 2d 76 61 6c 75 65 20 6f 70 65 72 61 74 69 6f  y-value operatio
209c0 6e 73 20 28 69 6e 73 65 72 74 73 2c 20 64 65 6c  ns (inserts, del
209d0 65 74 65 73 20 6f 72 20 0a 2a 2a 20 75 70 64 61  etes or .** upda
209e0 74 65 73 29 20 74 68 61 74 20 68 61 76 65 20 62  tes) that have b
209f0 65 65 6e 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e  een performed on
20a00 20 74 68 65 20 74 61 72 67 65 74 20 64 61 74 61   the target data
20a10 62 61 73 65 20 73 69 6e 63 65 20 74 68 65 0a 2a  base since the.*
20a20 2a 20 63 75 72 72 65 6e 74 20 52 42 55 20 75 70  * current RBU up
20a30 64 61 74 65 20 77 61 73 20 73 74 61 72 74 65 64  date was started
20a40 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74  ..*/.sqlite3_int
20a50 36 34 20 73 71 6c 69 74 65 33 72 62 75 5f 70 72  64 sqlite3rbu_pr
20a60 6f 67 72 65 73 73 28 73 71 6c 69 74 65 33 72 62  ogress(sqlite3rb
20a70 75 20 2a 70 52 62 75 29 7b 0a 20 20 72 65 74 75  u *pRbu){.  retu
20a80 72 6e 20 70 52 62 75 2d 3e 6e 50 72 6f 67 72 65  rn pRbu->nProgre
20a90 73 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ss;.}../*.** Ret
20aa0 75 72 6e 20 70 65 72 6d 79 72 69 61 64 61 67 65  urn permyriadage
20ab0 20 70 72 6f 67 72 65 73 73 20 69 6e 64 69 63 61   progress indica
20ac0 74 69 6f 6e 73 20 66 6f 72 20 74 68 65 20 74 77  tions for the tw
20ad0 6f 20 6d 61 69 6e 20 73 74 61 67 65 73 20 6f 66  o main stages of
20ae0 0a 2a 2a 20 61 6e 20 52 42 55 20 75 70 64 61 74  .** an RBU updat
20af0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
20b00 65 33 72 62 75 5f 62 70 5f 70 72 6f 67 72 65 73  e3rbu_bp_progres
20b10 73 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c  s(sqlite3rbu *p,
20b20 20 69 6e 74 20 2a 70 6e 4f 6e 65 2c 20 69 6e 74   int *pnOne, int
20b30 20 2a 70 6e 54 77 6f 29 7b 0a 20 20 63 6f 6e 73   *pnTwo){.  cons
20b40 74 20 69 6e 74 20 4d 41 58 5f 50 52 4f 47 52 45  t int MAX_PROGRE
20b50 53 53 20 3d 20 31 30 30 30 30 3b 0a 20 20 73 77  SS = 10000;.  sw
20b60 69 74 63 68 28 20 70 2d 3e 65 53 74 61 67 65 20  itch( p->eStage 
20b70 29 7b 0a 20 20 20 20 63 61 73 65 20 52 42 55 5f  ){.    case RBU_
20b80 53 54 41 47 45 5f 4f 41 4c 3a 0a 20 20 20 20 20  STAGE_OAL:.     
20b90 20 69 66 28 20 70 2d 3e 6e 50 68 61 73 65 4f 6e   if( p->nPhaseOn
20ba0 65 53 74 65 70 3e 30 20 29 7b 0a 20 20 20 20 20  eStep>0 ){.     
20bb0 20 20 20 2a 70 6e 4f 6e 65 20 3d 20 28 69 6e 74     *pnOne = (int
20bc0 29 28 4d 41 58 5f 50 52 4f 47 52 45 53 53 20 2a  )(MAX_PROGRESS *
20bd0 20 28 69 36 34 29 70 2d 3e 6e 50 72 6f 67 72 65   (i64)p->nProgre
20be0 73 73 2f 28 69 36 34 29 70 2d 3e 6e 50 68 61 73  ss/(i64)p->nPhas
20bf0 65 4f 6e 65 53 74 65 70 29 3b 0a 20 20 20 20 20  eOneStep);.     
20c00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20c10 2a 70 6e 4f 6e 65 20 3d 20 2d 31 3b 0a 20 20 20  *pnOne = -1;.   
20c20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 6e 54 77     }.      *pnTw
20c30 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  o = 0;.      bre
20c40 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 52 42  ak;..    case RB
20c50 55 5f 53 54 41 47 45 5f 4d 4f 56 45 3a 0a 20 20  U_STAGE_MOVE:.  
20c60 20 20 20 20 2a 70 6e 4f 6e 65 20 3d 20 4d 41 58      *pnOne = MAX
20c70 5f 50 52 4f 47 52 45 53 53 3b 0a 20 20 20 20 20  _PROGRESS;.     
20c80 20 2a 70 6e 54 77 6f 20 3d 20 30 3b 0a 20 20 20   *pnTwo = 0;.   
20c90 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
20ca0 61 73 65 20 52 42 55 5f 53 54 41 47 45 5f 43 4b  ase RBU_STAGE_CK
20cb0 50 54 3a 0a 20 20 20 20 20 20 2a 70 6e 4f 6e 65  PT:.      *pnOne
20cc0 20 3d 20 4d 41 58 5f 50 52 4f 47 52 45 53 53 3b   = MAX_PROGRESS;
20cd0 0a 20 20 20 20 20 20 2a 70 6e 54 77 6f 20 3d 20  .      *pnTwo = 
20ce0 28 69 6e 74 29 28 4d 41 58 5f 50 52 4f 47 52 45  (int)(MAX_PROGRE
20cf0 53 53 20 2a 20 28 69 36 34 29 70 2d 3e 6e 53 74  SS * (i64)p->nSt
20d00 65 70 20 2f 20 28 69 36 34 29 70 2d 3e 6e 46 72  ep / (i64)p->nFr
20d10 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ame);.      brea
20d20 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 52 42 55  k;..    case RBU
20d30 5f 53 54 41 47 45 5f 44 4f 4e 45 3a 0a 20 20 20  _STAGE_DONE:.   
20d40 20 20 20 2a 70 6e 4f 6e 65 20 3d 20 4d 41 58 5f     *pnOne = MAX_
20d50 50 52 4f 47 52 45 53 53 3b 0a 20 20 20 20 20 20  PROGRESS;.      
20d60 2a 70 6e 54 77 6f 20 3d 20 4d 41 58 5f 50 52 4f  *pnTwo = MAX_PRO
20d70 47 52 45 53 53 3b 0a 20 20 20 20 20 20 62 72 65  GRESS;.      bre
20d80 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74  ak;..    default
20d90 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
20da0 30 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  0 );.  }.}../*.*
20db0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
20dc0 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68  rent state of th
20dd0 65 20 52 42 55 20 76 61 63 75 75 6d 20 6f 72 20  e RBU vacuum or 
20de0 75 70 64 61 74 65 20 6f 70 65 72 61 74 69 6f 6e  update operation
20df0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
20e00 72 62 75 5f 73 74 61 74 65 28 73 71 6c 69 74 65  rbu_state(sqlite
20e10 33 72 62 75 20 2a 70 29 7b 0a 20 20 69 6e 74 20  3rbu *p){.  int 
20e20 61 52 65 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 30  aRes[] = {.    0
20e30 2c 20 53 51 4c 49 54 45 5f 52 42 55 5f 53 54 41  , SQLITE_RBU_STA
20e40 54 45 5f 4f 41 4c 2c 20 53 51 4c 49 54 45 5f 52  TE_OAL, SQLITE_R
20e50 42 55 5f 53 54 41 54 45 5f 4d 4f 56 45 2c 0a 20  BU_STATE_MOVE,. 
20e60 20 20 20 30 2c 20 53 51 4c 49 54 45 5f 52 42 55     0, SQLITE_RBU
20e70 5f 53 54 41 54 45 5f 43 48 45 43 4b 50 4f 49 4e  _STATE_CHECKPOIN
20e80 54 2c 20 53 51 4c 49 54 45 5f 52 42 55 5f 53 54  T, SQLITE_RBU_ST
20e90 41 54 45 5f 44 4f 4e 45 0a 20 20 7d 3b 0a 0a 20  ATE_DONE.  };.. 
20ea0 20 61 73 73 65 72 74 28 20 52 42 55 5f 53 54 41   assert( RBU_STA
20eb0 47 45 5f 4f 41 4c 3d 3d 31 20 29 3b 0a 20 20 61  GE_OAL==1 );.  a
20ec0 73 73 65 72 74 28 20 52 42 55 5f 53 54 41 47 45  ssert( RBU_STAGE
20ed0 5f 4d 4f 56 45 3d 3d 32 20 29 3b 0a 20 20 61 73  _MOVE==2 );.  as
20ee0 73 65 72 74 28 20 52 42 55 5f 53 54 41 47 45 5f  sert( RBU_STAGE_
20ef0 43 4b 50 54 3d 3d 34 20 29 3b 0a 20 20 61 73 73  CKPT==4 );.  ass
20f00 65 72 74 28 20 52 42 55 5f 53 54 41 47 45 5f 44  ert( RBU_STAGE_D
20f10 4f 4e 45 3d 3d 35 20 29 3b 0a 20 20 61 73 73 65  ONE==5 );.  asse
20f20 72 74 28 20 61 52 65 73 5b 52 42 55 5f 53 54 41  rt( aRes[RBU_STA
20f30 47 45 5f 4f 41 4c 5d 3d 3d 53 51 4c 49 54 45 5f  GE_OAL]==SQLITE_
20f40 52 42 55 5f 53 54 41 54 45 5f 4f 41 4c 20 29 3b  RBU_STATE_OAL );
20f50 0a 20 20 61 73 73 65 72 74 28 20 61 52 65 73 5b  .  assert( aRes[
20f60 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 5d 3d  RBU_STAGE_MOVE]=
20f70 3d 53 51 4c 49 54 45 5f 52 42 55 5f 53 54 41 54  =SQLITE_RBU_STAT
20f80 45 5f 4d 4f 56 45 20 29 3b 0a 20 20 61 73 73 65  E_MOVE );.  asse
20f90 72 74 28 20 61 52 65 73 5b 52 42 55 5f 53 54 41  rt( aRes[RBU_STA
20fa0 47 45 5f 43 4b 50 54 5d 3d 3d 53 51 4c 49 54 45  GE_CKPT]==SQLITE
20fb0 5f 52 42 55 5f 53 54 41 54 45 5f 43 48 45 43 4b  _RBU_STATE_CHECK
20fc0 50 4f 49 4e 54 20 29 3b 0a 20 20 61 73 73 65 72  POINT );.  asser
20fd0 74 28 20 61 52 65 73 5b 52 42 55 5f 53 54 41 47  t( aRes[RBU_STAG
20fe0 45 5f 44 4f 4e 45 5d 3d 3d 53 51 4c 49 54 45 5f  E_DONE]==SQLITE_
20ff0 52 42 55 5f 53 54 41 54 45 5f 44 4f 4e 45 20 29  RBU_STATE_DONE )
21000 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d  ;..  if( p->rc!=
21010 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e  SQLITE_OK && p->
21020 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
21030 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
21040 4c 49 54 45 5f 52 42 55 5f 53 54 41 54 45 5f 45  LITE_RBU_STATE_E
21050 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  RROR;.  }else{. 
21060 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63     assert( p->rc
21070 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c  !=SQLITE_DONE ||
21080 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f   p->eStage==RBU_
21090 53 54 41 47 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  STAGE_DONE );.  
210a0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74    assert( p->eSt
210b0 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f  age==RBU_STAGE_O
210c0 41 4c 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  AL.         || p
210d0 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  ->eStage==RBU_ST
210e0 41 47 45 5f 4d 4f 56 45 0a 20 20 20 20 20 20 20  AGE_MOVE.       
210f0 20 20 7c 7c 20 70 2d 3e 65 53 74 61 67 65 3d 3d    || p->eStage==
21100 52 42 55 5f 53 54 41 47 45 5f 43 4b 50 54 0a 20  RBU_STAGE_CKPT. 
21110 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53          || p->eS
21120 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f  tage==RBU_STAGE_
21130 44 4f 4e 45 0a 20 20 20 20 29 3b 0a 20 20 20 20  DONE.    );.    
21140 72 65 74 75 72 6e 20 61 52 65 73 5b 70 2d 3e 65  return aRes[p->e
21150 53 74 61 67 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 69  Stage];.  }.}..i
21160 6e 74 20 73 71 6c 69 74 65 33 72 62 75 5f 73 61  nt sqlite3rbu_sa
21170 76 65 73 74 61 74 65 28 73 71 6c 69 74 65 33 72  vestate(sqlite3r
21180 62 75 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  bu *p){.  int rc
21190 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20   = p->rc;.  if( 
211a0 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
211b0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
211c0 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
211d0 2d 3e 65 53 74 61 67 65 3e 3d 52 42 55 5f 53 54  ->eStage>=RBU_ST
211e0 41 47 45 5f 4f 41 4c 20 26 26 20 70 2d 3e 65 53  AGE_OAL && p->eS
211f0 74 61 67 65 3c 3d 52 42 55 5f 53 54 41 47 45 5f  tage<=RBU_STAGE_
21200 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 2d  DONE );.  if( p-
21210 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41  >eStage==RBU_STA
21220 47 45 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 61 73  GE_OAL ){.    as
21230 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
21240 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28  _DONE );.    if(
21250 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
21260 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
21270 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 43  ec(p->dbMain, "C
21280 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 30 29  OMMIT", 0, 0, 0)
21290 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 79 6e 63  ;.  }..  /* Sync
212a0 20 74 68 65 20 64 62 20 66 69 6c 65 20 2a 2f 0a   the db file */.
212b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
212c0 5f 4f 4b 20 26 26 20 70 2d 3e 65 53 74 61 67 65  _OK && p->eStage
212d0 3d 3d 52 42 55 5f 53 54 41 47 45 5f 43 4b 50 54  ==RBU_STAGE_CKPT
212e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
212f0 66 69 6c 65 20 2a 70 44 62 20 3d 20 70 2d 3e 70  file *pDb = p->p
21300 54 61 72 67 65 74 46 64 2d 3e 70 52 65 61 6c 3b  TargetFd->pReal;
21310 0a 20 20 20 20 72 63 20 3d 20 70 44 62 2d 3e 70  .    rc = pDb->p
21320 4d 65 74 68 6f 64 73 2d 3e 78 53 79 6e 63 28 70  Methods->xSync(p
21330 44 62 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  Db, SQLITE_SYNC_
21340 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a 0a 20 20  NORMAL);.  }..  
21350 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 72 62  p->rc = rc;.  rb
21360 75 53 61 76 65 53 74 61 74 65 28 70 2c 20 70 2d  uSaveState(p, p-
21370 3e 65 53 74 61 67 65 29 3b 0a 20 20 72 63 20 3d  >eStage);.  rc =
21380 20 70 2d 3e 72 63 3b 0a 0a 20 20 69 66 28 20 70   p->rc;..  if( p
21390 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  ->eStage==RBU_ST
213a0 41 47 45 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 61  AGE_OAL ){.    a
213b0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
213c0 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66  E_DONE );.    if
213d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
213e0 29 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65  ) rc = sqlite3_e
213f0 78 65 63 28 70 2d 3e 64 62 52 62 75 2c 20 22 43  xec(p->dbRbu, "C
21400 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 30 29  OMMIT", 0, 0, 0)
21410 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
21420 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20  LITE_OK ){ .    
21430 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42    const char *zB
21440 65 67 69 6e 20 3d 20 72 62 75 49 73 56 61 63 75  egin = rbuIsVacu
21450 75 6d 28 70 29 20 3f 20 22 42 45 47 49 4e 22 20  um(p) ? "BEGIN" 
21460 3a 20 22 42 45 47 49 4e 20 49 4d 4d 45 44 49 41  : "BEGIN IMMEDIA
21470 54 45 22 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  TE";.      rc = 
21480 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
21490 64 62 52 62 75 2c 20 7a 42 65 67 69 6e 2c 20 30  dbRbu, zBegin, 0
214a0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
214b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
214c0 45 5f 4f 4b 20 29 20 72 63 20 3d 20 73 71 6c 69  E_OK ) rc = sqli
214d0 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 4d 61  te3_exec(p->dbMa
214e0 69 6e 2c 20 22 42 45 47 49 4e 20 49 4d 4d 45 44  in, "BEGIN IMMED
214f0 49 41 54 45 22 2c 20 30 2c 20 30 2c 30 29 3b 0a  IATE", 0, 0,0);.
21500 20 20 7d 0a 0a 20 20 70 2d 3e 72 63 20 3d 20 72    }..  p->rc = r
21510 63 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  c;.  return rc;.
21520 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }../************
21530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
21570 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 52  * Beginning of R
21580 42 55 20 56 46 53 20 73 68 69 6d 20 6d 65 74 68  BU VFS shim meth
21590 6f 64 73 2e 20 54 68 65 20 56 46 53 20 73 68 69  ods. The VFS shi
215a0 6d 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 62  m modifies the b
215b0 65 68 61 76 69 6f 75 72 0a 2a 2a 20 6f 66 20 61  ehaviour.** of a
215c0 20 73 74 61 6e 64 61 72 64 20 56 46 53 20 69 6e   standard VFS in
215d0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77   the following w
215e0 61 79 73 3a 0a 2a 2a 0a 2a 2a 20 31 2e 20 57 68  ays:.**.** 1. Wh
215f0 65 6e 65 76 65 72 20 74 68 65 20 66 69 72 73 74  enever the first
21600 20 70 61 67 65 20 6f 66 20 61 20 6d 61 69 6e 20   page of a main 
21610 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
21620 20 72 65 61 64 20 6f 72 20 0a 2a 2a 20 20 20 20   read or .**    
21630 77 72 69 74 74 65 6e 2c 20 74 68 65 20 76 61 6c  written, the val
21640 75 65 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65  ue of the change
21650 2d 63 6f 75 6e 74 65 72 20 63 6f 6f 6b 69 65 20  -counter cookie 
21660 69 73 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  is stored in.** 
21670 20 20 20 72 62 75 5f 66 69 6c 65 2e 69 43 6f 6f     rbu_file.iCoo
21680 6b 69 65 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20  kie. Similarly, 
21690 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
216a0 20 22 77 72 69 74 65 2d 76 65 72 73 69 6f 6e 22   "write-version"
216b0 0a 2a 2a 20 20 20 20 64 61 74 61 62 61 73 65 20  .**    database 
216c0 68 65 61 64 65 72 20 66 69 65 6c 64 20 69 73 20  header field is 
216d0 73 74 6f 72 65 64 20 69 6e 20 72 62 75 5f 66 69  stored in rbu_fi
216e0 6c 65 2e 69 57 72 69 74 65 56 65 72 2e 20 54 68  le.iWriteVer. Th
216f0 69 73 20 65 6e 73 75 72 65 73 0a 2a 2a 20 20 20  is ensures.**   
21700 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
21710 20 61 72 65 20 61 6c 77 61 79 73 20 74 72 75 73   are always trus
21720 74 77 6f 72 74 68 79 20 77 69 74 68 69 6e 20 61  tworthy within a
21730 6e 20 6f 70 65 6e 20 74 72 61 6e 73 61 63 74 69  n open transacti
21740 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 32 2e 20 57 68 65  on..**.** 2. Whe
21750 6e 65 76 65 72 20 61 6e 20 53 51 4c 49 54 45 5f  never an SQLITE_
21760 4f 50 45 4e 5f 57 41 4c 20 66 69 6c 65 20 69 73  OPEN_WAL file is
21770 20 6f 70 65 6e 65 64 2c 20 74 68 65 20 28 72 62   opened, the (rb
21780 75 5f 66 69 6c 65 2e 70 57 61 6c 46 64 29 0a 2a  u_file.pWalFd).*
21790 2a 20 20 20 20 6d 65 6d 62 65 72 20 76 61 72 69  *    member vari
217a0 61 62 6c 65 20 6f 66 20 74 68 65 20 61 73 73 6f  able of the asso
217b0 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
217c0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
217d0 69 73 20 73 65 74 0a 2a 2a 20 20 20 20 74 6f 20  is set.**    to 
217e0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77  point to the new
217f0 20 66 69 6c 65 2e 20 41 20 6d 75 74 65 78 20 70   file. A mutex p
21800 72 6f 74 65 63 74 65 64 20 6c 69 6e 6b 65 64 20  rotected linked 
21810 6c 69 73 74 20 6f 66 20 61 6c 6c 20 6d 61 69 6e  list of all main
21820 20 0a 2a 2a 20 20 20 20 64 62 20 66 64 73 20 6f   .**    db fds o
21830 70 65 6e 65 64 20 75 73 69 6e 67 20 61 20 70 61  pened using a pa
21840 72 74 69 63 75 6c 61 72 20 52 42 55 20 56 46 53  rticular RBU VFS
21850 20 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 20 61   is maintained a
21860 74 20 0a 2a 2a 20 20 20 20 72 62 75 5f 76 66 73  t .**    rbu_vfs
21870 2e 70 4d 61 69 6e 20 74 6f 20 66 61 63 69 6c 69  .pMain to facili
21880 74 61 74 65 20 74 68 69 73 2e 0a 2a 2a 0a 2a 2a  tate this..**.**
21890 20 33 2e 20 55 73 69 6e 67 20 61 20 6e 65 77 20   3. Using a new 
218a0 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 22 53 51  file-control "SQ
218b0 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 42 55 22 2c  LITE_FCNTL_RBU",
218c0 20 61 20 6d 61 69 6e 20 64 62 20 72 62 75 5f 66   a main db rbu_f
218d0 69 6c 65 20 0a 2a 2a 20 20 20 20 6f 62 6a 65 63  ile .**    objec
218e0 74 20 63 61 6e 20 62 65 20 6d 61 72 6b 65 64 20  t can be marked 
218f0 61 73 20 74 68 65 20 74 61 72 67 65 74 20 64 61  as the target da
21900 74 61 62 61 73 65 20 6f 66 20 61 6e 20 52 42 55  tabase of an RBU
21910 20 75 70 64 61 74 65 2e 20 54 68 69 73 0a 2a 2a   update. This.**
21920 20 20 20 20 74 75 72 6e 73 20 6f 6e 20 74 68 65      turns on the
21930 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 74 72 61   following extra
21940 20 73 70 65 63 69 61 6c 20 62 65 68 61 76 69 6f   special behavio
21950 75 72 3a 0a 2a 2a 0a 2a 2a 20 33 61 2e 20 49 66  ur:.**.** 3a. If
21960 20 78 41 63 63 65 73 73 28 29 20 69 73 20 63 61   xAccess() is ca
21970 6c 6c 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66  lled to check if
21980 20 74 68 65 72 65 20 65 78 69 73 74 73 20 61 20   there exists a 
21990 2a 2d 77 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 20  *-wal file .**  
219a0 20 20 20 61 73 73 6f 63 69 61 74 65 64 20 77 69     associated wi
219b0 74 68 20 61 6e 20 52 42 55 20 74 61 72 67 65 74  th an RBU target
219c0 20 64 61 74 61 62 61 73 65 20 63 75 72 72 65 6e   database curren
219d0 74 6c 79 20 69 6e 20 52 42 55 5f 53 54 41 47 45  tly in RBU_STAGE
219e0 5f 4f 41 4c 0a 2a 2a 20 20 20 20 20 73 74 61 67  _OAL.**     stag
219f0 65 20 28 70 72 65 70 61 72 69 6e 67 20 74 68 65  e (preparing the
21a00 20 2a 2d 6f 61 6c 20 66 69 6c 65 29 2c 20 74 68   *-oal file), th
21a10 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 70 65 63  e following spec
21a20 69 61 6c 20 68 61 6e 64 6c 69 6e 67 0a 2a 2a 20  ial handling.** 
21a30 20 20 20 20 61 70 70 6c 69 65 73 3a 0a 2a 2a 0a      applies:.**.
21a40 2a 2a 20 20 20 20 20 20 2a 20 69 66 20 74 68 65  **      * if the
21a50 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65 73   *-wal file does
21a60 20 65 78 69 73 74 2c 20 72 65 74 75 72 6e 20 53   exist, return S
21a70 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2e 20  QLITE_CANTOPEN. 
21a80 41 6e 20 52 42 55 0a 2a 2a 20 20 20 20 20 20 20  An RBU.**       
21a90 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65   target database
21aa0 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20 77   may not be in w
21ab0 61 6c 20 6d 6f 64 65 20 61 6c 72 65 61 64 79 2e  al mode already.
21ac0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 2a 20 69 66  .**.**      * if
21ad0 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20   the *-wal file 
21ae0 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
21af0 73 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 70  set the output p
21b00 61 72 61 6d 65 74 65 72 20 74 6f 0a 2a 2a 20 20  arameter to.**  
21b10 20 20 20 20 20 20 6e 6f 6e 2d 7a 65 72 6f 20 28        non-zero (
21b20 74 6f 20 74 65 6c 6c 20 53 51 4c 69 74 65 20 74  to tell SQLite t
21b30 68 61 74 20 69 74 20 64 6f 65 73 20 65 78 69 73  hat it does exis
21b40 74 29 20 61 6e 79 77 61 79 2e 0a 2a 2a 0a 2a 2a  t) anyway..**.**
21b50 20 20 20 20 20 54 68 65 6e 2c 20 77 68 65 6e 20       Then, when 
21b60 78 4f 70 65 6e 28 29 20 69 73 20 63 61 6c 6c 65  xOpen() is calle
21b70 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 2a 2d  d to open the *-
21b80 77 61 6c 20 66 69 6c 65 20 61 73 73 6f 63 69 61  wal file associa
21b90 74 65 64 20 77 69 74 68 0a 2a 2a 20 20 20 20 20  ted with.**     
21ba0 74 68 65 20 52 42 55 20 74 61 72 67 65 74 20 69  the RBU target i
21bb0 6e 20 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20  n RBU_STAGE_OAL 
21bc0 73 74 61 67 65 2c 20 69 6e 73 74 65 61 64 20 6f  stage, instead o
21bd0 66 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 2a 2d  f opening the *-
21be0 77 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2c  wal.**     file,
21bf0 20 74 68 65 20 72 62 75 20 76 66 73 20 6f 70 65   the rbu vfs ope
21c00 6e 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  ns the correspon
21c10 64 69 6e 67 20 2a 2d 6f 61 6c 20 66 69 6c 65 20  ding *-oal file 
21c20 69 6e 73 74 65 61 64 2e 20 0a 2a 2a 0a 2a 2a 20  instead. .**.** 
21c30 33 62 2e 20 54 68 65 20 2a 2d 73 68 6d 20 70 61  3b. The *-shm pa
21c40 67 65 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  ges returned by 
21c50 78 53 68 6d 4d 61 70 28 29 20 66 6f 72 20 61 20  xShmMap() for a 
21c60 74 61 72 67 65 74 20 64 62 20 66 69 6c 65 20 69  target db file i
21c70 6e 0a 2a 2a 20 20 20 20 20 52 42 55 5f 53 54 41  n.**     RBU_STA
21c80 47 45 5f 4f 41 4c 20 6d 6f 64 65 20 61 72 65 20  GE_OAL mode are 
21c90 61 63 74 75 61 6c 6c 79 20 73 74 6f 72 65 64 20  actually stored 
21ca0 69 6e 20 68 65 61 70 20 6d 65 6d 6f 72 79 2e 20  in heap memory. 
21cb0 54 68 69 73 20 69 73 20 74 6f 0a 2a 2a 20 20 20  This is to.**   
21cc0 20 20 61 76 6f 69 64 20 63 72 65 61 74 69 6e 67    avoid creating
21cd0 20 61 20 2a 2d 73 68 6d 20 66 69 6c 65 20 6f 6e   a *-shm file on
21ce0 20 64 69 73 6b 2e 20 41 64 64 69 74 69 6f 6e 61   disk. Additiona
21cf0 6c 6c 79 2c 20 78 53 68 6d 4c 6f 63 6b 28 29 20  lly, xShmLock() 
21d00 63 61 6c 6c 73 0a 2a 2a 20 20 20 20 20 61 72 65  calls.**     are
21d10 20 6e 6f 2d 6f 70 73 20 6f 6e 20 74 61 72 67 65   no-ops on targe
21d20 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  t database files
21d30 20 69 6e 20 52 42 55 5f 53 54 41 47 45 5f 4f 41   in RBU_STAGE_OA
21d40 4c 20 6d 6f 64 65 2e 20 54 68 69 73 20 69 73 0a  L mode. This is.
21d50 2a 2a 20 20 20 20 20 62 65 63 61 75 73 65 20 61  **     because a
21d60 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
21d70 74 73 20 69 6e 20 73 6f 6d 65 20 56 46 53 20 69  ts in some VFS i
21d80 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66  mplementations f
21d90 61 69 6c 20 69 66 20 0a 2a 2a 20 20 20 20 20 78  ail if .**     x
21da0 53 68 6d 4c 6f 63 6b 28 29 20 69 73 20 63 61 6c  ShmLock() is cal
21db0 6c 65 64 20 62 65 66 6f 72 65 20 78 53 68 6d 4d  led before xShmM
21dc0 61 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 33 63 2e 20  ap()..**.** 3c. 
21dd0 49 66 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  If an EXCLUSIVE 
21de0 6c 6f 63 6b 20 69 73 20 61 74 74 65 6d 70 74 65  lock is attempte
21df0 64 20 6f 6e 20 61 20 74 61 72 67 65 74 20 64 61  d on a target da
21e00 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 61  tabase file in a
21e10 6e 79 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 20 65  ny.**     mode e
21e20 78 63 65 70 74 20 52 42 55 5f 53 54 41 47 45 5f  xcept RBU_STAGE_
21e30 44 4f 4e 45 20 28 61 6c 6c 20 77 6f 72 6b 20 63  DONE (all work c
21e40 6f 6d 70 6c 65 74 65 64 20 61 6e 64 20 63 68 65  ompleted and che
21e50 63 6b 70 6f 69 6e 74 65 64 29 2c 20 69 74 20 0a  ckpointed), it .
21e60 2a 2a 20 20 20 20 20 66 61 69 6c 73 20 77 69 74  **     fails wit
21e70 68 20 61 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  h an SQLITE_BUSY
21e80 20 65 72 72 6f 72 2e 20 54 68 69 73 20 69 73 20   error. This is 
21e90 74 6f 20 73 74 6f 70 20 52 42 55 20 63 6f 6e 6e  to stop RBU conn
21ea0 65 63 74 69 6f 6e 73 0a 2a 2a 20 20 20 20 20 66  ections.**     f
21eb0 72 6f 6d 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  rom automaticall
21ec0 79 20 63 68 65 63 6b 70 6f 69 6e 74 69 6e 67 20  y checkpointing 
21ed0 61 20 2a 2d 77 61 6c 20 28 6f 72 20 2a 2d 6f 61  a *-wal (or *-oa
21ee0 6c 29 20 66 69 6c 65 20 66 72 6f 6d 20 77 69 74  l) file from wit
21ef0 68 69 6e 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  hin.**     sqlit
21f00 65 33 5f 63 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a  e3_close()..**.*
21f10 2a 20 33 64 2e 20 49 6e 20 52 42 55 5f 53 54 41  * 3d. In RBU_STA
21f20 47 45 5f 43 41 50 54 55 52 45 20 6d 6f 64 65 2c  GE_CAPTURE mode,
21f30 20 61 6c 6c 20 78 52 65 61 64 28 29 20 63 61 6c   all xRead() cal
21f40 6c 73 20 6f 6e 20 74 68 65 20 77 61 6c 20 66 69  ls on the wal fi
21f50 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61  le, and.**     a
21f60 6c 6c 20 78 57 72 69 74 65 28 29 20 63 61 6c 6c  ll xWrite() call
21f70 73 20 6f 6e 20 74 68 65 20 74 61 72 67 65 74 20  s on the target 
21f80 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 65  database file pe
21f90 72 66 6f 72 6d 20 6e 6f 20 49 4f 2e 20 0a 2a 2a  rform no IO. .**
21fa0 20 20 20 20 20 49 6e 73 74 65 61 64 20 74 68 65       Instead the
21fb0 20 66 72 61 6d 65 20 61 6e 64 20 70 61 67 65 20   frame and page 
21fc0 6e 75 6d 62 65 72 73 20 74 68 61 74 20 77 6f 75  numbers that wou
21fd0 6c 64 20 62 65 20 72 65 61 64 20 61 6e 64 20 77  ld be read and w
21fe0 72 69 74 74 65 6e 0a 2a 2a 20 20 20 20 20 61 72  ritten.**     ar
21ff0 65 20 72 65 63 6f 72 64 65 64 2e 20 41 64 64 69  e recorded. Addi
22000 74 69 6f 6e 61 6c 6c 79 2c 20 73 75 63 63 65 73  tionally, succes
22010 73 66 75 6c 20 61 74 74 65 6d 70 74 73 20 74 6f  sful attempts to
22020 20 6f 62 74 61 69 6e 20 65 78 63 6c 75 73 69 76   obtain exclusiv
22030 65 0a 2a 2a 20 20 20 20 20 78 53 68 6d 4c 6f 63  e.**     xShmLoc
22040 6b 28 29 20 57 52 49 54 45 52 2c 20 43 48 45 43  k() WRITER, CHEC
22050 4b 50 4f 49 4e 54 45 52 20 61 6e 64 20 52 45 41  KPOINTER and REA
22060 44 30 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20  D0 locks on the 
22070 74 61 72 67 65 74 20 0a 2a 2a 20 20 20 20 20 64  target .**     d
22080 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65  atabase file are
22090 20 72 65 63 6f 72 64 65 64 2e 20 78 53 68 6d 4c   recorded. xShmL
220a0 6f 63 6b 28 29 20 63 61 6c 6c 73 20 74 6f 20 75  ock() calls to u
220b0 6e 6c 6f 63 6b 20 74 68 65 20 73 61 6d 65 0a 2a  nlock the same.*
220c0 2a 20 20 20 20 20 6c 6f 63 6b 73 20 61 72 65 20  *     locks are 
220d0 6e 6f 2d 6f 70 73 20 28 73 6f 20 74 68 61 74 20  no-ops (so that 
220e0 6f 6e 63 65 20 6f 62 74 61 69 6e 65 64 2c 20 74  once obtained, t
220f0 68 65 73 65 20 6c 6f 63 6b 73 20 61 72 65 20 6e  hese locks are n
22100 65 76 65 72 0a 2a 2a 20 20 20 20 20 72 65 6c 69  ever.**     reli
22110 6e 71 75 69 73 68 65 64 29 2e 20 46 69 6e 61 6c  nquished). Final
22120 6c 79 2c 20 63 61 6c 6c 73 20 74 6f 20 78 53 79  ly, calls to xSy
22130 6e 63 28 29 20 6f 6e 20 74 68 65 20 74 61 72 67  nc() on the targ
22140 65 74 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  et database.**  
22150 20 20 20 66 69 6c 65 20 66 61 69 6c 20 77 69 74     file fail wit
22160 68 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41  h SQLITE_INTERNA
22170 4c 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 0a 73 74  L errors..*/..st
22180 61 74 69 63 20 76 6f 69 64 20 72 62 75 55 6e 6c  atic void rbuUnl
22190 6f 63 6b 53 68 6d 28 72 62 75 5f 66 69 6c 65 20  ockShm(rbu_file 
221a0 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
221b0 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51  ->openFlags & SQ
221c0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
221d0 42 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 52  B );.  if( p->pR
221e0 62 75 20 29 7b 0a 20 20 20 20 69 6e 74 20 28 2a  bu ){.    int (*
221f0 78 53 68 6d 4c 6f 63 6b 29 28 73 71 6c 69 74 65  xShmLock)(sqlite
22200 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 69 6e 74 2c  3_file*,int,int,
22210 69 6e 74 29 20 3d 20 70 2d 3e 70 52 65 61 6c 2d  int) = p->pReal-
22220 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4c  >pMethods->xShmL
22230 6f 63 6b 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ock;.    int i;.
22240 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 53      for(i=0; i<S
22250 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 3b  QLITE_SHM_NLOCK;
22260 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
22270 28 31 3c 3c 69 29 20 26 20 70 2d 3e 70 52 62 75  (1<<i) & p->pRbu
22280 2d 3e 6d 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  ->mLock ){.     
22290 20 20 20 78 53 68 6d 4c 6f 63 6b 28 70 2d 3e 70     xShmLock(p->p
222a0 52 65 61 6c 2c 20 69 2c 20 31 2c 20 53 51 4c 49  Real, i, 1, SQLI
222b0 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 7c 53 51  TE_SHM_UNLOCK|SQ
222c0 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
222d0 56 45 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  VE);.      }.   
222e0 20 7d 0a 20 20 20 20 70 2d 3e 70 52 62 75 2d 3e   }.    p->pRbu->
222f0 6d 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 7d 0a 7d  mLock = 0;.  }.}
22300 0a 0a 2f 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ../*.*/.static i
22310 6e 74 20 72 62 75 55 70 64 61 74 65 54 65 6d 70  nt rbuUpdateTemp
22320 53 69 7a 65 28 72 62 75 5f 66 69 6c 65 20 2a 70  Size(rbu_file *p
22330 46 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  Fd, sqlite3_int6
22340 34 20 6e 4e 65 77 29 7b 0a 20 20 73 71 6c 69 74  4 nNew){.  sqlit
22350 65 33 72 62 75 20 2a 70 52 62 75 20 3d 20 70 46  e3rbu *pRbu = pF
22360 64 2d 3e 70 52 62 75 3b 0a 20 20 69 36 34 20 6e  d->pRbu;.  i64 n
22370 44 69 66 66 20 3d 20 6e 4e 65 77 20 2d 20 70 46  Diff = nNew - pF
22380 64 2d 3e 73 7a 3b 0a 20 20 70 52 62 75 2d 3e 73  d->sz;.  pRbu->s
22390 7a 54 65 6d 70 20 2b 3d 20 6e 44 69 66 66 3b 0a  zTemp += nDiff;.
223a0 20 20 70 46 64 2d 3e 73 7a 20 3d 20 6e 4e 65 77    pFd->sz = nNew
223b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 62 75  ;.  assert( pRbu
223c0 2d 3e 73 7a 54 65 6d 70 3e 3d 30 20 29 3b 0a 20  ->szTemp>=0 );. 
223d0 20 69 66 28 20 70 52 62 75 2d 3e 73 7a 54 65 6d   if( pRbu->szTem
223e0 70 4c 69 6d 69 74 20 26 26 20 70 52 62 75 2d 3e  pLimit && pRbu->
223f0 73 7a 54 65 6d 70 3e 70 52 62 75 2d 3e 73 7a 54  szTemp>pRbu->szT
22400 65 6d 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72  empLimit ) retur
22410 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  n SQLITE_FULL;. 
22420 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22430 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  K;.}../*.** Add 
22440 61 6e 20 69 74 65 6d 20 74 6f 20 74 68 65 20 6d  an item to the m
22450 61 69 6e 2d 64 62 20 6c 69 73 74 73 2c 20 69 66  ain-db lists, if
22460 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
22470 64 79 20 70 72 65 73 65 6e 74 2e 0a 2a 2a 0a 2a  dy present..**.*
22480 2a 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 20  * There are two 
22490 6d 61 69 6e 2d 64 62 20 6c 69 73 74 73 2e 20 4f  main-db lists. O
224a0 6e 65 20 66 6f 72 20 61 6c 6c 20 66 69 6c 65 20  ne for all file 
224b0 64 65 73 63 72 69 70 74 6f 72 73 2c 20 61 6e 64  descriptors, and
224c0 20 6f 6e 65 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20   one.** for all 
224d0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
224e0 20 77 69 74 68 20 72 62 75 5f 66 69 6c 65 2e 70   with rbu_file.p
224f0 44 62 21 3d 30 2e 20 49 66 20 74 68 65 20 61 72  Db!=0. If the ar
22500 67 75 6d 65 6e 74 20 68 61 73 0a 2a 2a 20 72 62  gument has.** rb
22510 75 5f 66 69 6c 65 2e 70 44 62 21 3d 30 2c 20 74  u_file.pDb!=0, t
22520 68 65 6e 20 69 74 20 69 73 20 61 73 73 75 6d 65  hen it is assume
22530 64 20 74 6f 20 61 6c 72 65 61 64 79 20 62 65 20  d to already be 
22540 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65 0a 2a  present on the.*
22550 2a 20 6d 61 69 6e 20 6c 69 73 74 20 61 6e 64 20  * main list and 
22560 69 73 20 6f 6e 6c 79 20 61 64 64 65 64 20 74 6f  is only added to
22570 20 74 68 65 20 70 44 62 21 3d 30 20 6c 69 73 74   the pDb!=0 list
22580 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
22590 20 72 62 75 4d 61 69 6e 6c 69 73 74 41 64 64 28   rbuMainlistAdd(
225a0 72 62 75 5f 66 69 6c 65 20 2a 70 29 7b 0a 20 20  rbu_file *p){.  
225b0 72 62 75 5f 76 66 73 20 2a 70 52 62 75 56 66 73  rbu_vfs *pRbuVfs
225c0 20 3d 20 70 2d 3e 70 52 62 75 56 66 73 3b 0a 20   = p->pRbuVfs;. 
225d0 20 72 62 75 5f 66 69 6c 65 20 2a 70 49 74 65 72   rbu_file *pIter
225e0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e  ;.  assert( (p->
225f0 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49  openFlags & SQLI
22600 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29  TE_OPEN_MAIN_DB)
22610 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   );.  sqlite3_mu
22620 74 65 78 5f 65 6e 74 65 72 28 70 52 62 75 56 66  tex_enter(pRbuVf
22630 73 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  s->mutex);.  if(
22640 20 70 2d 3e 70 52 62 75 3d 3d 30 20 29 7b 0a 20   p->pRbu==0 ){. 
22650 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70 52 62     for(pIter=pRb
22660 75 56 66 73 2d 3e 70 4d 61 69 6e 3b 20 70 49 74  uVfs->pMain; pIt
22670 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d  er; pIter=pIter-
22680 3e 70 4d 61 69 6e 4e 65 78 74 29 3b 0a 20 20 20  >pMainNext);.   
22690 20 70 2d 3e 70 4d 61 69 6e 4e 65 78 74 20 3d 20   p->pMainNext = 
226a0 70 52 62 75 56 66 73 2d 3e 70 4d 61 69 6e 3b 0a  pRbuVfs->pMain;.
226b0 20 20 20 20 70 52 62 75 56 66 73 2d 3e 70 4d 61      pRbuVfs->pMa
226c0 69 6e 20 3d 20 70 3b 0a 20 20 7d 65 6c 73 65 7b  in = p;.  }else{
226d0 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70  .    for(pIter=p
226e0 52 62 75 56 66 73 2d 3e 70 4d 61 69 6e 52 62 75  RbuVfs->pMainRbu
226f0 3b 20 70 49 74 65 72 20 26 26 20 70 49 74 65 72  ; pIter && pIter
22700 21 3d 70 3b 20 70 49 74 65 72 3d 70 49 74 65 72  !=p; pIter=pIter
22710 2d 3e 70 4d 61 69 6e 52 62 75 4e 65 78 74 29 7b  ->pMainRbuNext){
22720 7d 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 3d  }.    if( pIter=
22730 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70  =0 ){.      p->p
22740 4d 61 69 6e 52 62 75 4e 65 78 74 20 3d 20 70 52  MainRbuNext = pR
22750 62 75 56 66 73 2d 3e 70 4d 61 69 6e 52 62 75 3b  buVfs->pMainRbu;
22760 0a 20 20 20 20 20 20 70 52 62 75 56 66 73 2d 3e  .      pRbuVfs->
22770 70 4d 61 69 6e 52 62 75 20 3d 20 70 3b 0a 20 20  pMainRbu = p;.  
22780 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
22790 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 52  3_mutex_leave(pR
227a0 62 75 56 66 73 2d 3e 6d 75 74 65 78 29 3b 0a 7d  buVfs->mutex);.}
227b0 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 61  ../*.** Remove a
227c0 6e 20 69 74 65 6d 20 66 72 6f 6d 20 74 68 65 20  n item from the 
227d0 6d 61 69 6e 2d 64 62 20 6c 69 73 74 73 2e 0a 2a  main-db lists..*
227e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62  /.static void rb
227f0 75 4d 61 69 6e 6c 69 73 74 52 65 6d 6f 76 65 28  uMainlistRemove(
22800 72 62 75 5f 66 69 6c 65 20 2a 70 29 7b 0a 20 20  rbu_file *p){.  
22810 72 62 75 5f 66 69 6c 65 20 2a 2a 70 70 3b 0a 20  rbu_file **pp;. 
22820 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
22830 6e 74 65 72 28 70 2d 3e 70 52 62 75 56 66 73 2d  nter(p->pRbuVfs-
22840 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70  >mutex);.  for(p
22850 70 3d 26 70 2d 3e 70 52 62 75 56 66 73 2d 3e 70  p=&p->pRbuVfs->p
22860 4d 61 69 6e 3b 20 2a 70 70 20 26 26 20 2a 70 70  Main; *pp && *pp
22870 21 3d 70 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d  !=p; pp=&((*pp)-
22880 3e 70 4d 61 69 6e 4e 65 78 74 29 29 7b 7d 0a 20  >pMainNext)){}. 
22890 20 69 66 28 20 2a 70 70 20 29 20 2a 70 70 20 3d   if( *pp ) *pp =
228a0 20 70 2d 3e 70 4d 61 69 6e 4e 65 78 74 3b 0a 20   p->pMainNext;. 
228b0 20 70 2d 3e 70 4d 61 69 6e 4e 65 78 74 20 3d 20   p->pMainNext = 
228c0 30 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 2d 3e  0;.  for(pp=&p->
228d0 70 52 62 75 56 66 73 2d 3e 70 4d 61 69 6e 52 62  pRbuVfs->pMainRb
228e0 75 3b 20 2a 70 70 20 26 26 20 2a 70 70 21 3d 70  u; *pp && *pp!=p
228f0 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4d  ; pp=&((*pp)->pM
22900 61 69 6e 52 62 75 4e 65 78 74 29 29 7b 7d 0a 20  ainRbuNext)){}. 
22910 20 69 66 28 20 2a 70 70 20 29 20 2a 70 70 20 3d   if( *pp ) *pp =
22920 20 70 2d 3e 70 4d 61 69 6e 52 62 75 4e 65 78 74   p->pMainRbuNext
22930 3b 0a 20 20 70 2d 3e 70 4d 61 69 6e 52 62 75 4e  ;.  p->pMainRbuN
22940 65 78 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ext = 0;.  sqlit
22950 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
22960 2d 3e 70 52 62 75 56 66 73 2d 3e 6d 75 74 65 78  ->pRbuVfs->mutex
22970 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  );.}../*.** Give
22980 6e 20 74 68 61 74 20 7a 57 61 6c 20 70 6f 69 6e  n that zWal poin
22990 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  ts to a buffer c
229a0 6f 6e 74 61 69 6e 69 6e 67 20 61 20 77 61 6c 20  ontaining a wal 
229b0 66 69 6c 65 20 6e 61 6d 65 20 70 61 73 73 65 64  file name passed
229c0 20 74 6f 20 0a 2a 2a 20 65 69 74 68 65 72 20 74   to .** either t
229d0 68 65 20 78 4f 70 65 6e 28 29 20 6f 72 20 78 41  he xOpen() or xA
229e0 63 63 65 73 73 28 29 20 56 46 53 20 6d 65 74 68  ccess() VFS meth
229f0 6f 64 2c 20 73 65 61 72 63 68 20 74 68 65 20 6d  od, search the m
22a00 61 69 6e 2d 64 62 20 6c 69 73 74 20 66 6f 72 0a  ain-db list for.
22a10 2a 2a 20 61 20 66 69 6c 65 2d 68 61 6e 64 6c 65  ** a file-handle
22a20 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 73   opened by the s
22a30 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ame database con
22a40 6e 65 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63  nection on the c
22a50 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
22a60 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
22a70 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
22a80 72 20 62 52 62 75 20 69 73 20 74 72 75 65 2c 20  r bRbu is true, 
22a90 6f 6e 6c 79 20 73 65 61 72 63 68 20 66 6f 72 20  only search for 
22aa0 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
22ab0 20 77 69 74 68 0a 2a 2a 20 72 62 75 5f 66 69 6c   with.** rbu_fil
22ac0 65 2e 70 44 62 21 3d 30 2e 0a 2a 2f 0a 73 74 61  e.pDb!=0..*/.sta
22ad0 74 69 63 20 72 62 75 5f 66 69 6c 65 20 2a 72 62  tic rbu_file *rb
22ae0 75 46 69 6e 64 4d 61 69 6e 64 62 28 72 62 75 5f  uFindMaindb(rbu_
22af0 76 66 73 20 2a 70 52 62 75 56 66 73 2c 20 63 6f  vfs *pRbuVfs, co
22b00 6e 73 74 20 63 68 61 72 20 2a 7a 57 61 6c 2c 20  nst char *zWal, 
22b10 69 6e 74 20 62 52 62 75 29 7b 0a 20 20 72 62 75  int bRbu){.  rbu
22b20 5f 66 69 6c 65 20 2a 70 44 62 3b 0a 20 20 73 71  _file *pDb;.  sq
22b30 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
22b40 72 28 70 52 62 75 56 66 73 2d 3e 6d 75 74 65 78  r(pRbuVfs->mutex
22b50 29 3b 0a 20 20 69 66 28 20 62 52 62 75 20 29 7b  );.  if( bRbu ){
22b60 0a 20 20 20 20 66 6f 72 28 70 44 62 3d 70 52 62  .    for(pDb=pRb
22b70 75 56 66 73 2d 3e 70 4d 61 69 6e 52 62 75 3b 20  uVfs->pMainRbu; 
22b80 70 44 62 20 26 26 20 70 44 62 2d 3e 7a 57 61 6c  pDb && pDb->zWal
22b90 21 3d 7a 57 61 6c 3b 20 70 44 62 3d 70 44 62 2d  !=zWal; pDb=pDb-
22ba0 3e 70 4d 61 69 6e 52 62 75 4e 65 78 74 29 7b 7d  >pMainRbuNext){}
22bb0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
22bc0 72 28 70 44 62 3d 70 52 62 75 56 66 73 2d 3e 70  r(pDb=pRbuVfs->p
22bd0 4d 61 69 6e 3b 20 70 44 62 20 26 26 20 70 44 62  Main; pDb && pDb
22be0 2d 3e 7a 57 61 6c 21 3d 7a 57 61 6c 3b 20 70 44  ->zWal!=zWal; pD
22bf0 62 3d 70 44 62 2d 3e 70 4d 61 69 6e 4e 65 78 74  b=pDb->pMainNext
22c00 29 7b 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ){}.  }.  sqlite
22c10 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 52  3_mutex_leave(pR
22c20 62 75 56 66 73 2d 3e 6d 75 74 65 78 29 3b 0a 20  buVfs->mutex);. 
22c30 20 72 65 74 75 72 6e 20 70 44 62 3b 0a 7d 0a 0a   return pDb;.}..
22c40 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 72  /*.** Close an r
22c50 62 75 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  bu file..*/.stat
22c60 69 63 20 69 6e 74 20 72 62 75 56 66 73 43 6c 6f  ic int rbuVfsClo
22c70 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
22c80 2a 70 46 69 6c 65 29 7b 0a 20 20 72 62 75 5f 66  *pFile){.  rbu_f
22c90 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69  ile *p = (rbu_fi
22ca0 6c 65 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74  le*)pFile;.  int
22cb0 20 72 63 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20   rc;.  int i;.. 
22cc0 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e   /* Free the con
22cd0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 61 70 53  tents of the apS
22ce0 68 6d 5b 5d 20 61 72 72 61 79 2e 20 41 6e 64 20  hm[] array. And 
22cf0 74 68 65 20 61 72 72 61 79 20 69 74 73 65 6c 66  the array itself
22d00 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  . */.  for(i=0; 
22d10 69 3c 70 2d 3e 6e 53 68 6d 3b 20 69 2b 2b 29 7b  i<p->nShm; i++){
22d20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
22d30 65 28 70 2d 3e 61 70 53 68 6d 5b 69 5d 29 3b 0a  e(p->apShm[i]);.
22d40 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
22d50 65 65 28 70 2d 3e 61 70 53 68 6d 29 3b 0a 20 20  ee(p->apShm);.  
22d60 70 2d 3e 61 70 53 68 6d 20 3d 20 30 3b 0a 20 20  p->apShm = 0;.  
22d70 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
22d80 7a 44 65 6c 29 3b 0a 0a 20 20 69 66 28 20 70 2d  zDel);..  if( p-
22d90 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c  >openFlags & SQL
22da0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
22db0 20 29 7b 0a 20 20 20 20 72 62 75 4d 61 69 6e 6c   ){.    rbuMainl
22dc0 69 73 74 52 65 6d 6f 76 65 28 70 29 3b 0a 20 20  istRemove(p);.  
22dd0 20 20 72 62 75 55 6e 6c 6f 63 6b 53 68 6d 28 70    rbuUnlockShm(p
22de0 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65 61 6c 2d  );.    p->pReal-
22df0 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 55  >pMethods->xShmU
22e00 6e 6d 61 70 28 70 2d 3e 70 52 65 61 6c 2c 20 30  nmap(p->pReal, 0
22e10 29 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66  );.  }.  else if
22e20 28 20 28 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20  ( (p->openFlags 
22e30 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  & SQLITE_OPEN_DE
22e40 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 20 26 26 20  LETEONCLOSE) && 
22e50 70 2d 3e 70 52 62 75 20 29 7b 0a 20 20 20 20 72  p->pRbu ){.    r
22e60 62 75 55 70 64 61 74 65 54 65 6d 70 53 69 7a 65  buUpdateTempSize
22e70 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 61 73  (p, 0);.  }.  as
22e80 73 65 72 74 28 20 70 2d 3e 70 4d 61 69 6e 4e 65  sert( p->pMainNe
22e90 78 74 3d 3d 30 20 26 26 20 70 2d 3e 70 52 62 75  xt==0 && p->pRbu
22ea0 56 66 73 2d 3e 70 4d 61 69 6e 21 3d 70 20 29 3b  Vfs->pMain!=p );
22eb0 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 74 68 65  ..  /* Close the
22ec0 20 75 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65   underlying file
22ed0 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 72 63 20   handle */.  rc 
22ee0 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74  = p->pReal->pMet
22ef0 68 6f 64 73 2d 3e 78 43 6c 6f 73 65 28 70 2d 3e  hods->xClose(p->
22f00 70 52 65 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e  pReal);.  return
22f10 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52   rc;.}.../*.** R
22f20 65 61 64 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ead and return a
22f30 6e 20 75 6e 73 69 67 6e 65 64 20 33 32 2d 62 69  n unsigned 32-bi
22f40 74 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  t big-endian int
22f50 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20 62 75  eger from the bu
22f60 66 66 65 72 20 0a 2a 2a 20 70 61 73 73 65 64 20  ffer .** passed 
22f70 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
22f80 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
22f90 75 33 32 20 72 62 75 47 65 74 55 33 32 28 75 38  u32 rbuGetU32(u8
22fa0 20 2a 61 42 75 66 29 7b 0a 20 20 72 65 74 75 72   *aBuf){.  retur
22fb0 6e 20 28 28 75 33 32 29 61 42 75 66 5b 30 5d 20  n ((u32)aBuf[0] 
22fc0 3c 3c 20 32 34 29 0a 20 20 20 20 20 20 20 2b 20  << 24).       + 
22fd0 28 28 75 33 32 29 61 42 75 66 5b 31 5d 20 3c 3c  ((u32)aBuf[1] <<
22fe0 20 31 36 29 0a 20 20 20 20 20 20 20 2b 20 28 28   16).       + ((
22ff0 75 33 32 29 61 42 75 66 5b 32 5d 20 3c 3c 20 20  u32)aBuf[2] <<  
23000 38 29 0a 20 20 20 20 20 20 20 2b 20 28 28 75 33  8).       + ((u3
23010 32 29 61 42 75 66 5b 33 5d 29 3b 0a 7d 0a 0a 2f  2)aBuf[3]);.}../
23020 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 75 6e  *.** Write an un
23030 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20 76 61  signed 32-bit va
23040 6c 75 65 20 69 6e 20 62 69 67 2d 65 6e 64 69 61  lue in big-endia
23050 6e 20 66 6f 72 6d 61 74 20 74 6f 20 74 68 65 20  n format to the 
23060 73 75 70 70 6c 69 65 64 0a 2a 2a 20 62 75 66 66  supplied.** buff
23070 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
23080 69 64 20 72 62 75 50 75 74 55 33 32 28 75 38 20  id rbuPutU32(u8 
23090 2a 61 42 75 66 2c 20 75 33 32 20 69 56 61 6c 29  *aBuf, u32 iVal)
230a0 7b 0a 20 20 61 42 75 66 5b 30 5d 20 3d 20 28 69  {.  aBuf[0] = (i
230b0 56 61 6c 20 3e 3e 20 32 34 29 20 26 20 30 78 46  Val >> 24) & 0xF
230c0 46 3b 0a 20 20 61 42 75 66 5b 31 5d 20 3d 20 28  F;.  aBuf[1] = (
230d0 69 56 61 6c 20 3e 3e 20 31 36 29 20 26 20 30 78  iVal >> 16) & 0x
230e0 46 46 3b 0a 20 20 61 42 75 66 5b 32 5d 20 3d 20  FF;.  aBuf[2] = 
230f0 28 69 56 61 6c 20 3e 3e 20 20 38 29 20 26 20 30  (iVal >>  8) & 0
23100 78 46 46 3b 0a 20 20 61 42 75 66 5b 33 5d 20 3d  xFF;.  aBuf[3] =
23110 20 28 69 56 61 6c 20 3e 3e 20 20 30 29 20 26 20   (iVal >>  0) & 
23120 30 78 46 46 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  0xFF;.}..static 
23130 76 6f 69 64 20 72 62 75 50 75 74 55 31 36 28 75  void rbuPutU16(u
23140 38 20 2a 61 42 75 66 2c 20 75 31 36 20 69 56 61  8 *aBuf, u16 iVa
23150 6c 29 7b 0a 20 20 61 42 75 66 5b 30 5d 20 3d 20  l){.  aBuf[0] = 
23160 28 69 56 61 6c 20 3e 3e 20 20 38 29 20 26 20 30  (iVal >>  8) & 0
23170 78 46 46 3b 0a 20 20 61 42 75 66 5b 31 5d 20 3d  xFF;.  aBuf[1] =
23180 20 28 69 56 61 6c 20 3e 3e 20 20 30 29 20 26 20   (iVal >>  0) & 
23190 30 78 46 46 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  0xFF;.}../*.** R
231a0 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 6e  ead data from an
231b0 20 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f   rbuVfs-file..*/
231c0 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56  .static int rbuV
231d0 66 73 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65  fsRead(.  sqlite
231e0 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 0a  3_file *pFile, .
231f0 20 20 76 6f 69 64 20 2a 7a 42 75 66 2c 20 0a 20    void *zBuf, . 
23200 20 69 6e 74 20 69 41 6d 74 2c 20 0a 20 20 73 71   int iAmt, .  sq
23210 6c 69 74 65 5f 69 6e 74 36 34 20 69 4f 66 73 74  lite_int64 iOfst
23220 0a 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a  .){.  rbu_file *
23230 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 2a 29 70  p = (rbu_file*)p
23240 46 69 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33 72  File;.  sqlite3r
23250 62 75 20 2a 70 52 62 75 20 3d 20 70 2d 3e 70 52  bu *pRbu = p->pR
23260 62 75 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  bu;.  int rc;.. 
23270 20 69 66 28 20 70 52 62 75 20 26 26 20 70 52 62   if( pRbu && pRb
23280 75 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53  u->eStage==RBU_S
23290 54 41 47 45 5f 43 41 50 54 55 52 45 20 29 7b 0a  TAGE_CAPTURE ){.
232a0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f      assert( p->o
232b0 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49 54  penFlags & SQLIT
232c0 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 20 20  E_OPEN_WAL );.  
232d0 20 20 72 63 20 3d 20 72 62 75 43 61 70 74 75 72    rc = rbuCaptur
232e0 65 57 61 6c 52 65 61 64 28 70 2d 3e 70 52 62 75  eWalRead(p->pRbu
232f0 2c 20 69 4f 66 73 74 2c 20 69 41 6d 74 29 3b 0a  , iOfst, iAmt);.
23300 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
23310 20 70 52 62 75 20 26 26 20 70 52 62 75 2d 3e 65   pRbu && pRbu->e
23320 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45  Stage==RBU_STAGE
23330 5f 4f 41 4c 20 0a 20 20 20 20 20 26 26 20 28 70  _OAL .     && (p
23340 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51  ->openFlags & SQ
23350 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 29 20 0a  LITE_OPEN_WAL) .
23360 20 20 20 20 20 26 26 20 69 4f 66 73 74 3e 3d 70       && iOfst>=p
23370 52 62 75 2d 3e 69 4f 61 6c 53 7a 20 0a 20 20 20  Rbu->iOalSz .   
23380 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
23390 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
233a0 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20  memset(zBuf, 0, 
233b0 69 41 6d 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  iAmt);.    }else
233c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 2d 3e  {.      rc = p->
233d0 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d  pReal->pMethods-
233e0 3e 78 52 65 61 64 28 70 2d 3e 70 52 65 61 6c 2c  >xRead(p->pReal,
233f0 20 7a 42 75 66 2c 20 69 41 6d 74 2c 20 69 4f 66   zBuf, iAmt, iOf
23400 73 74 29 3b 0a 23 69 66 20 31 0a 20 20 20 20 20  st);.#if 1.     
23410 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 62   /* If this is b
23420 65 69 6e 67 20 63 61 6c 6c 65 64 20 74 6f 20 72  eing called to r
23430 65 61 64 20 74 68 65 20 66 69 72 73 74 20 70 61  ead the first pa
23440 67 65 20 6f 66 20 74 68 65 20 74 61 72 67 65 74  ge of the target
23450 20 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62   .      ** datab
23460 61 73 65 20 61 73 20 70 61 72 74 20 6f 66 20 61  ase as part of a
23470 6e 20 72 62 75 20 76 61 63 75 75 6d 20 6f 70 65  n rbu vacuum ope
23480 72 61 74 69 6f 6e 2c 20 73 79 6e 74 68 65 73 69  ration, synthesi
23490 7a 65 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  ze the .      **
234a0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
234b0 20 66 69 72 73 74 20 70 61 67 65 20 69 66 20 69   first page if i
234c0 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65  t does not yet e
234d0 78 69 73 74 2e 20 4f 74 68 65 72 77 69 73 65 2c  xist. Otherwise,
234e0 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 69 74 65  .      ** SQLite
234f0 20 77 69 6c 6c 20 6e 6f 74 20 63 68 65 63 6b 20   will not check 
23500 66 6f 72 20 61 20 2a 2d 77 61 6c 20 66 69 6c 65  for a *-wal file
23510 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .  */.      if( 
23520 70 52 62 75 20 26 26 20 72 62 75 49 73 56 61 63  pRbu && rbuIsVac
23530 75 75 6d 28 70 52 62 75 29 20 0a 20 20 20 20 20  uum(pRbu) .     
23540 20 20 20 20 20 26 26 20 72 63 3d 3d 53 51 4c 49       && rc==SQLI
23550 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
23560 45 41 44 20 26 26 20 69 4f 66 73 74 3d 3d 30 0a  EAD && iOfst==0.
23570 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 2d            && (p-
23580 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c  >openFlags & SQL
23590 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
235a0 29 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 70  ).          && p
235b0 52 62 75 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  Rbu->rc==SQLITE_
235c0 4f 4b 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  OK.      ){.    
235d0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
235e0 20 2a 70 46 64 20 3d 20 28 73 71 6c 69 74 65 33   *pFd = (sqlite3
235f0 5f 66 69 6c 65 2a 29 70 52 62 75 2d 3e 70 52 62  _file*)pRbu->pRb
23600 75 46 64 3b 0a 20 20 20 20 20 20 20 20 72 63 20  uFd;.        rc 
23610 3d 20 70 46 64 2d 3e 70 4d 65 74 68 6f 64 73 2d  = pFd->pMethods-
23620 3e 78 52 65 61 64 28 70 46 64 2c 20 7a 42 75 66  >xRead(pFd, zBuf
23630 2c 20 69 41 6d 74 2c 20 69 4f 66 73 74 29 3b 0a  , iAmt, iOfst);.
23640 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
23650 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23660 20 20 20 20 20 20 20 75 38 20 2a 61 42 75 66 20         u8 *aBuf 
23670 3d 20 28 75 38 2a 29 7a 42 75 66 3b 0a 20 20 20  = (u8*)zBuf;.   
23680 20 20 20 20 20 20 20 75 33 32 20 69 52 6f 6f 74         u32 iRoot
23690 20 3d 20 72 62 75 47 65 74 55 33 32 28 26 61 42   = rbuGetU32(&aB
236a0 75 66 5b 35 32 5d 29 20 3f 20 31 20 3a 20 30 3b  uf[52]) ? 1 : 0;
236b0 0a 20 20 20 20 20 20 20 20 20 20 72 62 75 50 75  .          rbuPu
236c0 74 55 33 32 28 26 61 42 75 66 5b 35 32 5d 2c 20  tU32(&aBuf[52], 
236d0 69 52 6f 6f 74 29 3b 20 20 20 20 20 20 2f 2a 20  iRoot);      /* 
236e0 6c 61 72 67 65 73 74 20 72 6f 6f 74 20 70 61 67  largest root pag
236f0 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20  e number */.    
23700 20 20 20 20 20 20 72 62 75 50 75 74 55 33 32 28        rbuPutU32(
23710 26 61 42 75 66 5b 33 36 5d 2c 20 30 29 3b 20 20  &aBuf[36], 0);  
23720 20 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d 62 65          /* numbe
23730 72 20 6f 66 20 66 72 65 65 20 70 61 67 65 73 20  r of free pages 
23740 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 62 75  */.          rbu
23750 50 75 74 55 33 32 28 26 61 42 75 66 5b 33 32 5d  PutU32(&aBuf[32]
23760 2c 20 30 29 3b 20 20 20 20 20 20 20 20 20 20 2f  , 0);          /
23770 2a 20 66 69 72 73 74 20 70 61 67 65 20 6f 6e 20  * first page on 
23780 66 72 65 65 20 6c 69 73 74 20 74 72 75 6e 6b 20  free list trunk 
23790 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 62 75  */.          rbu
237a0 50 75 74 55 33 32 28 26 61 42 75 66 5b 32 38 5d  PutU32(&aBuf[28]
237b0 2c 20 31 29 3b 20 20 20 20 20 20 20 20 20 20 2f  , 1);          /
237c0 2a 20 73 69 7a 65 20 6f 66 20 64 62 20 66 69 6c  * size of db fil
237d0 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20  e in pages */.  
237e0 20 20 20 20 20 20 20 20 72 62 75 50 75 74 55 33          rbuPutU3
237f0 32 28 26 61 42 75 66 5b 32 34 5d 2c 20 70 52 62  2(&aBuf[24], pRb
23800 75 2d 3e 70 52 62 75 46 64 2d 3e 69 43 6f 6f 6b  u->pRbuFd->iCook
23810 69 65 2b 31 29 3b 20 20 2f 2a 20 43 68 61 6e 67  ie+1);  /* Chang
23820 65 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20  e counter */..  
23830 20 20 20 20 20 20 20 20 69 66 28 20 69 41 6d 74          if( iAmt
23840 3e 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20  >100 ){.        
23850 20 20 20 20 6d 65 6d 73 65 74 28 26 61 42 75 66      memset(&aBuf
23860 5b 31 30 30 5d 2c 20 30 2c 20 69 41 6d 74 2d 31  [100], 0, iAmt-1
23870 30 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  00);.           
23880 20 72 62 75 50 75 74 55 31 36 28 26 61 42 75 66   rbuPutU16(&aBuf
23890 5b 31 30 35 5d 2c 20 69 41 6d 74 20 26 20 30 78  [105], iAmt & 0x
238a0 46 46 46 46 29 3b 0a 20 20 20 20 20 20 20 20 20  FFFF);.         
238b0 20 20 20 61 42 75 66 5b 31 30 30 5d 20 3d 20 30     aBuf[100] = 0
238c0 78 30 44 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  x0D;.          }
238d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
238e0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
238f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
23900 54 45 5f 4f 4b 20 26 26 20 69 4f 66 73 74 3d 3d  TE_OK && iOfst==
23910 30 20 26 26 20 28 70 2d 3e 6f 70 65 6e 46 6c 61  0 && (p->openFla
23920 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
23930 5f 4d 41 49 4e 5f 44 42 29 20 29 7b 0a 20 20 20  _MAIN_DB) ){.   
23940 20 20 20 2f 2a 20 54 68 65 73 65 20 6c 6f 6f 6b     /* These look
23950 20 6c 69 6b 65 20 6d 61 67 69 63 20 6e 75 6d 62   like magic numb
23960 65 72 73 2e 20 42 75 74 20 74 68 65 79 20 61 72  ers. But they ar
23970 65 20 73 74 61 62 6c 65 2c 20 61 73 20 74 68 65  e stable, as the
23980 79 20 61 72 65 20 70 61 72 74 0a 20 20 20 20 20  y are part.     
23990 20 20 2a 2a 20 6f 66 20 74 68 65 20 64 65 66 69    ** of the defi
239a0 6e 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 53 51  nition of the SQ
239b0 4c 69 74 65 20 66 69 6c 65 20 66 6f 72 6d 61 74  Lite file format
239c0 2c 20 77 68 69 63 68 20 6d 61 79 20 6e 6f 74 20  , which may not 
239d0 63 68 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 20  change. */.     
239e0 20 75 38 20 2a 70 42 75 66 20 3d 20 28 75 38 2a   u8 *pBuf = (u8*
239f0 29 7a 42 75 66 3b 0a 20 20 20 20 20 20 70 2d 3e  )zBuf;.      p->
23a00 69 43 6f 6f 6b 69 65 20 3d 20 72 62 75 47 65 74  iCookie = rbuGet
23a10 55 33 32 28 26 70 42 75 66 5b 32 34 5d 29 3b 0a  U32(&pBuf[24]);.
23a20 20 20 20 20 20 20 70 2d 3e 69 57 72 69 74 65 56        p->iWriteV
23a30 65 72 20 3d 20 70 42 75 66 5b 31 39 5d 3b 0a 20  er = pBuf[19];. 
23a40 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
23a50 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  n rc;.}../*.** W
23a60 72 69 74 65 20 64 61 74 61 20 74 6f 20 61 6e 20  rite data to an 
23a70 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a  rbuVfs-file..*/.
23a80 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66  static int rbuVf
23a90 73 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65  sWrite(.  sqlite
23aa0 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 0a  3_file *pFile, .
23ab0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42    const void *zB
23ac0 75 66 2c 20 0a 20 20 69 6e 74 20 69 41 6d 74 2c  uf, .  int iAmt,
23ad0 20 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34   .  sqlite_int64
23ae0 20 69 4f 66 73 74 0a 29 7b 0a 20 20 72 62 75 5f   iOfst.){.  rbu_
23af0 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66  file *p = (rbu_f
23b00 69 6c 65 2a 29 70 46 69 6c 65 3b 0a 20 20 73 71  ile*)pFile;.  sq
23b10 6c 69 74 65 33 72 62 75 20 2a 70 52 62 75 20 3d  lite3rbu *pRbu =
23b20 20 70 2d 3e 70 52 62 75 3b 0a 20 20 69 6e 74 20   p->pRbu;.  int 
23b30 72 63 3b 0a 0a 20 20 69 66 28 20 70 52 62 75 20  rc;..  if( pRbu 
23b40 26 26 20 70 52 62 75 2d 3e 65 53 74 61 67 65 3d  && pRbu->eStage=
23b50 3d 52 42 55 5f 53 54 41 47 45 5f 43 41 50 54 55  =RBU_STAGE_CAPTU
23b60 52 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  RE ){.    assert
23b70 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26  ( p->openFlags &
23b80 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
23b90 4e 5f 44 42 20 29 3b 0a 20 20 20 20 72 63 20 3d  N_DB );.    rc =
23ba0 20 72 62 75 43 61 70 74 75 72 65 44 62 57 72 69   rbuCaptureDbWri
23bb0 74 65 28 70 2d 3e 70 52 62 75 2c 20 69 4f 66 73  te(p->pRbu, iOfs
23bc0 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
23bd0 20 69 66 28 20 70 52 62 75 20 29 7b 0a 20 20 20   if( pRbu ){.   
23be0 20 20 20 69 66 28 20 70 52 62 75 2d 3e 65 53 74     if( pRbu->eSt
23bf0 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f  age==RBU_STAGE_O
23c00 41 4c 20 0a 20 20 20 20 20 20 20 26 26 20 28 70  AL .       && (p
23c10 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51  ->openFlags & SQ
23c20 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 29 20 0a  LITE_OPEN_WAL) .
23c30 20 20 20 20 20 20 20 26 26 20 69 4f 66 73 74 3e         && iOfst>
23c40 3d 70 52 62 75 2d 3e 69 4f 61 6c 53 7a 0a 20 20  =pRbu->iOalSz.  
23c50 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70      ){.        p
23c60 52 62 75 2d 3e 69 4f 61 6c 53 7a 20 3d 20 69 41  Rbu->iOalSz = iA
23c70 6d 74 20 2b 20 69 4f 66 73 74 3b 0a 20 20 20 20  mt + iOfst;.    
23c80 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f    }else if( p->o
23c90 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49 54  penFlags & SQLIT
23ca0 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
23cb0 4c 4f 53 45 20 29 7b 0a 20 20 20 20 20 20 20 20  LOSE ){.        
23cc0 69 36 34 20 73 7a 4e 65 77 20 3d 20 69 41 6d 74  i64 szNew = iAmt
23cd0 2b 69 4f 66 73 74 3b 0a 20 20 20 20 20 20 20 20  +iOfst;.        
23ce0 69 66 28 20 73 7a 4e 65 77 3e 70 2d 3e 73 7a 20  if( szNew>p->sz 
23cf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
23d00 3d 20 72 62 75 55 70 64 61 74 65 54 65 6d 70 53  = rbuUpdateTempS
23d10 69 7a 65 28 70 2c 20 73 7a 4e 65 77 29 3b 0a 20  ize(p, szNew);. 
23d20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
23d30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
23d40 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
23d50 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
23d60 20 20 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61      rc = p->pRea
23d70 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 57 72  l->pMethods->xWr
23d80 69 74 65 28 70 2d 3e 70 52 65 61 6c 2c 20 7a 42  ite(p->pReal, zB
23d90 75 66 2c 20 69 41 6d 74 2c 20 69 4f 66 73 74 29  uf, iAmt, iOfst)
23da0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
23db0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4f 66 73 74  LITE_OK && iOfst
23dc0 3d 3d 30 20 26 26 20 28 70 2d 3e 6f 70 65 6e 46  ==0 && (p->openF
23dd0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
23de0 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 29 7b 0a 20  EN_MAIN_DB) ){. 
23df0 20 20 20 20 20 2f 2a 20 54 68 65 73 65 20 6c 6f       /* These lo
23e00 6f 6b 20 6c 69 6b 65 20 6d 61 67 69 63 20 6e 75  ok like magic nu
23e10 6d 62 65 72 73 2e 20 42 75 74 20 74 68 65 79 20  mbers. But they 
23e20 61 72 65 20 73 74 61 62 6c 65 2c 20 61 73 20 74  are stable, as t
23e30 68 65 79 20 61 72 65 20 70 61 72 74 0a 20 20 20  hey are part.   
23e40 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 64 65 66     ** of the def
23e50 69 6e 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 53  inition of the S
23e60 51 4c 69 74 65 20 66 69 6c 65 20 66 6f 72 6d 61  QLite file forma
23e70 74 2c 20 77 68 69 63 68 20 6d 61 79 20 6e 6f 74  t, which may not
23e80 20 63 68 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20   change. */.    
23e90 20 20 75 38 20 2a 70 42 75 66 20 3d 20 28 75 38    u8 *pBuf = (u8
23ea0 2a 29 7a 42 75 66 3b 0a 20 20 20 20 20 20 70 2d  *)zBuf;.      p-
23eb0 3e 69 43 6f 6f 6b 69 65 20 3d 20 72 62 75 47 65  >iCookie = rbuGe
23ec0 74 55 33 32 28 26 70 42 75 66 5b 32 34 5d 29 3b  tU32(&pBuf[24]);
23ed0 0a 20 20 20 20 20 20 70 2d 3e 69 57 72 69 74 65  .      p->iWrite
23ee0 56 65 72 20 3d 20 70 42 75 66 5b 31 39 5d 3b 0a  Ver = pBuf[19];.
23ef0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
23f00 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
23f10 54 72 75 6e 63 61 74 65 20 61 6e 20 72 62 75 56  Truncate an rbuV
23f20 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  fs-file..*/.stat
23f30 69 63 20 69 6e 74 20 72 62 75 56 66 73 54 72 75  ic int rbuVfsTru
23f40 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69  ncate(sqlite3_fi
23f50 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74  le *pFile, sqlit
23f60 65 5f 69 6e 74 36 34 20 73 69 7a 65 29 7b 0a 20  e_int64 size){. 
23f70 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28   rbu_file *p = (
23f80 72 62 75 5f 66 69 6c 65 2a 29 70 46 69 6c 65 3b  rbu_file*)pFile;
23f90 0a 20 20 69 66 28 20 28 70 2d 3e 6f 70 65 6e 46  .  if( (p->openF
23fa0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
23fb0 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
23fc0 29 20 26 26 20 70 2d 3e 70 52 62 75 20 29 7b 0a  ) && p->pRbu ){.
23fd0 20 20 20 20 69 6e 74 20 72 63 20 3d 20 72 62 75      int rc = rbu
23fe0 55 70 64 61 74 65 54 65 6d 70 53 69 7a 65 28 70  UpdateTempSize(p
23ff0 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 69 66 28  , size);.    if(
24000 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
24010 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
24020 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 52 65 61    return p->pRea
24030 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 54 72  l->pMethods->xTr
24040 75 6e 63 61 74 65 28 70 2d 3e 70 52 65 61 6c 2c  uncate(p->pReal,
24050 20 73 69 7a 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   size);.}../*.**
24060 20 53 79 6e 63 20 61 6e 20 72 62 75 56 66 73 2d   Sync an rbuVfs-
24070 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
24080 69 6e 74 20 72 62 75 56 66 73 53 79 6e 63 28 73  int rbuVfsSync(s
24090 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
240a0 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  le, int flags){.
240b0 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20    rbu_file *p = 
240c0 28 72 62 75 5f 66 69 6c 65 20 2a 29 70 46 69 6c  (rbu_file *)pFil
240d0 65 3b 0a 20 20 69 66 28 20 70 2d 3e 70 52 62 75  e;.  if( p->pRbu
240e0 20 26 26 20 70 2d 3e 70 52 62 75 2d 3e 65 53 74   && p->pRbu->eSt
240f0 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 43  age==RBU_STAGE_C
24100 41 50 54 55 52 45 20 29 7b 0a 20 20 20 20 69 66  APTURE ){.    if
24110 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26  ( p->openFlags &
24120 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
24130 4e 5f 44 42 20 29 7b 0a 20 20 20 20 20 20 72 65  N_DB ){.      re
24140 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4e 54 45  turn SQLITE_INTE
24150 52 4e 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RNAL;.    }.    
24160 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
24170 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
24180 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
24190 73 2d 3e 78 53 79 6e 63 28 70 2d 3e 70 52 65 61  s->xSync(p->pRea
241a0 6c 2c 20 66 6c 61 67 73 29 3b 0a 7d 0a 0a 2f 2a  l, flags);.}../*
241b0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
241c0 75 72 72 65 6e 74 20 66 69 6c 65 2d 73 69 7a 65  urrent file-size
241d0 20 6f 66 20 61 6e 20 72 62 75 56 66 73 2d 66 69   of an rbuVfs-fi
241e0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
241f0 74 20 72 62 75 56 66 73 46 69 6c 65 53 69 7a 65  t rbuVfsFileSize
24200 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
24210 46 69 6c 65 2c 20 73 71 6c 69 74 65 5f 69 6e 74  File, sqlite_int
24220 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 72 62  64 *pSize){.  rb
24230 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75  u_file *p = (rbu
24240 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20  _file *)pFile;. 
24250 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20   int rc;.  rc = 
24260 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f  p->pReal->pMetho
24270 64 73 2d 3e 78 46 69 6c 65 53 69 7a 65 28 70 2d  ds->xFileSize(p-
24280 3e 70 52 65 61 6c 2c 20 70 53 69 7a 65 29 3b 0a  >pReal, pSize);.
24290 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
242a0 20 61 6e 20 52 42 55 20 76 61 63 75 75 6d 20 6f   an RBU vacuum o
242b0 70 65 72 61 74 69 6f 6e 20 61 6e 64 20 74 68 69  peration and thi
242c0 73 20 69 73 20 74 68 65 20 74 61 72 67 65 74 20  s is the target 
242d0 64 61 74 61 62 61 73 65 2c 0a 20 20 2a 2a 20 70  database,.  ** p
242e0 72 65 74 65 6e 64 20 74 68 61 74 20 69 74 20 68  retend that it h
242f0 61 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  as at least one 
24300 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  page. Otherwise,
24310 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74   SQLite will not
24320 0a 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20  .  ** check for 
24330 74 68 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66  the existance of
24340 20 61 20 2a 2d 77 61 6c 20 66 69 6c 65 2e 20 72   a *-wal file. r
24350 62 75 56 66 73 52 65 61 64 28 29 20 63 6f 6e 74  buVfsRead() cont
24360 61 69 6e 73 20 0a 20 20 2a 2a 20 73 69 6d 69 6c  ains .  ** simil
24370 61 72 20 6c 6f 67 69 63 2e 20 20 2a 2f 0a 20 20  ar logic.  */.  
24380 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
24390 4b 20 26 26 20 2a 70 53 69 7a 65 3d 3d 30 20 0a  K && *pSize==0 .
243a0 20 20 20 26 26 20 70 2d 3e 70 52 62 75 20 26 26     && p->pRbu &&
243b0 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 2d 3e   rbuIsVacuum(p->
243c0 70 52 62 75 29 20 0a 20 20 20 26 26 20 28 70 2d  pRbu) .   && (p-
243d0 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c  >openFlags & SQL
243e0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
243f0 29 0a 20 20 29 7b 0a 20 20 20 20 2a 70 53 69 7a  ).  ){.    *pSiz
24400 65 20 3d 20 31 30 32 34 3b 0a 20 20 7d 0a 20 20  e = 1024;.  }.  
24410 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
24420 0a 2a 2a 20 4c 6f 63 6b 20 61 6e 20 72 62 75 56  .** Lock an rbuV
24430 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  fs-file..*/.stat
24440 69 63 20 69 6e 74 20 72 62 75 56 66 73 4c 6f 63  ic int rbuVfsLoc
24450 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
24460 70 46 69 6c 65 2c 20 69 6e 74 20 65 4c 6f 63 6b  pFile, int eLock
24470 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70  ){.  rbu_file *p
24480 20 3d 20 28 72 62 75 5f 66 69 6c 65 2a 29 70 46   = (rbu_file*)pF
24490 69 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33 72 62  ile;.  sqlite3rb
244a0 75 20 2a 70 52 62 75 20 3d 20 70 2d 3e 70 52 62  u *pRbu = p->pRb
244b0 75 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  u;.  int rc = SQ
244c0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
244d0 72 74 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73  rt( p->openFlags
244e0 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   & (SQLITE_OPEN_
244f0 4d 41 49 4e 5f 44 42 7c 53 51 4c 49 54 45 5f 4f  MAIN_DB|SQLITE_O
24500 50 45 4e 5f 54 45 4d 50 5f 44 42 29 20 29 3b 0a  PEN_TEMP_DB) );.
24510 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 53 51 4c    if( eLock==SQL
24520 49 54 45 5f 4c 4f 43 4b 5f 45 58 43 4c 55 53 49  ITE_LOCK_EXCLUSI
24530 56 45 20 0a 20 20 20 26 26 20 28 70 2d 3e 62 4e  VE .   && (p->bN
24540 6f 6c 6f 63 6b 20 7c 7c 20 28 70 52 62 75 20 26  olock || (pRbu &
24550 26 20 70 52 62 75 2d 3e 65 53 74 61 67 65 21 3d  & pRbu->eStage!=
24560 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45 29 29  RBU_STAGE_DONE))
24570 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 20  .  ){.    /* Do 
24580 6e 6f 74 20 61 6c 6c 6f 77 20 45 58 43 4c 55 53  not allow EXCLUS
24590 49 56 45 20 6c 6f 63 6b 73 2e 20 50 72 65 76 65  IVE locks. Preve
245a0 6e 74 69 6e 67 20 53 51 4c 69 74 65 20 66 72 6f  nting SQLite fro
245b0 6d 20 74 61 6b 69 6e 67 20 74 68 69 73 20 0a 20  m taking this . 
245c0 20 20 20 2a 2a 20 70 72 65 76 65 6e 74 73 20 69     ** prevents i
245d0 74 20 66 72 6f 6d 20 63 68 65 63 6b 70 6f 69 6e  t from checkpoin
245e0 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
245f0 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 63  e from sqlite3_c
24600 6c 6f 73 65 28 29 2e 20 2a 2f 0a 20 20 20 20 72  lose(). */.    r
24610 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
24620 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
24630 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65   = p->pReal->pMe
24640 74 68 6f 64 73 2d 3e 78 4c 6f 63 6b 28 70 2d 3e  thods->xLock(p->
24650 70 52 65 61 6c 2c 20 65 4c 6f 63 6b 29 3b 0a 20  pReal, eLock);. 
24660 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
24670 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b  .}../*.** Unlock
24680 20 61 6e 20 72 62 75 56 66 73 2d 66 69 6c 65 2e   an rbuVfs-file.
24690 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
246a0 62 75 56 66 73 55 6e 6c 6f 63 6b 28 73 71 6c 69  buVfsUnlock(sqli
246b0 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
246c0 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 72   int eLock){.  r
246d0 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62  bu_file *p = (rb
246e0 75 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a  u_file *)pFile;.
246f0 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 52 65 61    return p->pRea
24700 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 55 6e  l->pMethods->xUn
24710 6c 6f 63 6b 28 70 2d 3e 70 52 65 61 6c 2c 20 65  lock(p->pReal, e
24720 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Lock);.}../*.** 
24730 43 68 65 63 6b 20 69 66 20 61 6e 6f 74 68 65 72  Check if another
24740 20 66 69 6c 65 2d 68 61 6e 64 6c 65 20 68 6f 6c   file-handle hol
24750 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  ds a RESERVED lo
24760 63 6b 20 6f 6e 20 61 6e 20 72 62 75 56 66 73 2d  ck on an rbuVfs-
24770 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
24780 69 6e 74 20 72 62 75 56 66 73 43 68 65 63 6b 52  int rbuVfsCheckR
24790 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
247a0 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
247b0 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
247c0 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20    rbu_file *p = 
247d0 28 72 62 75 5f 66 69 6c 65 20 2a 29 70 46 69 6c  (rbu_file *)pFil
247e0 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70  e;.  return p->p
247f0 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  Real->pMethods->
24800 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
24810 63 6b 28 70 2d 3e 70 52 65 61 6c 2c 20 70 52 65  ck(p->pReal, pRe
24820 73 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  sOut);.}../*.** 
24830 46 69 6c 65 20 63 6f 6e 74 72 6f 6c 20 6d 65 74  File control met
24840 68 6f 64 2e 20 46 6f 72 20 63 75 73 74 6f 6d 20  hod. For custom 
24850 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20 61 6e  operations on an
24860 20 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f   rbuVfs-file..*/
24870 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56  .static int rbuV
24880 66 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71  fsFileControl(sq
24890 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
248a0 65 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20  e, int op, void 
248b0 2a 70 41 72 67 29 7b 0a 20 20 72 62 75 5f 66 69  *pArg){.  rbu_fi
248c0 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c  le *p = (rbu_fil
248d0 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74  e *)pFile;.  int
248e0 20 28 2a 78 43 6f 6e 74 72 6f 6c 29 28 73 71 6c   (*xControl)(sql
248f0 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76  ite3_file*,int,v
24900 6f 69 64 2a 29 20 3d 20 70 2d 3e 70 52 65 61 6c  oid*) = p->pReal
24910 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 46 69 6c  ->pMethods->xFil
24920 65 43 6f 6e 74 72 6f 6c 3b 0a 20 20 69 6e 74 20  eControl;.  int 
24930 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  rc;..  assert( p
24940 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 28 53  ->openFlags & (S
24950 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
24960 44 42 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  DB|SQLITE_OPEN_T
24970 45 4d 50 5f 44 42 29 0a 20 20 20 20 20 20 20 7c  EMP_DB).       |
24980 7c 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26  | p->openFlags &
24990 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52   (SQLITE_OPEN_TR
249a0 41 4e 53 49 45 4e 54 5f 44 42 7c 53 51 4c 49 54  ANSIENT_DB|SQLIT
249b0 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
249c0 4e 41 4c 29 0a 20 20 29 3b 0a 20 20 69 66 28 20  NAL).  );.  if( 
249d0 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c  op==SQLITE_FCNTL
249e0 5f 52 42 55 20 29 7b 0a 20 20 20 20 73 71 6c 69  _RBU ){.    sqli
249f0 74 65 33 72 62 75 20 2a 70 52 62 75 20 3d 20 28  te3rbu *pRbu = (
24a00 73 71 6c 69 74 65 33 72 62 75 2a 29 70 41 72 67  sqlite3rbu*)pArg
24a10 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 72 73 74 20  ;..    /* First 
24a20 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 6f 74  try to find anot
24a30 68 65 72 20 52 42 55 20 76 66 73 20 6c 6f 77 65  her RBU vfs lowe
24a40 72 20 64 6f 77 6e 20 69 6e 20 74 68 65 20 76 66  r down in the vf
24a50 73 20 73 74 61 63 6b 2e 20 49 66 0a 20 20 20 20  s stack. If.    
24a60 2a 2a 20 6f 6e 65 20 69 73 20 66 6f 75 6e 64 2c  ** one is found,
24a70 20 74 68 69 73 20 76 66 73 20 77 69 6c 6c 20 6f   this vfs will o
24a80 70 65 72 61 74 65 20 69 6e 20 70 61 73 73 2d 74  perate in pass-t
24a90 68 72 6f 75 67 68 20 6d 6f 64 65 2e 20 54 68 65  hrough mode. The
24aa0 20 6c 6f 77 65 72 0a 20 20 20 20 2a 2a 20 6c 65   lower.    ** le
24ab0 76 65 6c 20 76 66 73 20 77 69 6c 6c 20 64 6f 20  vel vfs will do 
24ac0 74 68 65 20 73 70 65 63 69 61 6c 20 52 42 55 20  the special RBU 
24ad0 68 61 6e 64 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20  handling.  */.  
24ae0 20 20 72 63 20 3d 20 78 43 6f 6e 74 72 6f 6c 28    rc = xControl(
24af0 70 2d 3e 70 52 65 61 6c 2c 20 6f 70 2c 20 70 41  p->pReal, op, pA
24b00 72 67 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  rg);..    if( rc
24b10 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  ==SQLITE_NOTFOUN
24b20 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f  D ){.      /* No
24b30 77 20 73 65 61 72 63 68 20 66 6f 72 20 61 20 7a  w search for a z
24b40 69 70 76 66 73 20 69 6e 73 74 61 6e 63 65 20 6c  ipvfs instance l
24b50 6f 77 65 72 20 64 6f 77 6e 20 69 6e 20 74 68 65  ower down in the
24b60 20 56 46 53 20 73 74 61 63 6b 2e 20 49 66 0a 20   VFS stack. If. 
24b70 20 20 20 20 20 2a 2a 20 6f 6e 65 20 69 73 20 66       ** one is f
24b80 6f 75 6e 64 2c 20 74 68 69 73 20 69 73 20 61 6e  ound, this is an
24b90 20 65 72 72 6f 72 2e 20 20 2a 2f 0a 20 20 20 20   error.  */.    
24ba0 20 20 76 6f 69 64 20 2a 64 75 6d 6d 79 20 3d 20    void *dummy = 
24bb0 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 78 43  0;.      rc = xC
24bc0 6f 6e 74 72 6f 6c 28 70 2d 3e 70 52 65 61 6c 2c  ontrol(p->pReal,
24bd0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 5a 49   SQLITE_FCNTL_ZI
24be0 50 56 46 53 2c 20 26 64 75 6d 6d 79 29 3b 0a 20  PVFS, &dummy);. 
24bf0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
24c00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
24c10 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
24c20 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 70 52 62  ROR;.        pRb
24c30 75 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c  u->zErrmsg = sql
24c40 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 72 62  ite3_mprintf("rb
24c50 75 2f 7a 69 70 76 66 73 20 73 65 74 75 70 20 65  u/zipvfs setup e
24c60 72 72 6f 72 22 29 3b 0a 20 20 20 20 20 20 7d 65  rror");.      }e
24c70 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
24c80 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20  TE_NOTFOUND ){. 
24c90 20 20 20 20 20 20 20 70 52 62 75 2d 3e 70 54 61         pRbu->pTa
24ca0 72 67 65 74 46 64 20 3d 20 70 3b 0a 20 20 20 20  rgetFd = p;.    
24cb0 20 20 20 20 70 2d 3e 70 52 62 75 20 3d 20 70 52      p->pRbu = pR
24cc0 62 75 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  bu;.        if( 
24cd0 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53  p->openFlags & S
24ce0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
24cf0 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  DB ){.          
24d00 72 62 75 4d 61 69 6e 6c 69 73 74 41 64 64 28 70  rbuMainlistAdd(p
24d10 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
24d20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 57 61 6c       if( p->pWal
24d30 46 64 20 29 20 70 2d 3e 70 57 61 6c 46 64 2d 3e  Fd ) p->pWalFd->
24d40 70 52 62 75 20 3d 20 70 52 62 75 3b 0a 20 20 20  pRbu = pRbu;.   
24d50 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
24d60 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
24d70 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
24d80 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28  ;.  }.  else if(
24d90 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54   op==SQLITE_FCNT
24da0 4c 5f 52 42 55 43 4e 54 20 29 7b 0a 20 20 20 20  L_RBUCNT ){.    
24db0 73 71 6c 69 74 65 33 72 62 75 20 2a 70 52 62 75  sqlite3rbu *pRbu
24dc0 20 3d 20 28 73 71 6c 69 74 65 33 72 62 75 2a 29   = (sqlite3rbu*)
24dd0 70 41 72 67 3b 0a 20 20 20 20 70 52 62 75 2d 3e  pArg;.    pRbu->
24de0 6e 52 62 75 2b 2b 3b 0a 20 20 20 20 70 52 62 75  nRbu++;.    pRbu
24df0 2d 3e 70 52 62 75 46 64 20 3d 20 70 3b 0a 20 20  ->pRbuFd = p;.  
24e00 20 20 70 2d 3e 62 4e 6f 6c 6f 63 6b 20 3d 20 31    p->bNolock = 1
24e10 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 78 43  ;.  }..  rc = xC
24e20 6f 6e 74 72 6f 6c 28 70 2d 3e 70 52 65 61 6c 2c  ontrol(p->pReal,
24e30 20 6f 70 2c 20 70 41 72 67 29 3b 0a 20 20 69 66   op, pArg);.  if
24e40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
24e50 26 26 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43  && op==SQLITE_FC
24e60 4e 54 4c 5f 56 46 53 4e 41 4d 45 20 29 7b 0a 20  NTL_VFSNAME ){. 
24e70 20 20 20 72 62 75 5f 76 66 73 20 2a 70 52 62 75     rbu_vfs *pRbu
24e80 56 66 73 20 3d 20 70 2d 3e 70 52 62 75 56 66 73  Vfs = p->pRbuVfs
24e90 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 20  ;.    char *zIn 
24ea0 3d 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 3b  = *(char**)pArg;
24eb0 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f 75 74 20  .    char *zOut 
24ec0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
24ed0 66 28 22 72 62 75 28 25 73 29 2f 25 7a 22 2c 20  f("rbu(%s)/%z", 
24ee0 70 52 62 75 56 66 73 2d 3e 62 61 73 65 2e 7a 4e  pRbuVfs->base.zN
24ef0 61 6d 65 2c 20 7a 49 6e 29 3b 0a 20 20 20 20 2a  ame, zIn);.    *
24f00 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 7a  (char**)pArg = z
24f10 4f 75 74 3b 0a 20 20 20 20 69 66 28 20 7a 4f 75  Out;.    if( zOu
24f20 74 3d 3d 30 20 29 20 72 63 20 3d 20 53 51 4c 49  t==0 ) rc = SQLI
24f30 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
24f40 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
24f50 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
24f60 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20 62  sector-size in b
24f70 79 74 65 73 20 66 6f 72 20 61 6e 20 72 62 75 56  ytes for an rbuV
24f80 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  fs-file..*/.stat
24f90 69 63 20 69 6e 74 20 72 62 75 56 66 73 53 65 63  ic int rbuVfsSec
24fa0 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  torSize(sqlite3_
24fb0 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  file *pFile){.  
24fc0 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72  rbu_file *p = (r
24fd0 62 75 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b  bu_file *)pFile;
24fe0 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 52 65  .  return p->pRe
24ff0 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53  al->pMethods->xS
25000 65 63 74 6f 72 53 69 7a 65 28 70 2d 3e 70 52 65  ectorSize(p->pRe
25010 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  al);.}../*.** Re
25020 74 75 72 6e 20 74 68 65 20 64 65 76 69 63 65 20  turn the device 
25030 63 68 61 72 61 63 74 65 72 69 73 74 69 63 20 66  characteristic f
25040 6c 61 67 73 20 73 75 70 70 6f 72 74 65 64 20 62  lags supported b
25050 79 20 61 6e 20 72 62 75 56 66 73 2d 66 69 6c 65  y an rbuVfs-file
25060 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
25070 72 62 75 56 66 73 44 65 76 69 63 65 43 68 61 72  rbuVfsDeviceChar
25080 61 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69  acteristics(sqli
25090 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29  te3_file *pFile)
250a0 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20  {.  rbu_file *p 
250b0 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a 29 70 46  = (rbu_file *)pF
250c0 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  ile;.  return p-
250d0 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73  >pReal->pMethods
250e0 2d 3e 78 44 65 76 69 63 65 43 68 61 72 61 63 74  ->xDeviceCharact
250f0 65 72 69 73 74 69 63 73 28 70 2d 3e 70 52 65 61  eristics(p->pRea
25100 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 61 6b  l);.}../*.** Tak
25110 65 20 6f 72 20 72 65 6c 65 61 73 65 20 61 20 73  e or release a s
25120 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6c 6f 63  hared-memory loc
25130 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
25140 20 72 62 75 56 66 73 53 68 6d 4c 6f 63 6b 28 73   rbuVfsShmLock(s
25150 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
25160 6c 65 2c 20 69 6e 74 20 6f 66 73 74 2c 20 69 6e  le, int ofst, in
25170 74 20 6e 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  t n, int flags){
25180 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d  .  rbu_file *p =
25190 20 28 72 62 75 5f 66 69 6c 65 2a 29 70 46 69 6c   (rbu_file*)pFil
251a0 65 3b 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20  e;.  sqlite3rbu 
251b0 2a 70 52 62 75 20 3d 20 70 2d 3e 70 52 62 75 3b  *pRbu = p->pRbu;
251c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
251d0 54 45 5f 4f 4b 3b 0a 0a 23 69 66 64 65 66 20 53  TE_OK;..#ifdef S
251e0 51 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49  QLITE_AMALGAMATI
251f0 4f 4e 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  ON.    assert( W
25200 41 4c 5f 43 4b 50 54 5f 4c 4f 43 4b 3d 3d 31 20  AL_CKPT_LOCK==1 
25210 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  );.#endif..  ass
25220 65 72 74 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67  ert( p->openFlag
25230 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s & (SQLITE_OPEN
25240 5f 4d 41 49 4e 5f 44 42 7c 53 51 4c 49 54 45 5f  _MAIN_DB|SQLITE_
25250 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 29 20 29 3b  OPEN_TEMP_DB) );
25260 0a 20 20 69 66 28 20 70 52 62 75 20 26 26 20 28  .  if( pRbu && (
25270 70 52 62 75 2d 3e 65 53 74 61 67 65 3d 3d 52 42  pRbu->eStage==RB
25280 55 5f 53 54 41 47 45 5f 4f 41 4c 20 7c 7c 20 70  U_STAGE_OAL || p
25290 52 62 75 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55  Rbu->eStage==RBU
252a0 5f 53 54 41 47 45 5f 4d 4f 56 45 29 20 29 7b 0a  _STAGE_MOVE) ){.
252b0 20 20 20 20 2f 2a 20 4d 61 67 69 63 20 6e 75 6d      /* Magic num
252c0 62 65 72 20 31 20 69 73 20 74 68 65 20 57 41 4c  ber 1 is the WAL
252d0 5f 43 4b 50 54 5f 4c 4f 43 4b 20 6c 6f 63 6b 2e  _CKPT_LOCK lock.
252e0 20 50 72 65 76 65 6e 74 69 6e 67 20 53 51 4c 69   Preventing SQLi
252f0 74 65 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74  te from.    ** t
25300 61 6b 69 6e 67 20 74 68 69 73 20 6c 6f 63 6b 20  aking this lock 
25310 61 6c 73 6f 20 70 72 65 76 65 6e 74 73 20 61 6e  also prevents an
25320 79 20 63 68 65 63 6b 70 6f 69 6e 74 73 20 66 72  y checkpoints fr
25330 6f 6d 20 6f 63 63 75 72 72 69 6e 67 2e 20 0a 20  om occurring. . 
25340 20 20 20 2a 2a 20 74 6f 64 6f 3a 20 72 65 61 6c     ** todo: real
25350 6c 79 2c 20 69 74 27 73 20 6e 6f 74 20 63 6c 65  ly, it's not cle
25360 61 72 20 77 68 79 20 74 68 69 73 20 6d 69 67 68  ar why this migh
25370 74 20 6f 63 63 75 72 2c 20 61 73 20 0a 20 20 20  t occur, as .   
25380 20 2a 2a 20 77 61 6c 5f 61 75 74 6f 63 68 65 63   ** wal_autochec
25390 6b 70 6f 69 6e 74 20 6f 75 67 68 74 20 74 6f 20  kpoint ought to 
253a0 62 65 20 74 75 72 6e 65 64 20 6f 66 66 2e 20 20  be turned off.  
253b0 2a 2f 0a 20 20 20 20 69 66 28 20 6f 66 73 74 3d  */.    if( ofst=
253c0 3d 57 41 4c 5f 4c 4f 43 4b 5f 43 4b 50 54 20 26  =WAL_LOCK_CKPT &
253d0 26 20 6e 3d 3d 31 20 29 20 72 63 20 3d 20 53 51  & n==1 ) rc = SQ
253e0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c  LITE_BUSY;.  }el
253f0 73 65 7b 0a 20 20 20 20 69 6e 74 20 62 43 61 70  se{.    int bCap
25400 74 75 72 65 20 3d 20 30 3b 0a 20 20 20 20 69 66  ture = 0;.    if
25410 28 20 6e 3d 3d 31 20 26 26 20 28 66 6c 61 67 73  ( n==1 && (flags
25420 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   & SQLITE_SHM_EX
25430 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20 26 26  CLUSIVE).     &&
25440 20 70 52 62 75 20 26 26 20 70 52 62 75 2d 3e 65   pRbu && pRbu->e
25450 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45  Stage==RBU_STAGE
25460 5f 43 41 50 54 55 52 45 0a 20 20 20 20 20 26 26  _CAPTURE.     &&
25470 20 28 6f 66 73 74 3d 3d 57 41 4c 5f 4c 4f 43 4b   (ofst==WAL_LOCK
25480 5f 57 52 49 54 45 20 7c 7c 20 6f 66 73 74 3d 3d  _WRITE || ofst==
25490 57 41 4c 5f 4c 4f 43 4b 5f 43 4b 50 54 20 7c 7c  WAL_LOCK_CKPT ||
254a0 20 6f 66 73 74 3d 3d 57 41 4c 5f 4c 4f 43 4b 5f   ofst==WAL_LOCK_
254b0 52 45 41 44 30 29 0a 20 20 20 20 29 7b 0a 20 20  READ0).    ){.  
254c0 20 20 20 20 62 43 61 70 74 75 72 65 20 3d 20 31      bCapture = 1
254d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
254e0 20 62 43 61 70 74 75 72 65 3d 3d 30 20 7c 7c 20   bCapture==0 || 
254f0 30 3d 3d 28 66 6c 61 67 73 20 26 20 53 51 4c 49  0==(flags & SQLI
25500 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 29 20 29  TE_SHM_UNLOCK) )
25510 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 2d 3e  {.      rc = p->
25520 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d  pReal->pMethods-
25530 3e 78 53 68 6d 4c 6f 63 6b 28 70 2d 3e 70 52 65  >xShmLock(p->pRe
25540 61 6c 2c 20 6f 66 73 74 2c 20 6e 2c 20 66 6c 61  al, ofst, n, fla
25550 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62  gs);.      if( b
25560 43 61 70 74 75 72 65 20 26 26 20 72 63 3d 3d 53  Capture && rc==S
25570 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25580 20 20 20 20 70 52 62 75 2d 3e 6d 4c 6f 63 6b 20      pRbu->mLock 
25590 7c 3d 20 28 31 20 3c 3c 20 6f 66 73 74 29 3b 0a  |= (1 << ofst);.
255a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
255b0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
255c0 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20  }../*.** Obtain 
255d0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d  a pointer to a m
255e0 61 70 70 69 6e 67 20 6f 66 20 61 20 73 69 6e 67  apping of a sing
255f0 6c 65 20 33 32 4b 69 42 20 70 61 67 65 20 6f 66  le 32KiB page of
25600 20 74 68 65 20 2a 2d 73 68 6d 20 66 69 6c 65 2e   the *-shm file.
25610 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
25620 62 75 56 66 73 53 68 6d 4d 61 70 28 0a 20 20 73  buVfsShmMap(.  s
25630 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
25640 6c 65 2c 20 0a 20 20 69 6e 74 20 69 52 65 67 69  le, .  int iRegi
25650 6f 6e 2c 20 0a 20 20 69 6e 74 20 73 7a 52 65 67  on, .  int szReg
25660 69 6f 6e 2c 20 0a 20 20 69 6e 74 20 69 73 57 72  ion, .  int isWr
25670 69 74 65 2c 20 0a 20 20 76 6f 69 64 20 76 6f 6c  ite, .  void vol
25680 61 74 69 6c 65 20 2a 2a 70 70 0a 29 7b 0a 20 20  atile **pp.){.  
25690 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72  rbu_file *p = (r
256a0 62 75 5f 66 69 6c 65 2a 29 70 46 69 6c 65 3b 0a  bu_file*)pFile;.
256b0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
256c0 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 65 53 74 61  E_OK;.  int eSta
256d0 67 65 20 3d 20 28 70 2d 3e 70 52 62 75 20 3f 20  ge = (p->pRbu ? 
256e0 70 2d 3e 70 52 62 75 2d 3e 65 53 74 61 67 65 20  p->pRbu->eStage 
256f0 3a 20 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e  : 0);..  /* If n
25700 6f 74 20 69 6e 20 52 42 55 5f 53 54 41 47 45 5f  ot in RBU_STAGE_
25710 4f 41 4c 2c 20 61 6c 6c 6f 77 20 74 68 69 73 20  OAL, allow this 
25720 63 61 6c 6c 20 74 6f 20 70 61 73 73 20 74 68 72  call to pass thr
25730 6f 75 67 68 2e 20 4f 72 2c 20 69 66 20 74 68 69  ough. Or, if thi
25740 73 0a 20 20 2a 2a 20 72 62 75 20 69 73 20 69 6e  s.  ** rbu is in
25750 20 74 68 65 20 52 42 55 5f 53 54 41 47 45 5f 4f   the RBU_STAGE_O
25760 41 4c 20 73 74 61 74 65 2c 20 75 73 65 20 68 65  AL state, use he
25770 61 70 20 6d 65 6d 6f 72 79 20 66 6f 72 20 2a 2d  ap memory for *-
25780 73 68 6d 20 73 70 61 63 65 20 0a 20 20 2a 2a 20  shm space .  ** 
25790 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66 69 6c  instead of a fil
257a0 65 20 6f 6e 20 64 69 73 6b 2e 20 20 2a 2f 0a 20  e on disk.  */. 
257b0 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 65 6e   assert( p->open
257c0 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f  Flags & (SQLITE_
257d0 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 7c 53 51 4c  OPEN_MAIN_DB|SQL
257e0 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
257f0 29 20 29 3b 0a 20 20 69 66 28 20 65 53 74 61 67  ) );.  if( eStag
25800 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c  e==RBU_STAGE_OAL
25810 20 7c 7c 20 65 53 74 61 67 65 3d 3d 52 42 55 5f   || eStage==RBU_
25820 53 54 41 47 45 5f 4d 4f 56 45 20 29 7b 0a 20 20  STAGE_MOVE ){.  
25830 20 20 69 66 28 20 69 52 65 67 69 6f 6e 3c 3d 70    if( iRegion<=p
25840 2d 3e 6e 53 68 6d 20 29 7b 0a 20 20 20 20 20 20  ->nShm ){.      
25850 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42  sqlite3_int64 nB
25860 79 74 65 20 3d 20 28 69 52 65 67 69 6f 6e 2b 31  yte = (iRegion+1
25870 29 20 2a 20 73 69 7a 65 6f 66 28 63 68 61 72 2a  ) * sizeof(char*
25880 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 2a  );.      char **
25890 61 70 4e 65 77 20 3d 20 28 63 68 61 72 2a 2a 29  apNew = (char**)
258a0 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36  sqlite3_realloc6
258b0 34 28 70 2d 3e 61 70 53 68 6d 2c 20 6e 42 79 74  4(p->apShm, nByt
258c0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 70  e);.      if( ap
258d0 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
258e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
258f0 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  MEM;.      }else
25900 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  {.        memset
25910 28 26 61 70 4e 65 77 5b 70 2d 3e 6e 53 68 6d 5d  (&apNew[p->nShm]
25920 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63 68 61 72  , 0, sizeof(char
25930 2a 29 20 2a 20 28 31 20 2b 20 69 52 65 67 69 6f  *) * (1 + iRegio
25940 6e 20 2d 20 70 2d 3e 6e 53 68 6d 29 29 3b 0a 20  n - p->nShm));. 
25950 20 20 20 20 20 20 20 70 2d 3e 61 70 53 68 6d 20         p->apShm 
25960 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20 20 20 20  = apNew;.       
25970 20 70 2d 3e 6e 53 68 6d 20 3d 20 69 52 65 67 69   p->nShm = iRegi
25980 6f 6e 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  on+1;.      }.  
25990 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d    }..    if( rc=
259a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d  =SQLITE_OK && p-
259b0 3e 61 70 53 68 6d 5b 69 52 65 67 69 6f 6e 5d 3d  >apShm[iRegion]=
259c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  =0 ){.      char
259d0 20 2a 70 4e 65 77 20 3d 20 28 63 68 61 72 2a 29   *pNew = (char*)
259e0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
259f0 28 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20  (szRegion);.    
25a00 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
25a10 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
25a20 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
25a30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
25a40 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c   memset(pNew, 0,
25a50 20 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20   szRegion);.    
25a60 20 20 20 20 70 2d 3e 61 70 53 68 6d 5b 69 52 65      p->apShm[iRe
25a70 67 69 6f 6e 5d 20 3d 20 70 4e 65 77 3b 0a 20 20  gion] = pNew;.  
25a80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
25a90 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25aa0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 20  OK ){.      *pp 
25ab0 3d 20 70 2d 3e 61 70 53 68 6d 5b 69 52 65 67 69  = p->apShm[iRegi
25ac0 6f 6e 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  on];.    }else{.
25ad0 20 20 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20        *pp = 0;. 
25ae0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
25af0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70 53    assert( p->apS
25b00 68 6d 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  hm==0 );.    rc 
25b10 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74  = p->pReal->pMet
25b20 68 6f 64 73 2d 3e 78 53 68 6d 4d 61 70 28 70 2d  hods->xShmMap(p-
25b30 3e 70 52 65 61 6c 2c 20 69 52 65 67 69 6f 6e 2c  >pReal, iRegion,
25b40 20 73 7a 52 65 67 69 6f 6e 2c 20 69 73 57 72 69   szRegion, isWri
25b50 74 65 2c 20 70 70 29 3b 0a 20 20 7d 0a 0a 20 20  te, pp);.  }..  
25b60 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
25b70 0a 2a 2a 20 4d 65 6d 6f 72 79 20 62 61 72 72 69  .** Memory barri
25b80 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
25b90 69 64 20 72 62 75 56 66 73 53 68 6d 42 61 72 72  id rbuVfsShmBarr
25ba0 69 65 72 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ier(sqlite3_file
25bb0 20 2a 70 46 69 6c 65 29 7b 0a 20 20 72 62 75 5f   *pFile){.  rbu_
25bc0 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66  file *p = (rbu_f
25bd0 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 70  ile *)pFile;.  p
25be0 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
25bf0 73 2d 3e 78 53 68 6d 42 61 72 72 69 65 72 28 70  s->xShmBarrier(p
25c00 2d 3e 70 52 65 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a  ->pReal);.}../*.
25c10 2a 2a 20 54 68 65 20 78 53 68 6d 55 6e 6d 61 70  ** The xShmUnmap
25c20 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74   method..*/.stat
25c30 69 63 20 69 6e 74 20 72 62 75 56 66 73 53 68 6d  ic int rbuVfsShm
25c40 55 6e 6d 61 70 28 73 71 6c 69 74 65 33 5f 66 69  Unmap(sqlite3_fi
25c50 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 64  le *pFile, int d
25c60 65 6c 46 6c 61 67 29 7b 0a 20 20 72 62 75 5f 66  elFlag){.  rbu_f
25c70 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69  ile *p = (rbu_fi
25c80 6c 65 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74  le*)pFile;.  int
25c90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
25ca0 0a 20 20 69 6e 74 20 65 53 74 61 67 65 20 3d 20  .  int eStage = 
25cb0 28 70 2d 3e 70 52 62 75 20 3f 20 70 2d 3e 70 52  (p->pRbu ? p->pR
25cc0 62 75 2d 3e 65 53 74 61 67 65 20 3a 20 30 29 3b  bu->eStage : 0);
25cd0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f  ..  assert( p->o
25ce0 70 65 6e 46 6c 61 67 73 20 26 20 28 53 51 4c 49  penFlags & (SQLI
25cf0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 7c  TE_OPEN_MAIN_DB|
25d00 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
25d10 5f 44 42 29 20 29 3b 0a 20 20 69 66 28 20 65 53  _DB) );.  if( eS
25d20 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f  tage==RBU_STAGE_
25d30 4f 41 4c 20 7c 7c 20 65 53 74 61 67 65 3d 3d 52  OAL || eStage==R
25d40 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 20 29 7b  BU_STAGE_MOVE ){
25d50 0a 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f  .    /* no-op */
25d60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
25d70 20 52 65 6c 65 61 73 65 20 74 68 65 20 63 68 65   Release the che
25d80 63 6b 70 6f 69 6e 74 65 72 20 61 6e 64 20 77 72  ckpointer and wr
25d90 69 74 65 72 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  iter locks */.  
25da0 20 20 72 62 75 55 6e 6c 6f 63 6b 53 68 6d 28 70    rbuUnlockShm(p
25db0 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 2d 3e 70  );.    rc = p->p
25dc0 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  Real->pMethods->
25dd0 78 53 68 6d 55 6e 6d 61 70 28 70 2d 3e 70 52 65  xShmUnmap(p->pRe
25de0 61 6c 2c 20 64 65 6c 46 6c 61 67 29 3b 0a 20 20  al, delFlag);.  
25df0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
25e00 0a 0a 2f 2a 20 0a 2a 2a 20 41 20 6d 61 69 6e 20  ../* .** A main 
25e10 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64 20 7a  database named z
25e20 4e 61 6d 65 20 68 61 73 20 6a 75 73 74 20 62 65  Name has just be
25e30 65 6e 20 6f 70 65 6e 65 64 2e 20 54 68 65 20 66  en opened. The f
25e40 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 66 75 6e  ollowing .** fun
25e50 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20  ction returns a 
25e60 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66  pointer to a buf
25e70 66 65 72 20 6f 77 6e 65 64 20 62 79 20 53 51 4c  fer owned by SQL
25e80 69 74 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ite that contain
25e90 73 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66  s.** the name of
25ea0 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20   the *-wal file 
25eb0 74 68 69 73 20 64 62 20 63 6f 6e 6e 65 63 74 69  this db connecti
25ec0 6f 6e 20 77 69 6c 6c 20 75 73 65 2e 20 53 51 4c  on will use. SQL
25ed0 69 74 65 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74  ite.** happens t
25ee0 6f 20 70 61 73 73 20 61 20 70 6f 69 6e 74 65 72  o pass a pointer
25ef0 20 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20   to this buffer 
25f00 77 68 65 6e 20 75 73 69 6e 67 20 78 41 63 63 65  when using xAcce
25f10 73 73 28 29 0a 2a 2a 20 6f 72 20 78 4f 70 65 6e  ss().** or xOpen
25f20 28 29 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  () to operate on
25f30 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 2e   the *-wal file.
25f40 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e    .*/.static con
25f50 73 74 20 63 68 61 72 20 2a 72 62 75 4d 61 69 6e  st char *rbuMain
25f60 54 6f 57 61 6c 28 63 6f 6e 73 74 20 63 68 61 72  ToWal(const char
25f70 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 66 6c 61   *zName, int fla
25f80 67 73 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 28  gs){.  int n = (
25f90 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  int)strlen(zName
25fa0 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  );.  const char 
25fb0 2a 7a 20 3d 20 26 7a 4e 61 6d 65 5b 6e 5d 3b 0a  *z = &zName[n];.
25fc0 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51    if( flags & SQ
25fd0 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20 29 7b  LITE_OPEN_URI ){
25fe0 0a 20 20 20 20 69 6e 74 20 6f 64 64 20 3d 20 30  .    int odd = 0
25ff0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 31 20 29  ;.    while( 1 )
26000 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d  {.      if( z[0]
26010 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6f  ==0 ){.        o
26020 64 64 20 3d 20 31 20 2d 20 6f 64 64 3b 0a 20 20  dd = 1 - odd;.  
26030 20 20 20 20 20 20 69 66 28 20 6f 64 64 20 26 26        if( odd &&
26040 20 7a 5b 31 5d 3d 3d 30 20 29 20 62 72 65 61 6b   z[1]==0 ) break
26050 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
26060 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  z++;.    }.    z
26070 20 2b 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a   += 2;.  }else{.
26080 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 3d 3d 30      while( *z==0
26090 20 29 20 7a 2b 2b 3b 0a 20 20 7d 0a 20 20 7a 20   ) z++;.  }.  z 
260a0 2b 3d 20 28 6e 20 2b 20 38 20 2b 20 31 29 3b 0a  += (n + 8 + 1);.
260b0 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f    return z;.}../
260c0 2a 0a 2a 2a 20 4f 70 65 6e 20 61 6e 20 72 62 75  *.** Open an rbu
260d0 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f   file handle..*/
260e0 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56  .static int rbuV
260f0 66 73 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  fsOpen(.  sqlite
26100 33 5f 76 66 73 20 2a 70 56 66 73 2c 0a 20 20 63  3_vfs *pVfs,.  c
26110 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
26120 2c 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ,.  sqlite3_file
26130 20 2a 70 46 69 6c 65 2c 0a 20 20 69 6e 74 20 66   *pFile,.  int f
26140 6c 61 67 73 2c 0a 20 20 69 6e 74 20 2a 70 4f 75  lags,.  int *pOu
26150 74 46 6c 61 67 73 0a 29 7b 0a 20 20 73 74 61 74  tFlags.){.  stat
26160 69 63 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  ic sqlite3_io_me
26170 74 68 6f 64 73 20 72 62 75 76 66 73 5f 69 6f 5f  thods rbuvfs_io_
26180 6d 65 74 68 6f 64 73 20 3d 20 7b 0a 20 20 20 20  methods = {.    
26190 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2,              
261a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
261b0 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20   iVersion */.   
261c0 20 72 62 75 56 66 73 43 6c 6f 73 65 2c 20 20 20   rbuVfsClose,   
261d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
261e0 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20  * xClose */.    
261f0 72 62 75 56 66 73 52 65 61 64 2c 20 20 20 20 20  rbuVfsRead,     
26200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26210 20 78 52 65 61 64 20 2a 2f 0a 20 20 20 20 72 62   xRead */.    rb
26220 75 56 66 73 57 72 69 74 65 2c 20 20 20 20 20 20  uVfsWrite,      
26230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
26240 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 72 62 75  Write */.    rbu
26250 56 66 73 54 72 75 6e 63 61 74 65 2c 20 20 20 20  VfsTruncate,    
26260 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54             /* xT
26270 72 75 6e 63 61 74 65 20 2a 2f 0a 20 20 20 20 72  runcate */.    r
26280 62 75 56 66 73 53 79 6e 63 2c 20 20 20 20 20 20  buVfsSync,      
26290 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
262a0 78 53 79 6e 63 20 2a 2f 0a 20 20 20 20 72 62 75  xSync */.    rbu
262b0 56 66 73 46 69 6c 65 53 69 7a 65 2c 20 20 20 20  VfsFileSize,    
262c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
262d0 69 6c 65 53 69 7a 65 20 2a 2f 0a 20 20 20 20 72  ileSize */.    r
262e0 62 75 56 66 73 4c 6f 63 6b 2c 20 20 20 20 20 20  buVfsLock,      
262f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26300 78 4c 6f 63 6b 20 2a 2f 0a 20 20 20 20 72 62 75  xLock */.    rbu
26310 56 66 73 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  VfsUnlock,      
26320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
26330 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 72 62 75  nlock */.    rbu
26340 56 66 73 43 68 65 63 6b 52 65 73 65 72 76 65 64  VfsCheckReserved
26350 4c 6f 63 6b 2c 20 20 20 20 20 20 2f 2a 20 78 43  Lock,      /* xC
26360 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
26370 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 46 69   */.    rbuVfsFi
26380 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20  leControl,      
26390 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f        /* xFileCo
263a0 6e 74 72 6f 6c 20 2a 2f 0a 20 20 20 20 72 62 75  ntrol */.    rbu
263b0 56 66 73 53 65 63 74 6f 72 53 69 7a 65 2c 20 20  VfsSectorSize,  
263c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
263d0 65 63 74 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 20  ectorSize */.   
263e0 20 72 62 75 56 66 73 44 65 76 69 63 65 43 68 61   rbuVfsDeviceCha
263f0 72 61 63 74 65 72 69 73 74 69 63 73 2c 20 20 2f  racteristics,  /
26400 2a 20 78 44 65 76 69 63 65 43 68 61 72 61 63 74  * xDeviceCharact
26410 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 20 20  eristics */.    
26420 72 62 75 56 66 73 53 68 6d 4d 61 70 2c 20 20 20  rbuVfsShmMap,   
26430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26440 20 78 53 68 6d 4d 61 70 20 2a 2f 0a 20 20 20 20   xShmMap */.    
26450 72 62 75 56 66 73 53 68 6d 4c 6f 63 6b 2c 20 20  rbuVfsShmLock,  
26460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26470 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 20   xShmLock */.   
26480 20 72 62 75 56 66 73 53 68 6d 42 61 72 72 69 65   rbuVfsShmBarrie
26490 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
264a0 2a 20 78 53 68 6d 42 61 72 72 69 65 72 20 2a 2f  * xShmBarrier */
264b0 0a 20 20 20 20 72 62 75 56 66 73 53 68 6d 55 6e  .    rbuVfsShmUn
264c0 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  map,            
264d0 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20     /* xShmUnmap 
264e0 2a 2f 0a 20 20 20 20 30 2c 20 30 20 20 20 20 20  */.    0, 0     
264f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26500 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68 2c 20       /* xFetch, 
26510 78 55 6e 66 65 74 63 68 20 2a 2f 0a 20 20 7d 3b  xUnfetch */.  };
26520 0a 20 20 72 62 75 5f 76 66 73 20 2a 70 52 62 75  .  rbu_vfs *pRbu
26530 56 66 73 20 3d 20 28 72 62 75 5f 76 66 73 2a 29  Vfs = (rbu_vfs*)
26540 70 56 66 73 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pVfs;.  sqlite3_
26550 76 66 73 20 2a 70 52 65 61 6c 56 66 73 20 3d 20  vfs *pRealVfs = 
26560 70 52 62 75 56 66 73 2d 3e 70 52 65 61 6c 56 66  pRbuVfs->pRealVf
26570 73 3b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70  s;.  rbu_file *p
26580 46 64 20 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a  Fd = (rbu_file *
26590 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63  )pFile;.  int rc
265a0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
265b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 65  const char *zOpe
265c0 6e 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 69 6e 74  n = zName;.  int
265d0 20 6f 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b   oflags = flags;
265e0 0a 0a 20 20 6d 65 6d 73 65 74 28 70 46 64 2c 20  ..  memset(pFd, 
265f0 30 2c 20 73 69 7a 65 6f 66 28 72 62 75 5f 66 69  0, sizeof(rbu_fi
26600 6c 65 29 29 3b 0a 20 20 70 46 64 2d 3e 70 52 65  le));.  pFd->pRe
26610 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  al = (sqlite3_fi
26620 6c 65 2a 29 26 70 46 64 5b 31 5d 3b 0a 20 20 70  le*)&pFd[1];.  p
26630 46 64 2d 3e 70 52 62 75 56 66 73 20 3d 20 70 52  Fd->pRbuVfs = pR
26640 62 75 56 66 73 3b 0a 20 20 70 46 64 2d 3e 6f 70  buVfs;.  pFd->op
26650 65 6e 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  enFlags = flags;
26660 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a  .  if( zName ){.
26670 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20      if( flags & 
26680 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
26690 5f 44 42 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _DB ){.      /* 
266a0 41 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  A main database 
266b0 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 6f 70  has just been op
266c0 65 6e 65 64 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  ened. The follow
266d0 69 6e 67 20 62 6c 6f 63 6b 20 73 65 74 73 0a 20  ing block sets. 
266e0 20 20 20 20 20 2a 2a 20 28 70 46 64 2d 3e 7a 57       ** (pFd->zW
266f0 61 6c 29 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  al) to point to 
26700 61 20 62 75 66 66 65 72 20 6f 77 6e 65 64 20 62  a buffer owned b
26710 79 20 53 51 4c 69 74 65 20 74 68 61 74 20 63 6f  y SQLite that co
26720 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20  ntains.      ** 
26730 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
26740 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68 69 73 20  *-wal file this 
26750 64 62 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69  db connection wi
26760 6c 6c 20 75 73 65 2e 20 53 51 4c 69 74 65 0a 20  ll use. SQLite. 
26770 20 20 20 20 20 2a 2a 20 68 61 70 70 65 6e 73 20       ** happens 
26780 74 6f 20 70 61 73 73 20 61 20 70 6f 69 6e 74 65  to pass a pointe
26790 72 20 74 6f 20 74 68 69 73 20 62 75 66 66 65 72  r to this buffer
267a0 20 77 68 65 6e 20 75 73 69 6e 67 20 78 41 63 63   when using xAcc
267b0 65 73 73 28 29 0a 20 20 20 20 20 20 2a 2a 20 6f  ess().      ** o
267c0 72 20 78 4f 70 65 6e 28 29 20 74 6f 20 6f 70 65  r xOpen() to ope
267d0 72 61 74 65 20 6f 6e 20 74 68 65 20 2a 2d 77 61  rate on the *-wa
267e0 6c 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20  l file.  */.    
267f0 20 20 70 46 64 2d 3e 7a 57 61 6c 20 3d 20 72 62    pFd->zWal = rb
26800 75 4d 61 69 6e 54 6f 57 61 6c 28 7a 4e 61 6d 65  uMainToWal(zName
26810 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a  , flags);.    }.
26820 20 20 20 20 65 6c 73 65 20 69 66 28 20 66 6c 61      else if( fla
26830 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
26840 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 72 62  _WAL ){.      rb
26850 75 5f 66 69 6c 65 20 2a 70 44 62 20 3d 20 72 62  u_file *pDb = rb
26860 75 46 69 6e 64 4d 61 69 6e 64 62 28 70 52 62 75  uFindMaindb(pRbu
26870 56 66 73 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a  Vfs, zName, 0);.
26880 20 20 20 20 20 20 69 66 28 20 70 44 62 20 29 7b        if( pDb ){
26890 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 44 62  .        if( pDb
268a0 2d 3e 70 52 62 75 20 26 26 20 70 44 62 2d 3e 70  ->pRbu && pDb->p
268b0 52 62 75 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55  Rbu->eStage==RBU
268c0 5f 53 54 41 47 45 5f 4f 41 4c 20 29 7b 0a 20 20  _STAGE_OAL ){.  
268d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
268e0 63 61 6c 6c 20 69 73 20 74 6f 20 6f 70 65 6e 20  call is to open 
268f0 61 20 2a 2d 77 61 6c 20 66 69 6c 65 2e 20 49 6e  a *-wal file. In
26900 74 65 61 64 2c 20 6f 70 65 6e 20 74 68 65 20 2a  tead, open the *
26910 2d 6f 61 6c 2e 20 54 68 69 73 0a 20 20 20 20 20  -oal. This.     
26920 20 20 20 20 20 2a 2a 20 63 6f 64 65 20 65 6e 73       ** code ens
26930 75 72 65 73 20 74 68 61 74 20 74 68 65 20 73 74  ures that the st
26940 72 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20 78  ring passed to x
26950 4f 70 65 6e 28 29 20 69 73 20 74 65 72 6d 69 6e  Open() is termin
26960 61 74 65 64 20 62 79 20 61 0a 20 20 20 20 20 20  ated by a.      
26970 20 20 20 20 2a 2a 20 70 61 69 72 20 6f 66 20 27      ** pair of '
26980 5c 30 27 20 62 79 74 65 73 20 69 6e 20 63 61 73  \0' bytes in cas
26990 65 20 74 68 65 20 56 46 53 20 61 74 74 65 6d 70  e the VFS attemp
269a0 74 73 20 74 6f 20 65 78 74 72 61 63 74 20 61 20  ts to extract a 
269b0 55 52 49 20 0a 20 20 20 20 20 20 20 20 20 20 2a  URI .          *
269c0 2a 20 70 61 72 61 6d 65 74 65 72 20 66 72 6f 6d  * parameter from
269d0 20 69 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20   it.  */.       
269e0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
269f0 42 61 73 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Base = zName;.  
26a00 20 20 20 20 20 20 20 20 73 69 7a 65 5f 74 20 6e          size_t n
26a10 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20 20 20  Copy;.          
26a20 63 68 61 72 20 2a 7a 43 6f 70 79 3b 0a 20 20 20  char *zCopy;.   
26a30 20 20 20 20 20 20 20 69 66 28 20 72 62 75 49 73         if( rbuIs
26a40 56 61 63 75 75 6d 28 70 44 62 2d 3e 70 52 62 75  Vacuum(pDb->pRbu
26a50 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
26a60 20 7a 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33   zBase = sqlite3
26a70 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28 70 44 62  _db_filename(pDb
26a80 2d 3e 70 52 62 75 2d 3e 64 62 52 62 75 2c 20 22  ->pRbu->dbRbu, "
26a90 6d 61 69 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  main");.        
26aa0 20 20 20 20 7a 42 61 73 65 20 3d 20 72 62 75 4d      zBase = rbuM
26ab0 61 69 6e 54 6f 57 61 6c 28 7a 42 61 73 65 2c 20  ainToWal(zBase, 
26ac0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29  SQLITE_OPEN_URI)
26ad0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
26ae0 20 20 20 20 20 20 20 20 6e 43 6f 70 79 20 3d 20          nCopy = 
26af0 73 74 72 6c 65 6e 28 7a 42 61 73 65 29 3b 0a 20  strlen(zBase);. 
26b00 20 20 20 20 20 20 20 20 20 7a 43 6f 70 79 20 3d           zCopy =
26b10 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
26b20 34 28 6e 43 6f 70 79 2b 32 29 3b 0a 20 20 20 20  4(nCopy+2);.    
26b30 20 20 20 20 20 20 69 66 28 20 7a 43 6f 70 79 20        if( zCopy 
26b40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
26b50 65 6d 63 70 79 28 7a 43 6f 70 79 2c 20 7a 42 61  emcpy(zCopy, zBa
26b60 73 65 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20  se, nCopy);.    
26b70 20 20 20 20 20 20 20 20 7a 43 6f 70 79 5b 6e 43          zCopy[nC
26b80 6f 70 79 2d 33 5d 20 3d 20 27 6f 27 3b 0a 20 20  opy-3] = 'o';.  
26b90 20 20 20 20 20 20 20 20 20 20 7a 43 6f 70 79 5b            zCopy[
26ba0 6e 43 6f 70 79 5d 20 3d 20 27 5c 30 27 3b 0a 20  nCopy] = '\0';. 
26bb0 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 70 79             zCopy
26bc0 5b 6e 43 6f 70 79 2b 31 5d 20 3d 20 27 5c 30 27  [nCopy+1] = '\0'
26bd0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 4f  ;.            zO
26be0 70 65 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  pen = (const cha
26bf0 72 2a 29 28 70 46 64 2d 3e 7a 44 65 6c 20 3d 20  r*)(pFd->zDel = 
26c00 7a 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 20 20  zCopy);.        
26c10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26c20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
26c30 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
26c40 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 46    }.          pF
26c50 64 2d 3e 70 52 62 75 20 3d 20 70 44 62 2d 3e 70  d->pRbu = pDb->p
26c60 52 62 75 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Rbu;.        }. 
26c70 20 20 20 20 20 20 20 70 44 62 2d 3e 70 57 61 6c         pDb->pWal
26c80 46 64 20 3d 20 70 46 64 3b 0a 20 20 20 20 20 20  Fd = pFd;.      
26c90 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
26ca0 0a 20 20 20 20 70 46 64 2d 3e 70 52 62 75 20 3d  .    pFd->pRbu =
26cb0 20 70 52 62 75 56 66 73 2d 3e 70 52 62 75 3b 0a   pRbuVfs->pRbu;.
26cc0 20 20 7d 0a 0a 20 20 69 66 28 20 6f 66 6c 61 67    }..  if( oflag
26cd0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
26ce0 4d 41 49 4e 5f 44 42 20 0a 20 20 20 26 26 20 73  MAIN_DB .   && s
26cf0 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65  qlite3_uri_boole
26d00 61 6e 28 7a 4e 61 6d 65 2c 20 22 72 62 75 5f 6d  an(zName, "rbu_m
26d10 65 6d 6f 72 79 22 2c 20 30 29 20 0a 20 20 29 7b  emory", 0) .  ){
26d20 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 66 6c  .    assert( ofl
26d30 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
26d40 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 20  N_MAIN_DB );.   
26d50 20 6f 66 6c 61 67 73 20 3d 20 20 53 51 4c 49 54   oflags =  SQLIT
26d60 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 7c  E_OPEN_TEMP_DB |
26d70 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
26d80 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
26d90 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20  OPEN_CREATE |.  
26da0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
26db0 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
26dc0 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
26dd0 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20  DELETEONCLOSE;. 
26de0 20 20 20 7a 4f 70 65 6e 20 3d 20 30 3b 0a 20 20     zOpen = 0;.  
26df0 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
26e00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
26e10 20 3d 20 70 52 65 61 6c 56 66 73 2d 3e 78 4f 70   = pRealVfs->xOp
26e20 65 6e 28 70 52 65 61 6c 56 66 73 2c 20 7a 4f 70  en(pRealVfs, zOp
26e30 65 6e 2c 20 70 46 64 2d 3e 70 52 65 61 6c 2c 20  en, pFd->pReal, 
26e40 6f 66 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61 67  oflags, pOutFlag
26e50 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46  s);.  }.  if( pF
26e60 64 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f  d->pReal->pMetho
26e70 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  ds ){.    /* The
26e80 20 78 4f 70 65 6e 28 29 20 6f 70 65 72 61 74 69   xOpen() operati
26e90 6f 6e 20 68 61 73 20 73 75 63 63 65 65 64 65 64  on has succeeded
26ea0 2e 20 53 65 74 20 74 68 65 20 73 71 6c 69 74 65  . Set the sqlite
26eb0 33 5f 66 69 6c 65 2e 70 4d 65 74 68 6f 64 73 0a  3_file.pMethods.
26ec0 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 61      ** pointer a
26ed0 6e 64 2c 20 69 66 20 74 68 65 20 66 69 6c 65 20  nd, if the file 
26ee0 69 73 20 61 20 6d 61 69 6e 20 64 61 74 61 62 61  is a main databa
26ef0 73 65 20 66 69 6c 65 2c 20 6c 69 6e 6b 20 69 74  se file, link it
26f00 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a   into the.    **
26f10 20 6d 75 74 65 78 20 70 72 6f 74 65 63 74 65 64   mutex protected
26f20 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
26f30 61 6c 6c 20 73 75 63 68 20 66 69 6c 65 73 2e 20  all such files. 
26f40 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70   */.    pFile->p
26f50 4d 65 74 68 6f 64 73 20 3d 20 26 72 62 75 76 66  Methods = &rbuvf
26f60 73 5f 69 6f 5f 6d 65 74 68 6f 64 73 3b 0a 20 20  s_io_methods;.  
26f70 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51    if( flags & SQ
26f80 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
26f90 42 20 29 7b 0a 20 20 20 20 20 20 72 62 75 4d 61  B ){.      rbuMa
26fa0 69 6e 6c 69 73 74 41 64 64 28 70 46 64 29 3b 0a  inlistAdd(pFd);.
26fb0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
26fc0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
26fd0 70 46 64 2d 3e 7a 44 65 6c 29 3b 0a 20 20 7d 0a  pFd->zDel);.  }.
26fe0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
26ff0 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  ./*.** Delete th
27000 65 20 66 69 6c 65 20 6c 6f 63 61 74 65 64 20 61  e file located a
27010 74 20 7a 50 61 74 68 2e 0a 2a 2f 0a 73 74 61 74  t zPath..*/.stat
27020 69 63 20 69 6e 74 20 72 62 75 56 66 73 44 65 6c  ic int rbuVfsDel
27030 65 74 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ete(sqlite3_vfs 
27040 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61  *pVfs, const cha
27050 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 64 69  r *zPath, int di
27060 72 53 79 6e 63 29 7b 0a 20 20 73 71 6c 69 74 65  rSync){.  sqlite
27070 33 5f 76 66 73 20 2a 70 52 65 61 6c 56 66 73 20  3_vfs *pRealVfs 
27080 3d 20 28 28 72 62 75 5f 76 66 73 2a 29 70 56 66  = ((rbu_vfs*)pVf
27090 73 29 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20  s)->pRealVfs;.  
270a0 72 65 74 75 72 6e 20 70 52 65 61 6c 56 66 73 2d  return pRealVfs-
270b0 3e 78 44 65 6c 65 74 65 28 70 52 65 61 6c 56 66  >xDelete(pRealVf
270c0 73 2c 20 7a 50 61 74 68 2c 20 64 69 72 53 79 6e  s, zPath, dirSyn
270d0 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73  c);.}../*.** Tes
270e0 74 20 66 6f 72 20 61 63 63 65 73 73 20 70 65 72  t for access per
270f0 6d 69 73 73 69 6f 6e 73 2e 20 52 65 74 75 72 6e  missions. Return
27100 20 74 72 75 65 20 69 66 20 74 68 65 20 72 65 71   true if the req
27110 75 65 73 74 65 64 20 70 65 72 6d 69 73 73 69 6f  uested permissio
27120 6e 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c  n.** is availabl
27130 65 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65  e, or false othe
27140 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
27150 20 69 6e 74 20 72 62 75 56 66 73 41 63 63 65 73   int rbuVfsAcces
27160 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  s(.  sqlite3_vfs
27170 20 2a 70 56 66 73 2c 20 0a 20 20 63 6f 6e 73 74   *pVfs, .  const
27180 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 0a 20   char *zPath, . 
27190 20 69 6e 74 20 66 6c 61 67 73 2c 20 0a 20 20 69   int flags, .  i
271a0 6e 74 20 2a 70 52 65 73 4f 75 74 0a 29 7b 0a 20  nt *pResOut.){. 
271b0 20 72 62 75 5f 76 66 73 20 2a 70 52 62 75 56 66   rbu_vfs *pRbuVf
271c0 73 20 3d 20 28 72 62 75 5f 76 66 73 2a 29 70 56  s = (rbu_vfs*)pV
271d0 66 73 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  fs;.  sqlite3_vf
271e0 73 20 2a 70 52 65 61 6c 56 66 73 20 3d 20 70 52  s *pRealVfs = pR
271f0 62 75 56 66 73 2d 3e 70 52 65 61 6c 56 66 73 3b  buVfs->pRealVfs;
27200 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63  .  int rc;..  rc
27210 20 3d 20 70 52 65 61 6c 56 66 73 2d 3e 78 41 63   = pRealVfs->xAc
27220 63 65 73 73 28 70 52 65 61 6c 56 66 73 2c 20 7a  cess(pRealVfs, z
27230 50 61 74 68 2c 20 66 6c 61 67 73 2c 20 70 52 65  Path, flags, pRe
27240 73 4f 75 74 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  sOut);..  /* If 
27250 74 68 69 73 20 63 61 6c 6c 20 69 73 20 74 6f 20  this call is to 
27260 63 68 65 63 6b 20 69 66 20 61 20 2a 2d 77 61 6c  check if a *-wal
27270 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64   file associated
27280 20 77 69 74 68 20 61 6e 20 52 42 55 20 74 61 72   with an RBU tar
27290 67 65 74 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  get.  ** databas
272a0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 65 78 69  e connection exi
272b0 73 74 73 2c 20 61 6e 64 20 74 68 65 20 52 42 55  sts, and the RBU
272c0 20 75 70 64 61 74 65 20 69 73 20 69 6e 20 52 42   update is in RB
272d0 55 5f 53 54 41 47 45 5f 4f 41 4c 2c 0a 20 20 2a  U_STAGE_OAL,.  *
272e0 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
272f0 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67  special handling
27300 20 69 73 20 61 63 74 69 76 61 74 65 64 3a 0a 20   is activated:. 
27310 20 2a 2a 0a 20 20 2a 2a 20 20 20 61 29 20 69 66   **.  **   a) if
27320 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20   the *-wal file 
27330 64 6f 65 73 20 65 78 69 73 74 2c 20 72 65 74 75  does exist, retu
27340 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
27350 45 4e 2e 20 54 68 69 73 0a 20 20 2a 2a 20 20 20  EN. This.  **   
27360 20 20 20 65 6e 73 75 72 65 73 20 74 68 61 74 20     ensures that 
27370 74 68 65 20 52 42 55 20 65 78 74 65 6e 73 69 6f  the RBU extensio
27380 6e 20 6e 65 76 65 72 20 74 72 69 65 73 20 74 6f  n never tries to
27390 20 75 70 64 61 74 65 20 61 20 64 61 74 61 62 61   update a databa
273a0 73 65 0a 20 20 2a 2a 20 20 20 20 20 20 69 6e 20  se.  **      in 
273b0 77 61 6c 20 6d 6f 64 65 2c 20 65 76 65 6e 20 69  wal mode, even i
273c0 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  f the first page
273d0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
273e0 20 66 69 6c 65 20 68 61 73 0a 20 20 2a 2a 20 20   file has.  **  
273f0 20 20 20 20 62 65 65 6e 20 64 61 6d 61 67 65 64      been damaged
27400 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 62  . .  **.  **   b
27410 29 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66  ) if the *-wal f
27420 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
27430 73 74 2c 20 63 6c 61 69 6d 20 74 68 61 74 20 69  st, claim that i
27440 74 20 64 6f 65 73 20 61 6e 79 77 61 79 2c 0a 20  t does anyway,. 
27450 20 2a 2a 20 20 20 20 20 20 63 61 75 73 69 6e 67   **      causing
27460 20 53 51 4c 69 74 65 20 74 6f 20 63 61 6c 6c 20   SQLite to call 
27470 78 4f 70 65 6e 28 29 20 74 6f 20 6f 70 65 6e 20  xOpen() to open 
27480 69 74 2e 20 54 68 69 73 20 63 61 6c 6c 20 77 69  it. This call wi
27490 6c 6c 20 61 6c 73 6f 0a 20 20 2a 2a 20 20 20 20  ll also.  **    
274a0 20 20 62 65 20 69 6e 74 65 72 63 65 70 74 65 64    be intercepted
274b0 20 28 73 65 65 20 74 68 65 20 72 62 75 56 66 73   (see the rbuVfs
274c0 4f 70 65 6e 28 29 20 66 75 6e 63 74 69 6f 6e 29  Open() function)
274d0 20 61 6e 64 20 74 68 65 20 2a 2d 6f 61 6c 0a 20   and the *-oal. 
274e0 20 2a 2a 20 20 20 20 20 20 66 69 6c 65 20 6f 70   **      file op
274f0 65 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 20 20  ened instead..  
27500 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
27510 49 54 45 5f 4f 4b 20 26 26 20 66 6c 61 67 73 3d  ITE_OK && flags=
27520 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45  =SQLITE_ACCESS_E
27530 58 49 53 54 53 20 29 7b 0a 20 20 20 20 72 62 75  XISTS ){.    rbu
27540 5f 66 69 6c 65 20 2a 70 44 62 20 3d 20 72 62 75  _file *pDb = rbu
27550 46 69 6e 64 4d 61 69 6e 64 62 28 70 52 62 75 56  FindMaindb(pRbuV
27560 66 73 2c 20 7a 50 61 74 68 2c 20 31 29 3b 0a 20  fs, zPath, 1);. 
27570 20 20 20 69 66 28 20 70 44 62 20 26 26 20 70 44     if( pDb && pD
27580 62 2d 3e 70 52 62 75 20 26 26 20 70 44 62 2d 3e  b->pRbu && pDb->
27590 70 52 62 75 2d 3e 65 53 74 61 67 65 3d 3d 52 42  pRbu->eStage==RB
275a0 55 5f 53 54 41 47 45 5f 4f 41 4c 20 29 7b 0a 20  U_STAGE_OAL ){. 
275b0 20 20 20 20 20 69 66 28 20 2a 70 52 65 73 4f 75       if( *pResOu
275c0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
275d0 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  = SQLITE_CANTOPE
275e0 4e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  N;.      }else{.
275f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
27600 69 6e 74 36 34 20 73 7a 20 3d 20 30 3b 0a 20 20  int64 sz = 0;.  
27610 20 20 20 20 20 20 72 63 20 3d 20 72 62 75 56 66        rc = rbuVf
27620 73 46 69 6c 65 53 69 7a 65 28 26 70 44 62 2d 3e  sFileSize(&pDb->
27630 62 61 73 65 2c 20 26 73 7a 29 3b 0a 20 20 20 20  base, &sz);.    
27640 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 28      *pResOut = (
27650 73 7a 3e 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  sz>0);.      }. 
27660 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
27670 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
27680 50 6f 70 75 6c 61 74 65 20 62 75 66 66 65 72 20  Populate buffer 
27690 7a 4f 75 74 20 77 69 74 68 20 74 68 65 20 66 75  zOut with the fu
276a0 6c 6c 20 63 61 6e 6f 6e 69 63 61 6c 20 70 61 74  ll canonical pat
276b0 68 6e 61 6d 65 20 63 6f 72 72 65 73 70 6f 6e 64  hname correspond
276c0 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61  ing.** to the pa
276d0 74 68 6e 61 6d 65 20 69 6e 20 7a 50 61 74 68 2e  thname in zPath.
276e0 20 7a 4f 75 74 20 69 73 20 67 75 61 72 61 6e 74   zOut is guarant
276f0 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  eed to point to 
27700 61 20 62 75 66 66 65 72 0a 2a 2a 20 6f 66 20 61  a buffer.** of a
27710 74 20 6c 65 61 73 74 20 28 44 45 56 53 59 4d 5f  t least (DEVSYM_
27720 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 29 20  MAX_PATHNAME+1) 
27730 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  bytes..*/.static
27740 20 69 6e 74 20 72 62 75 56 66 73 46 75 6c 6c 50   int rbuVfsFullP
27750 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74  athname(.  sqlit
27760 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 0a 20  e3_vfs *pVfs, . 
27770 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
27780 74 68 2c 20 0a 20 20 69 6e 74 20 6e 4f 75 74 2c  th, .  int nOut,
27790 20 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 0a 29   .  char *zOut.)
277a0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
277b0 2a 70 52 65 61 6c 56 66 73 20 3d 20 28 28 72 62  *pRealVfs = ((rb
277c0 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e 70 52  u_vfs*)pVfs)->pR
277d0 65 61 6c 56 66 73 3b 0a 20 20 72 65 74 75 72 6e  ealVfs;.  return
277e0 20 70 52 65 61 6c 56 66 73 2d 3e 78 46 75 6c 6c   pRealVfs->xFull
277f0 50 61 74 68 6e 61 6d 65 28 70 52 65 61 6c 56 66  Pathname(pRealVf
27800 73 2c 20 7a 50 61 74 68 2c 20 6e 4f 75 74 2c 20  s, zPath, nOut, 
27810 7a 4f 75 74 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  zOut);.}..#ifnde
27820 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
27830 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a  AD_EXTENSION./*.
27840 2a 2a 20 4f 70 65 6e 20 74 68 65 20 64 79 6e 61  ** Open the dyna
27850 6d 69 63 20 6c 69 62 72 61 72 79 20 6c 6f 63 61  mic library loca
27860 74 65 64 20 61 74 20 7a 50 61 74 68 20 61 6e 64  ted at zPath and
27870 20 72 65 74 75 72 6e 20 61 20 68 61 6e 64 6c 65   return a handle
27880 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
27890 20 2a 72 62 75 56 66 73 44 6c 4f 70 65 6e 28 73   *rbuVfsDlOpen(s
278a0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
278b0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  , const char *zP
278c0 61 74 68 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ath){.  sqlite3_
278d0 76 66 73 20 2a 70 52 65 61 6c 56 66 73 20 3d 20  vfs *pRealVfs = 
278e0 28 28 72 62 75 5f 76 66 73 2a 29 70 56 66 73 29  ((rbu_vfs*)pVfs)
278f0 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20 72 65  ->pRealVfs;.  re
27900 74 75 72 6e 20 70 52 65 61 6c 56 66 73 2d 3e 78  turn pRealVfs->x
27910 44 6c 4f 70 65 6e 28 70 52 65 61 6c 56 66 73 2c  DlOpen(pRealVfs,
27920 20 7a 50 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   zPath);.}../*.*
27930 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 62  * Populate the b
27940 75 66 66 65 72 20 7a 45 72 72 4d 73 67 20 28 73  uffer zErrMsg (s
27950 69 7a 65 20 6e 42 79 74 65 20 62 79 74 65 73 29  ize nByte bytes)
27960 20 77 69 74 68 20 61 20 68 75 6d 61 6e 20 72 65   with a human re
27970 61 64 61 62 6c 65 0a 2a 2a 20 75 74 66 2d 38 20  adable.** utf-8 
27980 73 74 72 69 6e 67 20 64 65 73 63 72 69 62 69 6e  string describin
27990 67 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  g the most recen
279a0 74 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65  t error encounte
279b0 72 65 64 20 61 73 73 6f 63 69 61 74 65 64 20 0a  red associated .
279c0 2a 2a 20 77 69 74 68 20 64 79 6e 61 6d 69 63 20  ** with dynamic 
279d0 6c 69 62 72 61 72 69 65 73 2e 0a 2a 2f 0a 73 74  libraries..*/.st
279e0 61 74 69 63 20 76 6f 69 64 20 72 62 75 56 66 73  atic void rbuVfs
279f0 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f  DlError(sqlite3_
27a00 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e  vfs *pVfs, int n
27a10 42 79 74 65 2c 20 63 68 61 72 20 2a 7a 45 72 72  Byte, char *zErr
27a20 4d 73 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Msg){.  sqlite3_
27a30 76 66 73 20 2a 70 52 65 61 6c 56 66 73 20 3d 20  vfs *pRealVfs = 
27a40 28 28 72 62 75 5f 76 66 73 2a 29 70 56 66 73 29  ((rbu_vfs*)pVfs)
27a50 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20 70 52  ->pRealVfs;.  pR
27a60 65 61 6c 56 66 73 2d 3e 78 44 6c 45 72 72 6f 72  ealVfs->xDlError
27a70 28 70 52 65 61 6c 56 66 73 2c 20 6e 42 79 74 65  (pRealVfs, nByte
27a80 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 7d 0a 0a 2f  , zErrMsg);.}../
27a90 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
27aa0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 79 6d  inter to the sym
27ab0 62 6f 6c 20 7a 53 79 6d 62 6f 6c 20 69 6e 20 74  bol zSymbol in t
27ac0 68 65 20 64 79 6e 61 6d 69 63 20 6c 69 62 72 61  he dynamic libra
27ad0 72 79 20 70 48 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  ry pHandle..*/.s
27ae0 74 61 74 69 63 20 76 6f 69 64 20 28 2a 72 62 75  tatic void (*rbu
27af0 56 66 73 44 6c 53 79 6d 28 0a 20 20 73 71 6c 69  VfsDlSym(.  sqli
27b00 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 0a  te3_vfs *pVfs, .
27b10 20 20 76 6f 69 64 20 2a 70 41 72 67 2c 20 0a 20    void *pArg, . 
27b20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79   const char *zSy
27b30 6d 0a 29 29 28 76 6f 69 64 29 7b 0a 20 20 73 71  m.))(void){.  sq
27b40 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65 61 6c  lite3_vfs *pReal
27b50 56 66 73 20 3d 20 28 28 72 62 75 5f 76 66 73 2a  Vfs = ((rbu_vfs*
27b60 29 70 56 66 73 29 2d 3e 70 52 65 61 6c 56 66 73  )pVfs)->pRealVfs
27b70 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 61 6c  ;.  return pReal
27b80 56 66 73 2d 3e 78 44 6c 53 79 6d 28 70 52 65 61  Vfs->xDlSym(pRea
27b90 6c 56 66 73 2c 20 70 41 72 67 2c 20 7a 53 79 6d  lVfs, pArg, zSym
27ba0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  );.}../*.** Clos
27bb0 65 20 74 68 65 20 64 79 6e 61 6d 69 63 20 6c 69  e the dynamic li
27bc0 62 72 61 72 79 20 68 61 6e 64 6c 65 20 70 48 61  brary handle pHa
27bd0 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndle..*/.static 
27be0 76 6f 69 64 20 72 62 75 56 66 73 44 6c 43 6c 6f  void rbuVfsDlClo
27bf0 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  se(sqlite3_vfs *
27c00 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e  pVfs, void *pHan
27c10 64 6c 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  dle){.  sqlite3_
27c20 76 66 73 20 2a 70 52 65 61 6c 56 66 73 20 3d 20  vfs *pRealVfs = 
27c30 28 28 72 62 75 5f 76 66 73 2a 29 70 56 66 73 29  ((rbu_vfs*)pVfs)
27c40 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20 70 52  ->pRealVfs;.  pR
27c50 65 61 6c 56 66 73 2d 3e 78 44 6c 43 6c 6f 73 65  ealVfs->xDlClose
27c60 28 70 52 65 61 6c 56 66 73 2c 20 70 48 61 6e 64  (pRealVfs, pHand
27c70 6c 65 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  le);.}.#endif /*
27c80 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
27c90 44 5f 45 58 54 45 4e 53 49 4f 4e 20 2a 2f 0a 0a  D_EXTENSION */..
27ca0 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74  /*.** Populate t
27cb0 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
27cc0 64 20 74 6f 20 62 79 20 7a 42 75 66 4f 75 74 20  d to by zBufOut 
27cd0 77 69 74 68 20 6e 42 79 74 65 20 62 79 74 65 73  with nByte bytes
27ce0 20 6f 66 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 64   of .** random d
27cf0 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ata..*/.static i
27d00 6e 74 20 72 62 75 56 66 73 52 61 6e 64 6f 6d 6e  nt rbuVfsRandomn
27d10 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ess(sqlite3_vfs 
27d20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 79 74 65  *pVfs, int nByte
27d30 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29  , char *zBufOut)
27d40 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
27d50 2a 70 52 65 61 6c 56 66 73 20 3d 20 28 28 72 62  *pRealVfs = ((rb
27d60 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e 70 52  u_vfs*)pVfs)->pR
27d70 65 61 6c 56 66 73 3b 0a 20 20 72 65 74 75 72 6e  ealVfs;.  return
27d80 20 70 52 65 61 6c 56 66 73 2d 3e 78 52 61 6e 64   pRealVfs->xRand
27d90 6f 6d 6e 65 73 73 28 70 52 65 61 6c 56 66 73 2c  omness(pRealVfs,
27da0 20 6e 42 79 74 65 2c 20 7a 42 75 66 4f 75 74 29   nByte, zBufOut)
27db0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70  ;.}../*.** Sleep
27dc0 20 66 6f 72 20 6e 4d 69 63 72 6f 20 6d 69 63 72   for nMicro micr
27dd0 6f 73 65 63 6f 6e 64 73 2e 20 52 65 74 75 72 6e  oseconds. Return
27de0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
27df0 69 63 72 6f 73 65 63 6f 6e 64 73 20 0a 2a 2a 20  icroseconds .** 
27e00 61 63 74 75 61 6c 6c 79 20 73 6c 65 70 74 2e 0a  actually slept..
27e10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62  */.static int rb
27e20 75 56 66 73 53 6c 65 65 70 28 73 71 6c 69 74 65  uVfsSleep(sqlite
27e30 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
27e40 20 6e 4d 69 63 72 6f 29 7b 0a 20 20 73 71 6c 69   nMicro){.  sqli
27e50 74 65 33 5f 76 66 73 20 2a 70 52 65 61 6c 56 66  te3_vfs *pRealVf
27e60 73 20 3d 20 28 28 72 62 75 5f 76 66 73 2a 29 70  s = ((rbu_vfs*)p
27e70 56 66 73 29 2d 3e 70 52 65 61 6c 56 66 73 3b 0a  Vfs)->pRealVfs;.
27e80 20 20 72 65 74 75 72 6e 20 70 52 65 61 6c 56 66    return pRealVf
27e90 73 2d 3e 78 53 6c 65 65 70 28 70 52 65 61 6c 56  s->xSleep(pRealV
27ea0 66 73 2c 20 6e 4d 69 63 72 6f 29 3b 0a 7d 0a 0a  fs, nMicro);.}..
27eb0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
27ec0 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 73   current time as
27ed0 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75   a Julian Day nu
27ee0 6d 62 65 72 20 69 6e 20 2a 70 54 69 6d 65 4f 75  mber in *pTimeOu
27ef0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
27f00 20 72 62 75 56 66 73 43 75 72 72 65 6e 74 54 69   rbuVfsCurrentTi
27f10 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  me(sqlite3_vfs *
27f20 70 56 66 73 2c 20 64 6f 75 62 6c 65 20 2a 70 54  pVfs, double *pT
27f30 69 6d 65 4f 75 74 29 7b 0a 20 20 73 71 6c 69 74  imeOut){.  sqlit
27f40 65 33 5f 76 66 73 20 2a 70 52 65 61 6c 56 66 73  e3_vfs *pRealVfs
27f50 20 3d 20 28 28 72 62 75 5f 76 66 73 2a 29 70 56   = ((rbu_vfs*)pV
27f60 66 73 29 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20  fs)->pRealVfs;. 
27f70 20 72 65 74 75 72 6e 20 70 52 65 61 6c 56 66 73   return pRealVfs
27f80 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d 65 28 70  ->xCurrentTime(p
27f90 52 65 61 6c 56 66 73 2c 20 70 54 69 6d 65 4f 75  RealVfs, pTimeOu
27fa0 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d  t);.}../*.** No-
27fb0 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
27fc0 74 20 72 62 75 56 66 73 47 65 74 4c 61 73 74 45  t rbuVfsGetLastE
27fd0 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
27fe0 20 2a 70 56 66 73 2c 20 69 6e 74 20 61 2c 20 63   *pVfs, int a, c
27ff0 68 61 72 20 2a 62 29 7b 0a 20 20 72 65 74 75 72  har *b){.  retur
28000 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  n 0;.}../*.** De
28010 72 65 67 69 73 74 65 72 20 61 6e 64 20 64 65 73  register and des
28020 74 72 6f 79 20 61 6e 20 52 42 55 20 76 66 73 20  troy an RBU vfs 
28030 63 72 65 61 74 65 64 20 62 79 20 61 6e 20 65 61  created by an ea
28040 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 0a 2a 2a  rlier call to.**
28050 20 73 71 6c 69 74 65 33 72 62 75 5f 63 72 65 61   sqlite3rbu_crea
28060 74 65 5f 76 66 73 28 29 2e 0a 2a 2f 0a 76 6f 69  te_vfs()..*/.voi
28070 64 20 73 71 6c 69 74 65 33 72 62 75 5f 64 65 73  d sqlite3rbu_des
28080 74 72 6f 79 5f 76 66 73 28 63 6f 6e 73 74 20 63  troy_vfs(const c
28090 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 73  har *zName){.  s
280a0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
280b0 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66   = sqlite3_vfs_f
280c0 69 6e 64 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  ind(zName);.  if
280d0 28 20 70 56 66 73 20 26 26 20 70 56 66 73 2d 3e  ( pVfs && pVfs->
280e0 78 4f 70 65 6e 3d 3d 72 62 75 56 66 73 4f 70 65  xOpen==rbuVfsOpe
280f0 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
28100 5f 6d 75 74 65 78 5f 66 72 65 65 28 28 28 72 62  _mutex_free(((rb
28110 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e 6d 75  u_vfs*)pVfs)->mu
28120 74 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  tex);.    sqlite
28130 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72  3_vfs_unregister
28140 28 70 56 66 73 29 3b 0a 20 20 20 20 73 71 6c 69  (pVfs);.    sqli
28150 74 65 33 5f 66 72 65 65 28 70 56 66 73 29 3b 0a  te3_free(pVfs);.
28160 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65    }.}../*.** Cre
28170 61 74 65 20 61 6e 20 52 42 55 20 56 46 53 20 6e  ate an RBU VFS n
28180 61 6d 65 64 20 7a 4e 61 6d 65 20 74 68 61 74 20  amed zName that 
28190 61 63 63 65 73 73 65 73 20 74 68 65 20 75 6e 64  accesses the und
281a0 65 72 6c 79 69 6e 67 20 66 69 6c 65 2d 73 79 73  erlying file-sys
281b0 74 65 6d 0a 2a 2a 20 76 69 61 20 65 78 69 73 74  tem.** via exist
281c0 69 6e 67 20 56 46 53 20 7a 50 61 72 65 6e 74 2e  ing VFS zParent.
281d0 20 54 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20   The new object 
281e0 69 73 20 72 65 67 69 73 74 65 72 65 64 20 61 73  is registered as
281f0 20 61 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 0a 2a   a non-default.*
28200 2a 20 56 46 53 20 77 69 74 68 20 53 51 4c 69 74  * VFS with SQLit
28210 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
28220 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
28230 65 33 72 62 75 5f 63 72 65 61 74 65 5f 76 66 73  e3rbu_create_vfs
28240 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61  (const char *zNa
28250 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
28260 7a 50 61 72 65 6e 74 29 7b 0a 0a 20 20 2f 2a 20  zParent){..  /* 
28270 54 65 6d 70 6c 61 74 65 20 66 6f 72 20 56 46 53  Template for VFS
28280 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 73 71 6c   */.  static sql
28290 69 74 65 33 5f 76 66 73 20 76 66 73 5f 74 65 6d  ite3_vfs vfs_tem
282a0 70 6c 61 74 65 20 3d 20 7b 0a 20 20 20 20 31 2c  plate = {.    1,
282b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
282c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
282d0 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 30  Version */.    0
282e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
282f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28300 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20  szOsFile */.    
28310 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
28320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28330 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20   mxPathname */. 
28340 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
28350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28360 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20   /* pNext */.   
28370 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
28380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28390 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 30  * zName */.    0
283a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
283b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
283c0 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 20 20  pAppData */.    
283d0 72 62 75 56 66 73 4f 70 65 6e 2c 20 20 20 20 20  rbuVfsOpen,     
283e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
283f0 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 72 62   xOpen */.    rb
28400 75 56 66 73 44 65 6c 65 74 65 2c 20 20 20 20 20  uVfsDelete,     
28410 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
28420 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 72 62  Delete */.    rb
28430 75 56 66 73 41 63 63 65 73 73 2c 20 20 20 20 20  uVfsAccess,     
28440 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
28450 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 72 62  Access */.    rb
28460 75 56 66 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  uVfsFullPathname
28470 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
28480 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a  FullPathname */.
28490 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
284a0 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
284b0 49 4f 4e 0a 20 20 20 20 72 62 75 56 66 73 44 6c  ION.    rbuVfsDl
284c0 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
284d0 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e        /* xDlOpen
284e0 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 44 6c   */.    rbuVfsDl
284f0 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20  Error,          
28500 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f        /* xDlErro
28510 72 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 44  r */.    rbuVfsD
28520 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20  lSym,           
28530 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d         /* xDlSym
28540 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 44 6c   */.    rbuVfsDl
28550 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
28560 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73        /* xDlClos
28570 65 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 20 20 30  e */.#else.    0
28580 2c 20 30 2c 20 30 2c 20 30 2c 0a 23 65 6e 64 69  , 0, 0, 0,.#endi
28590 66 0a 0a 20 20 20 20 72 62 75 56 66 73 52 61 6e  f..    rbuVfsRan
285a0 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 20  domness,        
285b0 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e       /* xRandomn
285c0 65 73 73 20 2a 2f 0a 20 20 20 20 72 62 75 56 66  ess */.    rbuVf
285d0 73 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20  sSleep,         
285e0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65           /* xSle
285f0 65 70 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73  ep */.    rbuVfs
28600 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20  CurrentTime,    
28610 20 20 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72          /* xCurr
28620 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20 72  entTime */.    r
28630 62 75 56 66 73 47 65 74 4c 61 73 74 45 72 72 6f  buVfsGetLastErro
28640 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r,           /* 
28650 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f  xGetLastError */
28660 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
28670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28680 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69     /* xCurrentTi
28690 6d 65 49 6e 74 36 34 20 28 76 65 72 73 69 6f 6e  meInt64 (version
286a0 20 32 29 20 2a 2f 0a 20 20 20 20 30 2c 20 30 2c   2) */.    0, 0,
286b0 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
286c0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 69 6d           /* Unim
286d0 70 6c 65 6d 65 6e 74 65 64 20 76 65 72 73 69 6f  plemented versio
286e0 6e 20 33 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 20  n 3 methods */. 
286f0 20 7d 3b 0a 0a 20 20 72 62 75 5f 76 66 73 20 2a   };..  rbu_vfs *
28700 70 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20  pNew = 0;       
28710 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20         /* Newly 
28720 61 6c 6c 6f 63 61 74 65 64 20 56 46 53 20 2a 2f  allocated VFS */
28730 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
28740 54 45 5f 4f 4b 3b 0a 20 20 73 69 7a 65 5f 74 20  TE_OK;.  size_t 
28750 6e 4e 61 6d 65 3b 0a 20 20 73 69 7a 65 5f 74 20  nName;.  size_t 
28760 6e 42 79 74 65 3b 0a 0a 20 20 6e 4e 61 6d 65 20  nByte;..  nName 
28770 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b  = strlen(zName);
28780 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  .  nByte = sizeo
28790 66 28 72 62 75 5f 76 66 73 29 20 2b 20 6e 4e 61  f(rbu_vfs) + nNa
287a0 6d 65 20 2b 20 31 3b 0a 20 20 70 4e 65 77 20 3d  me + 1;.  pNew =
287b0 20 28 72 62 75 5f 76 66 73 2a 29 73 71 6c 69 74   (rbu_vfs*)sqlit
287c0 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74  e3_malloc64(nByt
287d0 65 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d  e);.  if( pNew==
287e0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
287f0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65  LITE_NOMEM;.  }e
28800 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
28810 5f 76 66 73 20 2a 70 50 61 72 65 6e 74 3b 20 20  _vfs *pParent;  
28820 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 65           /* Pare
28830 6e 74 20 56 46 53 20 2a 2f 0a 20 20 20 20 6d 65  nt VFS */.    me
28840 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 6e 42  mset(pNew, 0, nB
28850 79 74 65 29 3b 0a 20 20 20 20 70 50 61 72 65 6e  yte);.    pParen
28860 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  t = sqlite3_vfs_
28870 66 69 6e 64 28 7a 50 61 72 65 6e 74 29 3b 0a 20  find(zParent);. 
28880 20 20 20 69 66 28 20 70 50 61 72 65 6e 74 3d 3d     if( pParent==
28890 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
288a0 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b  SQLITE_NOTFOUND;
288b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
288c0 20 20 63 68 61 72 20 2a 7a 53 70 61 63 65 3b 0a    char *zSpace;.
288d0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e        memcpy(&pN
288e0 65 77 2d 3e 62 61 73 65 2c 20 26 76 66 73 5f 74  ew->base, &vfs_t
288f0 65 6d 70 6c 61 74 65 2c 20 73 69 7a 65 6f 66 28  emplate, sizeof(
28900 73 71 6c 69 74 65 33 5f 76 66 73 29 29 3b 0a 20  sqlite3_vfs));. 
28910 20 20 20 20 20 70 4e 65 77 2d 3e 62 61 73 65 2e       pNew->base.
28920 6d 78 50 61 74 68 6e 61 6d 65 20 3d 20 70 50 61  mxPathname = pPa
28930 72 65 6e 74 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  rent->mxPathname
28940 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 62 61  ;.      pNew->ba
28950 73 65 2e 73 7a 4f 73 46 69 6c 65 20 3d 20 73 69  se.szOsFile = si
28960 7a 65 6f 66 28 72 62 75 5f 66 69 6c 65 29 20 2b  zeof(rbu_file) +
28970 20 70 50 61 72 65 6e 74 2d 3e 73 7a 4f 73 46 69   pParent->szOsFi
28980 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  le;.      pNew->
28990 70 52 65 61 6c 56 66 73 20 3d 20 70 50 61 72 65  pRealVfs = pPare
289a0 6e 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  nt;.      pNew->
289b0 62 61 73 65 2e 7a 4e 61 6d 65 20 3d 20 28 63 6f  base.zName = (co
289c0 6e 73 74 20 63 68 61 72 2a 29 28 7a 53 70 61 63  nst char*)(zSpac
289d0 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77  e = (char*)&pNew
289e0 5b 31 5d 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  [1]);.      memc
289f0 70 79 28 7a 53 70 61 63 65 2c 20 7a 4e 61 6d 65  py(zSpace, zName
28a00 2c 20 6e 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20  , nName);..     
28a10 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   /* Allocate the
28a20 20 6d 75 74 65 78 20 61 6e 64 20 72 65 67 69 73   mutex and regis
28a30 74 65 72 20 74 68 65 20 6e 65 77 20 56 46 53 20  ter the new VFS 
28a40 28 6e 6f 74 20 61 73 20 74 68 65 20 64 65 66 61  (not as the defa
28a50 75 6c 74 29 20 2a 2f 0a 20 20 20 20 20 20 70 4e  ult) */.      pN
28a60 65 77 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69  ew->mutex = sqli
28a70 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
28a80 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43  SQLITE_MUTEX_REC
28a90 55 52 53 49 56 45 29 3b 0a 20 20 20 20 20 20 69  URSIVE);.      i
28aa0 66 28 20 70 4e 65 77 2d 3e 6d 75 74 65 78 3d 3d  f( pNew->mutex==
28ab0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
28ac0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
28ad0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
28ae0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
28af0 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26  3_vfs_register(&
28b00 70 4e 65 77 2d 3e 62 61 73 65 2c 20 30 29 3b 0a  pNew->base, 0);.
28b10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
28b20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
28b30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
28b40 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
28b50 28 70 4e 65 77 2d 3e 6d 75 74 65 78 29 3b 0a 20  (pNew->mutex);. 
28b60 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
28b70 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 7d 0a 20  e(pNew);.    }. 
28b80 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
28b90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67  .}../*.** Config
28ba0 75 72 65 20 74 68 65 20 61 67 67 72 65 67 61 74  ure the aggregat
28bb0 65 20 74 65 6d 70 20 66 69 6c 65 20 73 69 7a 65  e temp file size
28bc0 20 6c 69 6d 69 74 20 66 6f 72 20 74 68 69 73 20   limit for this 
28bd0 52 42 55 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  RBU handle..*/.s
28be0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c  qlite3_int64 sql
28bf0 69 74 65 33 72 62 75 5f 74 65 6d 70 5f 73 69 7a  ite3rbu_temp_siz
28c00 65 5f 6c 69 6d 69 74 28 73 71 6c 69 74 65 33 72  e_limit(sqlite3r
28c10 62 75 20 2a 70 52 62 75 2c 20 73 71 6c 69 74 65  bu *pRbu, sqlite
28c20 33 5f 69 6e 74 36 34 20 6e 29 7b 0a 20 20 69 66  3_int64 n){.  if
28c30 28 20 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 70 52  ( n>=0 ){.    pR
28c40 62 75 2d 3e 73 7a 54 65 6d 70 4c 69 6d 69 74 20  bu->szTempLimit 
28c50 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = n;.  }.  retur
28c60 6e 20 70 52 62 75 2d 3e 73 7a 54 65 6d 70 4c 69  n pRbu->szTempLi
28c70 6d 69 74 3b 0a 7d 0a 0a 73 71 6c 69 74 65 33 5f  mit;.}..sqlite3_
28c80 69 6e 74 36 34 20 73 71 6c 69 74 65 33 72 62 75  int64 sqlite3rbu
28c90 5f 74 65 6d 70 5f 73 69 7a 65 28 73 71 6c 69 74  _temp_size(sqlit
28ca0 65 33 72 62 75 20 2a 70 52 62 75 29 7b 0a 20 20  e3rbu *pRbu){.  
28cb0 72 65 74 75 72 6e 20 70 52 62 75 2d 3e 73 7a 54  return pRbu->szT
28cc0 65 6d 70 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a  emp;.}.../******
28cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28d10 2a 2a 2a 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a  ****/..#endif /*
28d20 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
28d30 5f 43 4f 52 45 29 20 7c 7c 20 64 65 66 69 6e 65  _CORE) || define
28d40 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
28d50 52 42 55 29 20 2a 2f 0a                          RBU) */.