/ Hex Artifact Content
Login

Artifact 5fb139058f37ddc5a113c5b93238de915b769b7792de41b44c983bc7c18cf5b9:


0000: 23 20 32 30 31 38 20 4a 61 6e 75 61 72 79 20 31  # 2018 January 1
0010: 31 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72  1.#.# The author
0020: 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72   disclaims copyr
0030: 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75  ight to this sou
0040: 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c  rce code.  In pl
0050: 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c  ace of.# a legal
0060: 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73   notice, here is
0070: 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23   a blessing:.#.#
0080: 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67      May you do g
0090: 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c  ood and not evil
00a0: 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66  ..#    May you f
00b0: 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20  ind forgiveness 
00c0: 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64  for yourself and
00d0: 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e   forgive others.
00e0: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68  .#    May you sh
00f0: 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65  are freely, neve
0100: 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68  r taking more th
0110: 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23  an 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 2a 2a 0a 23 0a 23 20 54 68 69 73  *******.#.# This
0170: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0180: 65 73 74 73 20 6f 66 20 6d 75 6c 74 69 70 6c 65  ests of multiple
0190: 20 52 42 55 20 6f 70 65 72 61 74 69 6f 6e 73 20   RBU operations 
01a0: 72 75 6e 6e 69 6e 67 0a 23 20 63 6f 6e 63 75 72  running.# concur
01b0: 72 65 6e 74 6c 79 20 77 69 74 68 69 6e 20 74 68  rently within th
01c0: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20  e same process. 
01d0: 0a 23 0a 0a 73 6f 75 72 63 65 20 5b 66 69 6c 65  .#..source [file
01e0: 20 6a 6f 69 6e 20 5b 66 69 6c 65 20 64 69 72 6e   join [file dirn
01f0: 61 6d 65 20 5b 69 6e 66 6f 20 73 63 72 69 70 74  ame [info script
0200: 5d 5d 20 72 62 75 5f 63 6f 6d 6d 6f 6e 2e 74 63  ]] rbu_common.tc
0210: 6c 5d 0a 73 65 74 20 3a 3a 74 65 73 74 70 72 65  l].set ::testpre
0220: 66 69 78 20 72 62 75 6d 75 6c 74 69 0a 0a 64 62  fix rbumulti..db
0230: 20 63 6c 6f 73 65 0a 73 71 6c 69 74 65 33 5f 73   close.sqlite3_s
0240: 68 75 74 64 6f 77 6e 0a 73 71 6c 69 74 65 33 5f  hutdown.sqlite3_
0250: 63 6f 6e 66 69 67 5f 75 72 69 20 31 0a 0a 61 75  config_uri 1..au
0260: 74 6f 69 6e 73 74 61 6c 6c 5f 74 65 73 74 5f 66  toinstall_test_f
0270: 75 6e 63 74 69 6f 6e 73 0a 0a 70 72 6f 63 20 62  unctions..proc b
0280: 75 69 6c 64 5f 64 62 20 7b 64 62 7d 20 7b 0a 20  uild_db {db} {. 
0290: 20 24 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20   $db eval {.    
02a0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
02b0: 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  a PRIMARY KEY, b
02c0: 2c 20 63 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , c);.    CREATE
02d0: 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
02e0: 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49  b);.    CREATE I
02f0: 4e 44 45 58 20 69 32 20 4f 4e 20 74 31 28 63 29  NDEX i2 ON t1(c)
0300: 3b 0a 0a 20 20 20 20 57 49 54 48 20 73 28 69 29  ;..    WITH s(i)
0310: 20 41 53 20 28 20 53 45 4c 45 43 54 20 31 20 55   AS ( SELECT 1 U
0320: 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20  NION ALL SELECT 
0330: 69 2b 31 20 46 52 4f 4d 20 73 20 57 48 45 52 45  i+1 FROM s WHERE
0340: 20 69 3c 35 30 30 20 29 0a 20 20 20 20 49 4e 53   i<500 ).    INS
0350: 45 52 54 20 49 4e 54 4f 20 74 31 20 0a 20 20 20  ERT INTO t1 .   
0360: 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
0370: 6f 62 28 31 30 29 2c 20 72 61 6e 64 6f 6d 62 6c  ob(10), randombl
0380: 6f 62 28 31 30 30 29 2c 20 72 61 6e 64 6f 6d 62  ob(100), randomb
0390: 6c 6f 62 28 31 30 30 29 20 46 52 4f 4d 20 73 3b  lob(100) FROM s;
03a0: 0a 20 20 7d 0a 7d 0a 0a 70 72 6f 63 20 62 75 69  .  }.}..proc bui
03b0: 6c 64 5f 72 62 75 20 7b 64 62 7d 20 7b 0a 20 20  ld_rbu {db} {.  
03c0: 24 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20 43  $db eval {.    C
03d0: 52 45 41 54 45 20 54 41 42 4c 45 20 64 61 74 61  REATE TABLE data
03e0: 5f 74 31 28 61 2c 20 62 2c 20 63 2c 20 72 62 75  _t1(a, b, c, rbu
03f0: 5f 63 6f 6e 74 72 6f 6c 29 3b 0a 20 20 20 20 57  _control);.    W
0400: 49 54 48 20 73 28 69 29 20 41 53 20 28 20 53 45  ITH s(i) AS ( SE
0410: 4c 45 43 54 20 31 20 55 4e 49 4f 4e 20 41 4c 4c  LECT 1 UNION ALL
0420: 20 53 45 4c 45 43 54 20 69 2b 31 20 46 52 4f 4d   SELECT i+1 FROM
0430: 20 73 20 57 48 45 52 45 20 69 3c 31 30 30 20 29   s WHERE i<100 )
0440: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
0450: 20 64 61 74 61 5f 74 31 20 0a 20 20 20 20 53 45   data_t1 .    SE
0460: 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
0470: 31 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  10), randomblob(
0480: 31 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  100), randomblob
0490: 28 31 30 30 29 2c 20 30 20 46 52 4f 4d 20 73 3b  (100), 0 FROM s;
04a0: 0a 20 20 7d 0a 7d 0a 0a 70 72 6f 63 20 73 74 65  .  }.}..proc ste
04b0: 70 5f 72 62 75 32 20 7b 62 4f 70 65 6e 43 6c 6f  p_rbu2 {bOpenClo
04c0: 73 65 20 6f 70 65 6e 72 31 20 6f 70 65 6e 72 32  se openr1 openr2
04d0: 7d 20 7b 0a 0a 20 20 66 6f 72 63 65 64 65 6c 65  } {..  forcedele
04e0: 74 65 20 74 65 73 74 73 74 61 74 65 2e 64 62 31  te teststate.db1
04f0: 0a 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20 74  .  forcedelete t
0500: 65 73 74 73 74 61 74 65 2e 64 62 32 0a 0a 20 20  eststate.db2..  
0510: 69 66 20 7b 24 62 4f 70 65 6e 43 6c 6f 73 65 21  if {$bOpenClose!
0520: 3d 30 20 26 26 20 24 62 4f 70 65 6e 43 6c 6f 73  =0 && $bOpenClos
0530: 65 21 3d 31 7d 20 7b 20 65 72 72 6f 72 20 24 62  e!=1} { error $b
0540: 4f 70 65 6e 43 6c 6f 73 65 20 7d 0a 20 20 69 66  OpenClose }.  if
0550: 20 7b 24 62 4f 70 65 6e 43 6c 6f 73 65 3d 3d 30   {$bOpenClose==0
0560: 7d 20 7b 0a 20 20 20 20 65 76 61 6c 20 24 6f 70  } {.    eval $op
0570: 65 6e 72 31 20 0a 20 20 20 20 65 76 61 6c 20 24  enr1 .    eval $
0580: 6f 70 65 6e 72 32 20 0a 20 20 7d 0a 0a 20 20 73  openr2 .  }..  s
0590: 65 74 20 62 31 20 30 0a 20 20 73 65 74 20 62 32  et b1 0.  set b2
05a0: 20 30 0a 0a 20 20 77 68 69 6c 65 20 7b 24 62 31   0..  while {$b1
05b0: 3d 3d 30 20 7c 7c 20 24 62 32 3d 3d 30 7d 20 7b  ==0 || $b2==0} {
05c0: 0a 20 20 20 20 69 66 20 7b 24 62 4f 70 65 6e 43  .    if {$bOpenC
05d0: 6c 6f 73 65 3d 3d 31 7d 20 7b 0a 20 20 20 20 20  lose==1} {.     
05e0: 20 69 66 20 7b 24 62 31 3d 3d 30 7d 20 7b 20 65   if {$b1==0} { e
05f0: 76 61 6c 20 24 6f 70 65 6e 72 31 20 74 65 73 74  val $openr1 test
0600: 73 74 61 74 65 2e 64 62 31 20 7d 0a 20 20 20 20  state.db1 }.    
0610: 20 20 69 66 20 7b 24 62 32 3d 3d 30 7d 20 7b 20    if {$b2==0} { 
0620: 65 76 61 6c 20 24 6f 70 65 6e 72 32 20 74 65 73  eval $openr2 tes
0630: 74 73 74 61 74 65 2e 64 62 32 20 7d 0a 20 20 20  tstate.db2 }.   
0640: 20 7d 0a 20 20 20 20 69 66 20 7b 24 62 31 3d 3d   }.    if {$b1==
0650: 30 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20 72  0} {.      set r
0660: 63 31 20 5b 72 31 20 73 74 65 70 5d 0a 20 20 20  c1 [r1 step].   
0670: 20 20 20 69 66 20 7b 24 72 63 31 20 21 3d 20 22     if {$rc1 != "
0680: 53 51 4c 49 54 45 5f 4f 4b 22 7d 20 7b 20 73 65  SQLITE_OK"} { se
0690: 74 20 62 31 20 31 20 7d 0a 20 20 20 20 7d 0a 20  t b1 1 }.    }. 
06a0: 20 20 20 69 66 20 7b 24 62 32 3d 3d 30 7d 20 7b     if {$b2==0} {
06b0: 0a 20 20 20 20 20 20 73 65 74 20 72 63 32 20 5b  .      set rc2 [
06c0: 72 32 20 73 74 65 70 5d 0a 20 20 20 20 20 20 69  r2 step].      i
06d0: 66 20 7b 24 72 63 32 20 21 3d 20 22 53 51 4c 49  f {$rc2 != "SQLI
06e0: 54 45 5f 4f 4b 22 7d 20 7b 20 73 65 74 20 62 32  TE_OK"} { set b2
06f0: 20 31 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69   1 }.    }.    i
0700: 66 20 7b 24 62 4f 70 65 6e 43 6c 6f 73 65 3d 3d  f {$bOpenClose==
0710: 31 7d 20 7b 0a 20 20 20 20 20 20 69 66 20 7b 24  1} {.      if {$
0720: 62 31 3d 3d 30 7d 20 7b 20 72 31 20 63 6c 6f 73  b1==0} { r1 clos
0730: 65 20 7d 0a 20 20 20 20 20 20 69 66 20 7b 24 62  e }.      if {$b
0740: 32 3d 3d 30 7d 20 7b 20 72 32 20 63 6c 6f 73 65  2==0} { r2 close
0750: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
0760: 73 65 74 20 72 63 31 20 5b 72 31 20 63 6c 6f 73  set rc1 [r1 clos
0770: 65 5d 0a 20 20 73 65 74 20 72 63 32 20 5b 72 32  e].  set rc2 [r2
0780: 20 63 6c 6f 73 65 5d 0a 0a 20 20 6c 69 73 74 20   close]..  list 
0790: 24 72 63 31 20 24 72 63 32 0a 7d 0a 0a 0a 66 6f  $rc1 $rc2.}...fo
07a0: 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 3c  r {set i 0} {$i<
07b0: 3d 33 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 0a  =3} {incr i} {..
07c0: 20 20 69 66 20 7b 24 69 20 26 20 30 78 30 31 7d    if {$i & 0x01}
07d0: 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 72 62   {.    sqlite3rb
07e0: 75 5f 63 72 65 61 74 65 5f 76 66 73 20 2d 64 65  u_create_vfs -de
07f0: 66 61 75 6c 74 20 6d 79 72 62 75 20 22 22 0a 20  fault myrbu "". 
0800: 20 7d 0a 20 20 73 65 74 20 62 4f 70 65 6e 43 6c   }.  set bOpenCl
0810: 6f 73 65 20 5b 65 78 70 72 20 24 69 3e 3e 31 5d  ose [expr $i>>1]
0820: 0a 0a 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20  ..  forcedelete 
0830: 74 65 73 74 2e 64 62 0a 20 20 66 6f 72 63 65 64  test.db.  forced
0840: 65 6c 65 74 65 20 74 65 73 74 2e 64 62 32 0a 20  elete test.db2. 
0850: 20 66 6f 72 63 65 64 65 6c 65 74 65 20 72 62 75   forcedelete rbu
0860: 2e 64 62 0a 20 20 66 6f 72 63 65 64 65 6c 65 74  .db.  forcedelet
0870: 65 20 72 62 75 2e 64 62 32 0a 20 20 0a 20 20 64  e rbu.db2.  .  d
0880: 6f 5f 74 65 73 74 20 31 2e 24 69 2e 30 20 7b 0a  o_test 1.$i.0 {.
0890: 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 20 74      sqlite3 db t
08a0: 65 73 74 2e 64 62 0a 20 20 20 20 73 71 6c 69 74  est.db.    sqlit
08b0: 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 32 0a  e3 db2 test.db2.
08c0: 20 20 20 20 62 75 69 6c 64 5f 64 62 20 64 62 0a      build_db db.
08d0: 20 20 20 20 62 75 69 6c 64 5f 64 62 20 64 62 32      build_db db2
08e0: 0a 20 20 0a 20 20 20 20 73 71 6c 69 74 65 33 20  .  .    sqlite3 
08f0: 72 62 75 31 20 72 62 75 2e 64 62 0a 20 20 20 20  rbu1 rbu.db.    
0900: 73 71 6c 69 74 65 33 20 72 62 75 32 20 72 62 75  sqlite3 rbu2 rbu
0910: 2e 64 62 32 0a 20 20 0a 20 20 20 20 62 75 69 6c  .db2.  .    buil
0920: 64 5f 72 62 75 20 72 62 75 31 0a 20 20 20 20 62  d_rbu rbu1.    b
0930: 75 69 6c 64 5f 72 62 75 20 72 62 75 32 0a 20 20  uild_rbu rbu2.  
0940: 0a 20 20 20 20 72 62 75 31 20 63 6c 6f 73 65 0a  .    rbu1 close.
0950: 20 20 20 20 72 62 75 32 20 63 6c 6f 73 65 0a 20      rbu2 close. 
0960: 20 7d 20 7b 7d 0a 0a 20 20 73 65 74 20 6d 31 20   } {}..  set m1 
0970: 5b 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54  [db eval {SELECT
0980: 20 6d 64 35 73 75 6d 28 61 2c 20 62 2c 20 63 29   md5sum(a, b, c)
0990: 20 46 52 4f 4d 20 74 31 7d 5d 0a 20 20 73 65 74   FROM t1}].  set
09a0: 20 6d 32 20 5b 64 62 32 20 65 76 61 6c 20 7b 53   m2 [db2 eval {S
09b0: 45 4c 45 43 54 20 6d 64 35 73 75 6d 28 61 2c 20  ELECT md5sum(a, 
09c0: 62 2c 20 63 29 20 46 52 4f 4d 20 74 31 7d 5d 0a  b, c) FROM t1}].
09d0: 20 20 0a 20 20 64 6f 5f 74 65 73 74 20 31 2e 24    .  do_test 1.$
09e0: 69 2e 31 20 7b 0a 20 20 20 20 73 74 65 70 5f 72  i.1 {.    step_r
09f0: 62 75 32 20 24 62 4f 70 65 6e 43 6c 6f 73 65 20  bu2 $bOpenClose 
0a00: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 72  {.      sqlite3r
0a10: 62 75 20 72 31 20 74 65 73 74 2e 64 62 20 72 62  bu r1 test.db rb
0a20: 75 2e 64 62 0a 20 20 20 20 7d 20 7b 0a 20 20 20  u.db.    } {.   
0a30: 20 20 20 73 71 6c 69 74 65 33 72 62 75 20 72 32     sqlite3rbu r2
0a40: 20 74 65 73 74 2e 64 62 32 20 72 62 75 2e 64 62   test.db2 rbu.db
0a50: 32 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 53 51 4c  2.    }.  } {SQL
0a60: 49 54 45 5f 44 4f 4e 45 20 53 51 4c 49 54 45 5f  ITE_DONE SQLITE_
0a70: 44 4f 4e 45 7d 0a 20 20 0a 20 20 64 6f 5f 65 78  DONE}.  .  do_ex
0a80: 65 63 73 71 6c 5f 74 65 73 74 20 2d 64 62 20 64  ecsql_test -db d
0a90: 62 20 20 31 2e 24 69 2e 32 2e 31 20 7b 20 50 52  b  1.$i.2.1 { PR
0aa0: 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63  AGMA integrity_c
0ab0: 68 65 63 6b 20 7d 20 6f 6b 0a 20 20 64 6f 5f 65  heck } ok.  do_e
0ac0: 78 65 63 73 71 6c 5f 74 65 73 74 20 2d 64 62 20  xecsql_test -db 
0ad0: 64 62 32 20 31 2e 24 69 2e 32 2e 32 20 7b 20 50  db2 1.$i.2.2 { P
0ae0: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
0af0: 63 68 65 63 6b 20 7d 20 6f 6b 0a 0a 20 20 64 6f  check } ok..  do
0b00: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 2d 64  _execsql_test -d
0b10: 62 20 64 62 20 20 31 2e 24 69 2e 33 2e 31 20 7b  b db  1.$i.3.1 {
0b20: 20 53 45 4c 45 43 54 20 6d 64 35 73 75 6d 28 61   SELECT md5sum(a
0b30: 2c 20 62 2c 20 63 29 3d 3d 24 6d 31 20 46 52 4f  , b, c)==$m1 FRO
0b40: 4d 20 74 31 20 7d 20 30 0a 20 20 64 6f 5f 65 78  M t1 } 0.  do_ex
0b50: 65 63 73 71 6c 5f 74 65 73 74 20 2d 64 62 20 64  ecsql_test -db d
0b60: 62 32 20 31 2e 24 69 2e 33 2e 32 20 7b 20 53 45  b2 1.$i.3.2 { SE
0b70: 4c 45 43 54 20 6d 64 35 73 75 6d 28 61 2c 20 62  LECT md5sum(a, b
0b80: 2c 20 63 29 3d 3d 24 6d 32 20 46 52 4f 4d 20 74  , c)==$m2 FROM t
0b90: 31 20 7d 20 30 0a 20 20 0a 20 20 63 61 74 63 68  1 } 0.  .  catch
0ba0: 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a 20 20   { db close }.  
0bb0: 63 61 74 63 68 20 7b 20 64 62 32 20 63 6c 6f 73  catch { db2 clos
0bc0: 65 20 7d 0a 20 20 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  e }.  #---------
0bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
0c10: 20 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73   forcedelete tes
0c20: 74 2e 64 62 32 0a 20 20 66 6f 72 63 65 64 65 6c  t.db2.  forcedel
0c30: 65 74 65 20 74 65 73 74 2e 64 62 0a 20 20 66 6f  ete test.db.  fo
0c40: 72 63 65 64 65 6c 65 74 65 20 72 62 75 2e 64 62  rcedelete rbu.db
0c50: 32 0a 20 20 0a 20 20 64 6f 5f 74 65 73 74 20 31  2.  .  do_test 1
0c60: 2e 24 69 2e 34 20 7b 0a 20 20 20 20 73 71 6c 69  .$i.4 {.    sqli
0c70: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
0c80: 20 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74     sqlite3 db2 t
0c90: 65 73 74 2e 64 62 32 0a 20 20 20 20 62 75 69 6c  est.db2.    buil
0ca0: 64 5f 64 62 20 64 62 0a 20 20 20 20 62 75 69 6c  d_db db.    buil
0cb0: 64 5f 64 62 20 64 62 32 0a 20 20 20 20 73 71 6c  d_db db2.    sql
0cc0: 69 74 65 33 20 72 62 75 32 20 72 62 75 2e 64 62  ite3 rbu2 rbu.db
0cd0: 32 0a 20 20 20 20 62 75 69 6c 64 5f 72 62 75 20  2.    build_rbu 
0ce0: 72 62 75 32 0a 20 20 20 20 72 62 75 32 20 63 6c  rbu2.    rbu2 cl
0cf0: 6f 73 65 0a 20 20 7d 20 7b 7d 0a 0a 20 20 73 65  ose.  } {}..  se
0d00: 74 20 6d 31 20 5b 64 62 20 65 76 61 6c 20 7b 53  t m1 [db eval {S
0d10: 45 4c 45 43 54 20 6d 64 35 73 75 6d 28 61 2c 20  ELECT md5sum(a, 
0d20: 62 2c 20 63 29 20 46 52 4f 4d 20 74 31 7d 5d 0a  b, c) FROM t1}].
0d30: 20 20 73 65 74 20 6d 32 20 5b 64 62 32 20 65 76    set m2 [db2 ev
0d40: 61 6c 20 7b 53 45 4c 45 43 54 20 6d 64 35 73 75  al {SELECT md5su
0d50: 6d 28 61 2c 20 62 2c 20 63 29 20 46 52 4f 4d 20  m(a, b, c) FROM 
0d60: 74 31 7d 5d 0a 0a 20 20 64 6f 5f 74 65 73 74 20  t1}]..  do_test 
0d70: 31 2e 24 69 2e 35 20 7b 0a 20 20 20 20 73 74 65  1.$i.5 {.    ste
0d80: 70 5f 72 62 75 32 20 24 62 4f 70 65 6e 43 6c 6f  p_rbu2 $bOpenClo
0d90: 73 65 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  se {.      sqlit
0da0: 65 33 72 62 75 5f 76 61 63 75 75 6d 20 72 31 20  e3rbu_vacuum r1 
0db0: 74 65 73 74 2e 64 62 0a 20 20 20 20 7d 20 7b 0a  test.db.    } {.
0dc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 72 62 75        sqlite3rbu
0dd0: 20 72 32 20 74 65 73 74 2e 64 62 32 20 72 62 75   r2 test.db2 rbu
0de0: 2e 64 62 32 0a 20 20 20 20 7d 0a 20 20 7d 20 7b  .db2.    }.  } {
0df0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 53 51 4c 49  SQLITE_DONE SQLI
0e00: 54 45 5f 44 4f 4e 45 7d 0a 0a 20 20 64 6f 5f 65  TE_DONE}..  do_e
0e10: 78 65 63 73 71 6c 5f 74 65 73 74 20 2d 64 62 20  xecsql_test -db 
0e20: 64 62 20 20 31 2e 24 69 2e 36 2e 31 20 7b 20 53  db  1.$i.6.1 { S
0e30: 45 4c 45 43 54 20 6d 64 35 73 75 6d 28 61 2c 20  ELECT md5sum(a, 
0e40: 62 2c 20 63 29 3d 3d 24 6d 31 20 46 52 4f 4d 20  b, c)==$m1 FROM 
0e50: 74 31 20 7d 20 31 0a 20 20 64 6f 5f 65 78 65 63  t1 } 1.  do_exec
0e60: 73 71 6c 5f 74 65 73 74 20 2d 64 62 20 64 62 32  sql_test -db db2
0e70: 20 31 2e 24 69 2e 36 2e 32 20 7b 20 53 45 4c 45   1.$i.6.2 { SELE
0e80: 43 54 20 6d 64 35 73 75 6d 28 61 2c 20 62 2c 20  CT md5sum(a, b, 
0e90: 63 29 3d 3d 24 6d 32 20 46 52 4f 4d 20 74 31 20  c)==$m2 FROM t1 
0ea0: 7d 20 30 0a 0a 20 20 64 6f 5f 65 78 65 63 73 71  } 0..  do_execsq
0eb0: 6c 5f 74 65 73 74 20 2d 64 62 20 64 62 20 20 31  l_test -db db  1
0ec0: 2e 24 69 2e 37 2e 31 20 7b 20 50 52 41 47 4d 41  .$i.7.1 { PRAGMA
0ed0: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
0ee0: 20 7d 20 6f 6b 0a 20 20 64 6f 5f 65 78 65 63 73   } ok.  do_execs
0ef0: 71 6c 5f 74 65 73 74 20 2d 64 62 20 64 62 32 20  ql_test -db db2 
0f00: 31 2e 24 69 2e 37 2e 32 20 7b 20 50 52 41 47 4d  1.$i.7.2 { PRAGM
0f10: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
0f20: 6b 20 7d 20 6f 6b 0a 0a 20 20 63 61 74 63 68 20  k } ok..  catch 
0f30: 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a 20 20 63  { db close }.  c
0f40: 61 74 63 68 20 7b 20 64 62 32 20 63 6c 6f 73 65  atch { db2 close
0f50: 20 7d 0a 20 20 69 66 20 7b 24 69 20 26 20 30 78   }.  if {$i & 0x
0f60: 30 31 7d 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  01} {.    sqlite
0f70: 33 72 62 75 5f 64 65 73 74 72 6f 79 5f 76 66 73  3rbu_destroy_vfs
0f80: 20 6d 79 72 62 75 0a 20 20 7d 0a 0a 7d 0a 0a 0a   myrbu.  }..}...
0f90: 66 69 6e 69 73 68 5f 74 65 73 74 0a              finish_test.