/ Hex Artifact Content
Login

Artifact 8acb77f4a422ff55acfcfc9cc15a5cb210b1de83:


0000: 23 20 32 30 31 37 20 4a 61 6e 75 61 72 79 20 31  # 2017 January 1
0010: 33 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72  3.#.# 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 66 6f 72 20 72 65 73 75 6d 70 74  ests for resumpt
0190: 69 6f 6e 20 6f 66 20 52 42 55 20 6f 70 65 72 61  ion of RBU opera
01a0: 74 69 6f 6e 73 20 69 6e 20 74 68 65 0a 23 20 63  tions in the.# c
01b0: 61 73 65 20 77 68 65 72 65 20 74 68 65 20 70 72  ase where the pr
01c0: 65 76 69 6f 75 73 20 52 42 55 20 70 72 6f 63 65  evious RBU proce
01d0: 73 73 20 63 72 61 73 68 65 64 2e 0a 23 0a 0a 73  ss crashed..#..s
01e0: 6f 75 72 63 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ource [file join
01f0: 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b   [file dirname [
0200: 69 6e 66 6f 20 73 63 72 69 70 74 5d 5d 20 72 62  info script]] rb
0210: 75 5f 63 6f 6d 6d 6f 6e 2e 74 63 6c 5d 0a 73 65  u_common.tcl].se
0220: 74 20 3a 3a 74 65 73 74 70 72 65 66 69 78 20 72  t ::testprefix r
0230: 62 75 72 65 73 75 6d 65 0a 0a 66 6f 72 63 65 64  buresume..forced
0240: 65 6c 65 74 65 20 74 65 73 74 2e 64 62 2d 73 68  elete test.db-sh
0250: 6d 20 74 65 73 74 2e 64 62 2d 6f 61 6c 0a 64 6f  m test.db-oal.do
0260: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 2e  _execsql_test 1.
0270: 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42  0 {.  CREATE TAB
0280: 4c 45 20 74 31 28 61 20 50 52 49 4d 41 52 59 20  LE t1(a PRIMARY 
0290: 4b 45 59 2c 20 62 2c 20 63 29 3b 0a 20 20 43 52  KEY, b, c);.  CR
02a0: 45 41 54 45 20 49 4e 44 45 58 20 74 31 61 20 4f  EATE INDEX t1a O
02b0: 4e 20 74 31 28 61 29 3b 0a 20 20 43 52 45 41 54  N t1(a);.  CREAT
02c0: 45 20 49 4e 44 45 58 20 74 31 62 20 4f 4e 20 74  E INDEX t1b ON t
02d0: 31 28 62 29 3b 0a 20 20 43 52 45 41 54 45 20 49  1(b);.  CREATE I
02e0: 4e 44 45 58 20 74 31 63 20 4f 4e 20 74 31 28 63  NDEX t1c ON t1(c
02f0: 29 3b 0a 20 20 57 49 54 48 20 73 28 69 29 20 41  );.  WITH s(i) A
0300: 53 20 28 0a 20 20 20 20 56 41 4c 55 45 53 28 31  S (.    VALUES(1
0310: 29 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45  ) UNION ALL SELE
0320: 43 54 20 69 2b 31 20 46 52 4f 4d 20 73 20 57 48  CT i+1 FROM s WH
0330: 45 52 45 20 69 3c 35 30 0a 20 20 29 0a 20 20 49  ERE i<50.  ).  I
0340: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
0350: 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
0360: 35 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  50), randomblob(
0370: 37 35 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  75), randomblob(
0380: 31 30 30 29 20 46 52 4f 4d 20 73 3b 0a 7d 0a 64  100) FROM s;.}.d
0390: 62 5f 73 61 76 65 5f 61 6e 64 5f 63 6c 6f 73 65  b_save_and_close
03a0: 0a 0a 64 6f 5f 74 65 73 74 20 31 2e 31 20 7b 0a  ..do_test 1.1 {.
03b0: 20 20 6c 69 73 74 20 5b 66 69 6c 65 20 65 78 69    list [file exi
03c0: 73 74 73 20 74 65 73 74 2e 64 62 5d 20 5c 0a 20  sts test.db] \. 
03d0: 20 20 20 20 20 20 5b 66 69 6c 65 20 65 78 69 73        [file exis
03e0: 74 73 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 20  ts test.db-wal] 
03f0: 5c 0a 20 20 20 20 20 20 20 5b 66 69 6c 65 20 65  \.       [file e
0400: 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 73 68  xists test.db-sh
0410: 6d 5d 20 5c 0a 20 20 20 20 20 20 20 5b 66 69 6c  m] \.       [fil
0420: 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62  e exists test.db
0430: 2d 6f 61 6c 5d 0a 7d 20 7b 31 20 30 20 30 20 30  -oal].} {1 0 0 0
0440: 7d 0a 0a 23 20 45 61 63 68 20 69 74 65 72 61 74  }..# Each iterat
0450: 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ion of the follo
0460: 77 69 6e 67 20 6c 6f 6f 70 3a 0a 23 0a 23 20 20  wing loop:.#.#  
0470: 20 31 2e 20 52 65 73 74 6f 72 65 73 20 74 68 65   1. Restores the
0480: 20 64 62 20 74 6f 20 74 68 65 20 73 74 61 74 65   db to the state
0490: 20 69 74 20 77 61 73 20 69 6e 20 66 6f 6c 6c 6f   it was in follo
04a0: 77 69 6e 67 20 74 65 73 74 20 63 61 73 65 20 31  wing test case 1
04b0: 2e 30 0a 23 20 20 20 32 2e 20 4f 70 65 6e 73 20  .0.#   2. Opens 
04c0: 61 6e 20 52 42 55 20 76 61 63 75 75 6d 20 61 6e  an RBU vacuum an
04d0: 64 20 73 74 65 70 73 20 69 74 20 24 6e 20 74 69  d steps it $n ti
04e0: 6d 65 73 2e 0a 23 20 20 20 33 2e 20 43 6c 6f 73  mes..#   3. Clos
04f0: 65 73 20 74 68 65 20 52 42 55 20 76 61 63 75 75  es the RBU vacuu
0500: 6d 20 68 61 6e 64 6c 65 64 20 6f 70 65 6e 65 64  m handled opened
0510: 20 69 6e 20 28 32 29 2e 0a 23 20 20 20 34 2e 20   in (2)..#   4. 
0520: 4f 70 65 6e 73 20 61 20 73 65 63 6f 6e 64 20 52  Opens a second R
0530: 42 55 20 76 61 63 75 75 6d 20 68 61 6e 64 6c 65  BU vacuum handle
0540: 2c 20 72 65 73 75 6d 65 73 20 61 6e 64 20 63 6f  , resumes and co
0550: 6d 70 6c 65 74 65 73 20 74 68 65 20 76 61 63 75  mpletes the vacu
0560: 75 6d 20 6f 70 2e 20 0a 23 0a 23 20 54 68 65 20  um op. .#.# The 
0570: 6c 6f 6f 70 20 72 75 6e 73 20 75 6e 74 69 6c 20  loop runs until 
0580: 24 6e 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75  $n is large enou
0590: 67 68 20 74 68 61 74 20 73 74 65 70 20 28 32 29  gh that step (2)
05a0: 20 76 61 63 75 75 6d 73 20 74 68 65 20 65 6e 74   vacuums the ent
05b0: 69 72 65 0a 23 20 64 61 74 61 62 61 73 65 2e 0a  ire.# database..
05c0: 23 0a 66 6f 72 20 7b 73 65 74 20 6e 20 31 7d 20  #.for {set n 1} 
05d0: 7b 24 6e 20 3c 20 35 30 30 30 7d 20 7b 69 6e 63  {$n < 5000} {inc
05e0: 72 20 6e 7d 20 7b 0a 20 20 64 62 5f 72 65 73 74  r n} {.  db_rest
05f0: 6f 72 65 0a 20 20 66 6f 72 63 65 64 65 6c 65 74  ore.  forcedelet
0600: 65 20 73 74 61 74 65 2e 64 62 0a 20 20 73 71 6c  e state.db.  sql
0610: 69 74 65 33 72 62 75 5f 76 61 63 75 75 6d 20 72  ite3rbu_vacuum r
0620: 62 75 20 74 65 73 74 2e 64 62 20 73 74 61 74 65  bu test.db state
0630: 2e 64 62 0a 20 20 66 6f 72 20 7b 73 65 74 20 69  .db.  for {set i
0640: 20 30 7d 20 7b 24 69 3c 24 6e 7d 20 7b 69 6e 63   0} {$i<$n} {inc
0650: 72 20 69 7d 20 7b 0a 20 20 20 20 73 65 74 20 72  r i} {.    set r
0660: 63 20 5b 72 62 75 20 73 74 65 70 5d 0a 20 20 20  c [rbu step].   
0670: 20 69 66 20 7b 24 72 63 20 3d 3d 20 22 53 51 4c   if {$rc == "SQL
0680: 49 54 45 5f 44 4f 4e 45 22 7d 20 62 72 65 61 6b  ITE_DONE"} break
0690: 0a 20 20 7d 0a 20 20 72 62 75 20 63 6c 6f 73 65  .  }.  rbu close
06a0: 0a 20 20 69 66 20 7b 24 72 63 20 3d 3d 20 22 53  .  if {$rc == "S
06b0: 51 4c 49 54 45 5f 44 4f 4e 45 22 7d 20 62 72 65  QLITE_DONE"} bre
06c0: 61 6b 0a 0a 20 20 64 6f 5f 74 65 73 74 20 31 2e  ak..  do_test 1.
06d0: 32 2e 24 6e 2e 31 20 7b 0a 20 20 20 20 73 71 6c  2.$n.1 {.    sql
06e0: 69 74 65 33 72 62 75 5f 76 61 63 75 75 6d 20 72  ite3rbu_vacuum r
06f0: 62 75 20 74 65 73 74 2e 64 62 20 73 74 61 74 65  bu test.db state
0700: 2e 64 62 0a 20 20 20 20 77 68 69 6c 65 20 7b 5b  .db.    while {[
0710: 72 62 75 20 73 74 65 70 5d 3d 3d 22 53 51 4c 49  rbu step]=="SQLI
0720: 54 45 5f 4f 4b 22 7d 20 7b 7d 0a 20 20 20 20 72  TE_OK"} {}.    r
0730: 62 75 20 63 6c 6f 73 65 0a 20 20 7d 20 7b 53 51  bu close.  } {SQ
0740: 4c 49 54 45 5f 44 4f 4e 45 7d 0a 0a 20 20 64 6f  LITE_DONE}..  do
0750: 5f 74 65 73 74 20 31 2e 32 2e 24 6e 2e 32 20 7b  _test 1.2.$n.2 {
0760: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 32  .    sqlite3 db2
0770: 20 74 65 73 74 2e 64 62 0a 20 20 20 20 64 62 32   test.db.    db2
0780: 20 65 76 61 6c 20 7b 20 0a 20 20 20 20 20 20 53   eval { .      S
0790: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
07a0: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 50 52  ROM t1;.      PR
07b0: 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63  AGMA integrity_c
07c0: 68 65 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  heck;.    }.  } 
07d0: 7b 35 30 20 6f 6b 7d 0a 20 20 64 62 32 20 63 6c  {50 ok}.  db2 cl
07e0: 6f 73 65 0a 7d 0a 0a 23 20 45 61 63 68 20 69 74  ose.}..# Each it
07f0: 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 69 73 20  eration of this 
0800: 6c 6f 6f 70 3a 0a 23 0a 23 20 20 20 31 2e 20 52  loop:.#.#   1. R
0810: 65 73 74 6f 72 65 73 20 74 68 65 20 64 62 20 74  estores the db t
0820: 6f 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77  o the state it w
0830: 61 73 20 69 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20  as in following 
0840: 74 65 73 74 20 63 61 73 65 20 31 2e 30 0a 23 20  test case 1.0.# 
0850: 20 20 32 2e 20 4f 70 65 6e 73 20 61 6e 20 52 42    2. Opens an RB
0860: 55 20 76 61 63 75 75 6d 20 61 6e 64 20 73 74 65  U vacuum and ste
0870: 70 73 20 69 74 20 24 6e 20 74 69 6d 65 73 2e 0a  ps it $n times..
0880: 23 20 20 20 33 2e 20 54 61 6b 65 73 20 61 20 63  #   3. Takes a c
0890: 6f 70 79 20 6f 66 20 61 6c 6c 20 64 61 74 61 62  opy of all datab
08a0: 61 73 65 20 66 69 6c 65 73 20 61 6e 64 20 74 68  ase files and th
08b0: 65 20 73 74 61 74 65 20 64 62 2e 0a 23 20 20 20  e state db..#   
08c0: 34 2e 20 4f 70 65 6e 73 20 61 20 73 65 63 6f 6e  4. Opens a secon
08d0: 64 20 52 42 55 20 76 61 63 75 75 6d 20 68 61 6e  d RBU vacuum han
08e0: 64 6c 65 20 6f 6e 20 74 68 65 20 63 6f 70 79 2c  dle on the copy,
08f0: 20 72 65 73 75 6d 65 73 20 61 6e 64 20 63 6f 6d   resumes and com
0900: 70 6c 65 74 65 73 20 74 68 65 0a 23 20 20 20 20  pletes the.#    
0910: 20 20 76 61 63 75 75 6d 20 6f 70 2e 20 0a 23 0a    vacuum op. .#.
0920: 23 20 54 68 65 20 6c 6f 6f 70 20 72 75 6e 73 20  # The loop runs 
0930: 75 6e 74 69 6c 20 24 6e 20 69 73 20 6c 61 72 67  until $n is larg
0940: 65 20 65 6e 6f 75 67 68 20 74 68 61 74 20 73 74  e enough that st
0950: 65 70 20 28 32 29 20 76 61 63 75 75 6d 73 20 74  ep (2) vacuums t
0960: 68 65 20 65 6e 74 69 72 65 0a 23 20 64 61 74 61  he entire.# data
0970: 62 61 73 65 2e 0a 23 0a 66 6f 72 20 7b 73 65 74  base..#.for {set
0980: 20 6e 20 31 7d 20 7b 24 6e 20 3c 20 35 30 30 30   n 1} {$n < 5000
0990: 7d 20 7b 69 6e 63 72 20 6e 7d 20 7b 0a 20 20 64  } {incr n} {.  d
09a0: 62 5f 72 65 73 74 6f 72 65 0a 20 20 66 6f 72 63  b_restore.  forc
09b0: 65 64 65 6c 65 74 65 20 73 74 61 74 65 2e 64 62  edelete state.db
09c0: 20 73 74 61 74 65 2e 64 62 2d 73 68 6d 20 73 74   state.db-shm st
09d0: 61 74 65 2e 64 62 2d 6f 61 6c 20 73 74 61 74 65  ate.db-oal state
09e0: 2e 64 62 2d 77 61 6c 0a 20 20 73 71 6c 69 74 65  .db-wal.  sqlite
09f0: 33 72 62 75 5f 76 61 63 75 75 6d 20 72 62 75 20  3rbu_vacuum rbu 
0a00: 74 65 73 74 2e 64 62 20 73 74 61 74 65 2e 64 62  test.db state.db
0a10: 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30 7d  .  for {set i 0}
0a20: 20 7b 24 69 3c 24 6e 7d 20 7b 69 6e 63 72 20 69   {$i<$n} {incr i
0a30: 7d 20 7b 0a 20 20 20 20 73 65 74 20 72 63 20 5b  } {.    set rc [
0a40: 72 62 75 20 73 74 65 70 5d 0a 20 20 20 20 69 66  rbu step].    if
0a50: 20 7b 24 72 63 20 3d 3d 20 22 53 51 4c 49 54 45   {$rc == "SQLITE
0a60: 5f 44 4f 4e 45 22 7d 20 62 72 65 61 6b 0a 20 20  _DONE"} break.  
0a70: 7d 0a 20 20 69 66 20 7b 24 72 63 20 3d 3d 20 22  }.  if {$rc == "
0a80: 53 51 4c 49 54 45 5f 44 4f 4e 45 22 7d 20 7b 0a  SQLITE_DONE"} {.
0a90: 20 20 20 20 72 62 75 20 63 6c 6f 73 65 0a 20 20      rbu close.  
0aa0: 20 20 62 72 65 61 6b 0a 20 20 7d 0a 0a 20 20 66    break.  }..  f
0ab0: 6f 72 65 61 63 68 20 66 20 7b 74 65 73 74 2e 64  oreach f {test.d
0ac0: 62 20 74 65 73 74 2e 64 62 2d 6f 61 6c 20 74 65  b test.db-oal te
0ad0: 73 74 2e 64 62 2d 77 61 6c 20 74 65 73 74 2e 64  st.db-wal test.d
0ae0: 62 2d 73 68 6d 20 74 65 73 74 2e 64 62 2d 76 61  b-shm test.db-va
0af0: 63 75 75 6d 7d 20 7b 0a 20 20 20 20 73 65 74 20  cuum} {.    set 
0b00: 66 32 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b  f2 [string map [
0b10: 6c 69 73 74 20 74 65 73 74 2e 64 62 20 74 65 73  list test.db tes
0b20: 74 2e 64 62 32 5d 20 24 66 5d 0a 20 20 20 20 69  t.db2] $f].    i
0b30: 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  f {[file exists 
0b40: 24 66 5d 7d 20 7b 0a 20 20 20 20 20 20 66 6f 72  $f]} {.      for
0b50: 63 65 63 6f 70 79 20 24 66 20 24 66 32 0a 20 20  cecopy $f $f2.  
0b60: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
0b70: 20 66 6f 72 63 65 64 65 6c 65 74 65 20 24 66 32   forcedelete $f2
0b80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
0b90: 63 65 63 6f 70 79 20 73 74 61 74 65 2e 64 62 20  cecopy state.db 
0ba0: 73 74 61 74 65 2e 64 62 32 0a 20 20 72 62 75 20  state.db2.  rbu 
0bb0: 63 6c 6f 73 65 0a 0a 20 20 64 6f 5f 74 65 73 74  close..  do_test
0bc0: 20 31 2e 33 2e 24 6e 2e 31 20 7b 0a 20 20 20 20   1.3.$n.1 {.    
0bd0: 73 71 6c 69 74 65 33 72 62 75 5f 76 61 63 75 75  sqlite3rbu_vacuu
0be0: 6d 20 72 62 75 20 74 65 73 74 2e 64 62 32 20 73  m rbu test.db2 s
0bf0: 74 61 74 65 2e 64 62 32 0a 20 20 20 20 77 68 69  tate.db2.    whi
0c00: 6c 65 20 7b 5b 72 62 75 20 73 74 65 70 5d 3d 3d  le {[rbu step]==
0c10: 22 53 51 4c 49 54 45 5f 4f 4b 22 7d 20 7b 7d 0a  "SQLITE_OK"} {}.
0c20: 20 20 20 20 72 62 75 20 63 6c 6f 73 65 0a 20 20      rbu close.  
0c30: 7d 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 7d 0a  } {SQLITE_DONE}.
0c40: 0a 20 20 64 6f 5f 74 65 73 74 20 31 2e 33 2e 24  .  do_test 1.3.$
0c50: 6e 2e 32 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  n.2 {.    sqlite
0c60: 33 20 64 62 32 20 74 65 73 74 2e 64 62 32 0a 20  3 db2 test.db2. 
0c70: 20 20 20 64 62 32 20 65 76 61 6c 20 7b 20 0a 20     db2 eval { . 
0c80: 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e       SELECT coun
0c90: 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  t(*) FROM t1;.  
0ca0: 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67      PRAGMA integ
0cb0: 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20 20 20  rity_check;.    
0cc0: 7d 0a 20 20 7d 20 7b 35 30 20 6f 6b 7d 0a 20 20  }.  } {50 ok}.  
0cd0: 64 62 32 20 63 6c 6f 73 65 0a 7d 0a 0a 23 20 45  db2 close.}..# E
0ce0: 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ach iteration of
0cf0: 20 74 68 69 73 20 6c 6f 6f 70 3a 0a 23 0a 23 20   this loop:.#.# 
0d00: 20 20 31 2e 20 52 65 73 74 6f 72 65 73 20 74 68    1. Restores th
0d10: 65 20 64 62 20 74 6f 20 74 68 65 20 73 74 61 74  e db to the stat
0d20: 65 20 69 74 20 77 61 73 20 69 6e 20 66 6f 6c 6c  e it was in foll
0d30: 6f 77 69 6e 67 20 74 65 73 74 20 63 61 73 65 20  owing test case 
0d40: 31 2e 30 0a 23 20 20 20 32 2e 20 4f 70 65 6e 73  1.0.#   2. Opens
0d50: 20 61 6e 20 52 42 55 20 76 61 63 75 75 6d 20 61   an RBU vacuum a
0d60: 6e 64 20 73 74 65 70 73 20 69 74 20 31 30 20 74  nd steps it 10 t
0d70: 69 6d 65 73 2e 20 54 68 65 6e 20 63 6c 6f 73 65  imes. Then close
0d80: 73 20 69 74 2e 0a 23 20 20 20 32 2e 20 4f 70 65  s it..#   2. Ope
0d90: 6e 73 20 61 6e 20 52 42 55 20 76 61 63 75 75 6d  ns an RBU vacuum
0da0: 20 61 6e 64 20 73 74 65 70 73 20 69 74 20 24 6e   and steps it $n
0db0: 20 74 69 6d 65 73 2e 0a 23 20 20 20 33 2e 20 54   times..#   3. T
0dc0: 61 6b 65 73 20 61 20 63 6f 70 79 20 6f 66 20 61  akes a copy of a
0dd0: 6c 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ll database file
0de0: 73 20 61 6e 64 20 74 68 65 20 73 74 61 74 65 20  s and the state 
0df0: 64 62 2e 0a 23 20 20 20 34 2e 20 4f 70 65 6e 73  db..#   4. Opens
0e00: 20 61 20 73 65 63 6f 6e 64 20 52 42 55 20 76 61   a second RBU va
0e10: 63 75 75 6d 20 68 61 6e 64 6c 65 20 6f 6e 20 74  cuum handle on t
0e20: 68 65 20 63 6f 70 79 2c 20 72 65 73 75 6d 65 73  he copy, resumes
0e30: 20 61 6e 64 20 63 6f 6d 70 6c 65 74 65 73 20 74   and completes t
0e40: 68 65 0a 23 20 20 20 20 20 20 76 61 63 75 75 6d  he.#      vacuum
0e50: 20 6f 70 2e 20 0a 23 0a 23 20 54 68 65 20 6c 6f   op. .#.# The lo
0e60: 6f 70 20 72 75 6e 73 20 75 6e 74 69 6c 20 24 6e  op runs until $n
0e70: 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   is large enough
0e80: 20 74 68 61 74 20 73 74 65 70 20 28 33 29 20 76   that step (3) v
0e90: 61 63 75 75 6d 73 20 74 68 65 20 65 6e 74 69 72  acuums the entir
0ea0: 65 0a 23 20 64 61 74 61 62 61 73 65 2e 0a 23 0a  e.# database..#.
0eb0: 66 6f 72 20 7b 73 65 74 20 6e 20 31 7d 20 7b 24  for {set n 1} {$
0ec0: 6e 20 3c 20 35 30 30 30 7d 20 7b 69 6e 63 72 20  n < 5000} {incr 
0ed0: 6e 7d 20 7b 0a 20 20 64 62 5f 72 65 73 74 6f 72  n} {.  db_restor
0ee0: 65 0a 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20  e.  forcedelete 
0ef0: 73 74 61 74 65 2e 64 62 20 73 74 61 74 65 2e 64  state.db state.d
0f00: 62 2d 73 68 6d 20 73 74 61 74 65 2e 64 62 2d 6f  b-shm state.db-o
0f10: 61 6c 20 73 74 61 74 65 2e 64 62 2d 77 61 6c 0a  al state.db-wal.
0f20: 0a 20 20 73 71 6c 69 74 65 33 72 62 75 5f 76 61  .  sqlite3rbu_va
0f30: 63 75 75 6d 20 72 62 75 20 74 65 73 74 2e 64 62  cuum rbu test.db
0f40: 20 73 74 61 74 65 2e 64 62 0a 20 20 66 6f 72 20   state.db.  for 
0f50: 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 3c 31 30  {set i 0} {$i<10
0f60: 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20  } {incr i} {.   
0f70: 20 72 62 75 20 73 74 65 70 0a 20 20 7d 0a 20 20   rbu step.  }.  
0f80: 72 62 75 20 63 6c 6f 73 65 0a 0a 20 20 73 71 6c  rbu close..  sql
0f90: 69 74 65 33 72 62 75 5f 76 61 63 75 75 6d 20 72  ite3rbu_vacuum r
0fa0: 62 75 20 74 65 73 74 2e 64 62 20 73 74 61 74 65  bu test.db state
0fb0: 2e 64 62 0a 20 20 66 6f 72 20 7b 73 65 74 20 69  .db.  for {set i
0fc0: 20 30 7d 20 7b 24 69 3c 24 6e 7d 20 7b 69 6e 63   0} {$i<$n} {inc
0fd0: 72 20 69 7d 20 7b 0a 20 20 20 20 73 65 74 20 72  r i} {.    set r
0fe0: 63 20 5b 72 62 75 20 73 74 65 70 5d 0a 20 20 20  c [rbu step].   
0ff0: 20 69 66 20 7b 24 72 63 20 3d 3d 20 22 53 51 4c   if {$rc == "SQL
1000: 49 54 45 5f 44 4f 4e 45 22 7d 20 62 72 65 61 6b  ITE_DONE"} break
1010: 0a 20 20 7d 0a 20 20 69 66 20 7b 24 72 63 20 3d  .  }.  if {$rc =
1020: 3d 20 22 53 51 4c 49 54 45 5f 44 4f 4e 45 22 7d  = "SQLITE_DONE"}
1030: 20 7b 0a 20 20 20 20 72 62 75 20 63 6c 6f 73 65   {.    rbu close
1040: 0a 20 20 20 20 62 72 65 61 6b 0a 20 20 7d 0a 0a  .    break.  }..
1050: 20 20 66 6f 72 65 61 63 68 20 66 20 7b 74 65 73    foreach f {tes
1060: 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 6f 61 6c  t.db test.db-oal
1070: 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 74 65 73   test.db-wal tes
1080: 74 2e 64 62 2d 73 68 6d 20 74 65 73 74 2e 64 62  t.db-shm test.db
1090: 2d 76 61 63 75 75 6d 7d 20 7b 0a 20 20 20 20 73  -vacuum} {.    s
10a0: 65 74 20 66 32 20 5b 73 74 72 69 6e 67 20 6d 61  et f2 [string ma
10b0: 70 20 5b 6c 69 73 74 20 74 65 73 74 2e 64 62 20  p [list test.db 
10c0: 74 65 73 74 2e 64 62 32 5d 20 24 66 5d 0a 20 20  test.db2] $f].  
10d0: 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73    if {[file exis
10e0: 74 73 20 24 66 5d 7d 20 7b 0a 20 20 20 20 20 20  ts $f]} {.      
10f0: 66 6f 72 63 65 63 6f 70 79 20 24 66 20 24 66 32  forcecopy $f $f2
1100: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
1110: 20 20 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20      forcedelete 
1120: 24 66 32 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  $f2.    }.  }.  
1130: 66 6f 72 63 65 63 6f 70 79 20 73 74 61 74 65 2e  forcecopy state.
1140: 64 62 20 73 74 61 74 65 2e 64 62 32 0a 20 20 72  db state.db2.  r
1150: 62 75 20 63 6c 6f 73 65 0a 0a 20 20 64 6f 5f 74  bu close..  do_t
1160: 65 73 74 20 31 2e 34 2e 24 6e 2e 31 20 7b 0a 20  est 1.4.$n.1 {. 
1170: 20 20 20 73 71 6c 69 74 65 33 72 62 75 5f 76 61     sqlite3rbu_va
1180: 63 75 75 6d 20 72 62 75 20 74 65 73 74 2e 64 62  cuum rbu test.db
1190: 32 20 73 74 61 74 65 2e 64 62 32 0a 20 20 20 20  2 state.db2.    
11a0: 77 68 69 6c 65 20 7b 5b 72 62 75 20 73 74 65 70  while {[rbu step
11b0: 5d 3d 3d 22 53 51 4c 49 54 45 5f 4f 4b 22 7d 20  ]=="SQLITE_OK"} 
11c0: 7b 7d 0a 20 20 20 20 72 62 75 20 63 6c 6f 73 65  {}.    rbu close
11d0: 0a 20 20 7d 20 7b 53 51 4c 49 54 45 5f 44 4f 4e  .  } {SQLITE_DON
11e0: 45 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 31 2e  E}..  do_test 1.
11f0: 34 2e 24 6e 2e 32 20 7b 0a 20 20 20 20 73 71 6c  4.$n.2 {.    sql
1200: 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62  ite3 db2 test.db
1210: 32 0a 20 20 20 20 64 62 32 20 65 76 61 6c 20 7b  2.    db2 eval {
1220: 20 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 63   .      SELECT c
1230: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b  ount(*) FROM t1;
1240: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 69 6e  .      PRAGMA in
1250: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20  tegrity_check;. 
1260: 20 20 20 7d 0a 20 20 7d 20 7b 35 30 20 6f 6b 7d     }.  } {50 ok}
1270: 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 7d 0a 0a  .  db2 close.}..
1280: 66 6f 72 63 65 64 65 6c 65 74 65 20 72 62 75 2e  forcedelete rbu.
1290: 64 62 0a 64 6f 5f 74 65 73 74 20 32 2e 30 20 7b  db.do_test 2.0 {
12a0: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 72  .  sqlite3 db2 r
12b0: 62 75 2e 64 62 0a 20 20 64 62 32 20 65 76 61 6c  bu.db.  db2 eval
12c0: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
12d0: 42 4c 45 20 64 61 74 61 5f 74 31 28 61 2c 20 62  BLE data_t1(a, b
12e0: 2c 20 63 2c 20 72 62 75 5f 63 6f 6e 74 72 6f 6c  , c, rbu_control
12f0: 29 3b 0a 20 20 20 20 57 49 54 48 20 73 28 69 29  );.    WITH s(i)
1300: 20 41 53 20 28 0a 20 20 20 20 20 20 20 20 56 41   AS (.        VA
1310: 4c 55 45 53 28 31 29 20 55 4e 49 4f 4e 20 41 4c  LUES(1) UNION AL
1320: 4c 20 53 45 4c 45 43 54 20 69 2b 31 20 46 52 4f  L SELECT i+1 FRO
1330: 4d 20 73 20 57 48 45 52 45 20 69 3c 31 30 0a 20  M s WHERE i<10. 
1340: 20 20 20 29 0a 20 20 20 20 49 4e 53 45 52 54 20     ).    INSERT 
1350: 49 4e 54 4f 20 64 61 74 61 5f 74 31 20 0a 20 20  INTO data_t1 .  
1360: 20 20 20 20 53 45 4c 45 43 54 20 72 61 6e 64 6f      SELECT rando
1370: 6d 62 6c 6f 62 28 35 30 29 2c 20 72 61 6e 64 6f  mblob(50), rando
1380: 6d 62 6c 6f 62 28 37 35 29 2c 20 72 61 6e 64 6f  mblob(75), rando
1390: 6d 62 6c 6f 62 28 31 30 30 29 2c 20 30 20 46 52  mblob(100), 0 FR
13a0: 4f 4d 20 73 3b 0a 20 20 7d 0a 20 20 64 62 32 20  OM s;.  }.  db2 
13b0: 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a 23 20 45 61  close.} {}..# Ea
13c0: 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  ch iteration of 
13d0: 74 68 69 73 20 6c 6f 6f 70 3a 0a 23 0a 23 20 20  this loop:.#.#  
13e0: 20 31 2e 20 52 65 73 74 6f 72 65 73 20 74 68 65   1. Restores the
13f0: 20 64 62 20 74 6f 20 74 68 65 20 73 74 61 74 65   db to the state
1400: 20 69 74 20 77 61 73 20 69 6e 20 66 6f 6c 6c 6f   it was in follo
1410: 77 69 6e 67 20 74 65 73 74 20 63 61 73 65 20 31  wing test case 1
1420: 2e 30 0a 23 20 20 20 32 2e 20 4f 70 65 6e 73 20  .0.#   2. Opens 
1430: 61 6e 20 52 42 55 20 68 61 6e 64 6c 65 20 74 6f  an RBU handle to
1440: 20 61 70 70 6c 79 20 74 68 65 20 52 42 55 20 75   apply the RBU u
1450: 70 64 61 74 65 20 63 72 65 61 74 65 64 20 69 6e  pdate created in
1460: 20 74 65 73 74 20 63 61 73 65 20 32 2e 30 2e 0a   test case 2.0..
1470: 23 20 20 20 33 2e 20 53 74 65 70 73 20 74 68 65  #   3. Steps the
1480: 20 52 42 55 20 68 61 6e 64 6c 65 20 24 6e 20 74   RBU handle $n t
1490: 69 6d 65 73 2e 0a 23 20 20 20 34 2e 20 54 61 6b  imes..#   4. Tak
14a0: 65 73 20 61 20 63 6f 70 79 20 6f 66 20 61 6c 6c  es a copy of all
14b0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
14c0: 61 6e 64 20 74 68 65 20 73 74 61 74 65 20 64 62  and the state db
14d0: 2e 0a 23 20 20 20 35 2e 20 4f 70 65 6e 73 20 61  ..#   5. Opens a
14e0: 20 73 65 63 6f 6e 64 20 52 42 55 20 68 61 6e 64   second RBU hand
14f0: 6c 65 20 6f 6e 20 74 68 65 20 63 6f 70 79 2c 20  le on the copy, 
1500: 72 65 73 75 6d 65 73 20 61 6e 64 20 63 6f 6d 70  resumes and comp
1510: 6c 65 74 65 73 20 74 68 65 0a 23 20 20 20 20 20  letes the.#     
1520: 20 52 42 55 20 6f 70 2e 20 43 68 65 63 6b 73 20   RBU op. Checks 
1530: 69 74 20 77 6f 72 6b 65 64 20 61 73 20 65 78 70  it worked as exp
1540: 65 63 74 65 64 2e 0a 23 0a 23 20 54 68 65 20 6c  ected..#.# The l
1550: 6f 6f 70 20 72 75 6e 73 20 75 6e 74 69 6c 20 24  oop runs until $
1560: 6e 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67  n is large enoug
1570: 68 20 74 68 61 74 20 73 74 65 70 20 28 33 29 20  h that step (3) 
1580: 61 70 70 6c 69 65 73 20 74 68 65 20 65 6e 74 69  applies the enti
1590: 72 65 0a 23 20 75 70 64 61 74 65 2e 0a 23 0a 66  re.# update..#.f
15a0: 6f 72 20 7b 73 65 74 20 6e 20 31 7d 20 7b 24 6e  or {set n 1} {$n
15b0: 20 3c 20 35 30 30 30 7d 20 7b 69 6e 63 72 20 6e   < 5000} {incr n
15c0: 7d 20 7b 0a 20 20 64 62 5f 72 65 73 74 6f 72 65  } {.  db_restore
15d0: 0a 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20 73  .  forcedelete s
15e0: 74 61 74 65 2e 64 62 20 73 74 61 74 65 2e 64 62  tate.db state.db
15f0: 2d 73 68 6d 20 73 74 61 74 65 2e 64 62 2d 6f 61  -shm state.db-oa
1600: 6c 20 73 74 61 74 65 2e 64 62 2d 77 61 6c 0a 20  l state.db-wal. 
1610: 20 73 71 6c 69 74 65 33 72 62 75 20 72 62 75 20   sqlite3rbu rbu 
1620: 74 65 73 74 2e 64 62 20 72 62 75 2e 64 62 20 73  test.db rbu.db s
1630: 74 61 74 65 2e 64 62 0a 0a 20 20 66 6f 72 20 7b  tate.db..  for {
1640: 73 65 74 20 69 20 30 7d 20 7b 24 69 3c 24 6e 7d  set i 0} {$i<$n}
1650: 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20   {incr i} {.    
1660: 73 65 74 20 72 63 20 5b 72 62 75 20 73 74 65 70  set rc [rbu step
1670: 5d 0a 20 20 20 20 69 66 20 7b 24 72 63 20 3d 3d  ].    if {$rc ==
1680: 20 22 53 51 4c 49 54 45 5f 44 4f 4e 45 22 7d 20   "SQLITE_DONE"} 
1690: 62 72 65 61 6b 0a 20 20 7d 0a 20 20 69 66 20 7b  break.  }.  if {
16a0: 24 72 63 20 3d 3d 20 22 53 51 4c 49 54 45 5f 44  $rc == "SQLITE_D
16b0: 4f 4e 45 22 7d 20 7b 0a 20 20 20 20 72 62 75 20  ONE"} {.    rbu 
16c0: 63 6c 6f 73 65 0a 20 20 20 20 62 72 65 61 6b 0a  close.    break.
16d0: 20 20 7d 0a 0a 20 20 66 6f 72 65 61 63 68 20 66    }..  foreach f
16e0: 20 7b 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64   {test.db test.d
16f0: 62 2d 6f 61 6c 20 74 65 73 74 2e 64 62 2d 77 61  b-oal test.db-wa
1700: 6c 20 74 65 73 74 2e 64 62 2d 73 68 6d 20 74 65  l test.db-shm te
1710: 73 74 2e 64 62 2d 76 61 63 75 75 6d 7d 20 7b 0a  st.db-vacuum} {.
1720: 20 20 20 20 73 65 74 20 66 32 20 5b 73 74 72 69      set f2 [stri
1730: 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20 74 65 73  ng map [list tes
1740: 74 2e 64 62 20 74 65 73 74 2e 64 62 32 5d 20 24  t.db test.db2] $
1750: 66 5d 0a 20 20 20 20 69 66 20 7b 5b 66 69 6c 65  f].    if {[file
1760: 20 65 78 69 73 74 73 20 24 66 5d 7d 20 7b 0a 20   exists $f]} {. 
1770: 20 20 20 20 20 66 6f 72 63 65 63 6f 70 79 20 24       forcecopy $
1780: 66 20 24 66 32 0a 20 20 20 20 7d 20 65 6c 73 65  f $f2.    } else
1790: 20 7b 0a 20 20 20 20 20 20 66 6f 72 63 65 64 65   {.      forcede
17a0: 6c 65 74 65 20 24 66 32 0a 20 20 20 20 7d 0a 20  lete $f2.    }. 
17b0: 20 7d 0a 20 20 66 6f 72 63 65 63 6f 70 79 20 73   }.  forcecopy s
17c0: 74 61 74 65 2e 64 62 20 73 74 61 74 65 2e 64 62  tate.db state.db
17d0: 32 0a 20 20 72 62 75 20 63 6c 6f 73 65 0a 0a 20  2.  rbu close.. 
17e0: 20 64 6f 5f 74 65 73 74 20 32 2e 24 6e 2e 31 20   do_test 2.$n.1 
17f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 72 62 75  {.    sqlite3rbu
1800: 20 72 62 75 20 74 65 73 74 2e 64 62 32 20 72 62   rbu test.db2 rb
1810: 75 2e 64 62 20 73 74 61 74 65 2e 64 62 32 0a 20  u.db state.db2. 
1820: 20 20 20 77 68 69 6c 65 20 7b 5b 72 62 75 20 73     while {[rbu s
1830: 74 65 70 5d 3d 3d 22 53 51 4c 49 54 45 5f 4f 4b  tep]=="SQLITE_OK
1840: 22 7d 20 7b 7d 0a 20 20 20 20 72 62 75 20 63 6c  "} {}.    rbu cl
1850: 6f 73 65 0a 20 20 7d 20 7b 53 51 4c 49 54 45 5f  ose.  } {SQLITE_
1860: 44 4f 4e 45 7d 0a 0a 20 20 64 6f 5f 74 65 73 74  DONE}..  do_test
1870: 20 32 2e 24 6e 2e 32 20 7b 0a 20 20 20 20 73 71   2.$n.2 {.    sq
1880: 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64  lite3 db2 test.d
1890: 62 32 0a 20 20 20 20 64 62 32 20 65 76 61 6c 20  b2.    db2 eval 
18a0: 7b 20 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  { .      SELECT 
18b0: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31  count(*) FROM t1
18c0: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 69  ;.      PRAGMA i
18d0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a  ntegrity_check;.
18e0: 20 20 20 20 7d 0a 20 20 7d 20 7b 36 30 20 6f 6b      }.  } {60 ok
18f0: 7d 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 7d 0a  }.  db2 close.}.
1900: 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a 0a        .finish_test..