/ Hex Artifact Content
Login

Artifact 2023a7df2c523e3df1cb532eff811cda385a789a:


0000: 23 20 32 30 31 36 20 4d 61 72 63 68 20 31 38 0a  # 2016 March 18.
0010: 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64  #.# The author d
0020: 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67  isclaims copyrig
0030: 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63  ht to this sourc
0040: 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63  e code.  In plac
0050: 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e  e of.# a legal n
0060: 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61  otice, here is a
0070: 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20   blessing:.#.#  
0080: 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f    May you do goo
0090: 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a  d and not evil..
00a0: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e  #    May you fin
00b0: 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f  d forgiveness fo
00c0: 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66  r yourself and f
00d0: 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23  orgive others..#
00e0: 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72      May you shar
00f0: 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20  e freely, never 
0100: 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  taking more than
0110: 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a   you give..#.#**
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 0a 23 0a 0a 73 6f 75 72 63 65 20  *****.#..source 
0170: 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 66 69 6c 65  [file join [file
0180: 20 64 69 72 6e 61 6d 65 20 5b 69 6e 66 6f 20 73   dirname [info s
0190: 63 72 69 70 74 5d 5d 20 72 62 75 5f 63 6f 6d 6d  cript]] rbu_comm
01a0: 6f 6e 2e 74 63 6c 5d 0a 73 65 74 20 3a 3a 74 65  on.tcl].set ::te
01b0: 73 74 70 72 65 66 69 78 20 72 62 75 70 72 6f 67  stprefix rbuprog
01c0: 72 65 73 73 0a 0a 0a 70 72 6f 63 20 63 72 65 61  ress...proc crea
01d0: 74 65 5f 64 62 5f 66 69 6c 65 20 7b 66 69 6c 65  te_db_file {file
01e0: 6e 61 6d 65 20 73 71 6c 7d 20 7b 0a 20 20 66 6f  name sql} {.  fo
01f0: 72 63 65 64 65 6c 65 74 65 20 24 66 69 6c 65 6e  rcedelete $filen
0200: 61 6d 65 0a 20 20 73 71 6c 69 74 65 33 20 74 6d  ame.  sqlite3 tm
0210: 70 64 62 20 24 66 69 6c 65 6e 61 6d 65 20 20 0a  pdb $filename  .
0220: 20 20 74 6d 70 64 62 20 65 76 61 6c 20 24 73 71    tmpdb eval $sq
0230: 6c 0a 20 20 74 6d 70 64 62 20 63 6c 6f 73 65 0a  l.  tmpdb close.
0240: 7d 0a 0a 23 20 43 72 65 61 74 65 20 61 20 73 69  }..# Create a si
0250: 6d 70 6c 65 20 52 42 55 20 64 61 74 61 62 61 73  mple RBU databas
0260: 65 2e 20 54 68 61 74 20 65 78 70 65 63 74 73 20  e. That expects 
0270: 74 6f 20 77 72 69 74 65 20 74 6f 20 61 20 74 61  to write to a ta
0280: 62 6c 65 3a 0a 23 0a 23 20 20 20 43 52 45 41 54  ble:.#.#   CREAT
0290: 45 20 54 41 42 4c 45 20 74 31 28 61 20 49 4e 54  E TABLE t1(a INT
02a0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
02b0: 2c 20 62 2c 20 63 29 3b 0a 23 0a 70 72 6f 63 20  , b, c);.#.proc 
02c0: 63 72 65 61 74 65 5f 72 62 75 31 20 7b 66 69 6c  create_rbu1 {fil
02d0: 65 6e 61 6d 65 7d 20 7b 0a 20 20 63 72 65 61 74  ename} {.  creat
02e0: 65 5f 64 62 5f 66 69 6c 65 20 24 66 69 6c 65 6e  e_db_file $filen
02f0: 61 6d 65 20 7b 0a 20 20 20 20 43 52 45 41 54 45  ame {.    CREATE
0300: 20 54 41 42 4c 45 20 64 61 74 61 5f 74 31 28 61   TABLE data_t1(a
0310: 2c 20 62 2c 20 63 2c 20 72 62 75 5f 63 6f 6e 74  , b, c, rbu_cont
0320: 72 6f 6c 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  rol);.    INSERT
0330: 20 49 4e 54 4f 20 64 61 74 61 5f 74 31 20 56 41   INTO data_t1 VA
0340: 4c 55 45 53 28 31 2c 20 32 2c 20 33 2c 20 30 29  LUES(1, 2, 3, 0)
0350: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
0360: 4f 20 64 61 74 61 5f 74 31 20 56 41 4c 55 45 53  O data_t1 VALUES
0370: 28 32 2c 20 27 74 77 6f 27 2c 20 27 74 68 72 65  (2, 'two', 'thre
0380: 65 27 2c 20 30 29 3b 0a 20 20 20 20 49 4e 53 45  e', 0);.    INSE
0390: 52 54 20 49 4e 54 4f 20 64 61 74 61 5f 74 31 20  RT INTO data_t1 
03a0: 56 41 4c 55 45 53 28 33 2c 20 4e 55 4c 4c 2c 20  VALUES(3, NULL, 
03b0: 38 2e 32 2c 20 30 29 3b 0a 0a 20 20 20 20 43 52  8.2, 0);..    CR
03c0: 45 41 54 45 20 54 41 42 4c 45 20 72 62 75 5f 63  EATE TABLE rbu_c
03d0: 6f 75 6e 74 28 74 62 6c 2c 20 63 6e 74 29 3b 0a  ount(tbl, cnt);.
03e0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
03f0: 72 62 75 5f 63 6f 75 6e 74 20 56 41 4c 55 45 53  rbu_count VALUES
0400: 28 27 64 61 74 61 5f 74 31 27 2c 20 33 29 3b 0a  ('data_t1', 3);.
0410: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 24 66 69    }.  return $fi
0420: 6c 65 6e 61 6d 65 0a 7d 0a 0a 0a 64 6f 5f 65 78  lename.}...do_ex
0430: 65 63 73 71 6c 5f 74 65 73 74 20 31 2e 30 20 7b  ecsql_test 1.0 {
0440: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
0450: 74 31 28 61 20 49 4e 54 45 47 45 52 20 50 52 49  t1(a INTEGER PRI
0460: 4d 41 52 59 20 4b 45 59 2c 20 62 2c 20 63 29 3b  MARY KEY, b, c);
0470: 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 31 2e 31 20  .}..do_test 1.1 
0480: 7b 0a 20 20 63 72 65 61 74 65 5f 72 62 75 31 20  {.  create_rbu1 
0490: 72 62 75 2e 64 62 0a 20 20 73 71 6c 69 74 65 33  rbu.db.  sqlite3
04a0: 72 62 75 20 72 62 75 20 74 65 73 74 2e 64 62 20  rbu rbu test.db 
04b0: 72 62 75 2e 64 62 0a 20 20 72 62 75 20 62 70 5f  rbu.db.  rbu bp_
04c0: 70 72 6f 67 72 65 73 73 0a 7d 20 7b 30 20 30 7d  progress.} {0 0}
04d0: 0a 64 6f 5f 74 65 73 74 20 31 2e 32 20 7b 20 72  .do_test 1.2 { r
04e0: 62 75 20 73 74 65 70 20 3b 20 72 62 75 20 62 70  bu step ; rbu bp
04f0: 5f 70 72 6f 67 72 65 73 73 20 7d 20 7b 33 33 33  _progress } {333
0500: 33 20 30 7d 0a 64 6f 5f 74 65 73 74 20 31 2e 33  3 0}.do_test 1.3
0510: 20 7b 20 72 62 75 20 73 74 65 70 20 3b 20 72 62   { rbu step ; rb
0520: 75 20 62 70 5f 70 72 6f 67 72 65 73 73 20 7d 20  u bp_progress } 
0530: 7b 36 36 36 36 20 30 7d 0a 64 6f 5f 74 65 73 74  {6666 0}.do_test
0540: 20 31 2e 34 20 7b 20 72 62 75 20 73 74 65 70 20   1.4 { rbu step 
0550: 3b 20 72 62 75 20 62 70 5f 70 72 6f 67 72 65 73  ; rbu bp_progres
0560: 73 20 7d 20 7b 31 30 30 30 30 20 30 7d 0a 64 6f  s } {10000 0}.do
0570: 5f 74 65 73 74 20 31 2e 35 20 7b 20 72 62 75 20  _test 1.5 { rbu 
0580: 73 74 65 70 20 3b 20 72 62 75 20 62 70 5f 70 72  step ; rbu bp_pr
0590: 6f 67 72 65 73 73 20 7d 20 7b 31 30 30 30 30 20  ogress } {10000 
05a0: 30 7d 0a 64 6f 5f 74 65 73 74 20 31 2e 36 20 7b  0}.do_test 1.6 {
05b0: 20 72 62 75 20 73 74 65 70 20 3b 20 72 62 75 20   rbu step ; rbu 
05c0: 62 70 5f 70 72 6f 67 72 65 73 73 20 7d 20 7b 31  bp_progress } {1
05d0: 30 30 30 30 20 30 7d 0a 64 6f 5f 74 65 73 74 20  0000 0}.do_test 
05e0: 31 2e 37 20 7b 20 72 62 75 20 73 74 65 70 20 3b  1.7 { rbu step ;
05f0: 20 72 62 75 20 62 70 5f 70 72 6f 67 72 65 73 73   rbu bp_progress
0600: 20 7d 20 7b 31 30 30 30 30 20 35 30 30 30 7d 0a   } {10000 5000}.
0610: 64 6f 5f 74 65 73 74 20 31 2e 38 20 7b 20 72 62  do_test 1.8 { rb
0620: 75 20 73 74 65 70 20 3b 20 72 62 75 20 62 70 5f  u step ; rbu bp_
0630: 70 72 6f 67 72 65 73 73 20 7d 20 7b 31 30 30 30  progress } {1000
0640: 30 20 31 30 30 30 30 7d 0a 64 6f 5f 74 65 73 74  0 10000}.do_test
0650: 20 31 2e 39 20 7b 20 72 62 75 20 73 74 65 70 20   1.9 { rbu step 
0660: 3b 20 72 62 75 20 62 70 5f 70 72 6f 67 72 65 73  ; rbu bp_progres
0670: 73 20 7d 20 7b 31 30 30 30 30 20 31 30 30 30 30  s } {10000 10000
0680: 7d 0a 0a 64 6f 5f 74 65 73 74 20 31 2e 31 30 20  }..do_test 1.10 
0690: 7b 0a 20 20 72 62 75 20 63 6c 6f 73 65 0a 7d 20  {.  rbu close.} 
06a0: 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 7d 0a 0a 23  {SQLITE_DONE}..#
06b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 70 72 6f 63  ---------.#.proc
0700: 20 64 6f 5f 73 70 5f 74 65 73 74 20 7b 74 6e 20   do_sp_test {tn 
0710: 62 52 65 6f 70 65 6e 20 74 61 72 67 65 74 20 72  bReopen target r
0720: 62 75 20 72 65 73 6c 69 73 74 7d 20 7b 0a 20 20  bu reslist} {.  
0730: 75 70 6c 65 76 65 6c 20 5b 6c 69 73 74 20 64 6f  uplevel [list do
0740: 5f 74 65 73 74 20 24 74 6e 20 5b 73 75 62 73 74  _test $tn [subst
0750: 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 7b 0a 20   -nocommands {. 
0760: 20 20 20 69 66 20 7b 24 62 52 65 6f 70 65 6e 3d     if {$bReopen=
0770: 3d 30 7d 20 7b 20 73 71 6c 69 74 65 33 72 62 75  =0} { sqlite3rbu
0780: 20 72 62 75 20 24 74 61 72 67 65 74 20 24 72 62   rbu $target $rb
0790: 75 20 7d 0a 20 20 20 20 73 65 74 20 72 65 73 20  u }.    set res 
07a0: 5b 6c 69 73 74 5d 0a 20 20 20 20 77 68 69 6c 65  [list].    while
07b0: 20 31 20 7b 0a 20 20 20 20 20 20 69 66 20 7b 24   1 {.      if {$
07c0: 62 52 65 6f 70 65 6e 7d 20 7b 20 73 71 6c 69 74  bReopen} { sqlit
07d0: 65 33 72 62 75 20 72 62 75 20 24 74 61 72 67 65  e3rbu rbu $targe
07e0: 74 20 24 72 62 75 20 7d 0a 20 20 20 20 20 20 73  t $rbu }.      s
07f0: 65 74 20 72 63 20 5b 72 62 75 20 73 74 65 70 5d  et rc [rbu step]
0800: 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 65 74 20  .      if {[set 
0810: 72 63 5d 20 21 3d 20 22 53 51 4c 49 54 45 5f 4f  rc] != "SQLITE_O
0820: 4b 22 7d 20 7b 20 72 62 75 20 63 6c 6f 73 65 20  K"} { rbu close 
0830: 3b 20 65 72 72 6f 72 20 22 65 72 72 6f 72 20 31  ; error "error 1
0840: 22 20 7d 0a 20 20 20 20 20 20 6c 61 70 70 65 6e  " }.      lappen
0850: 64 20 72 65 73 20 5b 6c 69 6e 64 65 78 20 5b 72  d res [lindex [r
0860: 62 75 20 62 70 5f 70 72 6f 67 72 65 73 73 5d 20  bu bp_progress] 
0870: 30 5d 0a 20 20 20 20 20 20 69 66 20 7b 5b 6c 69  0].      if {[li
0880: 6e 64 65 78 20 5b 73 65 74 20 72 65 73 5d 20 65  ndex [set res] e
0890: 6e 64 5d 3d 3d 31 30 30 30 30 7d 20 62 72 65 61  nd]==10000} brea
08a0: 6b 0a 20 20 20 20 20 20 69 66 20 7b 24 62 52 65  k.      if {$bRe
08b0: 6f 70 65 6e 7d 20 7b 20 72 62 75 20 63 6c 6f 73  open} { rbu clos
08c0: 65 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e }.    }.    if
08d0: 20 7b 5b 73 65 74 20 72 65 73 5d 20 21 3d 20 5b   {[set res] != [
08e0: 6c 69 73 74 20 24 72 65 73 6c 69 73 74 5d 7d 20  list $reslist]} 
08f0: 7b 0a 20 20 20 20 20 20 72 62 75 20 63 6c 6f 73  {.      rbu clos
0900: 65 0a 20 20 20 20 20 20 65 72 72 6f 72 20 22 31  e.      error "1
0910: 2e 20 72 65 73 6c 69 73 74 20 69 6e 63 6f 72 72  . reslist incorr
0920: 65 63 74 20 28 65 78 70 65 63 74 3d 24 72 65 73  ect (expect=$res
0930: 6c 69 73 74 20 67 6f 74 3d 5b 73 65 74 20 72 65  list got=[set re
0940: 73 5d 29 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20  s])".    }..    
0950: 23 20 4f 6e 65 20 73 74 65 70 20 74 6f 20 63 6c  # One step to cl
0960: 65 61 6e 20 75 70 20 74 68 65 20 74 65 6d 70 6f  ean up the tempo
0970: 72 61 72 79 20 74 61 62 6c 65 73 20 75 73 65 64  rary tables used
0980: 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 6f   to update the o
0990: 6e 6c 79 0a 20 20 20 20 23 20 74 61 72 67 65 74  nly.    # target
09a0: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 72 62   table in the rb
09b0: 75 20 64 61 74 61 62 61 73 65 2e 20 41 6e 64 20  u database. And 
09c0: 6f 6e 65 20 6d 6f 72 65 20 74 6f 20 6d 6f 76 65  one more to move
09d0: 20 74 68 65 20 2a 2d 6f 61 6c 20 0a 20 20 20 20   the *-oal .    
09e0: 23 20 66 69 6c 65 20 74 6f 20 2a 2d 77 61 6c 2e  # file to *-wal.
09f0: 20 41 66 74 65 72 20 65 61 63 68 20 6f 66 20 74   After each of t
0a00: 68 65 73 65 20 73 74 65 70 73 2c 20 74 68 65 20  hese steps, the 
0a10: 70 72 6f 67 72 65 73 73 20 72 65 6d 61 69 6e 73  progress remains
0a20: 0a 20 20 20 20 23 20 61 74 20 22 31 30 30 30 30  .    # at "10000
0a30: 20 30 22 2e 0a 20 20 20 20 23 0a 20 20 20 20 69   0"..    #.    i
0a40: 66 20 7b 5b 6c 69 6e 64 65 78 20 5b 6c 69 73 74  f {[lindex [list
0a50: 20 24 72 65 73 6c 69 73 74 5d 20 30 5d 21 3d 2d   $reslist] 0]!=-
0a60: 31 7d 20 7b 0a 20 20 20 20 20 20 72 62 75 20 73  1} {.      rbu s
0a70: 74 65 70 0a 20 20 20 20 20 20 73 65 74 20 72 65  tep.      set re
0a80: 73 20 5b 72 62 75 20 62 70 5f 70 72 6f 67 72 65  s [rbu bp_progre
0a90: 73 73 5d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73  ss].      if {[s
0aa0: 65 74 20 72 65 73 5d 20 21 3d 20 5b 6c 69 73 74  et res] != [list
0ab0: 20 31 30 30 30 30 20 30 5d 7d 20 7b 0a 20 20 20   10000 0]} {.   
0ac0: 20 20 20 20 20 72 62 75 20 63 6c 6f 73 65 0a 20       rbu close. 
0ad0: 20 20 20 20 20 20 20 65 72 72 6f 72 20 22 32 2e         error "2.
0ae0: 20 72 65 73 6c 69 73 74 20 69 6e 63 6f 72 72 65   reslist incorre
0af0: 63 74 20 28 65 78 70 65 63 74 3d 31 30 30 30 30  ct (expect=10000
0b00: 20 30 20 67 6f 74 3d 5b 73 65 74 20 72 65 73 5d   0 got=[set res]
0b10: 29 22 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  )".      }.    }
0b20: 0a 0a 20 20 20 20 72 62 75 20 73 74 65 70 0a 20  ..    rbu step. 
0b30: 20 20 20 73 65 74 20 72 65 73 20 5b 72 62 75 20     set res [rbu 
0b40: 62 70 5f 70 72 6f 67 72 65 73 73 5d 0a 20 20 20  bp_progress].   
0b50: 20 69 66 20 7b 5b 73 65 74 20 72 65 73 5d 20 21   if {[set res] !
0b60: 3d 20 5b 6c 69 73 74 20 31 30 30 30 30 20 30 5d  = [list 10000 0]
0b70: 7d 20 7b 0a 20 20 20 20 20 20 72 62 75 20 63 6c  } {.      rbu cl
0b80: 6f 73 65 0a 20 20 20 20 20 20 65 72 72 6f 72 20  ose.      error 
0b90: 22 33 2e 20 72 65 73 6c 69 73 74 20 69 6e 63 6f  "3. reslist inco
0ba0: 72 72 65 63 74 20 28 65 78 70 65 63 74 3d 31 30  rrect (expect=10
0bb0: 30 30 30 20 30 20 67 6f 74 3d 5b 73 65 74 20 72  000 0 got=[set r
0bc0: 65 73 5d 29 22 0a 20 20 20 20 7d 0a 0a 20 20 20  es])".    }..   
0bd0: 20 23 20 44 6f 20 74 68 65 20 63 68 65 63 6b 70   # Do the checkp
0be0: 6f 69 6e 74 2e 0a 20 20 20 20 77 68 69 6c 65 20  oint..    while 
0bf0: 7b 5b 72 62 75 20 73 74 65 70 5d 3d 3d 22 53 51  {[rbu step]=="SQ
0c00: 4c 49 54 45 5f 4f 4b 22 7d 20 7b 20 0a 20 20 20  LITE_OK"} { .   
0c10: 20 20 20 66 6f 72 65 61 63 68 20 7b 61 20 62 7d     foreach {a b}
0c20: 20 5b 72 62 75 20 62 70 5f 70 72 6f 67 72 65 73   [rbu bp_progres
0c30: 73 5d 20 7b 7d 0a 20 20 20 20 20 20 69 66 20 7b  s] {}.      if {
0c40: 5b 73 65 74 20 61 5d 21 3d 31 30 30 30 30 20 7c  [set a]!=10000 |
0c50: 7c 20 5b 73 65 74 20 62 5d 3c 3d 30 20 7c 7c 20  | [set b]<=0 || 
0c60: 5b 73 65 74 20 62 5d 3e 31 30 30 30 30 7d 20 7b  [set b]>10000} {
0c70: 0a 20 20 20 20 20 20 20 20 72 62 75 20 63 6c 6f  .        rbu clo
0c80: 73 65 0a 20 20 20 20 20 20 20 20 65 72 72 6f 72  se.        error
0c90: 20 22 34 2e 20 72 65 73 6c 69 73 74 20 69 6e 63   "4. reslist inc
0ca0: 6f 72 72 65 63 74 20 28 65 78 70 65 63 74 3d 31  orrect (expect=1
0cb0: 30 30 30 30 20 31 2e 2e 31 30 30 30 30 20 67 6f  0000 1..10000 go
0cc0: 74 3d 5b 73 65 74 20 61 5d 20 5b 73 65 74 20 62  t=[set a] [set b
0cd0: 5d 29 22 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ])".      }.    
0ce0: 7d 0a 0a 20 20 20 20 73 65 74 20 72 65 73 20 5b  }..    set res [
0cf0: 72 62 75 20 62 70 5f 70 72 6f 67 72 65 73 73 5d  rbu bp_progress]
0d00: 0a 20 20 20 20 69 66 20 7b 5b 73 65 74 20 72 65  .    if {[set re
0d10: 73 5d 20 21 3d 20 5b 6c 69 73 74 20 31 30 30 30  s] != [list 1000
0d20: 30 20 31 30 30 30 30 5d 7d 20 7b 0a 20 20 20 20  0 10000]} {.    
0d30: 20 20 72 62 75 20 63 6c 6f 73 65 0a 20 20 20 20    rbu close.    
0d40: 20 20 65 72 72 6f 72 20 22 35 2e 20 72 65 73 6c    error "5. resl
0d50: 69 73 74 20 69 73 20 69 6e 63 6f 72 72 65 63 74  ist is incorrect
0d60: 20 28 65 78 70 65 63 74 3d 31 30 30 30 30 20 31   (expect=10000 1
0d70: 30 30 30 30 20 67 6f 74 3d 5b 73 65 74 20 72 65  0000 got=[set re
0d80: 73 5d 29 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20  s])".    }..    
0d90: 72 62 75 20 63 6c 6f 73 65 0a 20 20 7d 5d 20 7b  rbu close.  }] {
0da0: 53 51 4c 49 54 45 5f 44 4f 4e 45 7d 5d 0a 7d 0a  SQLITE_DONE}].}.
0db0: 0a 66 6f 72 65 61 63 68 20 7b 62 52 65 6f 70 65  .foreach {bReope
0dc0: 6e 7d 20 7b 20 30 20 31 20 7d 20 7b 0a 20 20 72  n} { 0 1 } {.  r
0dd0: 65 73 65 74 5f 64 62 0a 20 20 64 6f 5f 74 65 73  eset_db.  do_tes
0de0: 74 20 32 2e 24 62 52 65 6f 70 65 6e 2e 31 2e 30  t 2.$bReopen.1.0
0df0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
0e00: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
0e10: 42 4c 45 20 74 31 28 61 20 49 4e 54 45 47 45 52  BLE t1(a INTEGER
0e20: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 2c   PRIMARY KEY, b,
0e30: 20 63 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63   c);.    }.    c
0e40: 72 65 61 74 65 5f 64 62 5f 66 69 6c 65 20 72 62  reate_db_file rb
0e50: 75 2e 64 62 20 7b 0a 20 20 20 20 20 20 43 52 45  u.db {.      CRE
0e60: 41 54 45 20 54 41 42 4c 45 20 64 61 74 61 5f 74  ATE TABLE data_t
0e70: 31 28 61 2c 20 62 2c 20 63 2c 20 72 62 75 5f 63  1(a, b, c, rbu_c
0e80: 6f 6e 74 72 6f 6c 29 3b 0a 20 20 20 20 20 20 49  ontrol);.      I
0e90: 4e 53 45 52 54 20 49 4e 54 4f 20 64 61 74 61 5f  NSERT INTO data_
0ea0: 74 31 20 56 41 4c 55 45 53 28 34 2c 20 34 2c 20  t1 VALUES(4, 4, 
0eb0: 34 2c 20 30 29 3b 0a 20 20 20 20 20 20 49 4e 53  4, 0);.      INS
0ec0: 45 52 54 20 49 4e 54 4f 20 64 61 74 61 5f 74 31  ERT INTO data_t1
0ed0: 20 56 41 4c 55 45 53 28 35 2c 20 35 2c 20 35 2c   VALUES(5, 5, 5,
0ee0: 20 30 29 3b 0a 20 20 0a 20 20 20 20 20 20 43 52   0);.  .      CR
0ef0: 45 41 54 45 20 54 41 42 4c 45 20 72 62 75 5f 63  EATE TABLE rbu_c
0f00: 6f 75 6e 74 28 74 62 6c 2c 20 63 6e 74 29 3b 0a  ount(tbl, cnt);.
0f10: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
0f20: 4f 20 72 62 75 5f 63 6f 75 6e 74 20 56 41 4c 55  O rbu_count VALU
0f30: 45 53 28 27 64 61 74 61 5f 74 31 27 2c 20 32 29  ES('data_t1', 2)
0f40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20  ;.    }.  } {}. 
0f50: 20 64 6f 5f 73 70 5f 74 65 73 74 20 32 2e 24 62   do_sp_test 2.$b
0f60: 52 65 6f 70 65 6e 2e 31 2e 31 20 24 62 52 65 6f  Reopen.1.1 $bReo
0f70: 70 65 6e 20 74 65 73 74 2e 64 62 20 72 62 75 2e  pen test.db rbu.
0f80: 64 62 20 7b 35 30 30 30 20 31 30 30 30 30 7d 0a  db {5000 10000}.
0f90: 20 20 0a 20 20 72 65 73 65 74 5f 64 62 0a 20 20    .  reset_db.  
0fa0: 64 6f 5f 74 65 73 74 20 32 2e 24 62 52 65 6f 70  do_test 2.$bReop
0fb0: 65 6e 2e 32 2e 30 20 7b 0a 20 20 20 20 65 78 65  en.2.0 {.    exe
0fc0: 63 73 71 6c 20 7b 20 43 52 45 41 54 45 20 54 41  csql { CREATE TA
0fd0: 42 4c 45 20 74 31 28 61 20 49 4e 54 45 47 45 52  BLE t1(a INTEGER
0fe0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 2c   PRIMARY KEY, b,
0ff0: 20 63 29 20 7d 0a 20 20 20 20 63 72 65 61 74 65   c) }.    create
1000: 5f 72 62 75 31 20 72 62 75 2e 64 62 0a 20 20 7d  _rbu1 rbu.db.  }
1010: 20 7b 72 62 75 2e 64 62 7d 0a 20 20 64 6f 5f 73   {rbu.db}.  do_s
1020: 70 5f 74 65 73 74 20 32 2e 24 62 52 65 6f 70 65  p_test 2.$bReope
1030: 6e 2e 32 2e 31 20 24 62 52 65 6f 70 65 6e 20 74  n.2.1 $bReopen t
1040: 65 73 74 2e 64 62 20 72 62 75 2e 64 62 20 7b 33  est.db rbu.db {3
1050: 33 33 33 20 36 36 36 36 20 31 30 30 30 30 7d 0a  333 6666 10000}.
1060: 20 20 0a 20 20 72 65 73 65 74 5f 64 62 0a 20 20    .  reset_db.  
1070: 64 6f 5f 74 65 73 74 20 32 2e 24 62 52 65 6f 70  do_test 2.$bReop
1080: 65 6e 2e 33 2e 30 20 7b 0a 20 20 20 20 65 78 65  en.3.0 {.    exe
1090: 63 73 71 6c 20 7b 20 0a 20 20 20 20 20 20 43 52  csql { .      CR
10a0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20  EATE TABLE t1(a 
10b0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
10c0: 4b 45 59 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20  KEY, b, c);.    
10d0: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
10e0: 31 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20 20  1 ON t1(b);.    
10f0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
1100: 20 56 41 4c 55 45 53 28 31 2c 20 31 2c 20 31 29   VALUES(1, 1, 1)
1110: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
1120: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32 2c  NTO t1 VALUES(2,
1130: 20 32 2c 20 32 29 3b 0a 20 20 20 20 20 20 49 4e   2, 2);.      IN
1140: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
1150: 55 45 53 28 33 2c 20 33 2c 20 33 29 3b 0a 20 20  UES(3, 3, 3);.  
1160: 20 20 7d 0a 20 20 20 20 63 72 65 61 74 65 5f 64    }.    create_d
1170: 62 5f 66 69 6c 65 20 72 62 75 2e 64 62 20 7b 0a  b_file rbu.db {.
1180: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
1190: 4c 45 20 64 61 74 61 5f 74 31 28 61 2c 20 62 2c  LE data_t1(a, b,
11a0: 20 63 2c 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 29   c, rbu_control)
11b0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
11c0: 4e 54 4f 20 64 61 74 61 5f 74 31 20 56 41 4c 55  NTO data_t1 VALU
11d0: 45 53 28 34 2c 20 34 2c 20 34 2c 20 30 29 3b 0a  ES(4, 4, 4, 0);.
11e0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
11f0: 4f 20 64 61 74 61 5f 74 31 20 56 41 4c 55 45 53  O data_t1 VALUES
1200: 28 32 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  (2, NULL, NULL, 
1210: 31 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  1);.      INSERT
1220: 20 49 4e 54 4f 20 64 61 74 61 5f 74 31 20 56 41   INTO data_t1 VA
1230: 4c 55 45 53 28 35 2c 20 4e 55 4c 4c 2c 20 4e 55  LUES(5, NULL, NU
1240: 4c 4c 2c 20 31 29 3b 0a 20 20 0a 20 20 20 20 20  LL, 1);.  .     
1250: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 72 62   CREATE TABLE rb
1260: 75 5f 63 6f 75 6e 74 28 74 62 6c 2c 20 63 6e 74  u_count(tbl, cnt
1270: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
1280: 49 4e 54 4f 20 72 62 75 5f 63 6f 75 6e 74 20 56  INTO rbu_count V
1290: 41 4c 55 45 53 28 27 64 61 74 61 5f 74 31 27 2c  ALUES('data_t1',
12a0: 20 33 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b   3);.    }.  } {
12b0: 7d 0a 20 20 64 6f 5f 73 70 5f 74 65 73 74 20 32  }.  do_sp_test 2
12c0: 2e 24 62 52 65 6f 70 65 6e 2e 33 2e 31 20 24 62  .$bReopen.3.1 $b
12d0: 52 65 6f 70 65 6e 20 74 65 73 74 2e 64 62 20 72  Reopen test.db r
12e0: 62 75 2e 64 62 20 7b 31 36 36 36 20 33 33 33 33  bu.db {1666 3333
12f0: 20 36 30 30 30 20 38 30 30 30 20 31 30 30 30 30   6000 8000 10000
1300: 7d 0a 20 20 0a 20 20 72 65 73 65 74 5f 64 62 0a  }.  .  reset_db.
1310: 20 20 64 6f 5f 74 65 73 74 20 32 2e 24 62 52 65    do_test 2.$bRe
1320: 6f 70 65 6e 2e 34 2e 30 20 7b 0a 20 20 20 20 65  open.4.0 {.    e
1330: 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20 20  xecsql { .      
1340: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
1350: 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  a INTEGER PRIMAR
1360: 59 20 4b 45 59 2c 20 62 2c 20 63 29 3b 0a 20 20  Y KEY, b, c);.  
1370: 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58      CREATE INDEX
1380: 20 69 31 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20   i1 ON t1(b);.  
1390: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
13a0: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 31 2c 20  t1 VALUES(1, 1, 
13b0: 31 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  1);.      INSERT
13c0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
13d0: 32 2c 20 32 2c 20 32 29 3b 0a 20 20 20 20 20 20  2, 2, 2);.      
13e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
13f0: 41 4c 55 45 53 28 33 2c 20 33 2c 20 33 29 3b 0a  ALUES(3, 3, 3);.
1400: 20 20 20 20 7d 0a 20 20 20 20 63 72 65 61 74 65      }.    create
1410: 5f 64 62 5f 66 69 6c 65 20 72 62 75 2e 64 62 20  _db_file rbu.db 
1420: 7b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54  {.      CREATE T
1430: 41 42 4c 45 20 64 61 74 61 5f 74 31 28 61 2c 20  ABLE data_t1(a, 
1440: 62 2c 20 63 2c 20 72 62 75 5f 63 6f 6e 74 72 6f  b, c, rbu_contro
1450: 6c 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  l);.      INSERT
1460: 20 49 4e 54 4f 20 64 61 74 61 5f 74 31 20 56 41   INTO data_t1 VA
1470: 4c 55 45 53 28 32 2c 20 34 2c 20 34 2c 20 27 2e  LUES(2, 4, 4, '.
1480: 78 78 27 29 3b 0a 20 20 0a 20 20 20 20 20 20 43  xx');.  .      C
1490: 52 45 41 54 45 20 54 41 42 4c 45 20 72 62 75 5f  REATE TABLE rbu_
14a0: 63 6f 75 6e 74 28 74 62 6c 2c 20 63 6e 74 29 3b  count(tbl, cnt);
14b0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
14c0: 54 4f 20 72 62 75 5f 63 6f 75 6e 74 20 56 41 4c  TO rbu_count VAL
14d0: 55 45 53 28 27 64 61 74 61 5f 74 31 27 2c 20 31  UES('data_t1', 1
14e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a  );.    }.  } {}.
14f0: 20 20 64 6f 5f 73 70 5f 74 65 73 74 20 32 2e 24    do_sp_test 2.$
1500: 62 52 65 6f 70 65 6e 2e 34 2e 31 20 24 62 52 65  bReopen.4.1 $bRe
1510: 6f 70 65 6e 20 74 65 73 74 2e 64 62 20 72 62 75  open test.db rbu
1520: 2e 64 62 20 7b 33 33 33 33 20 36 36 36 36 20 31  .db {3333 6666 1
1530: 30 30 30 30 7d 0a 20 20 0a 20 20 72 65 73 65 74  0000}.  .  reset
1540: 5f 64 62 0a 20 20 64 6f 5f 74 65 73 74 20 32 2e  _db.  do_test 2.
1550: 24 62 52 65 6f 70 65 6e 2e 35 2e 30 20 7b 0a 20  $bReopen.5.0 {. 
1560: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20     execsql { .  
1570: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
1580: 20 74 31 28 61 20 49 4e 54 45 47 45 52 20 50 52   t1(a INTEGER PR
1590: 49 4d 41 52 59 20 4b 45 59 2c 20 62 2c 20 63 29  IMARY KEY, b, c)
15a0: 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 49  ;.      CREATE I
15b0: 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 62 29  NDEX i1 ON t1(b)
15c0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
15d0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c  NTO t1 VALUES(1,
15e0: 20 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 49 4e   1, 1);.      IN
15f0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
1600: 55 45 53 28 32 2c 20 32 2c 20 32 29 3b 0a 20 20  UES(2, 2, 2);.  
1610: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1620: 74 31 20 56 41 4c 55 45 53 28 33 2c 20 33 2c 20  t1 VALUES(3, 3, 
1630: 33 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 72  3);.    }.    cr
1640: 65 61 74 65 5f 64 62 5f 66 69 6c 65 20 72 62 75  eate_db_file rbu
1650: 2e 64 62 20 7b 0a 20 20 20 20 20 20 43 52 45 41  .db {.      CREA
1660: 54 45 20 54 41 42 4c 45 20 64 61 74 61 5f 74 31  TE TABLE data_t1
1670: 28 61 2c 20 62 2c 20 63 2c 20 72 62 75 5f 63 6f  (a, b, c, rbu_co
1680: 6e 74 72 6f 6c 29 3b 0a 20 20 20 20 20 20 49 4e  ntrol);.      IN
1690: 53 45 52 54 20 49 4e 54 4f 20 64 61 74 61 5f 74  SERT INTO data_t
16a0: 31 20 56 41 4c 55 45 53 28 34 2c 20 4e 55 4c 4c  1 VALUES(4, NULL
16b0: 2c 20 34 2c 20 27 2e 78 78 27 29 3b 0a 20 20 0a  , 4, '.xx');.  .
16c0: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
16d0: 4c 45 20 72 62 75 5f 63 6f 75 6e 74 28 74 62 6c  LE rbu_count(tbl
16e0: 2c 20 63 6e 74 29 3b 0a 20 20 20 20 20 20 49 4e  , cnt);.      IN
16f0: 53 45 52 54 20 49 4e 54 4f 20 72 62 75 5f 63 6f  SERT INTO rbu_co
1700: 75 6e 74 20 56 41 4c 55 45 53 28 27 64 61 74 61  unt VALUES('data
1710: 5f 74 31 27 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  _t1', 1);.    }.
1720: 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 73 70 5f 74    } {}.  do_sp_t
1730: 65 73 74 20 32 2e 24 62 52 65 6f 70 65 6e 2e 35  est 2.$bReopen.5
1740: 2e 31 20 24 62 52 65 6f 70 65 6e 20 74 65 73 74  .1 $bReopen test
1750: 2e 64 62 20 72 62 75 2e 64 62 20 7b 31 30 30 30  .db rbu.db {1000
1760: 30 7d 0a 0a 20 20 72 65 73 65 74 5f 64 62 0a 20  0}..  reset_db. 
1770: 20 64 6f 5f 74 65 73 74 20 32 2e 24 62 52 65 6f   do_test 2.$bReo
1780: 70 65 6e 2e 36 2e 30 20 7b 0a 20 20 20 20 65 78  pen.6.0 {.    ex
1790: 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20 20 43  ecsql { .      C
17a0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
17b0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
17c0: 20 4b 45 59 2c 20 62 2c 20 63 29 3b 0a 20 20 20   KEY, b, c);.   
17d0: 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
17e0: 69 31 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20  i1 ON t1(b);.   
17f0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1800: 31 20 56 41 4c 55 45 53 28 31 2c 20 31 2c 20 31  1 VALUES(1, 1, 1
1810: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
1820: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32  INTO t1 VALUES(2
1830: 2c 20 32 2c 20 32 29 3b 0a 20 20 20 20 20 20 49  , 2, 2);.      I
1840: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
1850: 4c 55 45 53 28 33 2c 20 33 2c 20 33 29 3b 0a 20  LUES(3, 3, 3);. 
1860: 20 20 20 7d 0a 20 20 20 20 63 72 65 61 74 65 5f     }.    create_
1870: 64 62 5f 66 69 6c 65 20 72 62 75 2e 64 62 20 7b  db_file rbu.db {
1880: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
1890: 42 4c 45 20 64 61 74 61 5f 74 31 28 61 2c 20 62  BLE data_t1(a, b
18a0: 2c 20 63 2c 20 72 62 75 5f 63 6f 6e 74 72 6f 6c  , c, rbu_control
18b0: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
18c0: 49 4e 54 4f 20 64 61 74 61 5f 74 31 20 56 41 4c  INTO data_t1 VAL
18d0: 55 45 53 28 34 2c 20 34 2c 20 34 2c 20 30 29 3b  UES(4, 4, 4, 0);
18e0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
18f0: 54 4f 20 64 61 74 61 5f 74 31 20 56 41 4c 55 45  TO data_t1 VALUE
1900: 53 28 32 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  S(2, NULL, NULL,
1910: 20 31 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   1);.      INSER
1920: 54 20 49 4e 54 4f 20 64 61 74 61 5f 74 31 20 56  T INTO data_t1 V
1930: 41 4c 55 45 53 28 35 2c 20 4e 55 4c 4c 2c 20 4e  ALUES(5, NULL, N
1940: 55 4c 4c 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  ULL, 1);.    }. 
1950: 20 7d 20 7b 7d 0a 20 20 64 6f 5f 73 70 5f 74 65   } {}.  do_sp_te
1960: 73 74 20 32 2e 24 62 52 65 6f 70 65 6e 2e 36 2e  st 2.$bReopen.6.
1970: 31 20 24 62 52 65 6f 70 65 6e 20 74 65 73 74 2e  1 $bReopen test.
1980: 64 62 20 72 62 75 2e 64 62 20 7b 2d 31 20 2d 31  db rbu.db {-1 -1
1990: 20 2d 31 20 2d 31 20 2d 31 20 31 30 30 30 30 7d   -1 -1 -1 10000}
19a0: 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
19b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
19f0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
1a00: 65 73 74 73 20 76 65 72 69 66 79 20 74 68 61 74  ests verify that
1a10: 20 74 68 65 20 41 50 49 20 77 6f 72 6b 73 20 77   the API works w
1a20: 68 65 6e 20 72 65 73 75 6d 69 6e 67 20 61 6e 20  hen resuming an 
1a30: 75 70 64 61 74 65 0a 23 20 64 75 72 69 6e 67 20  update.# during 
1a40: 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  the incremental 
1a50: 63 68 65 63 6b 70 6f 69 6e 74 20 73 74 61 67 65  checkpoint stage
1a60: 2e 0a 23 0a 70 72 6f 63 20 64 6f 5f 70 68 61 73  ..#.proc do_phas
1a70: 65 32 5f 74 65 73 74 20 7b 74 6e 20 62 52 65 6f  e2_test {tn bReo
1a80: 70 65 6e 20 74 61 72 67 65 74 20 72 62 75 20 6e  pen target rbu n
1a90: 53 74 65 70 7d 20 7b 0a 20 20 75 70 6c 65 76 65  Step} {.  upleve
1aa0: 6c 20 5b 6c 69 73 74 20 64 6f 5f 74 65 73 74 20  l [list do_test 
1ab0: 24 74 6e 20 5b 73 75 62 73 74 20 2d 6e 6f 63 6f  $tn [subst -noco
1ac0: 6d 6d 61 6e 64 73 20 7b 0a 0a 20 20 20 20 23 20  mmands {..    # 
1ad0: 42 75 69 6c 64 20 74 68 65 20 4f 41 4c 2f 57 41  Build the OAL/WA
1ae0: 4c 20 66 69 6c 65 3a 0a 20 20 20 20 73 71 6c 69  L file:.    sqli
1af0: 74 65 33 72 62 75 20 72 62 75 20 24 74 61 72 67  te3rbu rbu $targ
1b00: 65 74 20 24 72 62 75 0a 20 20 20 20 77 68 69 6c  et $rbu.    whil
1b10: 65 20 7b 5b 6c 69 6e 64 65 78 20 5b 72 62 75 20  e {[lindex [rbu 
1b20: 62 70 5f 70 72 6f 67 72 65 73 73 5d 20 30 5d 3c  bp_progress] 0]<
1b30: 31 30 30 30 30 7d 20 7b 20 0a 20 20 20 20 20 20  10000} { .      
1b40: 73 65 74 20 72 63 20 5b 72 62 75 20 73 74 65 70  set rc [rbu step
1b50: 5d 0a 20 20 20 20 20 20 69 66 20 7b 22 53 51 4c  ].      if {"SQL
1b60: 49 54 45 5f 4f 4b 22 20 21 3d 20 5b 73 65 74 20  ITE_OK" != [set 
1b70: 72 63 5d 7d 20 7b 20 72 62 75 20 63 6c 6f 73 65  rc]} { rbu close
1b80: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20   }.    }..    # 
1b90: 43 6c 65 61 6e 20 75 70 20 74 68 65 20 74 65 6d  Clean up the tem
1ba0: 70 20 74 61 62 6c 65 73 20 61 6e 64 20 6d 6f 76  p tables and mov
1bb0: 65 20 74 68 65 20 2a 2d 6f 61 6c 20 66 69 6c 65  e the *-oal file
1bc0: 20 74 6f 20 2a 2d 77 61 6c 2e 0a 20 20 20 20 72   to *-wal..    r
1bd0: 62 75 20 73 74 65 70 0a 20 20 20 20 72 62 75 20  bu step.    rbu 
1be0: 73 74 65 70 0a 0a 20 20 20 20 66 6f 72 20 7b 73  step..    for {s
1bf0: 65 74 20 69 20 30 7d 20 7b 5b 73 65 74 20 69 5d  et i 0} {[set i]
1c00: 20 3c 20 24 6e 53 74 65 70 7d 20 7b 69 6e 63 72   < $nStep} {incr
1c10: 20 69 7d 20 7b 0a 20 20 20 20 20 20 69 66 20 7b   i} {.      if {
1c20: 24 62 52 65 6f 70 65 6e 7d 20 7b 0a 20 20 20 20  $bReopen} {.    
1c30: 20 20 20 20 72 62 75 20 63 6c 6f 73 65 0a 20 20      rbu close.  
1c40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 72 62 75        sqlite3rbu
1c50: 20 72 62 75 20 24 74 61 72 67 65 74 20 24 72 62   rbu $target $rb
1c60: 75 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  u.      }.      
1c70: 72 62 75 20 73 74 65 70 0a 20 20 20 20 20 20 73  rbu step.      s
1c80: 65 74 20 72 65 73 20 5b 72 62 75 20 62 70 5f 70  et res [rbu bp_p
1c90: 72 6f 67 72 65 73 73 5d 0a 20 20 20 20 20 20 73  rogress].      s
1ca0: 65 74 20 65 78 70 65 63 74 20 5b 65 78 70 72 20  et expect [expr 
1cb0: 28 31 20 2b 20 5b 73 65 74 20 69 5d 29 20 2a 20  (1 + [set i]) * 
1cc0: 31 30 30 30 30 20 2f 20 24 6e 53 74 65 70 5d 0a  10000 / $nStep].
1cd0: 20 20 20 20 20 20 69 66 20 7b 5b 6c 69 6e 64 65        if {[linde
1ce0: 78 20 5b 73 65 74 20 72 65 73 5d 20 31 5d 20 21  x [set res] 1] !
1cf0: 3d 20 5b 73 65 74 20 65 78 70 65 63 74 5d 7d 20  = [set expect]} 
1d00: 7b 0a 20 20 20 20 20 20 20 20 65 72 72 6f 72 20  {.        error 
1d10: 22 48 61 76 65 20 5b 73 65 74 20 72 65 73 5d 2c  "Have [set res],
1d20: 20 65 78 70 65 63 74 65 64 20 31 30 30 30 30 20   expected 10000 
1d30: 5b 73 65 74 20 65 78 70 65 63 74 5d 22 0a 20 20  [set expect]".  
1d40: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1d50: 20 73 65 74 20 72 63 20 5b 72 62 75 20 73 74 65   set rc [rbu ste
1d60: 70 5d 0a 20 20 20 20 69 66 20 7b 5b 73 65 74 20  p].    if {[set 
1d70: 72 63 5d 20 21 3d 20 22 53 51 4c 49 54 45 5f 44  rc] != "SQLITE_D
1d80: 4f 4e 45 22 7d 20 7b 0a 20 20 20 20 20 20 65 72  ONE"} {.      er
1d90: 72 6f 72 20 22 48 61 76 65 20 5b 73 65 74 20 72  ror "Have [set r
1da0: 63 5d 2c 20 65 78 70 65 63 74 65 64 20 53 51 4c  c], expected SQL
1db0: 49 54 45 5f 44 4f 4e 45 22 20 0a 20 20 20 20 7d  ITE_DONE" .    }
1dc0: 0a 0a 20 20 20 20 72 62 75 20 63 6c 6f 73 65 0a  ..    rbu close.
1dd0: 20 20 7d 5d 20 7b 53 51 4c 49 54 45 5f 44 4f 4e    }] {SQLITE_DON
1de0: 45 7d 5d 0a 7d 0a 0a 66 6f 72 65 61 63 68 20 62  E}].}..foreach b
1df0: 52 65 6f 70 65 6e 20 7b 30 20 31 7d 20 7b 0a 20  Reopen {0 1} {. 
1e00: 20 64 6f 5f 74 65 73 74 20 33 2e 24 62 52 65 6f   do_test 3.$bReo
1e10: 70 65 6e 2e 31 2e 30 20 7b 0a 20 20 20 20 72 65  pen.1.0 {.    re
1e20: 73 65 74 5f 64 62 0a 20 20 20 20 65 78 65 63 73  set_db.    execs
1e30: 71 6c 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54  ql {.      CREAT
1e40: 45 20 54 41 42 4c 45 20 74 31 28 61 20 49 4e 54  E TABLE t1(a INT
1e50: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
1e60: 2c 20 62 29 3b 0a 20 20 20 20 20 20 43 52 45 41  , b);.      CREA
1e70: 54 45 20 54 41 42 4c 45 20 74 32 28 61 20 49 4e  TE TABLE t2(a IN
1e80: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
1e90: 59 2c 20 62 29 3b 0a 20 20 20 20 20 20 43 52 45  Y, b);.      CRE
1ea0: 41 54 45 20 54 41 42 4c 45 20 74 33 28 61 20 49  ATE TABLE t3(a I
1eb0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
1ec0: 45 59 2c 20 62 29 3b 0a 20 20 20 20 20 20 43 52  EY, b);.      CR
1ed0: 45 41 54 45 20 54 41 42 4c 45 20 74 34 28 61 20  EATE TABLE t4(a 
1ee0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
1ef0: 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20 7d 0a 20  KEY, b);.    }. 
1f00: 20 20 20 63 72 65 61 74 65 5f 64 62 5f 66 69 6c     create_db_fil
1f10: 65 20 72 62 75 2e 64 62 20 7b 0a 20 20 20 20 20  e rbu.db {.     
1f20: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 64 61   CREATE TABLE da
1f30: 74 61 5f 74 31 28 61 2c 20 62 2c 20 72 62 75 5f  ta_t1(a, b, rbu_
1f40: 63 6f 6e 74 72 6f 6c 29 3b 0a 20 20 20 20 20 20  control);.      
1f50: 43 52 45 41 54 45 20 54 41 42 4c 45 20 64 61 74  CREATE TABLE dat
1f60: 61 5f 74 32 28 61 2c 20 62 2c 20 72 62 75 5f 63  a_t2(a, b, rbu_c
1f70: 6f 6e 74 72 6f 6c 29 3b 0a 20 20 20 20 20 20 43  ontrol);.      C
1f80: 52 45 41 54 45 20 54 41 42 4c 45 20 64 61 74 61  REATE TABLE data
1f90: 5f 74 33 28 61 2c 20 62 2c 20 72 62 75 5f 63 6f  _t3(a, b, rbu_co
1fa0: 6e 74 72 6f 6c 29 3b 0a 20 20 20 20 20 20 43 52  ntrol);.      CR
1fb0: 45 41 54 45 20 54 41 42 4c 45 20 64 61 74 61 5f  EATE TABLE data_
1fc0: 74 34 28 61 2c 20 62 2c 20 72 62 75 5f 63 6f 6e  t4(a, b, rbu_con
1fd0: 74 72 6f 6c 29 3b 0a 20 20 20 20 20 20 49 4e 53  trol);.      INS
1fe0: 45 52 54 20 49 4e 54 4f 20 64 61 74 61 5f 74 31  ERT INTO data_t1
1ff0: 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 30 29   VALUES(1, 2, 0)
2000: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
2010: 4e 54 4f 20 64 61 74 61 5f 74 32 20 56 41 4c 55  NTO data_t2 VALU
2020: 45 53 28 31 2c 20 32 2c 20 30 29 3b 0a 20 20 20  ES(1, 2, 0);.   
2030: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64     INSERT INTO d
2040: 61 74 61 5f 74 33 20 56 41 4c 55 45 53 28 31 2c  ata_t3 VALUES(1,
2050: 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 49 4e   2, 0);.      IN
2060: 53 45 52 54 20 49 4e 54 4f 20 64 61 74 61 5f 74  SERT INTO data_t
2070: 34 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 30  4 VALUES(1, 2, 0
2080: 29 3b 0a 20 20 0a 20 20 20 20 20 20 43 52 45 41  );.  .      CREA
2090: 54 45 20 54 41 42 4c 45 20 72 62 75 5f 63 6f 75  TE TABLE rbu_cou
20a0: 6e 74 28 74 62 6c 2c 20 63 6e 74 29 3b 0a 20 20  nt(tbl, cnt);.  
20b0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
20c0: 72 62 75 5f 63 6f 75 6e 74 20 56 41 4c 55 45 53  rbu_count VALUES
20d0: 28 27 64 61 74 61 5f 74 31 27 2c 20 31 29 3b 0a  ('data_t1', 1);.
20e0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
20f0: 4f 20 72 62 75 5f 63 6f 75 6e 74 20 56 41 4c 55  O rbu_count VALU
2100: 45 53 28 27 64 61 74 61 5f 74 32 27 2c 20 31 29  ES('data_t2', 1)
2110: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
2120: 4e 54 4f 20 72 62 75 5f 63 6f 75 6e 74 20 56 41  NTO rbu_count VA
2130: 4c 55 45 53 28 27 64 61 74 61 5f 74 33 27 2c 20  LUES('data_t3', 
2140: 31 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  1);.      INSERT
2150: 20 49 4e 54 4f 20 72 62 75 5f 63 6f 75 6e 74 20   INTO rbu_count 
2160: 56 41 4c 55 45 53 28 27 64 61 74 61 5f 74 34 27  VALUES('data_t4'
2170: 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  , 1);.    }.  } 
2180: 7b 7d 0a 20 20 64 6f 5f 70 68 61 73 65 32 5f 74  {}.  do_phase2_t
2190: 65 73 74 20 33 2e 24 62 52 65 6f 70 65 6e 2e 31  est 3.$bReopen.1
21a0: 2e 31 20 24 62 52 65 6f 70 65 6e 20 74 65 73 74  .1 $bReopen test
21b0: 2e 64 62 20 72 62 75 2e 64 62 20 35 0a 7d 0a 0a  .db rbu.db 5.}..
21c0: 0a 66 6f 72 65 61 63 68 20 7b 62 52 65 6f 70 65  .foreach {bReope
21d0: 6e 7d 20 7b 20 30 20 31 20 7d 20 7b 0a 20 20 66  n} { 0 1 } {.  f
21e0: 6f 72 65 61 63 68 20 7b 74 6e 20 74 62 6c 7d 20  oreach {tn tbl} 
21f0: 7b 0a 20 20 20 20 69 70 6b 20 7b 20 43 52 45 41  {.    ipk { CREA
2200: 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 49 4e  TE TABLE t1(a IN
2210: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
2220: 59 2c 20 62 2c 20 63 29 20 7d 0a 20 20 20 20 77  Y, b, c) }.    w
2230: 72 20 20 7b 20 43 52 45 41 54 45 20 54 41 42 4c  r  { CREATE TABL
2240: 45 20 74 31 28 61 20 49 4e 54 20 50 52 49 4d 41  E t1(a INT PRIMA
2250: 52 59 20 4b 45 59 2c 20 62 2c 20 63 29 20 57 49  RY KEY, b, c) WI
2260: 54 48 4f 55 54 20 52 4f 57 49 44 20 7d 0a 20 20  THOUT ROWID }.  
2270: 20 20 70 6b 20 20 7b 20 43 52 45 41 54 45 20 54    pk  { CREATE T
2280: 41 42 4c 45 20 74 31 28 61 20 49 4e 54 20 50 52  ABLE t1(a INT PR
2290: 49 4d 41 52 59 20 4b 45 59 2c 20 62 2c 20 63 29  IMARY KEY, b, c)
22a0: 20 7d 0a 20 20 7d 20 7b 0a 0a 20 20 20 20 66 6f   }.  } {..    fo
22b0: 72 65 61 63 68 20 7b 74 6e 32 20 72 62 75 73 71  reach {tn2 rbusq
22c0: 6c 20 72 31 20 72 33 7d 20 7b 0a 20 20 20 20 20  l r1 r3} {.     
22d0: 20 31 20 7b 0a 20 20 20 20 20 20 20 20 43 52 45   1 {.        CRE
22e0: 41 54 45 20 54 41 42 4c 45 20 64 61 74 61 30 5f  ATE TABLE data0_
22f0: 74 31 28 61 2c 20 62 2c 20 63 2c 20 72 62 75 5f  t1(a, b, c, rbu_
2300: 63 6f 6e 74 72 6f 6c 29 3b 0a 20 20 20 20 20 20  control);.      
2310: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 61    INSERT INTO da
2320: 74 61 30 5f 74 31 20 56 41 4c 55 45 53 28 31 35  ta0_t1 VALUES(15
2330: 2c 20 31 35 2c 20 31 35 2c 20 30 29 3b 0a 20 20  , 15, 15, 0);.  
2340: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
2350: 4f 20 64 61 74 61 30 5f 74 31 20 56 41 4c 55 45  O data0_t1 VALUE
2360: 53 28 32 30 2c 20 32 30 2c 20 32 30 2c 20 30 29  S(20, 20, 20, 0)
2370: 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41 54 45  ;.        CREATE
2380: 20 54 41 42 4c 45 20 72 62 75 5f 63 6f 75 6e 74   TABLE rbu_count
2390: 28 74 62 6c 2c 20 63 6e 74 29 3b 0a 20 20 20 20  (tbl, cnt);.    
23a0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
23b0: 72 62 75 5f 63 6f 75 6e 74 20 56 41 4c 55 45 53  rbu_count VALUES
23c0: 28 27 64 61 74 61 30 5f 74 31 27 2c 20 32 29 3b  ('data0_t1', 2);
23d0: 20 0a 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20   .      } .     
23e0: 20 7b 32 35 30 30 20 35 30 30 30 20 37 35 30 30   {2500 5000 7500
23f0: 20 31 30 30 30 30 7d 0a 20 20 20 20 20 20 7b 31   10000}.      {1
2400: 36 36 36 20 33 33 33 33 20 35 30 30 30 20 36 36  666 3333 5000 66
2410: 36 36 20 38 33 33 33 20 31 30 30 30 30 7d 0a 0a  66 8333 10000}..
2420: 20 20 20 20 20 20 32 20 7b 0a 20 20 20 20 20 20        2 {.      
2430: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 64    CREATE TABLE d
2440: 61 74 61 30 5f 74 31 28 61 2c 20 62 2c 20 63 2c  ata0_t1(a, b, c,
2450: 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 29 3b 0a 20   rbu_control);. 
2460: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
2470: 54 4f 20 64 61 74 61 30 5f 74 31 20 56 41 4c 55  TO data0_t1 VALU
2480: 45 53 28 31 30 2c 20 31 30 2c 20 31 30 2c 20 32  ES(10, 10, 10, 2
2490: 29 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41 54  );.        CREAT
24a0: 45 20 54 41 42 4c 45 20 72 62 75 5f 63 6f 75 6e  E TABLE rbu_coun
24b0: 74 28 74 62 6c 2c 20 63 6e 74 29 3b 0a 20 20 20  t(tbl, cnt);.   
24c0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
24d0: 20 72 62 75 5f 63 6f 75 6e 74 20 56 41 4c 55 45   rbu_count VALUE
24e0: 53 28 27 64 61 74 61 30 5f 74 31 27 2c 20 31 29  S('data0_t1', 1)
24f0: 3b 20 0a 20 20 20 20 20 20 7d 20 0a 20 20 20 20  ; .      } .    
2500: 20 20 7b 33 33 33 33 20 36 36 36 36 20 31 30 30    {3333 6666 100
2510: 30 30 7d 0a 20 20 20 20 20 20 7b 32 30 30 30 20  00}.      {2000 
2520: 34 30 30 30 20 36 30 30 30 20 38 30 30 30 20 31  4000 6000 8000 1
2530: 30 30 30 30 7d 0a 0a 20 20 20 20 20 20 33 20 7b  0000}..      3 {
2540: 0a 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20  .        CREATE 
2550: 54 41 42 4c 45 20 64 61 74 61 30 5f 74 31 28 61  TABLE data0_t1(a
2560: 2c 20 62 2c 20 63 2c 20 72 62 75 5f 63 6f 6e 74  , b, c, rbu_cont
2570: 72 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 49 4e  rol);.        IN
2580: 53 45 52 54 20 49 4e 54 4f 20 64 61 74 61 30 5f  SERT INTO data0_
2590: 74 31 20 56 41 4c 55 45 53 28 37 2c 20 37 2c 20  t1 VALUES(7, 7, 
25a0: 37 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 49  7, 2);.        I
25b0: 4e 53 45 52 54 20 49 4e 54 4f 20 64 61 74 61 30  NSERT INTO data0
25c0: 5f 74 31 20 56 41 4c 55 45 53 28 31 30 2c 20 31  _t1 VALUES(10, 1
25d0: 30 2c 20 31 30 2c 20 32 29 3b 0a 20 20 20 20 20  0, 10, 2);.     
25e0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
25f0: 72 62 75 5f 63 6f 75 6e 74 28 74 62 6c 2c 20 63  rbu_count(tbl, c
2600: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53  nt);.        INS
2610: 45 52 54 20 49 4e 54 4f 20 72 62 75 5f 63 6f 75  ERT INTO rbu_cou
2620: 6e 74 20 56 41 4c 55 45 53 28 27 64 61 74 61 30  nt VALUES('data0
2630: 5f 74 31 27 2c 20 32 29 3b 20 0a 20 20 20 20 20  _t1', 2); .     
2640: 20 7d 20 0a 20 20 20 20 20 20 7b 32 35 30 30 20   } .      {2500 
2650: 34 30 30 30 20 36 30 30 30 20 38 30 30 30 20 31  4000 6000 8000 1
2660: 30 30 30 30 7d 0a 20 20 20 20 20 20 7b 31 36 36  0000}.      {166
2670: 36 20 32 35 30 30 20 33 37 35 30 20 35 30 30 30  6 2500 3750 5000
2680: 20 36 32 35 30 20 37 35 30 30 20 38 37 35 30 20   6250 7500 8750 
2690: 31 30 30 30 30 7d 0a 0a 20 20 20 20 7d 20 7b 0a  10000}..    } {.
26a0: 0a 20 20 20 20 20 20 72 65 73 65 74 5f 64 62 20  .      reset_db 
26b0: 3b 20 65 78 65 63 73 71 6c 20 24 74 62 6c 0a 20  ; execsql $tbl. 
26c0: 20 20 20 20 20 64 6f 5f 74 65 73 74 20 34 2e 24       do_test 4.$
26d0: 74 6e 2e 24 62 52 65 6f 70 65 6e 2e 24 74 6e 32  tn.$bReopen.$tn2
26e0: 2e 30 20 7b 0a 20 20 20 20 20 20 20 20 65 78 65  .0 {.        exe
26f0: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 20 20 20  csql {.         
2700: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 31   CREATE INDEX t1
2710: 63 20 4f 4e 20 74 31 28 63 29 3b 0a 20 20 20 20  c ON t1(c);.    
2720: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
2730: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 31  O t1 VALUES(1, 1
2740: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
2750: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
2760: 41 4c 55 45 53 28 35 2c 20 35 2c 20 35 29 3b 0a  ALUES(5, 5, 5);.
2770: 20 20 20 20 20 20 20 20 20 20 49 4e 53 45 52 54            INSERT
2780: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
2790: 31 30 2c 20 31 30 2c 20 31 30 29 3b 0a 20 20 20  10, 10, 10);.   
27a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
27b0: 72 65 61 74 65 5f 64 62 5f 66 69 6c 65 20 72 62  reate_db_file rb
27c0: 75 2e 64 62 20 24 72 62 75 73 71 6c 0a 20 20 20  u.db $rbusql.   
27d0: 20 20 20 7d 20 7b 7d 0a 0a 20 20 20 20 20 20 73     } {}..      s
27e0: 65 74 20 52 28 69 70 6b 29 20 24 72 31 0a 20 20  et R(ipk) $r1.  
27f0: 20 20 20 20 73 65 74 20 52 28 77 72 29 20 24 72      set R(wr) $r
2800: 31 0a 20 20 20 20 20 20 73 65 74 20 52 28 70 6b  1.      set R(pk
2810: 29 20 24 72 33 0a 20 20 20 20 20 20 64 6f 5f 73  ) $r3.      do_s
2820: 70 5f 74 65 73 74 20 34 2e 24 74 6e 2e 24 62 52  p_test 4.$tn.$bR
2830: 65 6f 70 65 6e 2e 24 74 6e 32 2e 31 20 24 62 52  eopen.$tn2.1 $bR
2840: 65 6f 70 65 6e 20 74 65 73 74 2e 64 62 20 72 62  eopen test.db rb
2850: 75 2e 64 62 20 24 52 28 24 74 6e 29 0a 20 20 20  u.db $R($tn).   
2860: 20 7d 0a 20 20 7d 0a 7d 0a 0a 66 6f 72 65 61 63   }.  }.}..foreac
2870: 68 20 7b 62 52 65 6f 70 65 6e 7d 20 7b 20 30 20  h {bReopen} { 0 
2880: 31 20 7d 20 7b 0a 20 20 66 6f 72 65 61 63 68 20  1 } {.  foreach 
2890: 7b 74 6e 20 74 62 6c 7d 20 7b 0a 20 20 20 20 6e  {tn tbl} {.    n
28a0: 6f 70 6b 20 7b 20 0a 20 20 20 20 20 20 43 52 45  opk { .      CRE
28b0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
28c0: 62 2c 20 63 29 3b 0a 20 20 20 20 20 20 43 52 45  b, c);.      CRE
28d0: 41 54 45 20 49 4e 44 45 58 20 74 31 63 20 4f 4e  ATE INDEX t1c ON
28e0: 20 74 31 28 63 29 3b 0a 20 20 20 20 7d 0a 20 20   t1(c);.    }.  
28f0: 20 20 76 74 61 62 20 7b 20 0a 20 20 20 20 20 20    vtab { .      
2900: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
2910: 41 42 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74  ABLE t1 USING ft
2920: 73 35 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 20  s5(a, b, c);.   
2930: 20 7d 0a 20 20 7d 20 7b 0a 0a 20 20 20 20 66 6f   }.  } {..    fo
2940: 72 65 61 63 68 20 7b 74 6e 32 20 72 62 75 73 71  reach {tn2 rbusq
2950: 6c 20 72 31 20 72 32 7d 20 7b 0a 20 20 20 20 20  l r1 r2} {.     
2960: 20 31 20 7b 0a 20 20 20 20 20 20 20 20 43 52 45   1 {.        CRE
2970: 41 54 45 20 54 41 42 4c 45 20 64 61 74 61 30 5f  ATE TABLE data0_
2980: 74 31 28 61 2c 20 62 2c 20 63 2c 20 72 62 75 5f  t1(a, b, c, rbu_
2990: 72 6f 77 69 64 2c 20 72 62 75 5f 63 6f 6e 74 72  rowid, rbu_contr
29a0: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53  ol);.        INS
29b0: 45 52 54 20 49 4e 54 4f 20 64 61 74 61 30 5f 74  ERT INTO data0_t
29c0: 31 20 56 41 4c 55 45 53 28 31 35 2c 20 31 35 2c  1 VALUES(15, 15,
29d0: 20 31 35 2c 20 34 2c 20 30 29 3b 0a 20 20 20 20   15, 4, 0);.    
29e0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
29f0: 64 61 74 61 30 5f 74 31 20 56 41 4c 55 45 53 28  data0_t1 VALUES(
2a00: 32 30 2c 20 32 30 2c 20 32 30 2c 20 35 2c 20 30  20, 20, 20, 5, 0
2a10: 29 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41 54  );.        CREAT
2a20: 45 20 54 41 42 4c 45 20 72 62 75 5f 63 6f 75 6e  E TABLE rbu_coun
2a30: 74 28 74 62 6c 2c 20 63 6e 74 29 3b 0a 20 20 20  t(tbl, cnt);.   
2a40: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
2a50: 20 72 62 75 5f 63 6f 75 6e 74 20 56 41 4c 55 45   rbu_count VALUE
2a60: 53 28 27 64 61 74 61 30 5f 74 31 27 2c 20 32 29  S('data0_t1', 2)
2a70: 3b 20 0a 20 20 20 20 20 20 7d 20 0a 20 20 20 20  ; .      } .    
2a80: 20 20 7b 32 35 30 30 20 35 30 30 30 20 37 35 30    {2500 5000 750
2a90: 30 20 31 30 30 30 30 7d 0a 20 20 20 20 20 20 7b  0 10000}.      {
2aa0: 35 30 30 30 20 31 30 30 30 30 7d 0a 0a 20 20 20  5000 10000}..   
2ab0: 20 20 20 32 20 7b 0a 20 20 20 20 20 20 20 20 43     2 {.        C
2ac0: 52 45 41 54 45 20 54 41 42 4c 45 20 64 61 74 61  REATE TABLE data
2ad0: 30 5f 74 31 28 72 62 75 5f 72 6f 77 69 64 2c 20  0_t1(rbu_rowid, 
2ae0: 61 2c 20 62 2c 20 63 2c 20 72 62 75 5f 63 6f 6e  a, b, c, rbu_con
2af0: 74 72 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 49  trol);.        I
2b00: 4e 53 45 52 54 20 49 4e 54 4f 20 64 61 74 61 30  NSERT INTO data0
2b10: 5f 74 31 20 56 41 4c 55 45 53 28 30 2c 20 37 2c  _t1 VALUES(0, 7,
2b20: 20 37 2c 20 37 2c 20 32 29 3b 0a 20 20 20 20 20   7, 7, 2);.     
2b30: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64     INSERT INTO d
2b40: 61 74 61 30 5f 74 31 20 56 41 4c 55 45 53 28 32  ata0_t1 VALUES(2
2b50: 2c 20 31 30 2c 20 31 30 2c 20 31 30 2c 20 32 29  , 10, 10, 10, 2)
2b60: 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41 54 45  ;.        CREATE
2b70: 20 54 41 42 4c 45 20 72 62 75 5f 63 6f 75 6e 74   TABLE rbu_count
2b80: 28 74 62 6c 2c 20 63 6e 74 29 3b 0a 20 20 20 20  (tbl, cnt);.    
2b90: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2ba0: 72 62 75 5f 63 6f 75 6e 74 20 56 41 4c 55 45 53  rbu_count VALUES
2bb0: 28 27 64 61 74 61 30 5f 74 31 27 2c 20 32 29 3b  ('data0_t1', 2);
2bc0: 20 0a 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20   .      } .     
2bd0: 20 7b 32 35 30 30 20 34 30 30 30 20 36 30 30 30   {2500 4000 6000
2be0: 20 38 30 30 30 20 31 30 30 30 30 7d 0a 20 20 20   8000 10000}.   
2bf0: 20 20 20 7b 35 30 30 30 20 31 30 30 30 30 7d 0a     {5000 10000}.
2c00: 0a 20 20 20 20 20 20 33 20 7b 0a 20 20 20 20 20  .      3 {.     
2c10: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
2c20: 64 61 74 61 30 5f 74 31 28 72 62 75 5f 72 6f 77  data0_t1(rbu_row
2c30: 69 64 2c 20 61 2c 20 62 2c 20 63 2c 20 72 62 75  id, a, b, c, rbu
2c40: 5f 63 6f 6e 74 72 6f 6c 29 3b 0a 20 20 20 20 20  _control);.     
2c50: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64     INSERT INTO d
2c60: 61 74 61 30 5f 74 31 20 56 41 4c 55 45 53 28 31  ata0_t1 VALUES(1
2c70: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55  , NULL, NULL, NU
2c80: 4c 4c 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  LL, 1);.        
2c90: 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 61 74 61  INSERT INTO data
2ca0: 30 5f 74 31 20 56 41 4c 55 45 53 28 32 2c 20 4e  0_t1 VALUES(2, N
2cb0: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 37 2c 20 27 2e  ULL, NULL, 7, '.
2cc0: 2e 78 27 29 3b 0a 20 20 20 20 20 20 20 20 43 52  .x');.        CR
2cd0: 45 41 54 45 20 54 41 42 4c 45 20 72 62 75 5f 63  EATE TABLE rbu_c
2ce0: 6f 75 6e 74 28 74 62 6c 2c 20 63 6e 74 29 3b 0a  ount(tbl, cnt);.
2cf0: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
2d00: 4e 54 4f 20 72 62 75 5f 63 6f 75 6e 74 20 56 41  NTO rbu_count VA
2d10: 4c 55 45 53 28 27 64 61 74 61 30 5f 74 31 27 2c  LUES('data0_t1',
2d20: 20 32 29 3b 20 0a 20 20 20 20 20 20 7d 20 0a 20   2); .      } . 
2d30: 20 20 20 20 20 7b 32 35 30 30 20 34 30 30 30 20       {2500 4000 
2d40: 36 30 30 30 20 38 30 30 30 20 31 30 30 30 30 7d  6000 8000 10000}
2d50: 0a 20 20 20 20 20 20 7b 35 30 30 30 20 31 30 30  .      {5000 100
2d60: 30 30 7d 0a 20 20 20 20 7d 20 7b 0a 0a 20 20 20  00}.    } {..   
2d70: 20 20 20 72 65 73 65 74 5f 64 62 20 3b 20 65 78     reset_db ; ex
2d80: 65 63 73 71 6c 20 24 74 62 6c 0a 20 20 20 20 20  ecsql $tbl.     
2d90: 20 64 6f 5f 74 65 73 74 20 35 2e 24 74 6e 2e 24   do_test 5.$tn.$
2da0: 62 52 65 6f 70 65 6e 2e 24 74 6e 32 2e 30 20 7b  bReopen.$tn2.0 {
2db0: 0a 20 20 20 20 20 20 20 20 65 78 65 63 73 71 6c  .        execsql
2dc0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 49 4e 53   {.          INS
2dd0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
2de0: 45 53 28 31 2c 20 31 2c 20 31 29 3b 0a 20 20 20  ES(1, 1, 1);.   
2df0: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
2e00: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 35 2c 20  TO t1 VALUES(5, 
2e10: 35 2c 20 35 29 3b 0a 20 20 20 20 20 20 20 20 20  5, 5);.         
2e20: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
2e30: 56 41 4c 55 45 53 28 31 30 2c 20 31 30 2c 20 31  VALUES(10, 10, 1
2e40: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
2e50: 20 20 20 20 20 20 63 72 65 61 74 65 5f 64 62 5f        create_db_
2e60: 66 69 6c 65 20 72 62 75 2e 64 62 20 24 72 62 75  file rbu.db $rbu
2e70: 73 71 6c 0a 20 20 20 20 20 20 7d 20 7b 7d 0a 0a  sql.      } {}..
2e80: 20 20 20 20 20 20 73 65 74 20 52 28 6e 6f 70 6b        set R(nopk
2e90: 29 20 24 72 31 0a 20 20 20 20 20 20 73 65 74 20  ) $r1.      set 
2ea0: 52 28 76 74 61 62 29 20 24 72 32 0a 20 20 20 20  R(vtab) $r2.    
2eb0: 20 20 64 6f 5f 73 70 5f 74 65 73 74 20 35 2e 24    do_sp_test 5.$
2ec0: 74 6e 2e 24 62 52 65 6f 70 65 6e 2e 24 74 6e 32  tn.$bReopen.$tn2
2ed0: 2e 31 20 24 62 52 65 6f 70 65 6e 20 74 65 73 74  .1 $bReopen test
2ee0: 2e 64 62 20 72 62 75 2e 64 62 20 24 52 28 24 74  .db rbu.db $R($t
2ef0: 6e 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  n).    }.  }.}..
2f00: 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a 0a        .finish_test..