/ Hex Artifact Content
Login

Artifact 724b38ea5f722e3d22dc76343860bd998bb676c3f78c4bc8175df5c5d7720e23:


0000: 23 20 32 30 31 34 20 41 75 67 75 73 74 20 33 30  # 2014 August 30
0010: 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20  .#.# The author 
0020: 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69  disclaims copyri
0030: 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72  ght to this sour
0040: 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61  ce code.  In pla
0050: 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20  ce of.# a legal 
0060: 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20  notice, here is 
0070: 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20  a blessing:.#.# 
0080: 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f     May you do go
0090: 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e  od and not evil.
00a0: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69  .#    May you fi
00b0: 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66  nd forgiveness f
00c0: 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20  or yourself and 
00d0: 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a  forgive others..
00e0: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61  #    May you sha
00f0: 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72  re freely, never
0100: 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61   taking more tha
0110: 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a  n 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 0a 23 0a 23 20 54 65 73 74 20  ******.#.# Test 
0170: 73 6f 6d 65 20 70 72 6f 70 65 72 74 69 65 73 20  some properties 
0180: 6f 66 20 74 68 65 20 70 61 67 65 72 5f 72 62 75  of the pager_rbu
0190: 5f 6d 6f 64 65 20 61 6e 64 20 72 62 75 5f 6d 6f  _mode and rbu_mo
01a0: 64 65 20 70 72 61 67 6d 61 73 2e 0a 23 0a 0a 73  de pragmas..#..s
01b0: 6f 75 72 63 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ource [file join
01c0: 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b   [file dirname [
01d0: 69 6e 66 6f 20 73 63 72 69 70 74 5d 5d 20 72 62  info script]] rb
01e0: 75 5f 63 6f 6d 6d 6f 6e 2e 74 63 6c 5d 0a 73 65  u_common.tcl].se
01f0: 74 20 3a 3a 74 65 73 74 70 72 65 66 69 78 20 72  t ::testprefix r
0200: 62 75 35 0a 0a 0a 23 20 52 65 74 75 72 6e 20 61  bu5...# Return a
0210: 20 6c 69 73 74 20 6f 66 20 74 68 65 20 70 72 69   list of the pri
0220: 6d 61 72 79 20 6b 65 79 20 63 6f 6c 75 6d 6e 73  mary key columns
0230: 20 66 6f 72 20 74 61 62 6c 65 20 24 74 62 6c 20   for table $tbl 
0240: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  in the database.
0250: 23 20 6f 70 65 6e 65 64 20 62 79 20 64 61 74 61  # opened by data
0260: 62 61 73 65 20 68 61 6e 64 6c 65 20 24 64 62 2e  base handle $db.
0270: 0a 23 0a 70 72 6f 63 20 70 6b 63 6f 6c 73 20 7b  .#.proc pkcols {
0280: 64 62 20 74 62 6c 7d 20 7b 0a 20 20 73 65 74 20  db tbl} {.  set 
0290: 72 65 74 20 5b 6c 69 73 74 5d 0a 20 20 24 64 62  ret [list].  $db
02a0: 20 65 76 61 6c 20 22 50 52 41 47 4d 41 20 74 61   eval "PRAGMA ta
02b0: 62 6c 65 5f 69 6e 66 6f 20 3d 20 27 24 74 62 6c  ble_info = '$tbl
02c0: 27 22 20 7b 0a 20 20 20 20 69 66 20 7b 24 70 6b  '" {.    if {$pk
02d0: 7d 20 7b 20 6c 61 70 70 65 6e 64 20 72 65 74 20  } { lappend ret 
02e0: 24 6e 61 6d 65 20 7d 0a 20 20 7d 0a 20 20 72 65  $name }.  }.  re
02f0: 74 75 72 6e 20 24 72 65 74 0a 7d 0a 0a 23 20 52  turn $ret.}..# R
0300: 65 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20  eturn a list of 
0310: 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20  all columns for 
0320: 74 61 62 6c 65 20 24 74 62 6c 20 69 6e 20 74 68  table $tbl in th
0330: 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65  e database opene
0340: 64 20 62 79 20 0a 23 20 64 61 74 61 62 61 73 65  d by .# database
0350: 20 68 61 6e 64 6c 65 20 24 64 62 2e 0a 23 0a 70   handle $db..#.p
0360: 72 6f 63 20 61 6c 6c 63 6f 6c 73 20 7b 64 62 20  roc allcols {db 
0370: 74 62 6c 7d 20 7b 0a 20 20 73 65 74 20 72 65 74  tbl} {.  set ret
0380: 20 5b 6c 69 73 74 5d 0a 20 20 24 64 62 20 65 76   [list].  $db ev
0390: 61 6c 20 22 50 52 41 47 4d 41 20 74 61 62 6c 65  al "PRAGMA table
03a0: 5f 69 6e 66 6f 20 3d 20 27 24 74 62 6c 27 22 20  _info = '$tbl'" 
03b0: 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65  {.    lappend re
03c0: 74 20 24 6e 61 6d 65 0a 20 20 7d 0a 20 20 72 65  t $name.  }.  re
03d0: 74 75 72 6e 20 24 72 65 74 0a 7d 0a 0a 23 20 52  turn $ret.}..# R
03e0: 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d  eturn a checksum
03f0: 20 6f 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 61   on all tables a
0400: 6e 64 20 64 61 74 61 20 69 6e 20 74 68 65 20 6d  nd data in the m
0410: 61 69 6e 20 64 61 74 61 62 61 73 65 20 61 74 74  ain database att
0420: 61 63 68 65 64 0a 23 20 74 6f 20 64 61 74 61 62  ached.# to datab
0430: 61 73 65 20 68 61 6e 64 6c 65 20 24 64 62 2e 20  ase handle $db. 
0440: 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  It is possible t
0450: 6f 20 61 64 64 20 69 6e 64 65 78 65 73 20 77 69  o add indexes wi
0460: 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 0a 23  thout changing.#
0470: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 2e 0a 23   the checksum..#
0480: 0a 70 72 6f 63 20 64 61 74 61 63 6b 73 75 6d 20  .proc datacksum 
0490: 7b 64 62 7d 20 7b 0a 0a 20 20 24 64 62 20 65 76  {db} {..  $db ev
04a0: 61 6c 20 7b 20 53 45 4c 45 43 54 20 6e 61 6d 65  al { SELECT name
04b0: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
04c0: 74 65 72 20 57 48 45 52 45 20 74 79 70 65 3d 27  ter WHERE type='
04d0: 74 61 62 6c 65 27 20 7d 20 7b 0a 20 20 20 20 61  table' } {.    a
04e0: 70 70 65 6e 64 20 74 78 74 20 24 6e 61 6d 65 0a  ppend txt $name.
04f0: 20 20 20 20 73 65 74 20 63 6f 6c 73 20 5b 6c 69      set cols [li
0500: 73 74 5d 0a 20 20 20 20 73 65 74 20 6f 72 64 65  st].    set orde
0510: 72 20 5b 6c 69 73 74 5d 0a 20 20 20 20 73 65 74  r [list].    set
0520: 20 63 6e 74 20 30 0a 20 20 20 20 24 64 62 20 65   cnt 0.    $db e
0530: 76 61 6c 20 22 50 52 41 47 4d 41 20 74 61 62 6c  val "PRAGMA tabl
0540: 65 5f 69 6e 66 6f 20 3d 20 24 6e 61 6d 65 22 20  e_info = $name" 
0550: 78 20 7b 0a 20 20 20 20 20 20 6c 61 70 70 65 6e  x {.      lappen
0560: 64 20 63 6f 6c 73 20 22 71 75 6f 74 65 28 24 78  d cols "quote($x
0570: 28 6e 61 6d 65 29 29 22 0a 20 20 20 20 20 20 6c  (name))".      l
0580: 61 70 70 65 6e 64 20 6f 72 64 65 72 20 5b 69 6e  append order [in
0590: 63 72 20 63 6e 74 5d 0a 20 20 20 20 7d 0a 20 20  cr cnt].    }.  
05a0: 20 20 73 65 74 20 63 6f 6c 73 20 5b 6a 6f 69 6e    set cols [join
05b0: 20 24 63 6f 6c 73 20 2c 5d 0a 20 20 20 20 73 65   $cols ,].    se
05c0: 74 20 6f 72 64 65 72 20 5b 6a 6f 69 6e 20 24 6f  t order [join $o
05d0: 72 64 65 72 20 2c 5d 0a 20 20 20 20 61 70 70 65  rder ,].    appe
05e0: 6e 64 20 74 78 74 20 5b 24 64 62 20 65 76 61 6c  nd txt [$db eval
05f0: 20 22 53 45 4c 45 43 54 20 24 63 6f 6c 73 20 46   "SELECT $cols F
0600: 52 4f 4d 20 24 6e 61 6d 65 20 4f 52 44 45 52 20  ROM $name ORDER 
0610: 42 59 20 24 6f 72 64 65 72 22 5d 0a 20 20 7d 0a  BY $order"].  }.
0620: 20 20 72 65 74 75 72 6e 20 22 5b 73 74 72 69 6e    return "[strin
0630: 67 20 6c 65 6e 67 74 68 20 24 74 78 74 5d 2d 5b  g length $txt]-[
0640: 6d 64 35 20 24 74 78 74 5d 22 0a 7d 0a 0a 70 72  md5 $txt]".}..pr
0650: 6f 63 20 75 63 6f 6e 74 72 6f 6c 20 7b 61 72 67  oc ucontrol {arg
0660: 73 7d 20 7b 0a 20 20 73 65 74 20 72 65 74 20 22  s} {.  set ret "
0670: 22 0a 20 20 66 6f 72 65 61 63 68 20 61 20 24 61  ".  foreach a $a
0680: 72 67 73 20 7b 0a 20 20 20 20 69 66 20 7b 24 61  rgs {.    if {$a
0690: 7d 20 7b 0a 20 20 20 20 20 20 61 70 70 65 6e 64  } {.      append
06a0: 20 72 65 74 20 2e 0a 20 20 20 20 7d 20 65 6c 73   ret ..    } els
06b0: 65 20 7b 0a 20 20 20 20 20 20 61 70 70 65 6e 64  e {.      append
06c0: 20 72 65 74 20 78 0a 20 20 20 20 7d 0a 20 20 7d   ret x.    }.  }
06d0: 0a 20 20 72 65 74 75 72 6e 20 24 72 65 74 0a 7d  .  return $ret.}
06e0: 0a 0a 23 20 41 72 67 75 6d 65 6e 74 20 24 74 61  ..# Argument $ta
06f0: 72 67 65 74 20 69 73 20 74 68 65 20 6e 61 6d 65  rget is the name
0700: 20 6f 66 20 61 6e 20 53 51 4c 69 74 65 20 64 61   of an SQLite da
0710: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 24 73 71  tabase file. $sq
0720: 6c 20 69 73 20 61 6e 20 53 51 4c 0a 23 20 73 63  l is an SQL.# sc
0730: 72 69 70 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ript containing 
0740: 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 61  INSERT, UPDATE a
0750: 6e 64 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  nd DELETE statem
0760: 65 6e 74 73 20 74 6f 20 65 78 65 63 75 74 65 20  ents to execute 
0770: 61 67 61 69 6e 73 74 0a 23 20 69 74 2e 20 54 68  against.# it. Th
0780: 69 73 20 63 6f 6d 6d 61 6e 64 20 63 72 65 61 74  is command creat
0790: 65 73 20 61 6e 20 52 42 55 20 75 70 64 61 74 65  es an RBU update
07a0: 20 64 61 74 61 62 61 73 65 20 69 6e 20 66 69 6c   database in fil
07b0: 65 20 24 72 62 75 20 74 68 61 74 20 68 61 73 0a  e $rbu that has.
07c0: 23 20 74 68 65 20 73 61 6d 65 20 65 66 66 65 63  # the same effec
07d0: 74 20 61 73 20 74 68 65 20 73 63 72 69 70 74 2e  t as the script.
07e0: 20 54 68 65 20 74 61 72 67 65 74 20 64 61 74 61   The target data
07f0: 62 61 73 65 20 69 73 20 6e 6f 74 20 6d 6f 64 69  base is not modi
0800: 66 69 65 64 20 62 79 0a 23 20 74 68 69 73 20 63  fied by.# this c
0810: 6f 6d 6d 61 6e 64 2e 0a 23 0a 70 72 6f 63 20 67  ommand..#.proc g
0820: 65 6e 65 72 61 74 65 5f 72 62 75 5f 64 62 20 7b  enerate_rbu_db {
0830: 74 61 72 67 65 74 20 72 62 75 20 73 71 6c 7d 20  target rbu sql} 
0840: 7b 0a 0a 20 20 66 6f 72 63 65 64 65 6c 65 74 65  {..  forcedelete
0850: 20 24 72 62 75 0a 20 20 66 6f 72 63 65 63 6f 70   $rbu.  forcecop
0860: 79 20 24 74 61 72 67 65 74 20 63 6f 70 79 2e 64  y $target copy.d
0870: 62 0a 0a 20 20 23 20 45 76 61 6c 75 61 74 65 20  b..  # Evaluate 
0880: 74 68 65 20 53 51 4c 20 73 63 72 69 70 74 20 74  the SQL script t
0890: 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 63 6f 6e  o modify the con
08a0: 74 65 6e 74 73 20 6f 66 20 63 6f 70 79 2e 64 62  tents of copy.db
08b0: 2e 0a 20 20 23 0a 20 20 73 71 6c 69 74 65 33 20  ..  #.  sqlite3 
08c0: 64 62 52 62 75 20 63 6f 70 79 2e 64 62 0a 20 20  dbRbu copy.db.  
08d0: 64 62 52 62 75 20 65 76 61 6c 20 24 73 71 6c 0a  dbRbu eval $sql.
08e0: 0a 20 20 64 62 52 62 75 20 66 75 6e 63 74 69 6f  .  dbRbu functio
08f0: 6e 20 75 63 6f 6e 74 72 6f 6c 20 75 63 6f 6e 74  n ucontrol ucont
0900: 72 6f 6c 0a 20 20 0a 20 20 23 20 45 76 61 6c 75  rol.  .  # Evalu
0910: 61 74 65 20 74 68 65 20 53 51 4c 20 73 63 72 69  ate the SQL scri
0920: 70 74 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65  pt to modify the
0930: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 63 6f 70   contents of cop
0940: 79 2e 64 62 2e 0a 20 20 73 65 74 20 72 65 74 20  y.db..  set ret 
0950: 5b 64 61 74 61 63 6b 73 75 6d 20 64 62 52 62 75  [datacksum dbRbu
0960: 5d 0a 0a 20 20 64 62 52 62 75 20 65 76 61 6c 20  ]..  dbRbu eval 
0970: 7b 20 41 54 54 41 43 48 20 24 72 62 75 20 41 53  { ATTACH $rbu AS
0980: 20 72 62 75 20 7d 0a 20 20 64 62 52 62 75 20 65   rbu }.  dbRbu e
0990: 76 61 6c 20 7b 20 41 54 54 41 43 48 20 24 74 61  val { ATTACH $ta
09a0: 72 67 65 74 20 41 53 20 6f 72 69 67 20 7d 0a 0a  rget AS orig }..
09b0: 20 20 64 62 52 62 75 20 65 76 61 6c 20 7b 20 53    dbRbu eval { S
09c0: 45 4c 45 43 54 20 6e 61 6d 65 20 41 53 20 74 62  ELECT name AS tb
09d0: 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  l FROM sqlite_ma
09e0: 73 74 65 72 20 57 48 45 52 45 20 74 79 70 65 20  ster WHERE type 
09f0: 3d 20 27 74 61 62 6c 65 27 20 7d 20 7b 0a 20 20  = 'table' } {.  
0a00: 20 20 73 65 74 20 70 6b 20 5b 70 6b 63 6f 6c 73    set pk [pkcols
0a10: 20 64 62 52 62 75 20 24 74 62 6c 5d 0a 20 20 20   dbRbu $tbl].   
0a20: 20 73 65 74 20 63 6f 6c 73 20 5b 61 6c 6c 63 6f   set cols [allco
0a30: 6c 73 20 64 62 52 62 75 20 24 74 62 6c 5d 0a 0a  ls dbRbu $tbl]..
0a40: 20 20 20 20 23 20 41 20 57 48 45 52 45 20 63 6c      # A WHERE cl
0a50: 61 75 73 65 20 74 6f 20 74 65 73 74 20 74 68 61  ause to test tha
0a60: 74 20 74 68 65 20 50 4b 20 63 6f 6c 75 6d 6e 73  t the PK columns
0a70: 20 6d 61 74 63 68 2e 0a 20 20 20 20 23 0a 20 20   match..    #.  
0a80: 20 20 73 65 74 20 77 68 65 72 65 20 5b 6c 69 73    set where [lis
0a90: 74 5d 0a 20 20 20 20 66 6f 72 65 61 63 68 20 63  t].    foreach c
0aa0: 20 24 70 6b 20 7b 20 6c 61 70 70 65 6e 64 20 77   $pk { lappend w
0ab0: 68 65 72 65 20 22 6d 61 69 6e 2e 24 74 62 6c 2e  here "main.$tbl.
0ac0: 24 63 20 49 53 20 6f 72 69 67 2e 24 74 62 6c 2e  $c IS orig.$tbl.
0ad0: 24 63 22 20 7d 0a 20 20 20 20 73 65 74 20 77 68  $c" }.    set wh
0ae0: 65 72 65 20 5b 6a 6f 69 6e 20 24 77 68 65 72 65  ere [join $where
0af0: 20 22 20 41 4e 44 20 22 5d 0a 20 20 20 20 0a 20   " AND "].    . 
0b00: 20 20 20 23 20 41 20 57 48 45 52 45 20 63 6c 61     # A WHERE cla
0b10: 75 73 65 20 74 6f 20 74 65 73 74 20 74 68 61 74  use to test that
0b20: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6d 61 74   all columns mat
0b30: 63 68 2e 0a 20 20 20 20 23 0a 20 20 20 20 73 65  ch..    #.    se
0b40: 74 20 77 68 65 72 65 32 20 5b 6c 69 73 74 5d 0a  t where2 [list].
0b50: 20 20 20 20 66 6f 72 65 61 63 68 20 63 20 24 63      foreach c $c
0b60: 6f 6c 73 20 7b 20 6c 61 70 70 65 6e 64 20 77 68  ols { lappend wh
0b70: 65 72 65 32 20 22 6d 61 69 6e 2e 24 74 62 6c 2e  ere2 "main.$tbl.
0b80: 24 63 20 49 53 20 6f 72 69 67 2e 24 74 62 6c 2e  $c IS orig.$tbl.
0b90: 24 63 22 20 7d 0a 20 20 20 20 73 65 74 20 75 63  $c" }.    set uc
0ba0: 6f 6e 74 72 6f 6c 20 22 75 63 6f 6e 74 72 6f 6c  ontrol "ucontrol
0bb0: 28 5b 6a 6f 69 6e 20 24 77 68 65 72 65 32 20 2c  ([join $where2 ,
0bc0: 5d 29 22 0a 20 20 20 20 73 65 74 20 77 68 65 72  ])".    set wher
0bd0: 65 32 20 5b 6a 6f 69 6e 20 24 77 68 65 72 65 32  e2 [join $where2
0be0: 20 22 20 41 4e 44 20 22 5d 0a 0a 20 20 20 20 23   " AND "]..    #
0bf0: 20 43 72 65 61 74 65 20 61 20 64 61 74 61 5f 78   Create a data_x
0c00: 78 78 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  xx table in the 
0c10: 52 42 55 20 75 70 64 61 74 65 20 64 61 74 61 62  RBU update datab
0c20: 61 73 65 2e 0a 20 20 20 20 64 62 52 62 75 20 65  ase..    dbRbu e
0c30: 76 61 6c 20 22 0a 20 20 20 20 20 20 43 52 45 41  val ".      CREA
0c40: 54 45 20 54 41 42 4c 45 20 72 62 75 2e 64 61 74  TE TABLE rbu.dat
0c50: 61 5f 24 74 62 6c 20 41 53 20 53 45 4c 45 43 54  a_$tbl AS SELECT
0c60: 20 2a 2c 20 27 27 20 41 53 20 72 62 75 5f 63 6f   *, '' AS rbu_co
0c70: 6e 74 72 6f 6c 20 0a 20 20 20 20 20 20 46 52 4f  ntrol .      FRO
0c80: 4d 20 6d 61 69 6e 2e 24 74 62 6c 20 4c 49 4d 49  M main.$tbl LIMI
0c90: 54 20 30 0a 20 20 20 20 22 0a 0a 20 20 20 20 23  T 0.    "..    #
0ca0: 20 46 69 6e 64 20 61 6c 6c 20 6e 65 77 20 72 6f   Find all new ro
0cb0: 77 73 20 49 4e 53 45 52 54 65 64 20 62 79 20 74  ws INSERTed by t
0cc0: 68 65 20 73 63 72 69 70 74 2e 0a 20 20 20 20 64  he script..    d
0cd0: 62 52 62 75 20 65 76 61 6c 20 22 0a 20 20 20 20  bRbu eval ".    
0ce0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 72 62    INSERT INTO rb
0cf0: 75 2e 64 61 74 61 5f 24 74 62 6c 20 0a 20 20 20  u.data_$tbl .   
0d00: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 2c         SELECT *,
0d10: 20 30 20 41 53 20 72 62 75 5f 63 6f 6e 74 72 6f   0 AS rbu_contro
0d20: 6c 20 46 52 4f 4d 20 6d 61 69 6e 2e 24 74 62 6c  l FROM main.$tbl
0d30: 0a 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45  .          WHERE
0d40: 20 4e 4f 54 20 45 58 49 53 54 53 20 28 0a 20 20   NOT EXISTS (.  
0d50: 20 20 20 20 20 20 20 20 20 20 53 45 4c 45 43 54            SELECT
0d60: 20 31 20 46 52 4f 4d 20 6f 72 69 67 2e 24 74 62   1 FROM orig.$tb
0d70: 6c 20 57 48 45 52 45 20 24 77 68 65 72 65 0a 20  l WHERE $where. 
0d80: 20 20 20 20 20 20 20 20 20 29 0a 20 20 20 20 22           ).    "
0d90: 0a 20 20 20 20 0a 20 20 20 20 23 20 46 69 6e 64  .    .    # Find
0da0: 20 61 6c 6c 20 6f 6c 64 20 72 6f 77 73 20 44 45   all old rows DE
0db0: 4c 45 54 45 64 20 62 79 20 74 68 65 20 73 63 72  LETEd by the scr
0dc0: 69 70 74 2e 0a 20 20 20 20 64 62 52 62 75 20 65  ipt..    dbRbu e
0dd0: 76 61 6c 20 22 0a 20 20 20 20 20 20 49 4e 53 45  val ".      INSE
0de0: 52 54 20 49 4e 54 4f 20 72 62 75 2e 64 61 74 61  RT INTO rbu.data
0df0: 5f 24 74 62 6c 20 0a 20 20 20 20 20 20 20 20 20  _$tbl .         
0e00: 20 53 45 4c 45 43 54 20 2a 2c 20 31 20 41 53 20   SELECT *, 1 AS 
0e10: 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 46 52 4f 4d  rbu_control FROM
0e20: 20 6f 72 69 67 2e 24 74 62 6c 0a 20 20 20 20 20   orig.$tbl.     
0e30: 20 20 20 20 20 57 48 45 52 45 20 4e 4f 54 20 45       WHERE NOT E
0e40: 58 49 53 54 53 20 28 0a 20 20 20 20 20 20 20 20  XISTS (.        
0e50: 20 20 20 20 53 45 4c 45 43 54 20 31 20 46 52 4f      SELECT 1 FRO
0e60: 4d 20 6d 61 69 6e 2e 24 74 62 6c 20 57 48 45 52  M main.$tbl WHER
0e70: 45 20 24 77 68 65 72 65 0a 20 20 20 20 20 20 20  E $where.       
0e80: 20 20 20 29 0a 20 20 20 20 22 0a 20 20 20 20 0a     ).    ".    .
0e90: 20 20 20 20 23 20 46 69 6e 64 20 61 6c 6c 20 72      # Find all r
0ea0: 6f 77 73 20 55 50 44 41 54 45 64 20 62 79 20 74  ows UPDATEd by t
0eb0: 68 65 20 73 63 72 69 70 74 2e 0a 20 20 20 20 73  he script..    s
0ec0: 65 74 20 6f 72 69 67 63 6f 6c 73 20 5b 6c 69 73  et origcols [lis
0ed0: 74 5d 0a 20 20 20 20 66 6f 72 65 61 63 68 20 63  t].    foreach c
0ee0: 20 24 63 6f 6c 73 20 7b 20 6c 61 70 70 65 6e 64   $cols { lappend
0ef0: 20 6f 72 69 67 63 6f 6c 73 20 22 6d 61 69 6e 2e   origcols "main.
0f00: 24 74 62 6c 2e 24 63 22 20 7d 0a 20 20 20 20 73  $tbl.$c" }.    s
0f10: 65 74 20 6f 72 69 67 63 6f 6c 73 20 5b 6a 6f 69  et origcols [joi
0f20: 6e 20 24 6f 72 69 67 63 6f 6c 73 20 2c 5d 0a 20  n $origcols ,]. 
0f30: 20 20 20 64 62 52 62 75 20 65 76 61 6c 20 22 0a     dbRbu eval ".
0f40: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
0f50: 4f 20 72 62 75 2e 64 61 74 61 5f 24 74 62 6c 0a  O rbu.data_$tbl.
0f60: 20 20 20 20 20 20 20 20 20 20 53 45 4c 45 43 54            SELECT
0f70: 20 24 6f 72 69 67 63 6f 6c 73 2c 20 24 75 63 6f   $origcols, $uco
0f80: 6e 74 72 6f 6c 20 41 53 20 72 62 75 5f 63 6f 6e  ntrol AS rbu_con
0f90: 74 72 6f 6c 20 0a 20 20 20 20 20 20 20 20 20 20  trol .          
0fa0: 46 52 4f 4d 20 6f 72 69 67 2e 24 74 62 6c 2c 20  FROM orig.$tbl, 
0fb0: 6d 61 69 6e 2e 24 74 62 6c 0a 20 20 20 20 20 20  main.$tbl.      
0fc0: 20 20 20 20 57 48 45 52 45 20 24 77 68 65 72 65      WHERE $where
0fd0: 20 41 4e 44 20 4e 4f 54 20 28 24 77 68 65 72 65   AND NOT ($where
0fe0: 32 29 0a 20 20 20 20 22 0a 0a 20 20 7d 0a 0a 20  2).    "..  }.. 
0ff0: 20 64 62 52 62 75 20 63 6c 6f 73 65 0a 20 20 66   dbRbu close.  f
1000: 6f 72 63 65 64 65 6c 65 74 65 20 63 6f 70 79 2e  orcedelete copy.
1010: 64 62 0a 0a 20 20 72 65 74 75 72 6e 20 24 72 65  db..  return $re
1020: 74 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  t.}..#----------
1030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1070: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
1080: 74 20 31 2e 30 20 7b 0a 20 20 43 52 45 41 54 45  t 1.0 {.  CREATE
1090: 20 54 41 42 4c 45 20 74 31 28 61 20 49 4e 54 45   TABLE t1(a INTE
10a0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
10b0: 20 62 2c 20 63 29 3b 0a 20 20 43 52 45 41 54 45   b, c);.  CREATE
10c0: 20 54 41 42 4c 45 20 74 32 28 78 2c 20 79 2c 20   TABLE t2(x, y, 
10d0: 7a 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 79  z, PRIMARY KEY(y
10e0: 2c 20 7a 29 29 20 57 49 54 48 4f 55 54 20 52 4f  , z)) WITHOUT RO
10f0: 57 49 44 3b 0a 0a 20 20 49 4e 53 45 52 54 20 49  WID;..  INSERT I
1100: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c  NTO t1 VALUES(1,
1110: 20 32 2c 20 33 29 3b 0a 20 20 49 4e 53 45 52 54   2, 3);.  INSERT
1120: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
1130: 32 2c 20 34 2c 20 36 29 3b 0a 20 20 49 4e 53 45  2, 4, 6);.  INSE
1140: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
1150: 53 28 33 2c 20 36 2c 20 39 29 3b 0a 0a 20 20 49  S(3, 6, 9);..  I
1160: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
1170: 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 3b 0a 20  LUES(1, 2, 3);. 
1180: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
1190: 56 41 4c 55 45 53 28 32 2c 20 34 2c 20 36 29 3b  VALUES(2, 4, 6);
11a0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
11b0: 32 20 56 41 4c 55 45 53 28 33 2c 20 36 2c 20 39  2 VALUES(3, 6, 9
11c0: 29 3b 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a 0a 73  );.}.db close..s
11d0: 65 74 20 63 6b 73 75 6d 20 5b 67 65 6e 65 72 61  et cksum [genera
11e0: 74 65 5f 72 62 75 5f 64 62 20 74 65 73 74 2e 64  te_rbu_db test.d
11f0: 62 20 72 62 75 2e 64 62 20 7b 0a 20 20 49 4e 53  b rbu.db {.  INS
1200: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
1210: 45 53 28 34 2c 20 38 2c 20 31 32 29 3b 0a 20 20  ES(4, 8, 12);.  
1220: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57  DELETE FROM t1 W
1230: 48 45 52 45 20 61 20 3d 20 32 3b 0a 20 20 55 50  HERE a = 2;.  UP
1240: 44 41 54 45 20 74 31 20 53 45 54 20 63 20 3d 20  DATE t1 SET c = 
1250: 31 35 20 57 48 45 52 45 20 61 3d 33 3b 0a 0a 20  15 WHERE a=3;.. 
1260: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
1270: 56 41 4c 55 45 53 28 34 2c 20 38 2c 20 31 32 29  VALUES(4, 8, 12)
1280: 3b 0a 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  ;.  DELETE FROM 
1290: 74 32 20 57 48 45 52 45 20 78 20 3d 20 32 3b 0a  t2 WHERE x = 2;.
12a0: 20 20 55 50 44 41 54 45 20 74 32 20 53 45 54 20    UPDATE t2 SET 
12b0: 78 20 3d 20 31 35 20 57 48 45 52 45 20 7a 3d 39  x = 15 WHERE z=9
12c0: 3b 0a 7d 5d 0a 0a 66 6f 72 65 61 63 68 20 7b 74  ;.}]..foreach {t
12d0: 6e 20 69 64 78 7d 20 7b 0a 20 20 31 20 7b 0a 20  n idx} {.  1 {. 
12e0: 20 7d 0a 20 20 32 20 7b 0a 20 20 20 20 43 52 45   }.  2 {.    CRE
12f0: 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
1300: 74 31 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 20  t1(a, b, c);.   
1310: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 32   CREATE INDEX i2
1320: 20 4f 4e 20 74 32 28 78 2c 20 79 2c 20 7a 29 3b   ON t2(x, y, z);
1330: 0a 20 20 7d 0a 7d 20 7b 0a 20 20 66 6f 72 65 61  .  }.} {.  forea
1340: 63 68 20 63 6d 64 20 7b 72 75 6e 20 73 74 65 70  ch cmd {run step
1350: 7d 20 7b 0a 20 20 20 20 66 6f 72 63 65 63 6f 70  } {.    forcecop
1360: 79 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64  y test.db test.d
1370: 62 32 0a 20 20 20 20 66 6f 72 63 65 63 6f 70 79  b2.    forcecopy
1380: 20 72 62 75 2e 64 62 20 72 62 75 2e 64 62 32 0a   rbu.db rbu.db2.
1390: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 20  .    sqlite3 db 
13a0: 74 65 73 74 2e 64 62 32 0a 20 20 20 20 64 62 20  test.db2.    db 
13b0: 65 76 61 6c 20 24 69 64 78 0a 0a 20 20 20 20 64  eval $idx..    d
13c0: 6f 5f 74 65 73 74 20 31 2e 24 74 6e 2e 24 63 6d  o_test 1.$tn.$cm
13d0: 64 2e 31 20 7b 0a 20 20 20 20 20 20 24 7b 63 6d  d.1 {.      ${cm
13e0: 64 7d 5f 72 62 75 20 74 65 73 74 2e 64 62 32 20  d}_rbu test.db2 
13f0: 72 62 75 2e 64 62 32 0a 20 20 20 20 20 20 64 61  rbu.db2.      da
1400: 74 61 63 6b 73 75 6d 20 64 62 0a 20 20 20 20 7d  tacksum db.    }
1410: 20 24 63 6b 73 75 6d 0a 0a 20 20 20 20 64 6f 5f   $cksum..    do_
1420: 74 65 73 74 20 31 2e 24 74 6e 2e 24 63 6d 64 2e  test 1.$tn.$cmd.
1430: 32 20 7b 0a 20 20 20 20 20 20 64 62 20 65 76 61  2 {.      db eva
1440: 6c 20 7b 20 50 52 41 47 4d 41 20 69 6e 74 65 67  l { PRAGMA integ
1450: 72 69 74 79 5f 63 68 65 63 6b 20 7d 20 0a 20 20  rity_check } .  
1460: 20 20 7d 20 7b 6f 6b 7d 0a 0a 20 20 20 20 64 62    } {ok}..    db
1470: 20 63 6c 6f 73 65 0a 20 20 7d 0a 7d 0a 0a 23 2d   close.  }.}..#-
1480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14c0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 72 65 73 65 74  --------.#.reset
14d0: 5f 64 62 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  _db.do_execsql_t
14e0: 65 73 74 20 32 2e 30 20 7b 0a 20 20 43 52 45 41  est 2.0 {.  CREA
14f0: 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 49 4e  TE TABLE t1(a IN
1500: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
1510: 59 2c 20 62 2c 20 63 2c 20 64 2c 20 65 29 3b 0a  Y, b, c, d, e);.
1520: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
1530: 20 56 41 4c 55 45 53 28 2d 37 35 30 32 35 30 2c   VALUES(-750250,
1540: 27 66 79 65 74 63 6b 66 61 61 67 6a 6b 7a 71 6a  'fyetckfaagjkzqj
1550: 78 27 2c 2d 31 38 35 38 33 31 2c 58 27 46 45 41  x',-185831,X'FEA
1560: 44 27 2c 34 34 34 32 35 38 2e 32 39 29 3b 0a 20  D',444258.29);. 
1570: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
1580: 56 41 4c 55 45 53 28 36 34 39 30 38 31 2c 4e 55  VALUES(649081,NU
1590: 4c 4c 2c 58 27 37 44 46 32 35 42 46 37 38 37 37  LL,X'7DF25BF7877
15a0: 38 27 2c 2d 33 34 32 33 32 34 2e 36 33 2c 27 61  8',-342324.63,'a
15b0: 6b 76 73 70 6b 74 6f 63 77 6f 7a 6f 27 29 3b 0a  kvspktocwozo');.
15c0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
15d0: 20 56 41 4c 55 45 53 28 2d 31 33 33 30 34 35 2c   VALUES(-133045,
15e0: 2d 34 34 38 32 32 2e 33 31 2c 58 27 27 2c 32 38  -44822.31,X'',28
15f0: 37 39 33 35 2c 4e 55 4c 4c 29 3b 0a 20 20 49 4e  7935,NULL);.  IN
1600: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
1610: 55 45 53 28 32 30 32 31 33 32 2c 4e 55 4c 4c 2c  UES(202132,NULL,
1620: 58 27 35 33 39 39 27 2c 27 63 75 6a 73 6a 74 73  X'5399','cujsjts
1630: 70 72 79 71 65 79 6f 76 63 64 70 7a 27 2c 27 6d  pryqeyovcdpz','m
1640: 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
1650: 4f 20 74 31 20 56 41 4c 55 45 53 28 33 30 32 39  O t1 VALUES(3029
1660: 31 30 2c 4e 55 4c 4c 2c 27 64 76 64 68 69 76 74  10,NULL,'dvdhivt
1670: 66 6b 61 65 64 7a 68 64 63 6e 6e 27 2c 2d 37 31  fkaedzhdcnn',-71
1680: 37 31 31 33 2e 34 31 2c 36 38 38 34 38 37 29 3b  7113.41,688487);
1690: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
16a0: 31 20 56 41 4c 55 45 53 28 2d 35 38 32 33 32 37  1 VALUES(-582327
16b0: 2c 58 27 37 41 32 36 37 41 27 2c 58 27 37 45 36  ,X'7A267A',X'7E6
16c0: 42 33 43 46 45 35 43 42 39 27 2c 27 7a 61 63 75  B3CFE5CB9','zacu
16d0: 7a 69 6c 72 6f 6b 27 2c 2d 31 39 36 34 37 38 29  zilrok',-196478)
16e0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
16f0: 74 31 20 56 41 4c 55 45 53 28 2d 31 39 30 34 36  t1 VALUES(-19046
1700: 32 2c 58 27 44 31 41 30 38 37 45 37 44 36 38 44  2,X'D1A087E7D68D
1710: 39 35 37 38 27 2c 27 6c 73 6d 6c 65 74 69 27 2c  9578','lsmleti',
1720: 4e 55 4c 4c 2c 2d 39 32 38 30 39 34 29 3b 0a 20  NULL,-928094);. 
1730: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
1740: 56 41 4c 55 45 53 28 2d 34 36 37 36 36 35 2c 31  VALUES(-467665,1
1750: 37 36 33 34 34 2e 35 37 2c 2d 35 33 36 36 38 34  76344.57,-536684
1760: 2e 32 33 2c 38 32 38 38 37 36 2e 32 32 2c 58 27  .23,828876.22,X'
1770: 39 30 33 45 27 29 3b 0a 20 20 49 4e 53 45 52 54  903E');.  INSERT
1780: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
1790: 2d 36 32 39 31 33 38 2c 36 33 32 36 33 30 2e 32  -629138,632630.2
17a0: 39 2c 58 27 32 38 44 36 27 2c 2d 37 37 34 35 30  9,X'28D6',-77450
17b0: 31 2c 58 27 38 31 39 42 42 42 46 43 36 35 27 29  1,X'819BBBFC65')
17c0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
17d0: 74 31 20 56 41 4c 55 45 53 28 2d 38 32 38 31 31  t1 VALUES(-82811
17e0: 30 2c 2d 35 34 33 37 39 2e 32 34 2c 2d 38 38 31  0,-54379.24,-881
17f0: 31 32 31 2e 34 34 2c 58 27 27 2c 58 27 38 44 35  121.44,X'',X'8D5
1800: 41 38 39 34 46 30 44 27 29 3b 0a 0a 20 20 43 52  A894F0D');..  CR
1810: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 20  EATE TABLE t2(a 
1820: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 2c 20  PRIMARY KEY, b, 
1830: 63 2c 20 64 2c 20 65 29 20 57 49 54 48 4f 55 54  c, d, e) WITHOUT
1840: 20 52 4f 57 49 44 3b 0a 20 20 49 4e 53 45 52 54   ROWID;.  INSERT
1850: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
1860: 2d 36 35 31 37 34 2c 58 27 41 43 31 44 42 46 46  -65174,X'AC1DBFF
1870: 45 32 37 33 31 30 46 27 2c 2d 31 39 34 34 37 31  E27310F',-194471
1880: 2e 30 38 2c 33 34 37 39 38 38 2c 58 27 38 34 30  .08,347988,X'840
1890: 34 31 42 41 36 46 39 42 44 44 45 38 36 41 38 27  41BA6F9BDDE86A8'
18a0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
18b0: 20 74 32 20 56 41 4c 55 45 53 28 27 62 7a 62 70   t2 VALUES('bzbp
18c0: 69 27 2c 2d 39 35 32 36 39 33 2e 36 39 2c 38 31  i',-952693.69,81
18d0: 31 36 32 38 2e 32 35 2c 4e 55 4c 4c 2c 2d 38 31  1628.25,NULL,-81
18e0: 37 34 33 34 29 3b 0a 20 20 49 4e 53 45 52 54 20  7434);.  INSERT 
18f0: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 2d  INTO t2 VALUES(-
1900: 36 34 33 38 33 30 2c 4e 55 4c 4c 2c 27 6e 27 2c  643830,NULL,'n',
1910: 4e 55 4c 4c 2c 27 64 69 6f 27 29 3b 0a 20 20 49  NULL,'dio');.  I
1920: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
1930: 4c 55 45 53 28 27 72 6f 76 6f 65 6e 78 78 6a 27  LUES('rovoenxxj'
1940: 2c 4e 55 4c 4c 2c 27 6f 77 75 70 62 74 64 63 6f  ,NULL,'owupbtdco
1950: 78 78 6e 76 67 27 2c 2d 31 31 39 36 37 36 2c 58  xxnvg',-119676,X
1960: 27 35 35 34 33 31 44 46 41 27 29 3b 0a 20 20 49  '55431DFA');.  I
1970: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
1980: 4c 55 45 53 28 38 39 39 37 37 30 2c 27 6a 6c 79  LUES(899770,'jly
1990: 67 64 6c 27 2c 58 27 44 42 43 41 34 44 31 41 27  gdl',X'DBCA4D1A'
19a0: 2c 4e 55 4c 4c 2c 2d 36 33 31 37 37 33 29 3b 0a  ,NULL,-631773);.
19b0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
19c0: 20 56 41 4c 55 45 53 28 33 33 34 36 39 38 2e 38   VALUES(334698.8
19d0: 30 2c 4e 55 4c 4c 2c 2d 36 39 37 35 38 35 2e 35  0,NULL,-697585.5
19e0: 38 2c 2d 38 39 32 37 37 2c 2d 38 31 37 33 35 32  8,-89277,-817352
19f0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
1a00: 20 74 32 20 56 41 4c 55 45 53 28 58 27 31 41 39   t2 VALUES(X'1A9
1a10: 45 42 37 35 34 37 41 34 41 41 46 33 38 27 2c 27  EB7547A4AAF38','
1a20: 61 69 70 72 64 68 6b 70 7a 64 7a 27 2c 27 61 6e  aiprdhkpzdz','an
1a30: 77 27 2c 27 73 7a 76 6a 62 77 64 76 7a 75 63 79  w','szvjbwdvzucy
1a40: 62 70 77 77 71 6a 74 27 2c 58 27 35 33 27 29 3b  bpwwqjt',X'53');
1a50: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
1a60: 32 20 56 41 4c 55 45 53 28 37 31 33 32 32 30 2c  2 VALUES(713220,
1a70: 4e 55 4c 4c 2c 27 68 66 63 71 68 71 7a 6a 75 71  NULL,'hfcqhqzjuq
1a80: 70 6c 76 6b 75 6d 27 2c 58 27 32 30 42 30 37 36  plvkum',X'20B076
1a90: 30 37 35 36 34 39 44 45 27 2c 27 66 74 68 67 70  075649DE','fthgp
1aa0: 76 71 64 79 79 27 29 3b 0a 20 20 49 4e 53 45 52  vqdyy');.  INSER
1ab0: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
1ac0: 28 37 36 33 39 30 38 2c 4e 55 4c 4c 2c 27 78 67  (763908,NULL,'xg
1ad0: 73 6c 7a 63 70 76 77 66 6b 6e 62 72 27 2c 58 27  slzcpvwfknbr',X'
1ae0: 37 35 27 2c 58 27 36 36 38 31 34 36 27 29 3b 0a  75',X'668146');.
1af0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
1b00: 20 56 41 4c 55 45 53 28 58 27 45 31 42 41 32 42   VALUES(X'E1BA2B
1b10: 36 42 41 32 37 32 37 38 27 2c 27 77 6a 62 70 64  6BA27278','wjbpd
1b20: 27 2c 4e 55 4c 4c 2c 31 33 39 33 34 31 2c 2d 32  ',NULL,139341,-2
1b30: 39 30 30 38 36 2e 31 35 29 3b 0a 7d 0a 64 62 20  90086.15);.}.db 
1b40: 63 6c 6f 73 65 0a 0a 73 65 74 20 63 6b 73 75 6d  close..set cksum
1b50: 20 5b 67 65 6e 65 72 61 74 65 5f 72 62 75 5f 64   [generate_rbu_d
1b60: 62 20 74 65 73 74 2e 64 62 20 72 62 75 2e 64 62  b test.db rbu.db
1b70: 20 7b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   {.INSERT INTO t
1b80: 32 20 56 41 4c 55 45 53 28 32 32 32 39 31 36 2e  2 VALUES(222916.
1b90: 32 33 2c 27 69 64 68 27 2c 58 27 34 37 32 43 35  23,'idh',X'472C5
1ba0: 31 37 34 30 35 27 2c 58 27 45 33 27 2c 58 27 37  17405',X'E3',X'7
1bb0: 43 34 46 33 31 38 32 34 36 36 39 27 29 3b 0a 49  C4F31824669');.I
1bc0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
1bd0: 4c 55 45 53 28 27 78 63 6e 64 6a 77 61 66 63 6f  LUES('xcndjwafco
1be0: 78 77 78 69 7a 6f 6b 74 64 27 2c 2d 33 31 39 35  xwxizoktd',-3195
1bf0: 36 37 2e 32 31 2c 4e 55 4c 4c 2c 2d 37 32 30 39  67.21,NULL,-7209
1c00: 30 36 2e 34 33 2c 2d 35 37 37 31 37 30 29 3b 0a  06.43,-577170);.
1c10: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
1c20: 41 4c 55 45 53 28 33 37 36 33 36 39 2e 39 39 2c  ALUES(376369.99,
1c30: 2d 35 33 36 30 35 38 2c 27 79 6f 61 69 75 72 66  -536058,'yoaiurf
1c40: 71 75 70 64 73 63 77 63 27 2c 58 27 32 39 45 43  qupdscwc',X'29EC
1c50: 38 41 32 35 34 32 45 43 33 39 35 33 45 39 27 2c  8A2542EC3953E9',
1c60: 2d 37 34 30 34 38 35 2e 32 32 29 3b 0a 49 4e 53  -740485.22);.INS
1c70: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
1c80: 45 53 28 58 27 30 45 46 42 34 44 43 35 30 36 39  ES(X'0EFB4DC5069
1c90: 33 27 2c 2d 31 37 35 35 39 30 2e 38 33 2c 58 27  3',-175590.83,X'
1ca0: 31 37 37 39 45 32 35 33 43 41 42 35 42 31 37 38  1779E253CAB5B178
1cb0: 39 45 27 2c 58 27 42 43 36 39 30 33 27 2c 4e 55  9E',X'BC6903',NU
1cc0: 4c 4c 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f  LL);.INSERT INTO
1cd0: 20 74 32 20 56 41 4c 55 45 53 28 2d 32 38 38 32   t2 VALUES(-2882
1ce0: 39 39 2c 27 68 66 72 70 27 2c 4e 55 4c 4c 2c 35  99,'hfrp',NULL,5
1cf0: 32 38 34 37 37 2c 37 33 30 36 37 36 2e 37 37 29  28477,730676.77)
1d00: 3b 0a 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 32  ;.DELETE FROM t2
1d10: 20 57 48 45 52 45 20 61 20 3c 20 2d 36 30 30 30   WHERE a < -6000
1d20: 30 3b 0a 0a 55 50 44 41 54 45 20 74 32 20 53 45  0;..UPDATE t2 SE
1d30: 54 20 62 20 3d 20 27 70 67 6e 6e 61 61 6f 66 6c  T b = 'pgnnaaofl
1d40: 6e 77 27 20 57 48 45 52 45 20 61 20 3d 20 27 62  nw' WHERE a = 'b
1d50: 7a 62 70 69 27 3b 0a 55 50 44 41 54 45 20 74 32  zbpi';.UPDATE t2
1d60: 20 53 45 54 20 63 20 3d 20 2d 36 37 35 35 38 33   SET c = -675583
1d70: 20 57 48 45 52 45 20 61 20 3d 20 27 72 6f 76 6f   WHERE a = 'rovo
1d80: 65 6e 78 78 6a 27 3b 0a 55 50 44 41 54 45 20 74  enxxj';.UPDATE t
1d90: 32 20 53 45 54 20 64 20 3d 20 58 27 30 39 43 44  2 SET d = X'09CD
1da0: 46 32 42 32 43 32 34 31 27 20 57 48 45 52 45 20  F2B2C241' WHERE 
1db0: 61 20 3d 20 37 31 33 32 32 30 3b 0a 0a 49 4e 53  a = 713220;..INS
1dc0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
1dd0: 45 53 28 32 32 34 39 33 38 2c 27 62 6d 72 75 79  ES(224938,'bmruy
1de0: 63 76 66 7a 6e 68 68 6e 66 6d 67 71 79 73 27 2c  cvfznhhnfmgqys',
1df0: 27 66 72 27 2c 38 35 34 33 38 31 2c 37 38 39 31  'fr',854381,7891
1e00: 34 33 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f  43);.INSERT INTO
1e10: 20 74 31 20 56 41 4c 55 45 53 28 2d 38 36 33 39   t1 VALUES(-8639
1e20: 33 31 2c 2d 31 33 38 36 2e 32 36 2c 58 27 32 41  31,-1386.26,X'2A
1e30: 30 35 38 35 34 30 43 32 46 42 35 43 27 2c 4e 55  058540C2FB5C',NU
1e40: 4c 4c 2c 58 27 46 39 44 35 39 39 30 41 27 29 3b  LL,X'F9D5990A');
1e50: 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20  .INSERT INTO t1 
1e60: 56 41 4c 55 45 53 28 36 37 33 36 39 36 2c 58 27  VALUES(673696,X'
1e70: 39 37 33 30 31 46 30 41 43 35 37 33 35 46 34 34  97301F0AC5735F44
1e80: 42 35 27 2c 58 27 34 34 30 43 27 2c 32 32 37 39  B5',X'440C',2279
1e90: 39 39 2e 39 32 2c 2d 37 30 39 35 39 39 2e 37 39  99.92,-709599.79
1ea0: 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  );.INSERT INTO t
1eb0: 31 20 56 41 4c 55 45 53 28 2d 32 34 33 36 34 30  1 VALUES(-243640
1ec0: 2c 4e 55 4c 4c 2c 2d 37 31 37 31 38 2e 31 31 2c  ,NULL,-71718.11,
1ed0: 58 27 31 45 45 46 45 42 33 38 27 2c 58 27 38 43  X'1EEFEB38',X'8C
1ee0: 43 37 43 35 35 44 39 35 45 31 34 32 46 42 41 35  C7C55D95E142FBA5
1ef0: 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20  ');.INSERT INTO 
1f00: 74 31 20 56 41 4c 55 45 53 28 32 37 35 38 39 33  t1 VALUES(275893
1f10: 2c 58 27 27 2c 33 37 35 36 30 36 2e 33 30 2c 58  ,X'',375606.30,X
1f20: 27 30 41 46 39 45 43 33 33 34 37 31 31 46 42 27  '0AF9EC334711FB'
1f30: 2c 2d 34 36 38 31 39 34 29 3b 0a 44 45 4c 45 54  ,-468194);.DELET
1f40: 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  E FROM t1 WHERE 
1f50: 61 20 3e 20 32 30 30 30 30 30 3b 0a 0a 55 50 44  a > 200000;..UPD
1f60: 41 54 45 20 74 31 20 53 45 54 20 62 20 3d 20 27  ATE t1 SET b = '
1f70: 70 67 6e 6e 61 61 6f 66 6c 6e 77 27 20 57 48 45  pgnnaaoflnw' WHE
1f80: 52 45 20 61 20 3d 20 2d 31 39 30 34 36 32 3b 0a  RE a = -190462;.
1f90: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 63 20  UPDATE t1 SET c 
1fa0: 3d 20 2d 36 37 35 35 38 33 20 57 48 45 52 45 20  = -675583 WHERE 
1fb0: 61 20 3d 20 2d 34 36 37 36 36 35 3b 0a 55 50 44  a = -467665;.UPD
1fc0: 41 54 45 20 74 31 20 53 45 54 20 64 20 3d 20 58  ATE t1 SET d = X
1fd0: 27 30 39 43 44 46 32 42 32 43 32 34 31 27 20 57  '09CDF2B2C241' W
1fe0: 48 45 52 45 20 61 20 3d 20 2d 31 33 33 30 34 35  HERE a = -133045
1ff0: 3b 0a 0a 7d 5d 0a 0a 66 6f 72 65 61 63 68 20 7b  ;..}]..foreach {
2000: 74 6e 20 69 64 78 7d 20 7b 0a 20 20 31 20 7b 0a  tn idx} {.  1 {.
2010: 20 20 7d 0a 20 20 32 20 7b 0a 20 20 20 20 43 52    }.  2 {.    CR
2020: 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45  EATE UNIQUE INDE
2030: 58 20 69 31 20 4f 4e 20 74 31 28 62 2c 20 63 2c  X i1 ON t1(b, c,
2040: 20 64 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   d);.    CREATE 
2050: 55 4e 49 51 55 45 20 49 4e 44 45 58 20 69 32 20  UNIQUE INDEX i2 
2060: 4f 4e 20 74 31 28 64 2c 20 65 2c 20 61 29 3b 0a  ON t1(d, e, a);.
2070: 20 20 20 20 43 52 45 41 54 45 20 55 4e 49 51 55      CREATE UNIQU
2080: 45 20 49 4e 44 45 58 20 69 33 20 4f 4e 20 74 31  E INDEX i3 ON t1
2090: 28 65 2c 20 64 2c 20 63 2c 20 62 29 3b 0a 0a 20  (e, d, c, b);.. 
20a0: 20 20 20 43 52 45 41 54 45 20 55 4e 49 51 55 45     CREATE UNIQUE
20b0: 20 49 4e 44 45 58 20 69 34 20 4f 4e 20 74 32 28   INDEX i4 ON t2(
20c0: 62 2c 20 63 2c 20 64 29 3b 0a 20 20 20 20 43 52  b, c, d);.    CR
20d0: 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45  EATE UNIQUE INDE
20e0: 58 20 69 35 20 4f 4e 20 74 32 28 64 2c 20 65 2c  X i5 ON t2(d, e,
20f0: 20 61 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   a);.    CREATE 
2100: 55 4e 49 51 55 45 20 49 4e 44 45 58 20 69 36 20  UNIQUE INDEX i6 
2110: 4f 4e 20 74 32 28 65 2c 20 64 2c 20 63 2c 20 62  ON t2(e, d, c, b
2120: 29 3b 0a 20 20 7d 0a 7d 20 7b 0a 20 20 66 6f 72  );.  }.} {.  for
2130: 65 61 63 68 20 63 6d 64 20 7b 72 75 6e 20 73 74  each cmd {run st
2140: 65 70 7d 20 7b 0a 20 20 20 20 66 6f 72 63 65 63  ep} {.    forcec
2150: 6f 70 79 20 74 65 73 74 2e 64 62 20 74 65 73 74  opy test.db test
2160: 2e 64 62 32 0a 20 20 20 20 66 6f 72 63 65 63 6f  .db2.    forceco
2170: 70 79 20 72 62 75 2e 64 62 20 72 62 75 2e 64 62  py rbu.db rbu.db
2180: 32 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64  2..    sqlite3 d
2190: 62 20 74 65 73 74 2e 64 62 32 0a 20 20 20 20 64  b test.db2.    d
21a0: 62 20 65 76 61 6c 20 24 69 64 78 0a 0a 20 20 20  b eval $idx..   
21b0: 20 64 6f 5f 74 65 73 74 20 32 2e 24 74 6e 2e 24   do_test 2.$tn.$
21c0: 63 6d 64 2e 31 20 7b 0a 20 20 20 20 20 20 24 7b  cmd.1 {.      ${
21d0: 63 6d 64 7d 5f 72 62 75 20 74 65 73 74 2e 64 62  cmd}_rbu test.db
21e0: 32 20 72 62 75 2e 64 62 32 0a 20 20 20 20 20 20  2 rbu.db2.      
21f0: 64 61 74 61 63 6b 73 75 6d 20 64 62 0a 20 20 20  datacksum db.   
2200: 20 7d 20 24 63 6b 73 75 6d 0a 0a 20 20 20 20 64   } $cksum..    d
2210: 6f 5f 74 65 73 74 20 32 2e 24 74 6e 2e 24 63 6d  o_test 2.$tn.$cm
2220: 64 2e 32 20 7b 0a 20 20 20 20 20 20 64 62 20 65  d.2 {.      db e
2230: 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 69 6e 74  val { PRAGMA int
2240: 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 20 0a  egrity_check } .
2250: 20 20 20 20 7d 20 7b 6f 6b 7d 0a 0a 20 20 20 20      } {ok}..    
2260: 64 62 20 63 6c 6f 73 65 0a 20 20 7d 0a 7d 0a 0a  db close.  }.}..
2270: 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a           .finish_test.