/ Hex Artifact Content
Login

Artifact 60d904133ff843fe72cc0514e9dd2486707181e6e0fbab20979da28c48d21de9:


0000: 23 20 32 30 31 35 20 41 75 67 20 38 0a 23 0a 23  # 2015 Aug 8.#.#
0010: 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73 63   The author disc
0020: 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74 20  laims copyright 
0030: 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20 63  to this source c
0040: 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f  ode.  In place o
0050: 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69  f.# a legal noti
0060: 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c  ce, here is a bl
0070: 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20 20 4d  essing:.#.#    M
0080: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
0090: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23 20 20  nd not evil..#  
00a0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00b0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00c0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00d0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20 20 20  ive others..#   
00e0: 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66   May you share f
00f0: 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b  reely, never tak
0100: 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f  ing more than yo
0110: 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a 2a 2a  u 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 0a 23 0a 0a 69 66 20 7b 21 5b 69 6e 66 6f  **.#..if {![info
0170: 20 65 78 69 73 74 73 20 74 65 73 74 64 69 72 5d   exists testdir]
0180: 7d 20 7b 0a 20 20 73 65 74 20 74 65 73 74 64 69  } {.  set testdi
0190: 72 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 66 69  r [file join [fi
01a0: 6c 65 20 64 69 72 6e 61 6d 65 20 5b 69 6e 66 6f  le dirname [info
01b0: 20 73 63 72 69 70 74 5d 5d 20 2e 2e 20 2e 2e 20   script]] .. .. 
01c0: 74 65 73 74 5d 0a 7d 0a 73 6f 75 72 63 65 20 24  test].}.source $
01d0: 74 65 73 74 64 69 72 2f 74 65 73 74 65 72 2e 74  testdir/tester.t
01e0: 63 6c 0a 0a 70 72 6f 63 20 63 68 65 63 6b 5f 70  cl..proc check_p
01f0: 72 65 73 74 65 70 5f 73 74 61 74 65 20 7b 74 61  restep_state {ta
0200: 72 67 65 74 20 73 74 61 74 65 7d 20 7b 0a 20 20  rget state} {.  
0210: 73 65 74 20 6f 61 6c 5f 65 78 69 73 74 73 20 5b  set oal_exists [
0220: 66 69 6c 65 20 65 78 69 73 74 73 20 24 74 61 72  file exists $tar
0230: 67 65 74 2d 6f 61 6c 5d 0a 20 20 73 65 74 20 77  get-oal].  set w
0240: 61 6c 5f 65 78 69 73 74 73 20 5b 66 69 6c 65 20  al_exists [file 
0250: 65 78 69 73 74 73 20 24 74 61 72 67 65 74 2d 77  exists $target-w
0260: 61 6c 5d 0a 20 20 73 65 74 20 70 72 6f 67 72 65  al].  set progre
0270: 73 73 20 5b 72 62 75 20 70 72 6f 67 72 65 73 73  ss [rbu progress
0280: 5d 0a 0a 20 20 69 66 20 7b 28 24 70 72 6f 67 72  ]..  if {($progr
0290: 65 73 73 3d 3d 30 20 26 26 20 24 73 74 61 74 65  ess==0 && $state
02a0: 21 3d 22 6f 61 6c 22 20 26 26 20 24 73 74 61 74  !="oal" && $stat
02b0: 65 21 3d 22 64 6f 6e 65 22 29 0a 20 20 20 7c 7c  e!="done").   ||
02c0: 20 28 24 6f 61 6c 5f 65 78 69 73 74 73 20 26 26   ($oal_exists &&
02d0: 20 24 77 61 6c 5f 65 78 69 73 74 73 29 0a 20 20   $wal_exists).  
02e0: 20 7c 7c 20 28 24 70 72 6f 67 72 65 73 73 3e 30   || ($progress>0
02f0: 20 26 26 20 24 73 74 61 74 65 3d 3d 22 6f 61 6c   && $state=="oal
0300: 22 20 26 26 20 28 21 24 6f 61 6c 5f 65 78 69 73  " && (!$oal_exis
0310: 74 73 20 7c 7c 20 24 77 61 6c 5f 65 78 69 73 74  ts || $wal_exist
0320: 73 29 29 0a 20 20 20 7c 7c 20 28 24 73 74 61 74  s)).   || ($stat
0330: 65 3d 3d 22 6d 6f 76 65 22 20 26 26 20 28 21 24  e=="move" && (!$
0340: 6f 61 6c 5f 65 78 69 73 74 73 20 7c 7c 20 24 77  oal_exists || $w
0350: 61 6c 5f 65 78 69 73 74 73 29 29 0a 20 20 20 7c  al_exists)).   |
0360: 7c 20 28 24 73 74 61 74 65 3d 3d 22 63 68 65 63  | ($state=="chec
0370: 6b 70 6f 69 6e 74 22 20 26 26 20 28 24 6f 61 6c  kpoint" && ($oal
0380: 5f 65 78 69 73 74 73 20 7c 7c 20 21 24 77 61 6c  _exists || !$wal
0390: 5f 65 78 69 73 74 73 29 29 0a 20 20 20 7c 7c 20  _exists)).   || 
03a0: 28 24 73 74 61 74 65 3d 3d 22 64 6f 6e 65 22 20  ($state=="done" 
03b0: 26 26 20 28 24 6f 61 6c 5f 65 78 69 73 74 73 20  && ($oal_exists 
03c0: 26 26 20 24 70 72 6f 67 72 65 73 73 21 3d 30 29  && $progress!=0)
03d0: 29 0a 20 20 7d 20 7b 0a 20 20 20 20 65 72 72 6f  ).  } {.    erro
03e0: 72 20 22 42 3a 20 73 74 61 74 65 3d 24 73 74 61  r "B: state=$sta
03f0: 74 65 20 70 72 6f 67 72 65 73 73 3d 24 70 72 6f  te progress=$pro
0400: 67 72 65 73 73 20 6f 61 6c 3d 24 6f 61 6c 5f 65  gress oal=$oal_e
0410: 78 69 73 74 73 20 77 61 6c 3d 24 77 61 6c 5f 65  xists wal=$wal_e
0420: 78 69 73 74 73 22 0a 20 20 7d 0a 7d 0a 0a 70 72  xists".  }.}..pr
0430: 6f 63 20 63 68 65 63 6b 5f 70 6f 73 74 73 74 65  oc check_postste
0440: 70 5f 73 74 61 74 65 20 7b 72 63 20 74 61 72 67  p_state {rc targ
0450: 65 74 20 73 74 61 74 65 7d 20 7b 0a 20 20 69 66  et state} {.  if
0460: 20 7b 24 72 63 3d 3d 22 53 51 4c 49 54 45 5f 4f   {$rc=="SQLITE_O
0470: 4b 22 20 7c 7c 20 24 72 63 3d 3d 22 53 51 4c 49  K" || $rc=="SQLI
0480: 54 45 5f 44 4f 4e 45 22 7d 20 7b 0a 20 20 20 20  TE_DONE"} {.    
0490: 73 65 74 20 6f 61 6c 5f 65 78 69 73 74 73 20 5b  set oal_exists [
04a0: 66 69 6c 65 20 65 78 69 73 74 73 20 24 74 61 72  file exists $tar
04b0: 67 65 74 2d 6f 61 6c 5d 0a 20 20 20 20 73 65 74  get-oal].    set
04c0: 20 77 61 6c 5f 65 78 69 73 74 73 20 5b 66 69 6c   wal_exists [fil
04d0: 65 20 65 78 69 73 74 73 20 24 74 61 72 67 65 74  e exists $target
04e0: 2d 77 61 6c 5d 0a 20 20 20 20 69 66 20 7b 24 73  -wal].    if {$s
04f0: 74 61 74 65 3d 3d 22 6d 6f 76 65 22 20 26 26 20  tate=="move" && 
0500: 28 24 6f 61 6c 5f 65 78 69 73 74 73 20 7c 7c 20  ($oal_exists || 
0510: 21 24 77 61 6c 5f 65 78 69 73 74 73 29 7d 20 7b  !$wal_exists)} {
0520: 0a 20 20 20 20 20 20 65 72 72 6f 72 20 22 41 3a  .      error "A:
0530: 20 73 74 61 74 65 3d 24 73 74 61 74 65 20 70 72   state=$state pr
0540: 6f 67 72 65 73 73 3d 24 70 72 6f 67 72 65 73 73  ogress=$progress
0550: 20 6f 61 6c 3d 24 6f 61 6c 5f 65 78 69 73 74 73   oal=$oal_exists
0560: 20 77 61 6c 3d 24 77 61 6c 5f 65 78 69 73 74 73   wal=$wal_exists
0570: 22 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23  ".    }.  }.}..#
0580: 20 52 75 6e 20 74 68 65 20 52 42 55 20 69 6e 20   Run the RBU in 
0590: 66 69 6c 65 20 24 72 62 75 20 6f 6e 20 74 61 72  file $rbu on tar
05a0: 67 65 74 20 64 61 74 61 62 61 73 65 20 24 74 61  get database $ta
05b0: 72 67 65 74 20 75 6e 74 69 6c 20 63 6f 6d 70 6c  rget until compl
05c0: 65 74 69 6f 6e 2e 0a 23 0a 70 72 6f 63 20 72 75  etion..#.proc ru
05d0: 6e 5f 72 62 75 20 7b 74 61 72 67 65 74 20 72 62  n_rbu {target rb
05e0: 75 7d 20 7b 0a 20 20 73 71 6c 69 74 65 33 72 62  u} {.  sqlite3rb
05f0: 75 20 72 62 75 20 24 74 61 72 67 65 74 20 24 72  u rbu $target $r
0600: 62 75 0a 20 20 77 68 69 6c 65 20 31 20 7b 0a 20  bu.  while 1 {. 
0610: 20 20 20 73 65 74 20 73 74 61 74 65 20 5b 72 62     set state [rb
0620: 75 20 73 74 61 74 65 5d 0a 0a 20 20 20 20 63 68  u state]..    ch
0630: 65 63 6b 5f 70 72 65 73 74 65 70 5f 73 74 61 74  eck_prestep_stat
0640: 65 20 24 74 61 72 67 65 74 20 24 73 74 61 74 65  e $target $state
0650: 0a 20 20 20 20 73 65 74 20 72 63 20 5b 72 62 75  .    set rc [rbu
0660: 20 73 74 65 70 5d 0a 20 20 20 20 63 68 65 63 6b   step].    check
0670: 5f 70 6f 73 74 73 74 65 70 5f 73 74 61 74 65 20  _poststep_state 
0680: 24 72 63 20 24 74 61 72 67 65 74 20 24 73 74 61  $rc $target $sta
0690: 74 65 0a 0a 20 20 20 20 69 66 20 7b 24 72 63 21  te..    if {$rc!
06a0: 3d 22 53 51 4c 49 54 45 5f 4f 4b 22 7d 20 62 72  ="SQLITE_OK"} br
06b0: 65 61 6b 0a 20 20 7d 0a 20 20 72 62 75 20 63 6c  eak.  }.  rbu cl
06c0: 6f 73 65 0a 7d 0a 0a 70 72 6f 63 20 73 74 65 70  ose.}..proc step
06d0: 5f 72 62 75 20 7b 74 61 72 67 65 74 20 72 62 75  _rbu {target rbu
06e0: 7d 20 7b 0a 20 20 77 68 69 6c 65 20 31 20 7b 0a  } {.  while 1 {.
06f0: 20 20 20 20 73 71 6c 69 74 65 33 72 62 75 20 72      sqlite3rbu r
0700: 62 75 20 24 74 61 72 67 65 74 20 24 72 62 75 0a  bu $target $rbu.
0710: 20 20 20 20 73 65 74 20 73 74 61 74 65 20 5b 72      set state [r
0720: 62 75 20 73 74 61 74 65 5d 0a 20 20 20 20 63 68  bu state].    ch
0730: 65 63 6b 5f 70 72 65 73 74 65 70 5f 73 74 61 74  eck_prestep_stat
0740: 65 20 24 74 61 72 67 65 74 20 24 73 74 61 74 65  e $target $state
0750: 0a 20 20 20 20 73 65 74 20 72 63 20 5b 72 62 75  .    set rc [rbu
0760: 20 73 74 65 70 5d 0a 20 20 20 20 63 68 65 63 6b   step].    check
0770: 5f 70 6f 73 74 73 74 65 70 5f 73 74 61 74 65 20  _poststep_state 
0780: 24 72 63 20 24 74 61 72 67 65 74 20 24 73 74 61  $rc $target $sta
0790: 74 65 0a 20 20 20 20 72 62 75 20 63 6c 6f 73 65  te.    rbu close
07a0: 0a 20 20 20 20 69 66 20 7b 24 72 63 20 21 3d 20  .    if {$rc != 
07b0: 22 53 51 4c 49 54 45 5f 4f 4b 22 7d 20 62 72 65  "SQLITE_OK"} bre
07c0: 61 6b 0a 20 20 7d 0a 20 20 73 65 74 20 72 63 0a  ak.  }.  set rc.
07d0: 7d 0a 0a 70 72 6f 63 20 73 74 65 70 5f 72 62 75  }..proc step_rbu
07e0: 5f 6c 65 67 61 63 79 20 7b 74 61 72 67 65 74 20  _legacy {target 
07f0: 72 62 75 7d 20 7b 0a 20 20 77 68 69 6c 65 20 31  rbu} {.  while 1
0800: 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 72 62   {.    sqlite3rb
0810: 75 20 72 62 75 20 24 74 61 72 67 65 74 20 24 72  u rbu $target $r
0820: 62 75 0a 20 20 20 20 73 65 74 20 73 74 61 74 65  bu.    set state
0830: 20 5b 72 62 75 20 73 74 61 74 65 5d 0a 20 20 20   [rbu state].   
0840: 20 63 68 65 63 6b 5f 70 72 65 73 74 65 70 5f 73   check_prestep_s
0850: 74 61 74 65 20 24 74 61 72 67 65 74 20 24 73 74  tate $target $st
0860: 61 74 65 0a 20 20 20 20 73 65 74 20 72 63 20 5b  ate.    set rc [
0870: 72 62 75 20 73 74 65 70 5d 0a 20 20 20 20 63 68  rbu step].    ch
0880: 65 63 6b 5f 70 6f 73 74 73 74 65 70 5f 73 74 61  eck_poststep_sta
0890: 74 65 20 24 72 63 20 24 74 61 72 67 65 74 20 24  te $rc $target $
08a0: 73 74 61 74 65 0a 20 20 20 20 72 62 75 20 63 6c  state.    rbu cl
08b0: 6f 73 65 0a 20 20 20 20 69 66 20 7b 24 72 63 20  ose.    if {$rc 
08c0: 21 3d 20 22 53 51 4c 49 54 45 5f 4f 4b 22 7d 20  != "SQLITE_OK"} 
08d0: 62 72 65 61 6b 0a 20 20 20 20 73 71 6c 69 74 65  break.    sqlite
08e0: 33 20 74 6d 70 64 62 20 24 72 62 75 0a 20 20 20  3 tmpdb $rbu.   
08f0: 20 74 6d 70 64 62 20 65 76 61 6c 20 7b 20 44 45   tmpdb eval { DE
0900: 4c 45 54 45 20 46 52 4f 4d 20 72 62 75 5f 73 74  LETE FROM rbu_st
0910: 61 74 65 20 57 48 45 52 45 20 6b 3d 3d 31 30 20  ate WHERE k==10 
0920: 7d 0a 20 20 20 20 74 6d 70 64 62 20 63 6c 6f 73  }.    tmpdb clos
0930: 65 0a 20 20 7d 0a 20 20 73 65 74 20 72 63 0a 7d  e.  }.  set rc.}
0940: 0a 0a 70 72 6f 63 20 64 6f 5f 72 62 75 5f 76 61  ..proc do_rbu_va
0950: 63 75 75 6d 5f 74 65 73 74 20 7b 74 6e 20 73 74  cuum_test {tn st
0960: 65 70 20 7b 73 74 61 74 65 64 62 20 73 74 61 74  ep {statedb stat
0970: 65 2e 64 62 7d 7d 20 7b 0a 20 20 66 6f 72 63 65  e.db}} {.  force
0980: 64 65 6c 65 74 65 20 24 73 74 61 74 65 64 62 0a  delete $statedb.
0990: 20 20 69 66 20 7b 24 73 74 61 74 65 64 62 3d 3d    if {$statedb==
09a0: 22 22 20 26 26 20 24 73 74 65 70 3d 3d 31 7d 20  "" && $step==1} 
09b0: 62 72 65 61 6b 70 6f 69 6e 74 0a 20 20 75 70 6c  breakpoint.  upl
09c0: 65 76 65 6c 20 5b 6c 69 73 74 20 64 6f 5f 74 65  evel [list do_te
09d0: 73 74 20 24 74 6e 2e 31 20 5b 73 74 72 69 6e 67  st $tn.1 [string
09e0: 20 6d 61 70 20 5b 6c 69 73 74 20 25 73 74 61 74   map [list %stat
09f0: 65 25 20 24 73 74 61 74 65 64 62 20 25 73 74 65  e% $statedb %ste
0a00: 70 25 20 24 73 74 65 70 5d 20 7b 0a 20 20 20 20  p% $step] {.    
0a10: 69 66 20 7b 25 73 74 65 70 25 3d 3d 30 7d 20 7b  if {%step%==0} {
0a20: 20 73 71 6c 69 74 65 33 72 62 75 5f 76 61 63 75   sqlite3rbu_vacu
0a30: 75 6d 20 72 62 75 20 74 65 73 74 2e 64 62 20 7b  um rbu test.db {
0a40: 25 73 74 61 74 65 25 7d 7d 0a 20 20 20 20 77 68  %state%}}.    wh
0a50: 69 6c 65 20 31 20 7b 0a 20 20 20 20 20 20 69 66  ile 1 {.      if
0a60: 20 7b 25 73 74 65 70 25 3d 3d 31 7d 20 7b 20 73   {%step%==1} { s
0a70: 71 6c 69 74 65 33 72 62 75 5f 76 61 63 75 75 6d  qlite3rbu_vacuum
0a80: 20 72 62 75 20 74 65 73 74 2e 64 62 20 7b 25 73   rbu test.db {%s
0a90: 74 61 74 65 25 7d 7d 0a 20 20 20 20 20 20 73 65  tate%}}.      se
0aa0: 74 20 73 74 61 74 65 20 5b 72 62 75 20 73 74 61  t state [rbu sta
0ab0: 74 65 5d 0a 20 20 20 20 20 20 63 68 65 63 6b 5f  te].      check_
0ac0: 70 72 65 73 74 65 70 5f 73 74 61 74 65 20 74 65  prestep_state te
0ad0: 73 74 2e 64 62 20 24 73 74 61 74 65 0a 20 20 20  st.db $state.   
0ae0: 20 20 20 73 65 74 20 72 63 20 5b 72 62 75 20 73     set rc [rbu s
0af0: 74 65 70 5d 0a 20 20 20 20 20 20 63 68 65 63 6b  tep].      check
0b00: 5f 70 6f 73 74 73 74 65 70 5f 73 74 61 74 65 20  _poststep_state 
0b10: 24 72 63 20 74 65 73 74 2e 64 62 20 24 73 74 61  $rc test.db $sta
0b20: 74 65 0a 20 20 20 20 20 20 69 66 20 7b 24 72 63  te.      if {$rc
0b30: 21 3d 22 53 51 4c 49 54 45 5f 4f 4b 22 7d 20 62  !="SQLITE_OK"} b
0b40: 72 65 61 6b 0a 20 20 20 20 20 20 69 66 20 7b 25  reak.      if {%
0b50: 73 74 65 70 25 3d 3d 31 7d 20 7b 20 72 62 75 20  step%==1} { rbu 
0b60: 63 6c 6f 73 65 20 7d 0a 20 20 20 20 7d 0a 20 20  close }.    }.  
0b70: 20 20 72 62 75 20 63 6c 6f 73 65 0a 20 20 7d 5d    rbu close.  }]
0b80: 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 7d 5d 0a   {SQLITE_DONE}].
0b90: 0a 20 20 75 70 6c 65 76 65 6c 20 5b 6c 69 73 74  .  uplevel [list
0ba0: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
0bb0: 20 24 74 6e 2e 32 20 7b 0a 20 20 20 20 50 52 41   $tn.2 {.    PRA
0bc0: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
0bd0: 65 63 6b 0a 20 20 7d 20 6f 6b 5d 0a 7d 0a 0a     eck.  } ok].}..