/ Hex Artifact Content
Login

Artifact 04614ff8820bab9c1ec1b7dbec1edc4b45474421d4fe7abbd2a879a9c02884f9:


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 50 52 41 47 4d 41 20 70 61 67 65 5f 73  .  PRAGMA page_s
0450: 69 7a 65 20 3d 20 34 30 39 36 3b 0a 20 20 43 52  ize = 4096;.  CR
0460: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20  EATE TABLE t1(a 
0470: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
0480: 4b 45 59 2c 20 62 2c 20 63 29 3b 0a 7d 0a 0a 64  KEY, b, c);.}..d
0490: 6f 5f 74 65 73 74 20 31 2e 31 20 7b 0a 20 20 63  o_test 1.1 {.  c
04a0: 72 65 61 74 65 5f 72 62 75 31 20 72 62 75 2e 64  reate_rbu1 rbu.d
04b0: 62 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 72  b.  sqlite3rbu r
04c0: 62 75 20 74 65 73 74 2e 64 62 20 72 62 75 2e 64  bu test.db rbu.d
04d0: 62 0a 20 20 72 62 75 20 62 70 5f 70 72 6f 67 72  b.  rbu bp_progr
04e0: 65 73 73 0a 7d 20 7b 30 20 30 7d 0a 64 6f 5f 74  ess.} {0 0}.do_t
04f0: 65 73 74 20 31 2e 32 20 7b 20 72 62 75 20 73 74  est 1.2 { rbu st
0500: 65 70 20 3b 20 72 62 75 20 62 70 5f 70 72 6f 67  ep ; rbu bp_prog
0510: 72 65 73 73 20 7d 20 7b 33 33 33 33 20 30 7d 0a  ress } {3333 0}.
0520: 64 6f 5f 74 65 73 74 20 31 2e 33 20 7b 20 72 62  do_test 1.3 { rb
0530: 75 20 73 74 65 70 20 3b 20 72 62 75 20 62 70 5f  u step ; rbu bp_
0540: 70 72 6f 67 72 65 73 73 20 7d 20 7b 36 36 36 36  progress } {6666
0550: 20 30 7d 0a 64 6f 5f 74 65 73 74 20 31 2e 34 20   0}.do_test 1.4 
0560: 7b 20 72 62 75 20 73 74 65 70 20 3b 20 72 62 75  { rbu step ; rbu
0570: 20 62 70 5f 70 72 6f 67 72 65 73 73 20 7d 20 7b   bp_progress } {
0580: 31 30 30 30 30 20 30 7d 0a 64 6f 5f 74 65 73 74  10000 0}.do_test
0590: 20 31 2e 35 20 7b 20 72 62 75 20 73 74 65 70 20   1.5 { rbu step 
05a0: 3b 20 72 62 75 20 62 70 5f 70 72 6f 67 72 65 73  ; rbu bp_progres
05b0: 73 20 7d 20 7b 31 30 30 30 30 20 30 7d 0a 64 6f  s } {10000 0}.do
05c0: 5f 74 65 73 74 20 31 2e 36 20 7b 20 72 62 75 20  _test 1.6 { rbu 
05d0: 73 74 65 70 20 3b 20 72 62 75 20 62 70 5f 70 72  step ; rbu bp_pr
05e0: 6f 67 72 65 73 73 20 7d 20 7b 31 30 30 30 30 20  ogress } {10000 
05f0: 30 7d 0a 64 6f 5f 74 65 73 74 20 31 2e 37 20 7b  0}.do_test 1.7 {
0600: 20 72 62 75 20 73 74 65 70 20 3b 20 72 62 75 20   rbu step ; rbu 
0610: 62 70 5f 70 72 6f 67 72 65 73 73 20 7d 20 7b 31  bp_progress } {1
0620: 30 30 30 30 20 35 30 30 30 7d 0a 64 6f 5f 74 65  0000 5000}.do_te
0630: 73 74 20 31 2e 38 20 7b 20 72 62 75 20 73 74 65  st 1.8 { rbu ste
0640: 70 20 3b 20 72 62 75 20 62 70 5f 70 72 6f 67 72  p ; rbu bp_progr
0650: 65 73 73 20 7d 20 7b 31 30 30 30 30 20 31 30 30  ess } {10000 100
0660: 30 30 7d 0a 64 6f 5f 74 65 73 74 20 31 2e 39 20  00}.do_test 1.9 
0670: 7b 20 72 62 75 20 73 74 65 70 20 3b 20 72 62 75  { rbu step ; rbu
0680: 20 62 70 5f 70 72 6f 67 72 65 73 73 20 7d 20 7b   bp_progress } {
0690: 31 30 30 30 30 20 31 30 30 30 30 7d 0a 0a 64 6f  10000 10000}..do
06a0: 5f 74 65 73 74 20 31 2e 31 30 20 7b 0a 20 20 72  _test 1.10 {.  r
06b0: 62 75 20 63 6c 6f 73 65 0a 7d 20 7b 53 51 4c 49  bu close.} {SQLI
06c0: 54 45 5f 44 4f 4e 45 7d 0a 0a 23 2d 2d 2d 2d 2d  TE_DONE}..#-----
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 2d 2d 2d 2d 2d 2d 2d  ----------------
0700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0710: 2d 2d 2d 2d 0a 23 0a 70 72 6f 63 20 64 6f 5f 73  ----.#.proc do_s
0720: 70 5f 74 65 73 74 20 7b 74 6e 20 62 52 65 6f 70  p_test {tn bReop
0730: 65 6e 20 74 61 72 67 65 74 20 72 62 75 20 72 65  en target rbu re
0740: 73 6c 69 73 74 7d 20 7b 0a 20 20 75 70 6c 65 76  slist} {.  uplev
0750: 65 6c 20 5b 6c 69 73 74 20 64 6f 5f 74 65 73 74  el [list do_test
0760: 20 24 74 6e 20 5b 73 75 62 73 74 20 2d 6e 6f 63   $tn [subst -noc
0770: 6f 6d 6d 61 6e 64 73 20 7b 0a 20 20 20 20 69 66  ommands {.    if
0780: 20 7b 24 62 52 65 6f 70 65 6e 3d 3d 30 7d 20 7b   {$bReopen==0} {
0790: 20 73 71 6c 69 74 65 33 72 62 75 20 72 62 75 20   sqlite3rbu rbu 
07a0: 24 74 61 72 67 65 74 20 24 72 62 75 20 7d 0a 20  $target $rbu }. 
07b0: 20 20 20 73 65 74 20 72 65 73 20 5b 6c 69 73 74     set res [list
07c0: 5d 0a 20 20 20 20 77 68 69 6c 65 20 31 20 7b 0a  ].    while 1 {.
07d0: 20 20 20 20 20 20 69 66 20 7b 24 62 52 65 6f 70        if {$bReop
07e0: 65 6e 7d 20 7b 20 73 71 6c 69 74 65 33 72 62 75  en} { sqlite3rbu
07f0: 20 72 62 75 20 24 74 61 72 67 65 74 20 24 72 62   rbu $target $rb
0800: 75 20 7d 0a 20 20 20 20 20 20 73 65 74 20 72 63  u }.      set rc
0810: 20 5b 72 62 75 20 73 74 65 70 5d 0a 20 20 20 20   [rbu step].    
0820: 20 20 69 66 20 7b 5b 73 65 74 20 72 63 5d 20 21    if {[set rc] !
0830: 3d 20 22 53 51 4c 49 54 45 5f 4f 4b 22 7d 20 7b  = "SQLITE_OK"} {
0840: 20 72 62 75 20 63 6c 6f 73 65 20 3b 20 65 72 72   rbu close ; err
0850: 6f 72 20 22 65 72 72 6f 72 20 31 22 20 7d 0a 20  or "error 1" }. 
0860: 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73       lappend res
0870: 20 5b 6c 69 6e 64 65 78 20 5b 72 62 75 20 62 70   [lindex [rbu bp
0880: 5f 70 72 6f 67 72 65 73 73 5d 20 30 5d 0a 20 20  _progress] 0].  
0890: 20 20 20 20 69 66 20 7b 5b 6c 69 6e 64 65 78 20      if {[lindex 
08a0: 5b 73 65 74 20 72 65 73 5d 20 65 6e 64 5d 3d 3d  [set res] end]==
08b0: 31 30 30 30 30 7d 20 62 72 65 61 6b 0a 20 20 20  10000} break.   
08c0: 20 20 20 69 66 20 7b 24 62 52 65 6f 70 65 6e 7d     if {$bReopen}
08d0: 20 7b 20 72 62 75 20 63 6c 6f 73 65 20 7d 0a 20   { rbu close }. 
08e0: 20 20 20 7d 0a 20 20 20 20 69 66 20 7b 5b 73 65     }.    if {[se
08f0: 74 20 72 65 73 5d 20 21 3d 20 5b 6c 69 73 74 20  t res] != [list 
0900: 24 72 65 73 6c 69 73 74 5d 7d 20 7b 0a 20 20 20  $reslist]} {.   
0910: 20 20 20 72 62 75 20 63 6c 6f 73 65 0a 20 20 20     rbu close.   
0920: 20 20 20 65 72 72 6f 72 20 22 31 2e 20 72 65 73     error "1. res
0930: 6c 69 73 74 20 69 6e 63 6f 72 72 65 63 74 20 28  list incorrect (
0940: 65 78 70 65 63 74 3d 24 72 65 73 6c 69 73 74 20  expect=$reslist 
0950: 67 6f 74 3d 5b 73 65 74 20 72 65 73 5d 29 22 0a  got=[set res])".
0960: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 4f 6e 65      }..    # One
0970: 20 73 74 65 70 20 74 6f 20 63 6c 65 61 6e 20 75   step to clean u
0980: 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  p the temporary 
0990: 74 61 62 6c 65 73 20 75 73 65 64 20 74 6f 20 75  tables used to u
09a0: 70 64 61 74 65 20 74 68 65 20 6f 6e 6c 79 0a 20  pdate the only. 
09b0: 20 20 20 23 20 74 61 72 67 65 74 20 74 61 62 6c     # target tabl
09c0: 65 20 69 6e 20 74 68 65 20 72 62 75 20 64 61 74  e in the rbu dat
09d0: 61 62 61 73 65 2e 20 41 6e 64 20 6f 6e 65 20 6d  abase. And one m
09e0: 6f 72 65 20 74 6f 20 6d 6f 76 65 20 74 68 65 20  ore to move the 
09f0: 2a 2d 6f 61 6c 20 0a 20 20 20 20 23 20 66 69 6c  *-oal .    # fil
0a00: 65 20 74 6f 20 2a 2d 77 61 6c 2e 20 41 66 74 65  e to *-wal. Afte
0a10: 72 20 65 61 63 68 20 6f 66 20 74 68 65 73 65 20  r each of these 
0a20: 73 74 65 70 73 2c 20 74 68 65 20 70 72 6f 67 72  steps, the progr
0a30: 65 73 73 20 72 65 6d 61 69 6e 73 0a 20 20 20 20  ess remains.    
0a40: 23 20 61 74 20 22 31 30 30 30 30 20 30 22 2e 0a  # at "10000 0"..
0a50: 20 20 20 20 23 0a 20 20 20 20 69 66 20 7b 5b 6c      #.    if {[l
0a60: 69 6e 64 65 78 20 5b 6c 69 73 74 20 24 72 65 73  index [list $res
0a70: 6c 69 73 74 5d 20 30 5d 21 3d 2d 31 7d 20 7b 0a  list] 0]!=-1} {.
0a80: 20 20 20 20 20 20 72 62 75 20 73 74 65 70 0a 20        rbu step. 
0a90: 20 20 20 20 20 73 65 74 20 72 65 73 20 5b 72 62       set res [rb
0aa0: 75 20 62 70 5f 70 72 6f 67 72 65 73 73 5d 0a 20  u bp_progress]. 
0ab0: 20 20 20 20 20 69 66 20 7b 5b 73 65 74 20 72 65       if {[set re
0ac0: 73 5d 20 21 3d 20 5b 6c 69 73 74 20 31 30 30 30  s] != [list 1000
0ad0: 30 20 30 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20  0 0]} {.        
0ae0: 72 62 75 20 63 6c 6f 73 65 0a 20 20 20 20 20 20  rbu close.      
0af0: 20 20 65 72 72 6f 72 20 22 32 2e 20 72 65 73 6c    error "2. resl
0b00: 69 73 74 20 69 6e 63 6f 72 72 65 63 74 20 28 65  ist incorrect (e
0b10: 78 70 65 63 74 3d 31 30 30 30 30 20 30 20 67 6f  xpect=10000 0 go
0b20: 74 3d 5b 73 65 74 20 72 65 73 5d 29 22 0a 20 20  t=[set res])".  
0b30: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
0b40: 20 72 62 75 20 73 74 65 70 0a 20 20 20 20 73 65   rbu step.    se
0b50: 74 20 72 65 73 20 5b 72 62 75 20 62 70 5f 70 72  t res [rbu bp_pr
0b60: 6f 67 72 65 73 73 5d 0a 20 20 20 20 69 66 20 7b  ogress].    if {
0b70: 5b 73 65 74 20 72 65 73 5d 20 21 3d 20 5b 6c 69  [set res] != [li
0b80: 73 74 20 31 30 30 30 30 20 30 5d 7d 20 7b 0a 20  st 10000 0]} {. 
0b90: 20 20 20 20 20 72 62 75 20 63 6c 6f 73 65 0a 20       rbu close. 
0ba0: 20 20 20 20 20 65 72 72 6f 72 20 22 33 2e 20 72       error "3. r
0bb0: 65 73 6c 69 73 74 20 69 6e 63 6f 72 72 65 63 74  eslist incorrect
0bc0: 20 28 65 78 70 65 63 74 3d 31 30 30 30 30 20 30   (expect=10000 0
0bd0: 20 67 6f 74 3d 5b 73 65 74 20 72 65 73 5d 29 22   got=[set res])"
0be0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 44 6f  .    }..    # Do
0bf0: 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 2e   the checkpoint.
0c00: 0a 20 20 20 20 77 68 69 6c 65 20 7b 5b 72 62 75  .    while {[rbu
0c10: 20 73 74 65 70 5d 3d 3d 22 53 51 4c 49 54 45 5f   step]=="SQLITE_
0c20: 4f 4b 22 7d 20 7b 20 0a 20 20 20 20 20 20 66 6f  OK"} { .      fo
0c30: 72 65 61 63 68 20 7b 61 20 62 7d 20 5b 72 62 75  reach {a b} [rbu
0c40: 20 62 70 5f 70 72 6f 67 72 65 73 73 5d 20 7b 7d   bp_progress] {}
0c50: 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 65 74 20  .      if {[set 
0c60: 61 5d 21 3d 31 30 30 30 30 20 7c 7c 20 5b 73 65  a]!=10000 || [se
0c70: 74 20 62 5d 3c 3d 30 20 7c 7c 20 5b 73 65 74 20  t b]<=0 || [set 
0c80: 62 5d 3e 31 30 30 30 30 7d 20 7b 0a 20 20 20 20  b]>10000} {.    
0c90: 20 20 20 20 72 62 75 20 63 6c 6f 73 65 0a 20 20      rbu close.  
0ca0: 20 20 20 20 20 20 65 72 72 6f 72 20 22 34 2e 20        error "4. 
0cb0: 72 65 73 6c 69 73 74 20 69 6e 63 6f 72 72 65 63  reslist incorrec
0cc0: 74 20 28 65 78 70 65 63 74 3d 31 30 30 30 30 20  t (expect=10000 
0cd0: 31 2e 2e 31 30 30 30 30 20 67 6f 74 3d 5b 73 65  1..10000 got=[se
0ce0: 74 20 61 5d 20 5b 73 65 74 20 62 5d 29 22 0a 20  t a] [set b])". 
0cf0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
0d00: 20 20 73 65 74 20 72 65 73 20 5b 72 62 75 20 62    set res [rbu b
0d10: 70 5f 70 72 6f 67 72 65 73 73 5d 0a 20 20 20 20  p_progress].    
0d20: 69 66 20 7b 5b 73 65 74 20 72 65 73 5d 20 21 3d  if {[set res] !=
0d30: 20 5b 6c 69 73 74 20 31 30 30 30 30 20 31 30 30   [list 10000 100
0d40: 30 30 5d 7d 20 7b 0a 20 20 20 20 20 20 72 62 75  00]} {.      rbu
0d50: 20 63 6c 6f 73 65 0a 20 20 20 20 20 20 65 72 72   close.      err
0d60: 6f 72 20 22 35 2e 20 72 65 73 6c 69 73 74 20 69  or "5. reslist i
0d70: 73 20 69 6e 63 6f 72 72 65 63 74 20 28 65 78 70  s incorrect (exp
0d80: 65 63 74 3d 31 30 30 30 30 20 31 30 30 30 30 20  ect=10000 10000 
0d90: 67 6f 74 3d 5b 73 65 74 20 72 65 73 5d 29 22 0a  got=[set res])".
0da0: 20 20 20 20 7d 0a 0a 20 20 20 20 72 62 75 20 63      }..    rbu c
0db0: 6c 6f 73 65 0a 20 20 7d 5d 20 7b 53 51 4c 49 54  lose.  }] {SQLIT
0dc0: 45 5f 44 4f 4e 45 7d 5d 0a 7d 0a 0a 66 6f 72 65  E_DONE}].}..fore
0dd0: 61 63 68 20 7b 62 52 65 6f 70 65 6e 7d 20 7b 20  ach {bReopen} { 
0de0: 30 20 31 20 7d 20 7b 0a 20 20 72 65 73 65 74 5f  0 1 } {.  reset_
0df0: 64 62 0a 20 20 64 6f 5f 74 65 73 74 20 32 2e 24  db.  do_test 2.$
0e00: 62 52 65 6f 70 65 6e 2e 31 2e 30 20 7b 0a 20 20  bReopen.1.0 {.  
0e10: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
0e20: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
0e30: 31 28 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d  1(a INTEGER PRIM
0e40: 41 52 59 20 4b 45 59 2c 20 62 2c 20 63 29 3b 0a  ARY KEY, b, c);.
0e50: 20 20 20 20 7d 0a 20 20 20 20 63 72 65 61 74 65      }.    create
0e60: 5f 64 62 5f 66 69 6c 65 20 72 62 75 2e 64 62 20  _db_file rbu.db 
0e70: 7b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54  {.      CREATE T
0e80: 41 42 4c 45 20 64 61 74 61 5f 74 31 28 61 2c 20  ABLE data_t1(a, 
0e90: 62 2c 20 63 2c 20 72 62 75 5f 63 6f 6e 74 72 6f  b, c, rbu_contro
0ea0: 6c 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  l);.      INSERT
0eb0: 20 49 4e 54 4f 20 64 61 74 61 5f 74 31 20 56 41   INTO data_t1 VA
0ec0: 4c 55 45 53 28 34 2c 20 34 2c 20 34 2c 20 30 29  LUES(4, 4, 4, 0)
0ed0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
0ee0: 4e 54 4f 20 64 61 74 61 5f 74 31 20 56 41 4c 55  NTO data_t1 VALU
0ef0: 45 53 28 35 2c 20 35 2c 20 35 2c 20 30 29 3b 0a  ES(5, 5, 5, 0);.
0f00: 20 20 0a 20 20 20 20 20 20 43 52 45 41 54 45 20    .      CREATE 
0f10: 54 41 42 4c 45 20 72 62 75 5f 63 6f 75 6e 74 28  TABLE rbu_count(
0f20: 74 62 6c 2c 20 63 6e 74 29 3b 0a 20 20 20 20 20  tbl, cnt);.     
0f30: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 72 62 75   INSERT INTO rbu
0f40: 5f 63 6f 75 6e 74 20 56 41 4c 55 45 53 28 27 64  _count VALUES('d
0f50: 61 74 61 5f 74 31 27 2c 20 32 29 3b 0a 20 20 20  ata_t1', 2);.   
0f60: 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 73   }.  } {}.  do_s
0f70: 70 5f 74 65 73 74 20 32 2e 24 62 52 65 6f 70 65  p_test 2.$bReope
0f80: 6e 2e 31 2e 31 20 24 62 52 65 6f 70 65 6e 20 74  n.1.1 $bReopen t
0f90: 65 73 74 2e 64 62 20 72 62 75 2e 64 62 20 7b 35  est.db rbu.db {5
0fa0: 30 30 30 20 31 30 30 30 30 7d 0a 20 20 0a 20 20  000 10000}.  .  
0fb0: 72 65 73 65 74 5f 64 62 0a 20 20 64 6f 5f 74 65  reset_db.  do_te
0fc0: 73 74 20 32 2e 24 62 52 65 6f 70 65 6e 2e 32 2e  st 2.$bReopen.2.
0fd0: 30 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  0 {.    execsql 
0fe0: 7b 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74  { CREATE TABLE t
0ff0: 31 28 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d  1(a INTEGER PRIM
1000: 41 52 59 20 4b 45 59 2c 20 62 2c 20 63 29 20 7d  ARY KEY, b, c) }
1010: 0a 20 20 20 20 63 72 65 61 74 65 5f 72 62 75 31  .    create_rbu1
1020: 20 72 62 75 2e 64 62 0a 20 20 7d 20 7b 72 62 75   rbu.db.  } {rbu
1030: 2e 64 62 7d 0a 20 20 64 6f 5f 73 70 5f 74 65 73  .db}.  do_sp_tes
1040: 74 20 32 2e 24 62 52 65 6f 70 65 6e 2e 32 2e 31  t 2.$bReopen.2.1
1050: 20 24 62 52 65 6f 70 65 6e 20 74 65 73 74 2e 64   $bReopen test.d
1060: 62 20 72 62 75 2e 64 62 20 7b 33 33 33 33 20 36  b rbu.db {3333 6
1070: 36 36 36 20 31 30 30 30 30 7d 0a 20 20 0a 20 20  666 10000}.  .  
1080: 72 65 73 65 74 5f 64 62 0a 20 20 64 6f 5f 74 65  reset_db.  do_te
1090: 73 74 20 32 2e 24 62 52 65 6f 70 65 6e 2e 33 2e  st 2.$bReopen.3.
10a0: 30 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  0 {.    execsql 
10b0: 7b 20 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  { .      CREATE 
10c0: 54 41 42 4c 45 20 74 31 28 61 20 49 4e 54 45 47  TABLE t1(a INTEG
10d0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
10e0: 62 2c 20 63 29 3b 0a 20 20 20 20 20 20 43 52 45  b, c);.      CRE
10f0: 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
1100: 74 31 28 62 29 3b 0a 20 20 20 20 20 20 49 4e 53  t1(b);.      INS
1110: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
1120: 45 53 28 31 2c 20 31 2c 20 31 29 3b 0a 20 20 20  ES(1, 1, 1);.   
1130: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1140: 31 20 56 41 4c 55 45 53 28 32 2c 20 32 2c 20 32  1 VALUES(2, 2, 2
1150: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
1160: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33  INTO t1 VALUES(3
1170: 2c 20 33 2c 20 33 29 3b 0a 20 20 20 20 7d 0a 20  , 3, 3);.    }. 
1180: 20 20 20 63 72 65 61 74 65 5f 64 62 5f 66 69 6c     create_db_fil
1190: 65 20 72 62 75 2e 64 62 20 7b 0a 20 20 20 20 20  e rbu.db {.     
11a0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 64 61   CREATE TABLE da
11b0: 74 61 5f 74 31 28 61 2c 20 62 2c 20 63 2c 20 72  ta_t1(a, b, c, r
11c0: 62 75 5f 63 6f 6e 74 72 6f 6c 29 3b 0a 20 20 20  bu_control);.   
11d0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64     INSERT INTO d
11e0: 61 74 61 5f 74 31 20 56 41 4c 55 45 53 28 34 2c  ata_t1 VALUES(4,
11f0: 20 34 2c 20 34 2c 20 30 29 3b 0a 20 20 20 20 20   4, 4, 0);.     
1200: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 61 74   INSERT INTO dat
1210: 61 5f 74 31 20 56 41 4c 55 45 53 28 32 2c 20 4e  a_t1 VALUES(2, N
1220: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 31 29 3b 0a 20  ULL, NULL, 1);. 
1230: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
1240: 20 64 61 74 61 5f 74 31 20 56 41 4c 55 45 53 28   data_t1 VALUES(
1250: 35 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 31  5, NULL, NULL, 1
1260: 29 3b 0a 20 20 0a 20 20 20 20 20 20 43 52 45 41  );.  .      CREA
1270: 54 45 20 54 41 42 4c 45 20 72 62 75 5f 63 6f 75  TE TABLE rbu_cou
1280: 6e 74 28 74 62 6c 2c 20 63 6e 74 29 3b 0a 20 20  nt(tbl, cnt);.  
1290: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
12a0: 72 62 75 5f 63 6f 75 6e 74 20 56 41 4c 55 45 53  rbu_count VALUES
12b0: 28 27 64 61 74 61 5f 74 31 27 2c 20 33 29 3b 0a  ('data_t1', 3);.
12c0: 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64      }.  } {}.  d
12d0: 6f 5f 73 70 5f 74 65 73 74 20 32 2e 24 62 52 65  o_sp_test 2.$bRe
12e0: 6f 70 65 6e 2e 33 2e 31 20 24 62 52 65 6f 70 65  open.3.1 $bReope
12f0: 6e 20 74 65 73 74 2e 64 62 20 72 62 75 2e 64 62  n test.db rbu.db
1300: 20 7b 31 36 36 36 20 33 33 33 33 20 36 30 30 30   {1666 3333 6000
1310: 20 38 30 30 30 20 31 30 30 30 30 7d 0a 20 20 0a   8000 10000}.  .
1320: 20 20 72 65 73 65 74 5f 64 62 0a 20 20 64 6f 5f    reset_db.  do_
1330: 74 65 73 74 20 32 2e 24 62 52 65 6f 70 65 6e 2e  test 2.$bReopen.
1340: 34 2e 30 20 7b 0a 20 20 20 20 65 78 65 63 73 71  4.0 {.    execsq
1350: 6c 20 7b 20 0a 20 20 20 20 20 20 43 52 45 41 54  l { .      CREAT
1360: 45 20 54 41 42 4c 45 20 74 31 28 61 20 49 4e 54  E TABLE t1(a INT
1370: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
1380: 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20 20 20 43  , b, c);.      C
1390: 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
13a0: 4e 20 74 31 28 62 29 3b 0a 20 20 20 20 20 20 49  N t1(b);.      I
13b0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
13c0: 4c 55 45 53 28 31 2c 20 31 2c 20 31 29 3b 0a 20  LUES(1, 1, 1);. 
13d0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
13e0: 20 74 31 20 56 41 4c 55 45 53 28 32 2c 20 32 2c   t1 VALUES(2, 2,
13f0: 20 32 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   2);.      INSER
1400: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
1410: 28 33 2c 20 33 2c 20 33 29 3b 0a 20 20 20 20 7d  (3, 3, 3);.    }
1420: 0a 20 20 20 20 63 72 65 61 74 65 5f 64 62 5f 66  .    create_db_f
1430: 69 6c 65 20 72 62 75 2e 64 62 20 7b 0a 20 20 20  ile rbu.db {.   
1440: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
1450: 64 61 74 61 5f 74 31 28 61 2c 20 62 2c 20 63 2c  data_t1(a, b, c,
1460: 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 29 3b 0a 20   rbu_control);. 
1470: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
1480: 20 64 61 74 61 5f 74 31 20 56 41 4c 55 45 53 28   data_t1 VALUES(
1490: 32 2c 20 34 2c 20 34 2c 20 27 2e 78 78 27 29 3b  2, 4, 4, '.xx');
14a0: 0a 20 20 0a 20 20 20 20 20 20 43 52 45 41 54 45  .  .      CREATE
14b0: 20 54 41 42 4c 45 20 72 62 75 5f 63 6f 75 6e 74   TABLE rbu_count
14c0: 28 74 62 6c 2c 20 63 6e 74 29 3b 0a 20 20 20 20  (tbl, cnt);.    
14d0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 72 62    INSERT INTO rb
14e0: 75 5f 63 6f 75 6e 74 20 56 41 4c 55 45 53 28 27  u_count VALUES('
14f0: 64 61 74 61 5f 74 31 27 2c 20 31 29 3b 0a 20 20  data_t1', 1);.  
1500: 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f    }.  } {}.  do_
1510: 73 70 5f 74 65 73 74 20 32 2e 24 62 52 65 6f 70  sp_test 2.$bReop
1520: 65 6e 2e 34 2e 31 20 24 62 52 65 6f 70 65 6e 20  en.4.1 $bReopen 
1530: 74 65 73 74 2e 64 62 20 72 62 75 2e 64 62 20 7b  test.db rbu.db {
1540: 33 33 33 33 20 36 36 36 36 20 31 30 30 30 30 7d  3333 6666 10000}
1550: 0a 20 20 0a 20 20 72 65 73 65 74 5f 64 62 0a 20  .  .  reset_db. 
1560: 20 64 6f 5f 74 65 73 74 20 32 2e 24 62 52 65 6f   do_test 2.$bReo
1570: 70 65 6e 2e 35 2e 30 20 7b 0a 20 20 20 20 65 78  pen.5.0 {.    ex
1580: 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20 20 43  ecsql { .      C
1590: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
15a0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
15b0: 20 4b 45 59 2c 20 62 2c 20 63 29 3b 0a 20 20 20   KEY, b, c);.   
15c0: 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
15d0: 69 31 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20  i1 ON t1(b);.   
15e0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
15f0: 31 20 56 41 4c 55 45 53 28 31 2c 20 31 2c 20 31  1 VALUES(1, 1, 1
1600: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
1610: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32  INTO t1 VALUES(2
1620: 2c 20 32 2c 20 32 29 3b 0a 20 20 20 20 20 20 49  , 2, 2);.      I
1630: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
1640: 4c 55 45 53 28 33 2c 20 33 2c 20 33 29 3b 0a 20  LUES(3, 3, 3);. 
1650: 20 20 20 7d 0a 20 20 20 20 63 72 65 61 74 65 5f     }.    create_
1660: 64 62 5f 66 69 6c 65 20 72 62 75 2e 64 62 20 7b  db_file rbu.db {
1670: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
1680: 42 4c 45 20 64 61 74 61 5f 74 31 28 61 2c 20 62  BLE data_t1(a, b
1690: 2c 20 63 2c 20 72 62 75 5f 63 6f 6e 74 72 6f 6c  , c, rbu_control
16a0: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
16b0: 49 4e 54 4f 20 64 61 74 61 5f 74 31 20 56 41 4c  INTO data_t1 VAL
16c0: 55 45 53 28 34 2c 20 4e 55 4c 4c 2c 20 34 2c 20  UES(4, NULL, 4, 
16d0: 27 2e 78 78 27 29 3b 0a 20 20 0a 20 20 20 20 20  '.xx');.  .     
16e0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 72 62   CREATE TABLE rb
16f0: 75 5f 63 6f 75 6e 74 28 74 62 6c 2c 20 63 6e 74  u_count(tbl, cnt
1700: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
1710: 49 4e 54 4f 20 72 62 75 5f 63 6f 75 6e 74 20 56  INTO rbu_count V
1720: 41 4c 55 45 53 28 27 64 61 74 61 5f 74 31 27 2c  ALUES('data_t1',
1730: 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b   1);.    }.  } {
1740: 7d 0a 20 20 64 6f 5f 73 70 5f 74 65 73 74 20 32  }.  do_sp_test 2
1750: 2e 24 62 52 65 6f 70 65 6e 2e 35 2e 31 20 24 62  .$bReopen.5.1 $b
1760: 52 65 6f 70 65 6e 20 74 65 73 74 2e 64 62 20 72  Reopen test.db r
1770: 62 75 2e 64 62 20 7b 31 30 30 30 30 7d 0a 0a 20  bu.db {10000}.. 
1780: 20 72 65 73 65 74 5f 64 62 0a 20 20 64 6f 5f 74   reset_db.  do_t
1790: 65 73 74 20 32 2e 24 62 52 65 6f 70 65 6e 2e 36  est 2.$bReopen.6
17a0: 2e 30 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .0 {.    execsql
17b0: 20 7b 20 0a 20 20 20 20 20 20 43 52 45 41 54 45   { .      CREATE
17c0: 20 54 41 42 4c 45 20 74 31 28 61 20 49 4e 54 45   TABLE t1(a INTE
17d0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
17e0: 20 62 2c 20 63 29 3b 0a 20 20 20 20 20 20 43 52   b, c);.      CR
17f0: 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
1800: 20 74 31 28 62 29 3b 0a 20 20 20 20 20 20 49 4e   t1(b);.      IN
1810: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
1820: 55 45 53 28 31 2c 20 31 2c 20 31 29 3b 0a 20 20  UES(1, 1, 1);.  
1830: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1840: 74 31 20 56 41 4c 55 45 53 28 32 2c 20 32 2c 20  t1 VALUES(2, 2, 
1850: 32 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  2);.      INSERT
1860: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
1870: 33 2c 20 33 2c 20 33 29 3b 0a 20 20 20 20 7d 0a  3, 3, 3);.    }.
1880: 20 20 20 20 63 72 65 61 74 65 5f 64 62 5f 66 69      create_db_fi
1890: 6c 65 20 72 62 75 2e 64 62 20 7b 0a 20 20 20 20  le rbu.db {.    
18a0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 64    CREATE TABLE d
18b0: 61 74 61 5f 74 31 28 61 2c 20 62 2c 20 63 2c 20  ata_t1(a, b, c, 
18c0: 72 62 75 5f 63 6f 6e 74 72 6f 6c 29 3b 0a 20 20  rbu_control);.  
18d0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
18e0: 64 61 74 61 5f 74 31 20 56 41 4c 55 45 53 28 34  data_t1 VALUES(4
18f0: 2c 20 34 2c 20 34 2c 20 30 29 3b 0a 20 20 20 20  , 4, 4, 0);.    
1900: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 61    INSERT INTO da
1910: 74 61 5f 74 31 20 56 41 4c 55 45 53 28 32 2c 20  ta_t1 VALUES(2, 
1920: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 31 29 3b 0a  NULL, NULL, 1);.
1930: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
1940: 4f 20 64 61 74 61 5f 74 31 20 56 41 4c 55 45 53  O data_t1 VALUES
1950: 28 35 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  (5, NULL, NULL, 
1960: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d  1);.    }.  } {}
1970: 0a 20 20 64 6f 5f 73 70 5f 74 65 73 74 20 32 2e  .  do_sp_test 2.
1980: 24 62 52 65 6f 70 65 6e 2e 36 2e 31 20 24 62 52  $bReopen.6.1 $bR
1990: 65 6f 70 65 6e 20 74 65 73 74 2e 64 62 20 72 62  eopen test.db rb
19a0: 75 2e 64 62 20 7b 2d 31 20 2d 31 20 2d 31 20 2d  u.db {-1 -1 -1 -
19b0: 31 20 2d 31 20 31 30 30 30 30 7d 0a 7d 0a 0a 23  1 -1 10000}.}..#
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 2d 2d  ----------------
19f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20  ---------.# The 
1a10: 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 20  following tests 
1a20: 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
1a30: 41 50 49 20 77 6f 72 6b 73 20 77 68 65 6e 20 72  API works when r
1a40: 65 73 75 6d 69 6e 67 20 61 6e 20 75 70 64 61 74  esuming an updat
1a50: 65 0a 23 20 64 75 72 69 6e 67 20 74 68 65 20 69  e.# during the i
1a60: 6e 63 72 65 6d 65 6e 74 61 6c 20 63 68 65 63 6b  ncremental check
1a70: 70 6f 69 6e 74 20 73 74 61 67 65 2e 0a 23 0a 70  point stage..#.p
1a80: 72 6f 63 20 64 6f 5f 70 68 61 73 65 32 5f 74 65  roc do_phase2_te
1a90: 73 74 20 7b 74 6e 20 62 52 65 6f 70 65 6e 20 74  st {tn bReopen t
1aa0: 61 72 67 65 74 20 72 62 75 20 6e 53 74 65 70 7d  arget rbu nStep}
1ab0: 20 7b 0a 20 20 75 70 6c 65 76 65 6c 20 5b 6c 69   {.  uplevel [li
1ac0: 73 74 20 64 6f 5f 74 65 73 74 20 24 74 6e 20 5b  st do_test $tn [
1ad0: 73 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64  subst -nocommand
1ae0: 73 20 7b 0a 0a 20 20 20 20 23 20 42 75 69 6c 64  s {..    # Build
1af0: 20 74 68 65 20 4f 41 4c 2f 57 41 4c 20 66 69 6c   the OAL/WAL fil
1b00: 65 3a 0a 20 20 20 20 73 71 6c 69 74 65 33 72 62  e:.    sqlite3rb
1b10: 75 20 72 62 75 20 24 74 61 72 67 65 74 20 24 72  u rbu $target $r
1b20: 62 75 0a 20 20 20 20 77 68 69 6c 65 20 7b 5b 6c  bu.    while {[l
1b30: 69 6e 64 65 78 20 5b 72 62 75 20 62 70 5f 70 72  index [rbu bp_pr
1b40: 6f 67 72 65 73 73 5d 20 30 5d 3c 31 30 30 30 30  ogress] 0]<10000
1b50: 7d 20 7b 20 0a 20 20 20 20 20 20 73 65 74 20 72  } { .      set r
1b60: 63 20 5b 72 62 75 20 73 74 65 70 5d 0a 20 20 20  c [rbu step].   
1b70: 20 20 20 69 66 20 7b 22 53 51 4c 49 54 45 5f 4f     if {"SQLITE_O
1b80: 4b 22 20 21 3d 20 5b 73 65 74 20 72 63 5d 7d 20  K" != [set rc]} 
1b90: 7b 20 72 62 75 20 63 6c 6f 73 65 20 7d 0a 20 20  { rbu close }.  
1ba0: 20 20 7d 0a 0a 20 20 20 20 23 20 43 6c 65 61 6e    }..    # Clean
1bb0: 20 75 70 20 74 68 65 20 74 65 6d 70 20 74 61 62   up the temp tab
1bc0: 6c 65 73 20 61 6e 64 20 6d 6f 76 65 20 74 68 65  les and move the
1bd0: 20 2a 2d 6f 61 6c 20 66 69 6c 65 20 74 6f 20 2a   *-oal file to *
1be0: 2d 77 61 6c 2e 0a 20 20 20 20 72 62 75 20 73 74  -wal..    rbu st
1bf0: 65 70 0a 20 20 20 20 72 62 75 20 73 74 65 70 0a  ep.    rbu step.
1c00: 0a 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 20  .    for {set i 
1c10: 30 7d 20 7b 5b 73 65 74 20 69 5d 20 3c 20 24 6e  0} {[set i] < $n
1c20: 53 74 65 70 7d 20 7b 69 6e 63 72 20 69 7d 20 7b  Step} {incr i} {
1c30: 0a 20 20 20 20 20 20 69 66 20 7b 24 62 52 65 6f  .      if {$bReo
1c40: 70 65 6e 7d 20 7b 0a 20 20 20 20 20 20 20 20 72  pen} {.        r
1c50: 62 75 20 63 6c 6f 73 65 0a 20 20 20 20 20 20 20  bu close.       
1c60: 20 73 71 6c 69 74 65 33 72 62 75 20 72 62 75 20   sqlite3rbu rbu 
1c70: 24 74 61 72 67 65 74 20 24 72 62 75 0a 20 20 20  $target $rbu.   
1c80: 20 20 20 7d 0a 20 20 20 20 20 20 72 62 75 20 73     }.      rbu s
1c90: 74 65 70 0a 20 20 20 20 20 20 73 65 74 20 72 65  tep.      set re
1ca0: 73 20 5b 72 62 75 20 62 70 5f 70 72 6f 67 72 65  s [rbu bp_progre
1cb0: 73 73 5d 0a 20 20 20 20 20 20 73 65 74 20 65 78  ss].      set ex
1cc0: 70 65 63 74 20 5b 65 78 70 72 20 28 31 20 2b 20  pect [expr (1 + 
1cd0: 5b 73 65 74 20 69 5d 29 20 2a 20 31 30 30 30 30  [set i]) * 10000
1ce0: 20 2f 20 24 6e 53 74 65 70 5d 0a 20 20 20 20 20   / $nStep].     
1cf0: 20 69 66 20 7b 5b 6c 69 6e 64 65 78 20 5b 73 65   if {[lindex [se
1d00: 74 20 72 65 73 5d 20 31 5d 20 21 3d 20 5b 73 65  t res] 1] != [se
1d10: 74 20 65 78 70 65 63 74 5d 7d 20 7b 0a 20 20 20  t expect]} {.   
1d20: 20 20 20 20 20 65 72 72 6f 72 20 22 48 61 76 65       error "Have
1d30: 20 5b 73 65 74 20 72 65 73 5d 2c 20 65 78 70 65   [set res], expe
1d40: 63 74 65 64 20 31 30 30 30 30 20 5b 73 65 74 20  cted 10000 [set 
1d50: 65 78 70 65 63 74 5d 22 0a 20 20 20 20 20 20 7d  expect]".      }
1d60: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 65 74 20  .    }..    set 
1d70: 72 63 20 5b 72 62 75 20 73 74 65 70 5d 0a 20 20  rc [rbu step].  
1d80: 20 20 69 66 20 7b 5b 73 65 74 20 72 63 5d 20 21    if {[set rc] !
1d90: 3d 20 22 53 51 4c 49 54 45 5f 44 4f 4e 45 22 7d  = "SQLITE_DONE"}
1da0: 20 7b 0a 20 20 20 20 20 20 65 72 72 6f 72 20 22   {.      error "
1db0: 48 61 76 65 20 5b 73 65 74 20 72 63 5d 2c 20 65  Have [set rc], e
1dc0: 78 70 65 63 74 65 64 20 53 51 4c 49 54 45 5f 44  xpected SQLITE_D
1dd0: 4f 4e 45 22 20 0a 20 20 20 20 7d 0a 0a 20 20 20  ONE" .    }..   
1de0: 20 72 62 75 20 63 6c 6f 73 65 0a 20 20 7d 5d 20   rbu close.  }] 
1df0: 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 7d 5d 0a 7d  {SQLITE_DONE}].}
1e00: 0a 0a 66 6f 72 65 61 63 68 20 62 52 65 6f 70 65  ..foreach bReope
1e10: 6e 20 7b 30 20 31 7d 20 7b 0a 20 20 64 6f 5f 74  n {0 1} {.  do_t
1e20: 65 73 74 20 33 2e 24 62 52 65 6f 70 65 6e 2e 31  est 3.$bReopen.1
1e30: 2e 30 20 7b 0a 20 20 20 20 72 65 73 65 74 5f 64  .0 {.    reset_d
1e40: 62 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  b.    execsql {.
1e50: 20 20 20 20 20 20 50 52 41 47 4d 41 20 70 61 67        PRAGMA pag
1e60: 65 5f 73 69 7a 65 20 3d 20 34 30 39 36 3b 0a 20  e_size = 4096;. 
1e70: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
1e80: 45 20 74 31 28 61 20 49 4e 54 45 47 45 52 20 50  E t1(a INTEGER P
1e90: 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a  RIMARY KEY, b);.
1ea0: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
1eb0: 4c 45 20 74 32 28 61 20 49 4e 54 45 47 45 52 20  LE t2(a INTEGER 
1ec0: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b  PRIMARY KEY, b);
1ed0: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
1ee0: 42 4c 45 20 74 33 28 61 20 49 4e 54 45 47 45 52  BLE t3(a INTEGER
1ef0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29   PRIMARY KEY, b)
1f00: 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54  ;.      CREATE T
1f10: 41 42 4c 45 20 74 34 28 61 20 49 4e 54 45 47 45  ABLE t4(a INTEGE
1f20: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  R PRIMARY KEY, b
1f30: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 72 65  );.    }.    cre
1f40: 61 74 65 5f 64 62 5f 66 69 6c 65 20 72 62 75 2e  ate_db_file rbu.
1f50: 64 62 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54  db {.      CREAT
1f60: 45 20 54 41 42 4c 45 20 64 61 74 61 5f 74 31 28  E TABLE data_t1(
1f70: 61 2c 20 62 2c 20 72 62 75 5f 63 6f 6e 74 72 6f  a, b, rbu_contro
1f80: 6c 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45  l);.      CREATE
1f90: 20 54 41 42 4c 45 20 64 61 74 61 5f 74 32 28 61   TABLE data_t2(a
1fa0: 2c 20 62 2c 20 72 62 75 5f 63 6f 6e 74 72 6f 6c  , b, rbu_control
1fb0: 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  );.      CREATE 
1fc0: 54 41 42 4c 45 20 64 61 74 61 5f 74 33 28 61 2c  TABLE data_t3(a,
1fd0: 20 62 2c 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 29   b, rbu_control)
1fe0: 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54  ;.      CREATE T
1ff0: 41 42 4c 45 20 64 61 74 61 5f 74 34 28 61 2c 20  ABLE data_t4(a, 
2000: 62 2c 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 29 3b  b, rbu_control);
2010: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
2020: 54 4f 20 64 61 74 61 5f 74 31 20 56 41 4c 55 45  TO data_t1 VALUE
2030: 53 28 31 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20  S(1, 2, 0);.    
2040: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 61    INSERT INTO da
2050: 74 61 5f 74 32 20 56 41 4c 55 45 53 28 31 2c 20  ta_t2 VALUES(1, 
2060: 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 49 4e 53  2, 0);.      INS
2070: 45 52 54 20 49 4e 54 4f 20 64 61 74 61 5f 74 33  ERT INTO data_t3
2080: 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 30 29   VALUES(1, 2, 0)
2090: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
20a0: 4e 54 4f 20 64 61 74 61 5f 74 34 20 56 41 4c 55  NTO data_t4 VALU
20b0: 45 53 28 31 2c 20 32 2c 20 30 29 3b 0a 20 20 0a  ES(1, 2, 0);.  .
20c0: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
20d0: 4c 45 20 72 62 75 5f 63 6f 75 6e 74 28 74 62 6c  LE rbu_count(tbl
20e0: 2c 20 63 6e 74 29 3b 0a 20 20 20 20 20 20 49 4e  , cnt);.      IN
20f0: 53 45 52 54 20 49 4e 54 4f 20 72 62 75 5f 63 6f  SERT INTO rbu_co
2100: 75 6e 74 20 56 41 4c 55 45 53 28 27 64 61 74 61  unt VALUES('data
2110: 5f 74 31 27 2c 20 31 29 3b 0a 20 20 20 20 20 20  _t1', 1);.      
2120: 49 4e 53 45 52 54 20 49 4e 54 4f 20 72 62 75 5f  INSERT INTO rbu_
2130: 63 6f 75 6e 74 20 56 41 4c 55 45 53 28 27 64 61  count VALUES('da
2140: 74 61 5f 74 32 27 2c 20 31 29 3b 0a 20 20 20 20  ta_t2', 1);.    
2150: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 72 62    INSERT INTO rb
2160: 75 5f 63 6f 75 6e 74 20 56 41 4c 55 45 53 28 27  u_count VALUES('
2170: 64 61 74 61 5f 74 33 27 2c 20 31 29 3b 0a 20 20  data_t3', 1);.  
2180: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2190: 72 62 75 5f 63 6f 75 6e 74 20 56 41 4c 55 45 53  rbu_count VALUES
21a0: 28 27 64 61 74 61 5f 74 34 27 2c 20 31 29 3b 0a  ('data_t4', 1);.
21b0: 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64      }.  } {}.  d
21c0: 6f 5f 70 68 61 73 65 32 5f 74 65 73 74 20 33 2e  o_phase2_test 3.
21d0: 24 62 52 65 6f 70 65 6e 2e 31 2e 31 20 24 62 52  $bReopen.1.1 $bR
21e0: 65 6f 70 65 6e 20 74 65 73 74 2e 64 62 20 72 62  eopen test.db rb
21f0: 75 2e 64 62 20 35 0a 7d 0a 0a 0a 66 6f 72 65 61  u.db 5.}...forea
2200: 63 68 20 7b 62 52 65 6f 70 65 6e 7d 20 7b 20 30  ch {bReopen} { 0
2210: 20 31 20 7d 20 7b 0a 20 20 66 6f 72 65 61 63 68   1 } {.  foreach
2220: 20 7b 74 6e 20 74 62 6c 7d 20 7b 0a 20 20 20 20   {tn tbl} {.    
2230: 69 70 6b 20 7b 20 43 52 45 41 54 45 20 54 41 42  ipk { CREATE TAB
2240: 4c 45 20 74 31 28 61 20 49 4e 54 45 47 45 52 20  LE t1(a INTEGER 
2250: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 2c 20  PRIMARY KEY, b, 
2260: 63 29 20 7d 0a 20 20 20 20 77 72 20 20 7b 20 43  c) }.    wr  { C
2270: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
2280: 20 49 4e 54 20 50 52 49 4d 41 52 59 20 4b 45 59   INT PRIMARY KEY
2290: 2c 20 62 2c 20 63 29 20 57 49 54 48 4f 55 54 20  , b, c) WITHOUT 
22a0: 52 4f 57 49 44 20 7d 0a 20 20 20 20 70 6b 20 20  ROWID }.    pk  
22b0: 7b 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74  { CREATE TABLE t
22c0: 31 28 61 20 49 4e 54 20 50 52 49 4d 41 52 59 20  1(a INT PRIMARY 
22d0: 4b 45 59 2c 20 62 2c 20 63 29 20 7d 0a 20 20 7d  KEY, b, c) }.  }
22e0: 20 7b 0a 0a 20 20 20 20 66 6f 72 65 61 63 68 20   {..    foreach 
22f0: 7b 74 6e 32 20 72 62 75 73 71 6c 20 72 31 20 72  {tn2 rbusql r1 r
2300: 33 7d 20 7b 0a 20 20 20 20 20 20 31 20 7b 0a 20  3} {.      1 {. 
2310: 20 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41         CREATE TA
2320: 42 4c 45 20 64 61 74 61 30 5f 74 31 28 61 2c 20  BLE data0_t1(a, 
2330: 62 2c 20 63 2c 20 72 62 75 5f 63 6f 6e 74 72 6f  b, c, rbu_contro
2340: 6c 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45  l);.        INSE
2350: 52 54 20 49 4e 54 4f 20 64 61 74 61 30 5f 74 31  RT INTO data0_t1
2360: 20 56 41 4c 55 45 53 28 31 35 2c 20 31 35 2c 20   VALUES(15, 15, 
2370: 31 35 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  15, 0);.        
2380: 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 61 74 61  INSERT INTO data
2390: 30 5f 74 31 20 56 41 4c 55 45 53 28 32 30 2c 20  0_t1 VALUES(20, 
23a0: 32 30 2c 20 32 30 2c 20 30 29 3b 0a 20 20 20 20  20, 20, 0);.    
23b0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
23c0: 20 72 62 75 5f 63 6f 75 6e 74 28 74 62 6c 2c 20   rbu_count(tbl, 
23d0: 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 49 4e  cnt);.        IN
23e0: 53 45 52 54 20 49 4e 54 4f 20 72 62 75 5f 63 6f  SERT INTO rbu_co
23f0: 75 6e 74 20 56 41 4c 55 45 53 28 27 64 61 74 61  unt VALUES('data
2400: 30 5f 74 31 27 2c 20 32 29 3b 20 0a 20 20 20 20  0_t1', 2); .    
2410: 20 20 7d 20 0a 20 20 20 20 20 20 7b 32 35 30 30    } .      {2500
2420: 20 35 30 30 30 20 37 35 30 30 20 31 30 30 30 30   5000 7500 10000
2430: 7d 0a 20 20 20 20 20 20 7b 31 36 36 36 20 33 33  }.      {1666 33
2440: 33 33 20 35 30 30 30 20 36 36 36 36 20 38 33 33  33 5000 6666 833
2450: 33 20 31 30 30 30 30 7d 0a 0a 20 20 20 20 20 20  3 10000}..      
2460: 32 20 7b 0a 20 20 20 20 20 20 20 20 43 52 45 41  2 {.        CREA
2470: 54 45 20 54 41 42 4c 45 20 64 61 74 61 30 5f 74  TE TABLE data0_t
2480: 31 28 61 2c 20 62 2c 20 63 2c 20 72 62 75 5f 63  1(a, b, c, rbu_c
2490: 6f 6e 74 72 6f 6c 29 3b 0a 20 20 20 20 20 20 20  ontrol);.       
24a0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 61 74   INSERT INTO dat
24b0: 61 30 5f 74 31 20 56 41 4c 55 45 53 28 31 30 2c  a0_t1 VALUES(10,
24c0: 20 31 30 2c 20 31 30 2c 20 32 29 3b 0a 20 20 20   10, 10, 2);.   
24d0: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
24e0: 45 20 72 62 75 5f 63 6f 75 6e 74 28 74 62 6c 2c  E rbu_count(tbl,
24f0: 20 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 49   cnt);.        I
2500: 4e 53 45 52 54 20 49 4e 54 4f 20 72 62 75 5f 63  NSERT INTO rbu_c
2510: 6f 75 6e 74 20 56 41 4c 55 45 53 28 27 64 61 74  ount VALUES('dat
2520: 61 30 5f 74 31 27 2c 20 31 29 3b 20 0a 20 20 20  a0_t1', 1); .   
2530: 20 20 20 7d 20 0a 20 20 20 20 20 20 7b 33 33 33     } .      {333
2540: 33 20 36 36 36 36 20 31 30 30 30 30 7d 0a 20 20  3 6666 10000}.  
2550: 20 20 20 20 7b 32 30 30 30 20 34 30 30 30 20 36      {2000 4000 6
2560: 30 30 30 20 38 30 30 30 20 31 30 30 30 30 7d 0a  000 8000 10000}.
2570: 0a 20 20 20 20 20 20 33 20 7b 0a 20 20 20 20 20  .      3 {.     
2580: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
2590: 64 61 74 61 30 5f 74 31 28 61 2c 20 62 2c 20 63  data0_t1(a, b, c
25a0: 2c 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 29 3b 0a  , rbu_control);.
25b0: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
25c0: 4e 54 4f 20 64 61 74 61 30 5f 74 31 20 56 41 4c  NTO data0_t1 VAL
25d0: 55 45 53 28 37 2c 20 37 2c 20 37 2c 20 32 29 3b  UES(7, 7, 7, 2);
25e0: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
25f0: 49 4e 54 4f 20 64 61 74 61 30 5f 74 31 20 56 41  INTO data0_t1 VA
2600: 4c 55 45 53 28 31 30 2c 20 31 30 2c 20 31 30 2c  LUES(10, 10, 10,
2610: 20 32 29 3b 0a 20 20 20 20 20 20 20 20 43 52 45   2);.        CRE
2620: 41 54 45 20 54 41 42 4c 45 20 72 62 75 5f 63 6f  ATE TABLE rbu_co
2630: 75 6e 74 28 74 62 6c 2c 20 63 6e 74 29 3b 0a 20  unt(tbl, cnt);. 
2640: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
2650: 54 4f 20 72 62 75 5f 63 6f 75 6e 74 20 56 41 4c  TO rbu_count VAL
2660: 55 45 53 28 27 64 61 74 61 30 5f 74 31 27 2c 20  UES('data0_t1', 
2670: 32 29 3b 20 0a 20 20 20 20 20 20 7d 20 0a 20 20  2); .      } .  
2680: 20 20 20 20 7b 32 35 30 30 20 34 30 30 30 20 36      {2500 4000 6
2690: 30 30 30 20 38 30 30 30 20 31 30 30 30 30 7d 0a  000 8000 10000}.
26a0: 20 20 20 20 20 20 7b 31 36 36 36 20 32 35 30 30        {1666 2500
26b0: 20 33 37 35 30 20 35 30 30 30 20 36 32 35 30 20   3750 5000 6250 
26c0: 37 35 30 30 20 38 37 35 30 20 31 30 30 30 30 7d  7500 8750 10000}
26d0: 0a 0a 20 20 20 20 7d 20 7b 0a 0a 20 20 20 20 20  ..    } {..     
26e0: 20 72 65 73 65 74 5f 64 62 20 3b 20 65 78 65 63   reset_db ; exec
26f0: 73 71 6c 20 24 74 62 6c 0a 20 20 20 20 20 20 64  sql $tbl.      d
2700: 6f 5f 74 65 73 74 20 34 2e 24 74 6e 2e 24 62 52  o_test 4.$tn.$bR
2710: 65 6f 70 65 6e 2e 24 74 6e 32 2e 30 20 7b 0a 20  eopen.$tn2.0 {. 
2720: 20 20 20 20 20 20 20 65 78 65 63 73 71 6c 20 7b         execsql {
2730: 0a 20 20 20 20 20 20 20 20 20 20 43 52 45 41 54  .          CREAT
2740: 45 20 49 4e 44 45 58 20 74 31 63 20 4f 4e 20 74  E INDEX t1c ON t
2750: 31 28 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20  1(c);.          
2760: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
2770: 41 4c 55 45 53 28 31 2c 20 31 2c 20 31 29 3b 0a  ALUES(1, 1, 1);.
2780: 20 20 20 20 20 20 20 20 20 20 49 4e 53 45 52 54            INSERT
2790: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
27a0: 35 2c 20 35 2c 20 35 29 3b 0a 20 20 20 20 20 20  5, 5, 5);.      
27b0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
27c0: 74 31 20 56 41 4c 55 45 53 28 31 30 2c 20 31 30  t1 VALUES(10, 10
27d0: 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  , 10);.        }
27e0: 0a 20 20 20 20 20 20 20 20 63 72 65 61 74 65 5f  .        create_
27f0: 64 62 5f 66 69 6c 65 20 72 62 75 2e 64 62 20 24  db_file rbu.db $
2800: 72 62 75 73 71 6c 0a 20 20 20 20 20 20 7d 20 7b  rbusql.      } {
2810: 7d 0a 0a 20 20 20 20 20 20 73 65 74 20 52 28 69  }..      set R(i
2820: 70 6b 29 20 24 72 31 0a 20 20 20 20 20 20 73 65  pk) $r1.      se
2830: 74 20 52 28 77 72 29 20 24 72 31 0a 20 20 20 20  t R(wr) $r1.    
2840: 20 20 73 65 74 20 52 28 70 6b 29 20 24 72 33 0a    set R(pk) $r3.
2850: 20 20 20 20 20 20 64 6f 5f 73 70 5f 74 65 73 74        do_sp_test
2860: 20 34 2e 24 74 6e 2e 24 62 52 65 6f 70 65 6e 2e   4.$tn.$bReopen.
2870: 24 74 6e 32 2e 31 20 24 62 52 65 6f 70 65 6e 20  $tn2.1 $bReopen 
2880: 74 65 73 74 2e 64 62 20 72 62 75 2e 64 62 20 24  test.db rbu.db $
2890: 52 28 24 74 6e 29 0a 20 20 20 20 7d 0a 20 20 7d  R($tn).    }.  }
28a0: 0a 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 62 52 65  .}..foreach {bRe
28b0: 6f 70 65 6e 7d 20 7b 20 30 20 31 20 7d 20 7b 0a  open} { 0 1 } {.
28c0: 20 20 66 6f 72 65 61 63 68 20 7b 74 6e 20 74 62    foreach {tn tb
28d0: 6c 7d 20 7b 0a 20 20 20 20 6e 6f 70 6b 20 7b 20  l} {.    nopk { 
28e0: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
28f0: 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63 29 3b  BLE t1(a, b, c);
2900: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 49 4e  .      CREATE IN
2910: 44 45 58 20 74 31 63 20 4f 4e 20 74 31 28 63 29  DEX t1c ON t1(c)
2920: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76 74 61 62  ;.    }.    vtab
2930: 20 7b 20 0a 20 20 20 20 20 20 43 52 45 41 54 45   { .      CREATE
2940: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74   VIRTUAL TABLE t
2950: 31 20 55 53 49 4e 47 20 66 74 73 35 28 61 2c 20  1 USING fts5(a, 
2960: 62 2c 20 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  b, c);.    }.  }
2970: 20 7b 0a 0a 20 20 20 20 69 66 20 7b 24 74 6e 3d   {..    if {$tn=
2980: 3d 22 76 74 61 62 22 7d 20 7b 20 69 66 63 61 70  ="vtab"} { ifcap
2990: 61 62 6c 65 20 21 66 74 73 35 20 62 72 65 61 6b  able !fts5 break
29a0: 20 7d 0a 0a 20 20 20 20 66 6f 72 65 61 63 68 20   }..    foreach 
29b0: 7b 74 6e 32 20 72 62 75 73 71 6c 20 72 31 20 72  {tn2 rbusql r1 r
29c0: 32 7d 20 7b 0a 20 20 20 20 20 20 31 20 7b 0a 20  2} {.      1 {. 
29d0: 20 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41         CREATE TA
29e0: 42 4c 45 20 64 61 74 61 30 5f 74 31 28 61 2c 20  BLE data0_t1(a, 
29f0: 62 2c 20 63 2c 20 72 62 75 5f 72 6f 77 69 64 2c  b, c, rbu_rowid,
2a00: 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 29 3b 0a 20   rbu_control);. 
2a10: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
2a20: 54 4f 20 64 61 74 61 30 5f 74 31 20 56 41 4c 55  TO data0_t1 VALU
2a30: 45 53 28 31 35 2c 20 31 35 2c 20 31 35 2c 20 34  ES(15, 15, 15, 4
2a40: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 49 4e  , 0);.        IN
2a50: 53 45 52 54 20 49 4e 54 4f 20 64 61 74 61 30 5f  SERT INTO data0_
2a60: 74 31 20 56 41 4c 55 45 53 28 32 30 2c 20 32 30  t1 VALUES(20, 20
2a70: 2c 20 32 30 2c 20 35 2c 20 30 29 3b 0a 20 20 20  , 20, 5, 0);.   
2a80: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
2a90: 45 20 72 62 75 5f 63 6f 75 6e 74 28 74 62 6c 2c  E rbu_count(tbl,
2aa0: 20 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 49   cnt);.        I
2ab0: 4e 53 45 52 54 20 49 4e 54 4f 20 72 62 75 5f 63  NSERT INTO rbu_c
2ac0: 6f 75 6e 74 20 56 41 4c 55 45 53 28 27 64 61 74  ount VALUES('dat
2ad0: 61 30 5f 74 31 27 2c 20 32 29 3b 20 0a 20 20 20  a0_t1', 2); .   
2ae0: 20 20 20 7d 20 0a 20 20 20 20 20 20 7b 32 35 30     } .      {250
2af0: 30 20 35 30 30 30 20 37 35 30 30 20 31 30 30 30  0 5000 7500 1000
2b00: 30 7d 0a 20 20 20 20 20 20 7b 35 30 30 30 20 31  0}.      {5000 1
2b10: 30 30 30 30 7d 0a 0a 20 20 20 20 20 20 32 20 7b  0000}..      2 {
2b20: 0a 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20  .        CREATE 
2b30: 54 41 42 4c 45 20 64 61 74 61 30 5f 74 31 28 72  TABLE data0_t1(r
2b40: 62 75 5f 72 6f 77 69 64 2c 20 61 2c 20 62 2c 20  bu_rowid, a, b, 
2b50: 63 2c 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 29 3b  c, rbu_control);
2b60: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
2b70: 49 4e 54 4f 20 64 61 74 61 30 5f 74 31 20 56 41  INTO data0_t1 VA
2b80: 4c 55 45 53 28 30 2c 20 37 2c 20 37 2c 20 37 2c  LUES(0, 7, 7, 7,
2b90: 20 32 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53   2);.        INS
2ba0: 45 52 54 20 49 4e 54 4f 20 64 61 74 61 30 5f 74  ERT INTO data0_t
2bb0: 31 20 56 41 4c 55 45 53 28 32 2c 20 31 30 2c 20  1 VALUES(2, 10, 
2bc0: 31 30 2c 20 31 30 2c 20 32 29 3b 0a 20 20 20 20  10, 10, 2);.    
2bd0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
2be0: 20 72 62 75 5f 63 6f 75 6e 74 28 74 62 6c 2c 20   rbu_count(tbl, 
2bf0: 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 49 4e  cnt);.        IN
2c00: 53 45 52 54 20 49 4e 54 4f 20 72 62 75 5f 63 6f  SERT INTO rbu_co
2c10: 75 6e 74 20 56 41 4c 55 45 53 28 27 64 61 74 61  unt VALUES('data
2c20: 30 5f 74 31 27 2c 20 32 29 3b 20 0a 20 20 20 20  0_t1', 2); .    
2c30: 20 20 7d 20 0a 20 20 20 20 20 20 7b 32 35 30 30    } .      {2500
2c40: 20 34 30 30 30 20 36 30 30 30 20 38 30 30 30 20   4000 6000 8000 
2c50: 31 30 30 30 30 7d 0a 20 20 20 20 20 20 7b 35 30  10000}.      {50
2c60: 30 30 20 31 30 30 30 30 7d 0a 0a 20 20 20 20 20  00 10000}..     
2c70: 20 33 20 7b 0a 20 20 20 20 20 20 20 20 43 52 45   3 {.        CRE
2c80: 41 54 45 20 54 41 42 4c 45 20 64 61 74 61 30 5f  ATE TABLE data0_
2c90: 74 31 28 72 62 75 5f 72 6f 77 69 64 2c 20 61 2c  t1(rbu_rowid, a,
2ca0: 20 62 2c 20 63 2c 20 72 62 75 5f 63 6f 6e 74 72   b, c, rbu_contr
2cb0: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53  ol);.        INS
2cc0: 45 52 54 20 49 4e 54 4f 20 64 61 74 61 30 5f 74  ERT INTO data0_t
2cd0: 31 20 56 41 4c 55 45 53 28 31 2c 20 4e 55 4c 4c  1 VALUES(1, NULL
2ce0: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 31 29  , NULL, NULL, 1)
2cf0: 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  ;.        INSERT
2d00: 20 49 4e 54 4f 20 64 61 74 61 30 5f 74 31 20 56   INTO data0_t1 V
2d10: 41 4c 55 45 53 28 32 2c 20 4e 55 4c 4c 2c 20 4e  ALUES(2, NULL, N
2d20: 55 4c 4c 2c 20 37 2c 20 27 2e 2e 78 27 29 3b 0a  ULL, 7, '..x');.
2d30: 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20 54          CREATE T
2d40: 41 42 4c 45 20 72 62 75 5f 63 6f 75 6e 74 28 74  ABLE rbu_count(t
2d50: 62 6c 2c 20 63 6e 74 29 3b 0a 20 20 20 20 20 20  bl, cnt);.      
2d60: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 72 62    INSERT INTO rb
2d70: 75 5f 63 6f 75 6e 74 20 56 41 4c 55 45 53 28 27  u_count VALUES('
2d80: 64 61 74 61 30 5f 74 31 27 2c 20 32 29 3b 20 0a  data0_t1', 2); .
2d90: 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7b        } .      {
2da0: 32 35 30 30 20 34 30 30 30 20 36 30 30 30 20 38  2500 4000 6000 8
2db0: 30 30 30 20 31 30 30 30 30 7d 0a 20 20 20 20 20  000 10000}.     
2dc0: 20 7b 35 30 30 30 20 31 30 30 30 30 7d 0a 20 20   {5000 10000}.  
2dd0: 20 20 7d 20 7b 0a 0a 20 20 20 20 20 20 72 65 73    } {..      res
2de0: 65 74 5f 64 62 20 3b 20 65 78 65 63 73 71 6c 20  et_db ; execsql 
2df0: 24 74 62 6c 0a 20 20 20 20 20 20 64 6f 5f 74 65  $tbl.      do_te
2e00: 73 74 20 35 2e 24 74 6e 2e 24 62 52 65 6f 70 65  st 5.$tn.$bReope
2e10: 6e 2e 24 74 6e 32 2e 30 20 7b 0a 20 20 20 20 20  n.$tn2.0 {.     
2e20: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
2e30: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
2e40: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
2e50: 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  1, 1);.         
2e60: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
2e70: 56 41 4c 55 45 53 28 35 2c 20 35 2c 20 35 29 3b  VALUES(5, 5, 5);
2e80: 0a 20 20 20 20 20 20 20 20 20 20 49 4e 53 45 52  .          INSER
2e90: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
2ea0: 28 31 30 2c 20 31 30 2c 20 31 30 29 3b 0a 20 20  (10, 10, 10);.  
2eb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2ec0: 63 72 65 61 74 65 5f 64 62 5f 66 69 6c 65 20 72  create_db_file r
2ed0: 62 75 2e 64 62 20 24 72 62 75 73 71 6c 0a 20 20  bu.db $rbusql.  
2ee0: 20 20 20 20 7d 20 7b 7d 0a 0a 20 20 20 20 20 20      } {}..      
2ef0: 73 65 74 20 52 28 6e 6f 70 6b 29 20 24 72 31 0a  set R(nopk) $r1.
2f00: 20 20 20 20 20 20 73 65 74 20 52 28 76 74 61 62        set R(vtab
2f10: 29 20 24 72 32 0a 20 20 20 20 20 20 64 6f 5f 73  ) $r2.      do_s
2f20: 70 5f 74 65 73 74 20 35 2e 24 74 6e 2e 24 62 52  p_test 5.$tn.$bR
2f30: 65 6f 70 65 6e 2e 24 74 6e 32 2e 31 20 24 62 52  eopen.$tn2.1 $bR
2f40: 65 6f 70 65 6e 20 74 65 73 74 2e 64 62 20 72 62  eopen test.db rb
2f50: 75 2e 64 62 20 24 52 28 24 74 6e 29 0a 20 20 20  u.db $R($tn).   
2f60: 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 66 69 6e 69 73   }.  }.}...finis
2f70: 68 5f 74 65 73 74 0a                             h_test.