/ Hex Artifact Content
Login

Artifact 55e101e90168c2b31df6c9638fe73dc7f7cc666b6142266d1563697d79f73534:


0000: 23 20 32 30 31 36 20 41 70 72 69 6c 20 31 35 0a  # 2016 April 15.
0010: 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64  #.# The author d
0020: 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67  isclaims copyrig
0030: 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63  ht to this sourc
0040: 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63  e code.  In plac
0050: 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e  e of.# a legal n
0060: 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61  otice, here is a
0070: 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20   blessing:.#.#  
0080: 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f    May you do goo
0090: 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a  d and not evil..
00a0: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e  #    May you fin
00b0: 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f  d forgiveness fo
00c0: 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66  r yourself and f
00d0: 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23  orgive others..#
00e0: 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72      May you shar
00f0: 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20  e freely, never 
0100: 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  taking more than
0110: 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a   you give..#.#**
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 0a 23 0a 23 20 54 68 69 73 20 66  *****.#.# This f
0170: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 65 73  ile contains tes
0180: 74 73 20 66 6f 72 20 74 68 65 20 52 42 55 20 6d  ts for the RBU m
0190: 6f 64 75 6c 65 2e 20 4d 6f 72 65 20 73 70 65 63  odule. More spec
01a0: 69 66 69 63 61 6c 6c 79 2c 20 69 74 0a 23 20 63  ifically, it.# c
01b0: 6f 6e 74 61 69 6e 73 20 74 65 73 74 73 20 74 6f  ontains tests to
01c0: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
01d0: 20 73 71 6c 69 74 65 33 72 62 75 5f 76 61 63 75   sqlite3rbu_vacu
01e0: 75 6d 28 29 20 41 50 49 20 77 6f 72 6b 73 20 61  um() API works a
01f0: 73 0a 23 20 65 78 70 65 63 74 65 64 2e 0a 23 0a  s.# expected..#.
0200: 0a 73 6f 75 72 63 65 20 5b 66 69 6c 65 20 6a 6f  .source [file jo
0210: 69 6e 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65  in [file dirname
0220: 20 5b 69 6e 66 6f 20 73 63 72 69 70 74 5d 5d 20   [info script]] 
0230: 72 62 75 5f 63 6f 6d 6d 6f 6e 2e 74 63 6c 5d 0a  rbu_common.tcl].
0240: 73 65 74 20 3a 3a 74 65 73 74 70 72 65 66 69 78  set ::testprefix
0250: 20 72 62 75 76 61 63 75 75 6d 0a 0a 66 6f 72 65   rbuvacuum..fore
0260: 61 63 68 20 73 74 65 70 20 7b 30 20 31 7d 20 7b  ach step {0 1} {
0270: 0a 0a 20 20 73 65 74 20 3a 3a 74 65 73 74 70 72  ..  set ::testpr
0280: 65 66 69 78 20 72 62 75 76 61 63 75 75 6d 2d 73  efix rbuvacuum-s
0290: 74 65 70 3d 24 73 74 65 70 0a 20 20 72 65 73 65  tep=$step.  rese
02a0: 74 5f 64 62 0a 0a 20 20 23 20 53 69 6d 70 6c 65  t_db..  # Simple
02b0: 73 74 20 70 6f 73 73 69 62 6c 65 20 76 61 63 75  st possible vacu
02c0: 75 6d 2e 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c  um..  do_execsql
02d0: 5f 74 65 73 74 20 31 2e 30 20 7b 0a 20 20 20 20  _test 1.0 {.    
02e0: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
02f0: 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 43 52 45   = 1024;.    CRE
0300: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 49  ATE TABLE t1(a I
0310: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
0320: 45 59 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20 49  EY, b, c);.    I
0330: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
0340: 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 3b 0a 20  LUES(1, 2, 3);. 
0350: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
0360: 31 20 56 41 4c 55 45 53 28 34 2c 20 35 2c 20 36  1 VALUES(4, 5, 6
0370: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
0380: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 37 2c 20  TO t1 VALUES(7, 
0390: 38 2c 20 39 29 3b 0a 20 20 20 20 50 52 41 47 4d  8, 9);.    PRAGM
03a0: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
03b0: 6b 3b 0a 20 20 7d 20 7b 6f 6b 7d 0a 20 20 64 6f  k;.  } {ok}.  do
03c0: 5f 72 62 75 5f 76 61 63 75 75 6d 5f 74 65 73 74  _rbu_vacuum_test
03d0: 20 31 2e 31 20 24 73 74 65 70 0a 0a 20 20 23 20   1.1 $step..  # 
03e0: 41 20 76 61 63 75 75 6d 20 74 68 61 74 20 61 63  A vacuum that ac
03f0: 74 75 61 6c 6c 79 20 72 65 63 6c 61 69 6d 73 20  tually reclaims 
0400: 73 70 61 63 65 2e 0a 20 20 64 6f 5f 65 78 65 63  space..  do_exec
0410: 73 71 6c 5f 74 65 73 74 20 31 2e 32 2e 31 20 7b  sql_test 1.2.1 {
0420: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
0430: 20 74 31 20 56 41 4c 55 45 53 28 38 2c 20 72 61   t1 VALUES(8, ra
0440: 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 2c 20 72  ndomblob(900), r
0450: 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 29 3b  andomblob(900));
0460: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
0470: 20 74 31 20 56 41 4c 55 45 53 28 39 2c 20 72 61   t1 VALUES(9, ra
0480: 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 2c 20 72  ndomblob(900), r
0490: 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 29 3b  andomblob(900));
04a0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
04b0: 20 74 31 20 56 41 4c 55 45 53 28 31 30 2c 20 72   t1 VALUES(10, r
04c0: 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 2c 20  andomblob(900), 
04d0: 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 29  randomblob(900))
04e0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
04f0: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 31 2c 20  O t1 VALUES(11, 
0500: 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 2c  randomblob(900),
0510: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29   randomblob(900)
0520: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
0530: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 32 2c  TO t1 VALUES(12,
0540: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29   randomblob(900)
0550: 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30  , randomblob(900
0560: 29 29 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 70  ));.    PRAGMA p
0570: 61 67 65 5f 63 6f 75 6e 74 3b 0a 20 20 7d 20 7b  age_count;.  } {
0580: 31 32 7d 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c  12}.  do_execsql
0590: 5f 74 65 73 74 20 31 2e 32 2e 32 20 7b 0a 20 20  _test 1.2.2 {.  
05a0: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31    DELETE FROM t1
05b0: 20 57 48 45 52 45 20 72 6f 77 69 64 20 42 45 54   WHERE rowid BET
05c0: 57 45 45 4e 20 38 20 41 4e 44 20 31 31 3b 0a 20  WEEN 8 AND 11;. 
05d0: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 63     PRAGMA page_c
05e0: 6f 75 6e 74 3b 0a 20 20 7d 20 7b 31 32 7d 0a 20  ount;.  } {12}. 
05f0: 20 64 6f 5f 72 62 75 5f 76 61 63 75 75 6d 5f 74   do_rbu_vacuum_t
0600: 65 73 74 20 31 2e 32 2e 33 20 24 73 74 65 70 0a  est 1.2.3 $step.
0610: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
0620: 74 20 31 2e 32 2e 34 20 7b 0a 20 20 20 20 50 52  t 1.2.4 {.    PR
0630: 41 47 4d 41 20 70 61 67 65 5f 63 6f 75 6e 74 3b  AGMA page_count;
0640: 0a 20 20 7d 20 7b 33 7d 0a 20 20 0a 20 20 23 20  .  } {3}.  .  # 
0650: 41 64 64 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  Add an index to 
0660: 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 64 6f 5f  the table..  do_
0670: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 2e 33  execsql_test 1.3
0680: 2e 31 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  .1 {.    CREATE 
0690: 49 4e 44 45 58 20 74 31 62 20 4f 4e 20 74 31 28  INDEX t1b ON t1(
06a0: 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  b);.    INSERT I
06b0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 33  NTO t1 VALUES(13
06c0: 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30  , randomblob(900
06d0: 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30  ), randomblob(90
06e0: 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  0));.    INSERT 
06f0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
0700: 34 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30  4, randomblob(90
0710: 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39  0), randomblob(9
0720: 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  00));.    INSERT
0730: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
0740: 31 35 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39  15, randomblob(9
0750: 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  00), randomblob(
0760: 39 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52  900));.    INSER
0770: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
0780: 28 31 36 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  (16, randomblob(
0790: 39 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  900), randomblob
07a0: 28 39 30 30 29 29 3b 0a 20 20 20 20 50 52 41 47  (900));.    PRAG
07b0: 4d 41 20 70 61 67 65 5f 63 6f 75 6e 74 3b 0a 20  MA page_count;. 
07c0: 20 7d 20 7b 31 38 7d 0a 20 20 64 6f 5f 65 78 65   } {18}.  do_exe
07d0: 63 73 71 6c 5f 74 65 73 74 20 31 2e 33 2e 32 20  csql_test 1.3.2 
07e0: 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  {.    DELETE FRO
07f0: 4d 20 74 31 20 57 48 45 52 45 20 72 6f 77 69 64  M t1 WHERE rowid
0800: 20 42 45 54 57 45 45 4e 20 31 32 20 41 4e 44 20   BETWEEN 12 AND 
0810: 31 35 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 70  15;.    PRAGMA p
0820: 61 67 65 5f 63 6f 75 6e 74 3b 0a 20 20 7d 20 7b  age_count;.  } {
0830: 31 38 7d 0a 20 20 64 6f 5f 72 62 75 5f 76 61 63  18}.  do_rbu_vac
0840: 75 75 6d 5f 74 65 73 74 20 31 2e 33 2e 33 20 24  uum_test 1.3.3 $
0850: 73 74 65 70 0a 20 20 64 6f 5f 65 78 65 63 73 71  step.  do_execsq
0860: 6c 5f 74 65 73 74 20 31 2e 33 2e 34 20 7b 0a 20  l_test 1.3.4 {. 
0870: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 63     PRAGMA page_c
0880: 6f 75 6e 74 3b 0a 20 20 7d 20 7b 35 7d 0a 0a 20  ount;.  } {5}.. 
0890: 20 23 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44   # WITHOUT ROWID
08a0: 20 74 61 62 6c 65 2e 0a 20 20 64 6f 5f 65 78 65   table..  do_exe
08b0: 63 73 71 6c 5f 74 65 73 74 20 31 2e 34 2e 31 20  csql_test 1.4.1 
08c0: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
08d0: 4c 45 20 74 32 28 61 2c 20 62 2c 20 63 2c 20 50  LE t2(a, b, c, P
08e0: 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 20 62 29  RIMARY KEY(a, b)
08f0: 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 3b  ) WITHOUT ROWID;
0900: 0a 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ..    INSERT INT
0910: 4f 20 74 32 20 56 41 4c 55 45 53 28 72 61 6e 64  O t2 VALUES(rand
0920: 6f 6d 62 6c 6f 62 28 39 30 30 29 2c 20 31 2c 20  omblob(900), 1, 
0930: 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 29  randomblob(900))
0940: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
0950: 4f 20 74 32 20 56 41 4c 55 45 53 28 72 61 6e 64  O t2 VALUES(rand
0960: 6f 6d 62 6c 6f 62 28 39 30 30 29 2c 20 32 2c 20  omblob(900), 2, 
0970: 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 29  randomblob(900))
0980: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
0990: 4f 20 74 32 20 56 41 4c 55 45 53 28 72 61 6e 64  O t2 VALUES(rand
09a0: 6f 6d 62 6c 6f 62 28 39 30 30 29 2c 20 33 2c 20  omblob(900), 3, 
09b0: 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 29  randomblob(900))
09c0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
09d0: 4f 20 74 32 20 56 41 4c 55 45 53 28 72 61 6e 64  O t2 VALUES(rand
09e0: 6f 6d 62 6c 6f 62 28 39 30 30 29 2c 20 34 2c 20  omblob(900), 4, 
09f0: 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 29  randomblob(900))
0a00: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
0a10: 4f 20 74 32 20 56 41 4c 55 45 53 28 72 61 6e 64  O t2 VALUES(rand
0a20: 6f 6d 62 6c 6f 62 28 39 30 30 29 2c 20 36 2c 20  omblob(900), 6, 
0a30: 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 29  randomblob(900))
0a40: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
0a50: 4f 20 74 32 20 56 41 4c 55 45 53 28 72 61 6e 64  O t2 VALUES(rand
0a60: 6f 6d 62 6c 6f 62 28 39 30 30 29 2c 20 37 2c 20  omblob(900), 7, 
0a70: 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 29  randomblob(900))
0a80: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
0a90: 4f 20 74 32 20 56 41 4c 55 45 53 28 72 61 6e 64  O t2 VALUES(rand
0aa0: 6f 6d 62 6c 6f 62 28 39 30 30 29 2c 20 38 2c 20  omblob(900), 8, 
0ab0: 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 29  randomblob(900))
0ac0: 3b 0a 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52  ;..    DELETE FR
0ad0: 4f 4d 20 74 32 20 57 48 45 52 45 20 62 20 42 45  OM t2 WHERE b BE
0ae0: 54 57 45 45 4e 20 32 20 41 4e 44 20 37 3b 0a 20  TWEEN 2 AND 7;. 
0af0: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 63     PRAGMA page_c
0b00: 6f 75 6e 74 3b 0a 20 20 7d 20 7b 32 30 7d 0a 20  ount;.  } {20}. 
0b10: 20 64 6f 5f 72 62 75 5f 76 61 63 75 75 6d 5f 74   do_rbu_vacuum_t
0b20: 65 73 74 20 31 2e 34 2e 32 20 24 73 74 65 70 0a  est 1.4.2 $step.
0b30: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
0b40: 74 20 31 2e 34 2e 33 20 7b 0a 20 20 20 20 50 52  t 1.4.3 {.    PR
0b50: 41 47 4d 41 20 70 61 67 65 5f 63 6f 75 6e 74 3b  AGMA page_count;
0b60: 0a 20 20 7d 20 7b 31 30 7d 0a 20 20 0a 20 20 23  .  } {10}.  .  #
0b70: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
0b80: 61 62 6c 65 20 77 69 74 68 20 61 6e 20 69 6e 64  able with an ind
0b90: 65 78 2e 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c  ex..  do_execsql
0ba0: 5f 74 65 73 74 20 31 2e 34 2e 31 20 7b 0a 20 20  _test 1.4.1 {.  
0bb0: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 74    CREATE INDEX t
0bc0: 32 63 20 4f 4e 20 74 32 28 63 29 3b 0a 0a 20 20  2c ON t2(c);..  
0bd0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
0be0: 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c   VALUES(randombl
0bf0: 6f 62 28 39 30 30 29 2c 20 39 2c 20 72 61 6e 64  ob(900), 9, rand
0c00: 6f 6d 62 6c 6f 62 28 39 30 30 29 29 3b 0a 20 20  omblob(900));.  
0c10: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
0c20: 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c   VALUES(randombl
0c30: 6f 62 28 39 30 30 29 2c 20 31 30 2c 20 72 61 6e  ob(900), 10, ran
0c40: 64 6f 6d 62 6c 6f 62 28 39 30 30 29 29 3b 0a 20  domblob(900));. 
0c50: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
0c60: 32 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62  2 VALUES(randomb
0c70: 6c 6f 62 28 39 30 30 29 2c 20 31 31 2c 20 72 61  lob(900), 11, ra
0c80: 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 29 3b 0a  ndomblob(900));.
0c90: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0ca0: 74 32 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d  t2 VALUES(random
0cb0: 62 6c 6f 62 28 39 30 30 29 2c 20 31 32 2c 20 72  blob(900), 12, r
0cc0: 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 29 3b  andomblob(900));
0cd0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
0ce0: 20 74 32 20 56 41 4c 55 45 53 28 72 61 6e 64 6f   t2 VALUES(rando
0cf0: 6d 62 6c 6f 62 28 39 30 30 29 2c 20 31 33 2c 20  mblob(900), 13, 
0d00: 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 29  randomblob(900))
0d10: 3b 0a 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52  ;..    DELETE FR
0d20: 4f 4d 20 74 32 20 57 48 45 52 45 20 62 20 42 45  OM t2 WHERE b BE
0d30: 54 57 45 45 4e 20 38 20 41 4e 44 20 31 32 3b 0a  TWEEN 8 AND 12;.
0d40: 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f      PRAGMA page_
0d50: 63 6f 75 6e 74 3b 0a 20 20 7d 20 7b 33 35 7d 0a  count;.  } {35}.
0d60: 20 20 64 6f 5f 72 62 75 5f 76 61 63 75 75 6d 5f    do_rbu_vacuum_
0d70: 74 65 73 74 20 31 2e 34 2e 32 20 24 73 74 65 70  test 1.4.2 $step
0d80: 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .  do_execsql_te
0d90: 73 74 20 31 2e 34 2e 33 20 7b 0a 20 20 20 20 50  st 1.4.3 {.    P
0da0: 52 41 47 4d 41 20 70 61 67 65 5f 63 6f 75 6e 74  RAGMA page_count
0db0: 3b 0a 20 20 7d 20 7b 31 35 7d 0a 20 20 64 6f 5f  ;.  } {15}.  do_
0dc0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 2e 34  execsql_test 1.4
0dd0: 2e 34 20 7b 0a 20 20 20 20 56 41 43 55 55 4d 3b  .4 {.    VACUUM;
0de0: 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65  .    PRAGMA page
0df0: 5f 63 6f 75 6e 74 3b 0a 20 20 7d 20 7b 31 35 7d  _count;.  } {15}
0e00: 0a 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ..  do_execsql_t
0e10: 65 73 74 20 31 2e 35 2e 31 20 7b 0a 20 20 20 20  est 1.5.1 {.    
0e20: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28  CREATE TABLE t3(
0e30: 61 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20 49 4e  a, b, c);.    IN
0e40: 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c  SERT INTO t3 VAL
0e50: 55 45 53 28 27 61 27 2c 20 27 62 27 2c 20 27 63  UES('a', 'b', 'c
0e60: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
0e70: 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 27 64  NTO t3 VALUES('d
0e80: 27 2c 20 27 65 27 2c 20 27 66 27 29 3b 0a 20 20  ', 'e', 'f');.  
0e90: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
0ea0: 20 56 41 4c 55 45 53 28 27 67 27 2c 20 27 68 27   VALUES('g', 'h'
0eb0: 2c 20 27 69 27 29 3b 0a 20 20 7d 0a 20 20 64 6f  , 'i');.  }.  do
0ec0: 5f 72 62 75 5f 76 61 63 75 75 6d 5f 74 65 73 74  _rbu_vacuum_test
0ed0: 20 31 2e 35 2e 32 20 24 73 74 65 70 0a 20 20 64   1.5.2 $step.  d
0ee0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31  o_execsql_test 1
0ef0: 2e 35 2e 33 20 7b 0a 20 20 20 20 53 45 4c 45 43  .5.3 {.    SELEC
0f00: 54 20 2a 20 46 52 4f 4d 20 74 33 0a 20 20 7d 20  T * FROM t3.  } 
0f10: 7b 61 20 62 20 63 20 64 20 65 20 66 20 67 20 68  {a b c d e f g h
0f20: 20 69 7d 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c   i}.  do_execsql
0f30: 5f 74 65 73 74 20 31 2e 35 2e 34 20 7b 0a 20 20  _test 1.5.4 {.  
0f40: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 74    CREATE INDEX t
0f50: 33 61 20 4f 4e 20 74 33 28 61 29 3b 0a 20 20 20  3a ON t3(a);.   
0f60: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 33   CREATE INDEX t3
0f70: 62 20 4f 4e 20 74 33 28 62 29 3b 0a 20 20 20 20  b ON t3(b);.    
0f80: 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 33 63  CREATE INDEX t3c
0f90: 20 4f 4e 20 74 33 28 63 29 3b 0a 20 20 20 20 49   ON t3(c);.    I
0fa0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41  NSERT INTO t3 VA
0fb0: 4c 55 45 53 28 27 6a 27 2c 20 27 6b 27 2c 20 27  LUES('j', 'k', '
0fc0: 6c 27 29 3b 0a 20 20 20 20 44 45 4c 45 54 45 20  l');.    DELETE 
0fd0: 46 52 4f 4d 20 74 33 20 57 48 45 52 45 20 61 20  FROM t3 WHERE a 
0fe0: 3d 20 27 67 27 3b 0a 20 20 7d 0a 20 20 64 6f 5f  = 'g';.  }.  do_
0ff0: 72 62 75 5f 76 61 63 75 75 6d 5f 74 65 73 74 20  rbu_vacuum_test 
1000: 31 2e 35 2e 35 20 24 73 74 65 70 0a 20 20 64 6f  1.5.5 $step.  do
1010: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 2e  _execsql_test 1.
1020: 35 2e 36 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  5.6 {.    SELECT
1030: 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 74   rowid, * FROM t
1040: 33 20 4f 52 44 45 52 20 42 59 20 62 0a 20 20 7d  3 ORDER BY b.  }
1050: 20 7b 31 20 61 20 62 20 63 20 32 20 64 20 65 20   {1 a b c 2 d e 
1060: 66 20 34 20 6a 20 6b 20 6c 7d 0a 0a 20 20 64 6f  f 4 j k l}..  do
1070: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 2e  _execsql_test 1.
1080: 36 2e 31 20 7b 0a 20 20 20 20 43 52 45 41 54 45  6.1 {.    CREATE
1090: 20 54 41 42 4c 45 20 74 34 28 61 20 50 52 49 4d   TABLE t4(a PRIM
10a0: 41 52 59 20 4b 45 59 2c 20 62 2c 20 63 29 3b 0a  ARY KEY, b, c);.
10b0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
10c0: 74 34 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27  t4 VALUES('a', '
10d0: 62 27 2c 20 27 63 27 29 3b 0a 20 20 20 20 49 4e  b', 'c');.    IN
10e0: 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c  SERT INTO t4 VAL
10f0: 55 45 53 28 27 64 27 2c 20 27 65 27 2c 20 27 66  UES('d', 'e', 'f
1100: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
1110: 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 27 67  NTO t4 VALUES('g
1120: 27 2c 20 27 68 27 2c 20 27 69 27 29 3b 0a 20 20  ', 'h', 'i');.  
1130: 7d 0a 20 20 64 6f 5f 72 62 75 5f 76 61 63 75 75  }.  do_rbu_vacuu
1140: 6d 5f 74 65 73 74 20 31 2e 36 2e 32 20 24 73 74  m_test 1.6.2 $st
1150: 65 70 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f  ep.  do_execsql_
1160: 74 65 73 74 20 31 2e 36 2e 33 20 7b 0a 20 20 20  test 1.6.3 {.   
1170: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1180: 34 0a 20 20 7d 20 7b 61 20 62 20 63 20 64 20 65  4.  } {a b c d e
1190: 20 66 20 67 20 68 20 69 7d 0a 20 20 64 6f 5f 65   f g h i}.  do_e
11a0: 78 65 63 73 71 6c 5f 74 65 73 74 20 31 2e 36 2e  xecsql_test 1.6.
11b0: 34 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 49  4 {.    CREATE I
11c0: 4e 44 45 58 20 74 34 61 20 4f 4e 20 74 34 28 61  NDEX t4a ON t4(a
11d0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e  );.    CREATE IN
11e0: 44 45 58 20 74 34 62 20 4f 4e 20 74 34 28 62 29  DEX t4b ON t4(b)
11f0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e 44  ;.    CREATE IND
1200: 45 58 20 74 34 63 20 4f 4e 20 74 34 28 63 29 3b  EX t4c ON t4(c);
1210: 0a 20 20 20 20 0a 20 20 20 20 49 4e 53 45 52 54  .    .    INSERT
1220: 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28   INTO t4 VALUES(
1230: 27 6a 27 2c 20 27 6b 27 2c 20 27 6c 27 29 3b 0a  'j', 'k', 'l');.
1240: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
1250: 74 34 20 57 48 45 52 45 20 61 3d 27 67 27 3b 0a  t4 WHERE a='g';.
1260: 20 20 7d 0a 20 20 64 6f 5f 72 62 75 5f 76 61 63    }.  do_rbu_vac
1270: 75 75 6d 5f 74 65 73 74 20 31 2e 36 2e 35 20 24  uum_test 1.6.5 $
1280: 73 74 65 70 0a 20 20 64 6f 5f 65 78 65 63 73 71  step.  do_execsq
1290: 6c 5f 74 65 73 74 20 31 2e 36 2e 36 20 7b 0a 20  l_test 1.6.6 {. 
12a0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
12b0: 20 74 34 20 4f 52 44 45 52 20 42 59 20 62 0a 20   t4 ORDER BY b. 
12c0: 20 7d 20 7b 61 20 62 20 63 20 64 20 65 20 66 20   } {a b c d e f 
12d0: 6a 20 6b 20 6c 7d 0a 0a 20 20 72 65 73 65 74 5f  j k l}..  reset_
12e0: 64 62 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f  db.  do_execsql_
12f0: 74 65 73 74 20 31 2e 37 2e 30 20 7b 0a 20 20 20  test 1.7.0 {.   
1300: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
1310: 28 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  (a INTEGER PRIMA
1320: 52 59 20 4b 45 59 20 41 55 54 4f 49 4e 43 52 45  RY KEY AUTOINCRE
1330: 4d 45 4e 54 2c 20 62 29 3b 0a 20 20 20 20 49 4e  MENT, b);.    IN
1340: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
1350: 55 45 53 28 4e 55 4c 4c 2c 20 27 6f 6e 65 27 29  UES(NULL, 'one')
1360: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
1370: 4f 20 74 31 20 56 41 4c 55 45 53 28 4e 55 4c 4c  O t1 VALUES(NULL
1380: 2c 20 27 74 77 6f 27 29 3b 0a 20 20 20 20 44 45  , 'two');.    DE
1390: 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45  LETE FROM t1 WHE
13a0: 52 45 20 61 3d 32 3b 0a 20 20 20 20 49 4e 53 45  RE a=2;.    INSE
13b0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
13c0: 53 28 4e 55 4c 4c 2c 20 27 74 68 72 65 65 27 29  S(NULL, 'three')
13d0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
13e0: 4f 20 74 31 20 56 41 4c 55 45 53 28 4e 55 4c 4c  O t1 VALUES(NULL
13f0: 2c 20 27 66 6f 75 72 27 29 3b 0a 20 20 20 20 44  , 'four');.    D
1400: 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48  ELETE FROM t1 WH
1410: 45 52 45 20 61 3d 34 3b 0a 20 20 20 20 49 4e 53  ERE a=4;.    INS
1420: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
1430: 45 53 28 4e 55 4c 4c 2c 20 27 66 69 76 65 27 29  ES(NULL, 'five')
1440: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
1450: 4f 20 74 31 20 56 41 4c 55 45 53 28 4e 55 4c 4c  O t1 VALUES(NULL
1460: 2c 20 27 73 69 78 27 29 3b 0a 20 20 20 20 44 45  , 'six');.    DE
1470: 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45  LETE FROM t1 WHE
1480: 52 45 20 61 3d 36 3b 0a 20 20 20 20 53 45 4c 45  RE a=6;.    SELE
1490: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
14a0: 7d 20 7b 31 20 6f 6e 65 20 33 20 74 68 72 65 65  } {1 one 3 three
14b0: 20 35 20 66 69 76 65 7d 0a 20 20 64 6f 5f 72 62   5 five}.  do_rb
14c0: 75 5f 76 61 63 75 75 6d 5f 74 65 73 74 20 31 2e  u_vacuum_test 1.
14d0: 37 2e 31 20 24 73 74 65 70 0a 20 20 64 6f 5f 65  7.1 $step.  do_e
14e0: 78 65 63 73 71 6c 5f 74 65 73 74 20 31 2e 37 2e  xecsql_test 1.7.
14f0: 32 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  2 {.    INSERT I
1500: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 4e 55  NTO t1 VALUES(NU
1510: 4c 4c 2c 20 27 73 65 76 65 6e 27 29 3b 0a 20 20  LL, 'seven');.  
1520: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
1530: 74 31 3b 0a 20 20 7d 20 7b 31 20 6f 6e 65 20 33  t1;.  } {1 one 3
1540: 20 74 68 72 65 65 20 35 20 66 69 76 65 20 37 20   three 5 five 7 
1550: 73 65 76 65 6e 7d 0a 0a 20 20 72 65 73 65 74 5f  seven}..  reset_
1560: 64 62 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f  db.  do_execsql_
1570: 74 65 73 74 20 31 2e 38 2e 30 20 7b 0a 20 20 20  test 1.8.0 {.   
1580: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
1590: 28 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  (a INTEGER PRIMA
15a0: 52 59 20 4b 45 59 20 41 55 54 4f 49 4e 43 52 45  RY KEY AUTOINCRE
15b0: 4d 45 4e 54 2c 20 62 29 3b 0a 20 20 20 20 43 52  MENT, b);.    CR
15c0: 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
15d0: 20 74 31 28 62 29 3b 0a 20 20 20 20 49 4e 53 45   t1(b);.    INSE
15e0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
15f0: 53 28 4e 55 4c 4c 2c 20 27 6f 6e 65 27 29 3b 0a  S(NULL, 'one');.
1600: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1610: 74 31 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20  t1 VALUES(NULL, 
1620: 27 74 77 6f 27 29 3b 0a 20 20 20 20 49 4e 53 45  'two');.    INSE
1630: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
1640: 53 28 4e 55 4c 4c 2c 20 27 74 68 72 65 65 27 29  S(NULL, 'three')
1650: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
1660: 4f 20 74 31 20 56 41 4c 55 45 53 28 4e 55 4c 4c  O t1 VALUES(NULL
1670: 2c 20 27 66 6f 75 72 27 29 3b 0a 20 20 20 20 49  , 'four');.    I
1680: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
1690: 4c 55 45 53 28 4e 55 4c 4c 2c 20 27 66 69 76 65  LUES(NULL, 'five
16a0: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
16b0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 4e 55  NTO t1 VALUES(NU
16c0: 4c 4c 2c 20 27 73 69 78 27 29 3b 0a 20 20 20 20  LL, 'six');.    
16d0: 41 4e 41 4c 59 5a 45 3b 0a 20 20 20 20 53 45 4c  ANALYZE;.    SEL
16e0: 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74  ECT * FROM sqlit
16f0: 65 5f 73 74 61 74 31 3b 0a 20 20 7d 20 7b 74 31  e_stat1;.  } {t1
1700: 20 69 31 20 7b 36 20 31 7d 7d 0a 20 20 64 6f 5f   i1 {6 1}}.  do_
1710: 72 62 75 5f 76 61 63 75 75 6d 5f 74 65 73 74 20  rbu_vacuum_test 
1720: 31 2e 38 2e 31 20 24 73 74 65 70 0a 20 20 64 6f  1.8.1 $step.  do
1730: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 2e  _execsql_test 1.
1740: 37 2e 32 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  7.2 {.    SELECT
1750: 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73   * FROM sqlite_s
1760: 74 61 74 31 3b 0a 20 20 7d 20 7b 74 31 20 69 31  tat1;.  } {t1 i1
1770: 20 7b 36 20 31 7d 7d 0a 0a 20 20 72 65 73 65 74   {6 1}}..  reset
1780: 5f 64 62 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c  _db.  do_execsql
1790: 5f 74 65 73 74 20 31 2e 39 2e 30 20 7b 0a 20 20  _test 1.9.0 {.  
17a0: 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69    PRAGMA page_si
17b0: 7a 65 20 3d 20 38 31 39 32 3b 0a 20 20 20 20 50  ze = 8192;.    P
17c0: 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75  RAGMA auto_vacuu
17d0: 6d 20 3d 20 32 3b 0a 20 20 20 20 50 52 41 47 4d  m = 2;.    PRAGM
17e0: 41 20 75 73 65 72 5f 76 65 72 73 69 6f 6e 20 3d  A user_version =
17f0: 20 34 31 32 3b 0a 20 20 20 20 50 52 41 47 4d 41   412;.    PRAGMA
1800: 20 61 70 70 6c 69 63 61 74 69 6f 6e 5f 69 64 20   application_id 
1810: 3d 20 34 31 33 3b 0a 0a 20 20 20 20 43 52 45 41  = 413;..    CREA
1820: 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 49 4e  TE TABLE t1(a IN
1830: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
1840: 59 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 2c  Y AUTOINCREMENT,
1850: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
1860: 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 62  INDEX i1 ON t1(b
1870: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
1880: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 4e 55 4c  TO t1 VALUES(NUL
1890: 4c 2c 20 27 6f 6e 65 27 29 3b 0a 20 20 20 20 49  L, 'one');.    I
18a0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
18b0: 4c 55 45 53 28 4e 55 4c 4c 2c 20 27 74 77 6f 27  LUES(NULL, 'two'
18c0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
18d0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 4e 55 4c  TO t1 VALUES(NUL
18e0: 4c 2c 20 27 74 68 72 65 65 27 29 3b 0a 20 20 20  L, 'three');.   
18f0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
1900: 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 27 66 6f  VALUES(NULL, 'fo
1910: 75 72 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  ur');.    INSERT
1920: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
1930: 4e 55 4c 4c 2c 20 27 66 69 76 65 27 29 3b 0a 20  NULL, 'five');. 
1940: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1950: 31 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 27  1 VALUES(NULL, '
1960: 73 69 78 27 29 3b 0a 0a 20 20 20 20 50 52 41 47  six');..    PRAG
1970: 4d 41 20 6d 61 69 6e 2e 70 61 67 65 5f 73 69 7a  MA main.page_siz
1980: 65 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6d 61  e;.    PRAGMA ma
1990: 69 6e 2e 61 75 74 6f 5f 76 61 63 75 75 6d 3b 0a  in.auto_vacuum;.
19a0: 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e      PRAGMA main.
19b0: 75 73 65 72 5f 76 65 72 73 69 6f 6e 3b 0a 20 20  user_version;.  
19c0: 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 61 70    PRAGMA main.ap
19d0: 70 6c 69 63 61 74 69 6f 6e 5f 69 64 3b 0a 20 20  plication_id;.  
19e0: 7d 20 7b 38 31 39 32 20 32 20 34 31 32 20 34 31  } {8192 2 412 41
19f0: 33 7d 0a 0a 20 20 64 6f 5f 72 62 75 5f 76 61 63  3}..  do_rbu_vac
1a00: 75 75 6d 5f 74 65 73 74 20 31 2e 39 2e 31 20 24  uum_test 1.9.1 $
1a10: 73 74 65 70 0a 20 20 64 6f 5f 65 78 65 63 73 71  step.  do_execsq
1a20: 6c 5f 74 65 73 74 20 31 2e 39 2e 32 20 7b 0a 20  l_test 1.9.2 {. 
1a30: 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 70     PRAGMA main.p
1a40: 61 67 65 5f 73 69 7a 65 3b 0a 20 20 20 20 50 52  age_size;.    PR
1a50: 41 47 4d 41 20 6d 61 69 6e 2e 61 75 74 6f 5f 76  AGMA main.auto_v
1a60: 61 63 75 75 6d 3b 0a 20 20 20 20 50 52 41 47 4d  acuum;.    PRAGM
1a70: 41 20 6d 61 69 6e 2e 75 73 65 72 5f 76 65 72 73  A main.user_vers
1a80: 69 6f 6e 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  ion;.    PRAGMA 
1a90: 6d 61 69 6e 2e 61 70 70 6c 69 63 61 74 69 6f 6e  main.application
1aa0: 5f 69 64 3b 0a 20 20 7d 20 7b 38 31 39 32 20 32  _id;.  } {8192 2
1ab0: 20 34 31 32 20 34 31 33 7d 0a 0a 20 20 23 20 56   412 413}..  # V
1ac0: 61 63 75 75 6d 20 61 20 64 61 74 61 62 61 73 65  acuum a database
1ad0: 20 77 69 74 68 20 61 20 6c 61 72 67 65 20 73 71   with a large sq
1ae0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
1af0: 65 2e 0a 20 20 23 0a 20 20 72 65 73 65 74 5f 64  e..  #.  reset_d
1b00: 62 0a 20 20 64 6f 5f 74 65 73 74 20 31 2e 31 30  b.  do_test 1.10
1b10: 2e 31 20 7b 0a 20 20 20 20 66 6f 72 20 7b 73 65  .1 {.    for {se
1b20: 74 20 69 20 31 7d 20 7b 24 69 20 3c 20 35 30 7d  t i 1} {$i < 50}
1b30: 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20   {incr i} {.    
1b40: 20 20 65 78 65 63 73 71 6c 20 22 50 52 41 47 4d    execsql "PRAGM
1b50: 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30  A page_size = 10
1b60: 32 34 22 0a 20 20 20 20 20 20 65 78 65 63 73 71  24".      execsq
1b70: 6c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  l "CREATE TABLE 
1b80: 74 24 69 20 28 61 2c 20 62 2c 20 63 2c 20 50 52  t$i (a, b, c, PR
1b90: 49 4d 41 52 59 20 4b 45 59 28 61 2c 20 62 29 29  IMARY KEY(a, b))
1ba0: 3b 22 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c  ;".      execsql
1bb0: 20 22 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52   ".        INSER
1bc0: 54 20 49 4e 54 4f 20 74 24 69 20 56 41 4c 55 45  T INTO t$i VALUE
1bd0: 53 28 31 2c 20 32 2c 20 33 29 3b 0a 20 20 20 20  S(1, 2, 3);.    
1be0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1bf0: 74 24 69 20 56 41 4c 55 45 53 28 34 2c 20 35 2c  t$i VALUES(4, 5,
1c00: 20 36 29 3b 0a 20 20 20 20 20 20 22 0a 20 20 20   6);.      ".   
1c10: 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 72   }.  } {}.  do_r
1c20: 62 75 5f 76 61 63 75 75 6d 5f 74 65 73 74 20 31  bu_vacuum_test 1
1c30: 2e 31 30 2e 32 20 24 73 74 65 70 0a 0a 20 20 23  .10.2 $step..  #
1c40: 20 44 61 74 61 62 61 73 65 20 77 69 74 68 20 65   Database with e
1c50: 6d 70 74 79 20 74 61 62 6c 65 73 2e 0a 20 20 23  mpty tables..  #
1c60: 0a 20 20 72 65 73 65 74 5f 64 62 0a 20 20 64 6f  .  reset_db.  do
1c70: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 2e  _execsql_test 1.
1c80: 31 31 2e 31 20 7b 0a 20 20 20 20 43 52 45 41 54  11.1 {.    CREAT
1c90: 45 20 54 41 42 4c 45 20 74 31 28 61 20 49 4e 54  E TABLE t1(a INT
1ca0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
1cb0: 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , b);.    CREATE
1cc0: 20 54 41 42 4c 45 20 74 32 28 61 20 49 4e 54 45   TABLE t2(a INTE
1cd0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
1ce0: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
1cf0: 54 41 42 4c 45 20 74 33 28 61 20 49 4e 54 45 47  TABLE t3(a INTEG
1d00: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
1d10: 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  b);.    CREATE T
1d20: 41 42 4c 45 20 74 34 28 61 20 49 4e 54 45 47 45  ABLE t4(a INTEGE
1d30: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  R PRIMARY KEY, b
1d40: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
1d50: 54 4f 20 74 34 20 56 41 4c 55 45 53 28 31 2c 20  TO t4 VALUES(1, 
1d60: 32 29 3b 0a 20 20 7d 0a 20 20 64 6f 5f 72 62 75  2);.  }.  do_rbu
1d70: 5f 76 61 63 75 75 6d 5f 74 65 73 74 20 31 2e 31  _vacuum_test 1.1
1d80: 31 2e 32 20 24 73 74 65 70 0a 20 20 64 6f 5f 65  1.2 $step.  do_e
1d90: 78 65 63 73 71 6c 5f 74 65 73 74 20 31 2e 31 31  xecsql_test 1.11
1da0: 2e 33 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  .3 {.    SELECT 
1db0: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 53  * FROM t1;.    S
1dc0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b  ELECT * FROM t2;
1dd0: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
1de0: 4f 4d 20 74 33 3b 0a 20 20 20 20 53 45 4c 45 43  OM t3;.    SELEC
1df0: 54 20 2a 20 46 52 4f 4d 20 74 34 3b 0a 20 20 7d  T * FROM t4;.  }
1e00: 20 7b 31 20 32 7d 0a 20 20 72 65 73 65 74 5f 64   {1 2}.  reset_d
1e10: 62 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74  b.  do_execsql_t
1e20: 65 73 74 20 31 2e 31 32 2e 31 20 7b 0a 20 20 20  est 1.12.1 {.   
1e30: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
1e40: 28 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  (a INTEGER PRIMA
1e50: 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20  RY KEY, b);.    
1e60: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
1e70: 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  a INTEGER PRIMAR
1e80: 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20 43  Y KEY, b);.    C
1e90: 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 61  REATE TABLE t3(a
1ea0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
1eb0: 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20 43 52   KEY, b);.    CR
1ec0: 45 41 54 45 20 54 41 42 4c 45 20 74 34 28 61 20  EATE TABLE t4(a 
1ed0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
1ee0: 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53  KEY, b);.    INS
1ef0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
1f00: 45 53 28 31 2c 20 32 29 3b 0a 20 20 7d 0a 20 20  ES(1, 2);.  }.  
1f10: 64 6f 5f 72 62 75 5f 76 61 63 75 75 6d 5f 74 65  do_rbu_vacuum_te
1f20: 73 74 20 31 2e 31 32 2e 32 20 24 73 74 65 70 0a  st 1.12.2 $step.
1f30: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
1f40: 74 20 31 2e 31 32 2e 33 20 7b 0a 20 20 20 20 53  t 1.12.3 {.    S
1f50: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
1f60: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
1f70: 4f 4d 20 74 32 3b 0a 20 20 20 20 53 45 4c 45 43  OM t2;.    SELEC
1f80: 54 20 2a 20 46 52 4f 4d 20 74 33 3b 0a 20 20 20  T * FROM t3;.   
1f90: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1fa0: 34 3b 0a 20 20 7d 20 7b 31 20 32 7d 0a 7d 0a 73  4;.  } {1 2}.}.s
1fb0: 65 74 20 3a 3a 74 65 73 74 70 72 65 66 69 78 20  et ::testprefix 
1fc0: 72 62 75 76 61 63 75 75 6d 0a 0a 23 2d 2d 2d 2d  rbuvacuum..#----
1fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2010: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 73 6f 6d  -----.# Test som
2020: 65 20 65 72 72 6f 72 20 63 61 73 65 73 3a 0a 23  e error cases:.#
2030: 0a 23 20 20 20 32 2e 31 2e 2a 20 74 68 65 20 64  .#   2.1.* the d
2040: 62 20 62 65 69 6e 67 20 76 61 63 75 75 6d 65 64  b being vacuumed
2050: 20 62 65 69 6e 67 20 69 6e 20 77 61 6c 20 6d 6f   being in wal mo
2060: 64 65 20 61 6c 72 65 61 64 79 2e 0a 23 20 20 20  de already..#   
2070: 32 2e 32 2e 2a 20 64 61 74 61 62 61 73 65 20 6d  2.2.* database m
2080: 6f 64 69 66 69 65 64 20 6d 69 64 20 76 61 63 75  odified mid vacu
2090: 75 6d 2e 0a 23 0a 72 65 73 65 74 5f 64 62 0a 64  um..#.reset_db.d
20a0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 32  o_execsql_test 2
20b0: 2e 31 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20  .1.0 {.  CREATE 
20c0: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
20d0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
20e0: 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20   VALUES(1, 2);. 
20f0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
2100: 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20  VALUES(3, 4);.  
2110: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
2120: 41 4c 55 45 53 28 35 2c 20 36 29 3b 0a 20 20 49  ALUES(5, 6);.  I
2130: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
2140: 4c 55 45 53 28 37 2c 20 38 29 3b 0a 20 20 50 52  LUES(7, 8);.  PR
2150: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
2160: 65 20 3d 20 77 61 6c 3b 0a 20 20 49 4e 53 45 52  e = wal;.  INSER
2170: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
2180: 28 39 2c 20 31 30 29 3b 0a 7d 20 77 61 6c 0a 64  (9, 10);.} wal.d
2190: 6f 5f 74 65 73 74 20 32 2e 31 2e 31 20 7b 0a 20  o_test 2.1.1 {. 
21a0: 20 73 71 6c 69 74 65 33 72 62 75 5f 76 61 63 75   sqlite3rbu_vacu
21b0: 75 6d 20 72 62 75 20 74 65 73 74 2e 64 62 20 73  um rbu test.db s
21c0: 74 61 74 65 2e 64 62 0a 20 20 72 62 75 20 73 74  tate.db.  rbu st
21d0: 65 70 0a 7d 20 7b 53 51 4c 49 54 45 5f 45 52 52  ep.} {SQLITE_ERR
21e0: 4f 52 7d 0a 64 6f 5f 74 65 73 74 20 32 2e 31 2e  OR}.do_test 2.1.
21f0: 32 20 7b 0a 20 20 6c 69 73 74 20 5b 63 61 74 63  2 {.  list [catc
2200: 68 20 7b 20 72 62 75 20 63 6c 6f 73 65 20 7d 20  h { rbu close } 
2210: 6d 73 67 5d 20 24 6d 73 67 0a 7d 20 7b 31 20 7b  msg] $msg.} {1 {
2220: 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 2d 20 63  SQLITE_ERROR - c
2230: 61 6e 6e 6f 74 20 76 61 63 75 75 6d 20 77 61 6c  annot vacuum wal
2240: 20 6d 6f 64 65 20 64 61 74 61 62 61 73 65 7d 7d   mode database}}
2250: 0a 0a 64 6f 5f 74 65 73 74 20 32 2e 31 2e 33 20  ..do_test 2.1.3 
2260: 7b 0a 20 20 73 71 6c 69 74 65 33 72 62 75 5f 76  {.  sqlite3rbu_v
2270: 61 63 75 75 6d 20 72 62 75 20 74 65 73 74 2e 64  acuum rbu test.d
2280: 62 20 73 74 61 74 65 2e 64 62 0a 20 20 72 62 75  b state.db.  rbu
2290: 20 73 74 65 70 0a 7d 20 7b 53 51 4c 49 54 45 5f   step.} {SQLITE_
22a0: 45 52 52 4f 52 7d 0a 64 6f 5f 74 65 73 74 20 32  ERROR}.do_test 2
22b0: 2e 31 2e 34 20 7b 0a 20 20 6c 69 73 74 20 5b 63  .1.4 {.  list [c
22c0: 61 74 63 68 20 7b 20 72 62 75 20 63 6c 6f 73 65  atch { rbu close
22d0: 5f 6e 6f 5f 65 72 72 6f 72 20 7d 20 6d 73 67 5d  _no_error } msg]
22e0: 20 24 6d 73 67 0a 7d 20 7b 31 20 53 51 4c 49 54   $msg.} {1 SQLIT
22f0: 45 5f 45 52 52 4f 52 7d 0a 0a 72 65 73 65 74 5f  E_ERROR}..reset_
2300: 64 62 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  db.do_execsql_te
2310: 73 74 20 32 2e 32 2e 30 20 7b 0a 20 20 43 52 45  st 2.2.0 {.  CRE
2320: 41 54 45 20 54 41 42 4c 45 20 74 78 28 61 20 50  ATE TABLE tx(a P
2330: 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 42 4c  RIMARY KEY, b BL
2340: 4f 42 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  OB);.  INSERT IN
2350: 54 4f 20 74 78 20 56 41 4c 55 45 53 28 31 2c 20  TO tx VALUES(1, 
2360: 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 29  randomblob(900))
2370: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
2380: 74 78 20 53 45 4c 45 43 54 20 61 2b 31 2c 20 72  tx SELECT a+1, r
2390: 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46  andomblob(900) F
23a0: 52 4f 4d 20 74 78 3b 0a 20 20 49 4e 53 45 52 54  ROM tx;.  INSERT
23b0: 20 49 4e 54 4f 20 74 78 20 53 45 4c 45 43 54 20   INTO tx SELECT 
23c0: 61 2b 32 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  a+2, randomblob(
23d0: 39 30 30 29 20 46 52 4f 4d 20 74 78 3b 0a 20 20  900) FROM tx;.  
23e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 78 20 53  INSERT INTO tx S
23f0: 45 4c 45 43 54 20 61 2b 34 2c 20 72 61 6e 64 6f  ELECT a+4, rando
2400: 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20  mblob(900) FROM 
2410: 74 78 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  tx;.  INSERT INT
2420: 4f 20 74 78 20 53 45 4c 45 43 54 20 61 2b 38 2c  O tx SELECT a+8,
2430: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29   randomblob(900)
2440: 20 46 52 4f 4d 20 74 78 3b 0a 7d 0a 64 62 5f 73   FROM tx;.}.db_s
2450: 61 76 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a 66 6f  ave_and_close.fo
2460: 72 20 7b 73 65 74 20 69 20 31 7d 20 31 20 7b 69  r {set i 1} 1 {i
2470: 6e 63 72 20 69 7d 20 7b 0a 20 20 64 62 5f 72 65  ncr i} {.  db_re
2480: 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  store_and_reopen
2490: 0a 0a 20 20 73 71 6c 69 74 65 33 72 62 75 5f 76  ..  sqlite3rbu_v
24a0: 61 63 75 75 6d 20 72 62 75 20 74 65 73 74 2e 64  acuum rbu test.d
24b0: 62 20 73 74 61 74 65 2e 64 62 0a 20 20 66 6f 72  b state.db.  for
24c0: 20 7b 73 65 74 20 73 74 65 70 20 30 7d 20 7b 24   {set step 0} {$
24d0: 73 74 65 70 3c 24 69 7d 20 7b 69 6e 63 72 20 73  step<$i} {incr s
24e0: 74 65 70 7d 20 7b 20 72 62 75 20 73 74 65 70 20  tep} { rbu step 
24f0: 7d 0a 20 20 72 62 75 20 63 6c 6f 73 65 0a 20 20  }.  rbu close.  
2500: 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73  if {[file exists
2510: 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 7d 20 62   test.db-wal]} b
2520: 72 65 61 6b 0a 0a 20 20 65 78 65 63 73 71 6c 20  reak..  execsql 
2530: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 78  { INSERT INTO tx
2540: 20 56 41 4c 55 45 53 28 32 30 2c 20 32 30 29 20   VALUES(20, 20) 
2550: 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 32 2e 32  }..  do_test 2.2
2560: 2e 24 69 2e 31 20 7b 0a 20 20 20 20 73 71 6c 69  .$i.1 {.    sqli
2570: 74 65 33 72 62 75 5f 76 61 63 75 75 6d 20 72 62  te3rbu_vacuum rb
2580: 75 20 74 65 73 74 2e 64 62 20 73 74 61 74 65 2e  u test.db state.
2590: 64 62 20 0a 20 20 20 20 72 62 75 20 73 74 65 70  db .    rbu step
25a0: 0a 20 20 7d 20 7b 53 51 4c 49 54 45 5f 42 55 53  .  } {SQLITE_BUS
25b0: 59 7d 0a 20 20 64 6f 5f 74 65 73 74 20 32 2e 32  Y}.  do_test 2.2
25c0: 2e 24 69 2e 32 20 7b 0a 20 20 20 20 6c 69 73 74  .$i.2 {.    list
25d0: 20 5b 63 61 74 63 68 20 7b 20 72 62 75 20 63 6c   [catch { rbu cl
25e0: 6f 73 65 20 7d 20 6d 73 67 5d 20 24 6d 73 67 0a  ose } msg] $msg.
25f0: 20 20 7d 20 7b 31 20 7b 53 51 4c 49 54 45 5f 42    } {1 {SQLITE_B
2600: 55 53 59 20 2d 20 64 61 74 61 62 61 73 65 20 6d  USY - database m
2610: 6f 64 69 66 69 65 64 20 64 75 72 69 6e 67 20 72  odified during r
2620: 62 75 20 76 61 63 75 75 6d 7d 7d 0a 7d 0a 0a 23  bu vacuum}}.}..#
2630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
2680: 20 74 68 61 74 20 61 20 64 61 74 61 62 61 73 65   that a database
2690: 20 74 68 61 74 20 75 73 65 73 20 63 75 73 74 6f   that uses custo
26a0: 6d 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  m collation sequ
26b0: 65 6e 63 65 73 20 63 61 6e 20 62 65 20 52 42 55  ences can be RBU
26c0: 0a 23 20 76 61 63 75 75 6d 65 64 2e 0a 23 0a 72  .# vacuumed..#.r
26d0: 65 73 65 74 5f 64 62 0a 66 6f 72 63 65 64 65 6c  eset_db.forcedel
26e0: 65 74 65 20 73 74 61 74 65 2e 64 62 0a 70 72 6f  ete state.db.pro
26f0: 63 20 6e 6f 6f 70 20 7b 61 72 67 73 7d 20 7b 7d  c noop {args} {}
2700: 0a 70 72 6f 63 20 6c 65 6e 67 74 68 5f 63 6d 70  .proc length_cmp
2710: 20 7b 78 20 79 7d 20 7b 0a 20 20 73 65 74 20 6e   {x y} {.  set n
2720: 31 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68  1 [string length
2730: 20 24 78 5d 0a 20 20 73 65 74 20 6e 32 20 5b 73   $x].  set n2 [s
2740: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 79 5d  tring length $y]
2750: 0a 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20  .  return [expr 
2760: 24 6e 31 20 2d 20 24 6e 32 5d 0a 7d 0a 73 71 6c  $n1 - $n2].}.sql
2770: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
2780: 61 74 69 6f 6e 5f 76 32 20 64 62 20 6c 65 6e 67  ation_v2 db leng
2790: 74 68 20 6c 65 6e 67 74 68 5f 63 6d 70 20 6e 6f  th length_cmp no
27a0: 6f 70 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  op..do_execsql_t
27b0: 65 73 74 20 33 2e 30 20 7b 0a 20 20 43 52 45 41  est 3.0 {.  CREA
27c0: 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 49 4e  TE TABLE t1(a IN
27d0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
27e0: 59 2c 20 62 29 3b 0a 20 20 49 4e 53 45 52 54 20  Y, b);.  INSERT 
27f0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
2800: 2c 20 27 69 27 29 3b 0a 20 20 49 4e 53 45 52 54  , 'i');.  INSERT
2810: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
2820: 32 2c 20 27 69 69 69 69 27 29 3b 0a 20 20 49 4e  2, 'iiii');.  IN
2830: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
2840: 55 45 53 28 33 2c 20 27 69 69 27 29 3b 0a 20 20  UES(3, 'ii');.  
2850: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
2860: 41 4c 55 45 53 28 34 2c 20 27 69 69 69 27 29 3b  ALUES(4, 'iii');
2870: 0a 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  .  SELECT a FROM
2880: 20 74 31 20 4f 52 44 45 52 20 42 59 20 62 20 43   t1 ORDER BY b C
2890: 4f 4c 4c 41 54 45 20 6c 65 6e 67 74 68 3b 0a 7d  OLLATE length;.}
28a0: 20 7b 31 20 33 20 34 20 32 7d 0a 64 6f 5f 65 78   {1 3 4 2}.do_ex
28b0: 65 63 73 71 6c 5f 74 65 73 74 20 33 2e 31 20 7b  ecsql_test 3.1 {
28c0: 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  .  CREATE INDEX 
28d0: 69 31 20 4f 4e 20 74 31 28 62 20 43 4f 4c 4c 41  i1 ON t1(b COLLA
28e0: 54 45 20 6c 65 6e 67 74 68 29 3b 0a 7d 0a 0a 64  TE length);.}..d
28f0: 6f 5f 74 65 73 74 20 33 2e 32 20 7b 0a 20 20 73  o_test 3.2 {.  s
2900: 71 6c 69 74 65 33 72 62 75 5f 76 61 63 75 75 6d  qlite3rbu_vacuum
2910: 20 72 62 75 20 74 65 73 74 2e 64 62 20 73 74 61   rbu test.db sta
2920: 74 65 2e 64 62 0a 20 20 77 68 69 6c 65 20 7b 5b  te.db.  while {[
2930: 72 62 75 20 73 74 65 70 5d 3d 3d 22 53 51 4c 49  rbu step]=="SQLI
2940: 54 45 5f 4f 4b 22 7d 20 7b 7d 0a 20 20 6c 69 73  TE_OK"} {}.  lis
2950: 74 20 5b 63 61 74 63 68 20 7b 20 72 62 75 20 63  t [catch { rbu c
2960: 6c 6f 73 65 20 7d 20 6d 73 67 5d 20 24 6d 73 67  lose } msg] $msg
2970: 0a 7d 20 7b 31 20 7b 53 51 4c 49 54 45 5f 45 52  .} {1 {SQLITE_ER
2980: 52 4f 52 20 2d 20 6e 6f 20 73 75 63 68 20 63 6f  ROR - no such co
2990: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
29a0: 3a 20 6c 65 6e 67 74 68 7d 7d 0a 0a 64 6f 5f 74  : length}}..do_t
29b0: 65 73 74 20 33 2e 33 20 7b 0a 20 20 73 71 6c 69  est 3.3 {.  sqli
29c0: 74 65 33 72 62 75 5f 76 61 63 75 75 6d 20 72 62  te3rbu_vacuum rb
29d0: 75 20 74 65 73 74 2e 64 62 20 73 74 61 74 65 2e  u test.db state.
29e0: 64 62 0a 20 20 73 65 74 20 64 62 31 20 5b 72 62  db.  set db1 [rb
29f0: 75 20 64 62 20 30 5d 0a 20 20 73 71 6c 69 74 65  u db 0].  sqlite
2a00: 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
2a10: 6f 6e 5f 76 32 20 24 64 62 31 20 6c 65 6e 67 74  on_v2 $db1 lengt
2a20: 68 20 6c 65 6e 67 74 68 5f 63 6d 70 20 6e 6f 6f  h length_cmp noo
2a30: 70 0a 20 20 77 68 69 6c 65 20 7b 5b 72 62 75 20  p.  while {[rbu 
2a40: 73 74 65 70 5d 3d 3d 22 53 51 4c 49 54 45 5f 4f  step]=="SQLITE_O
2a50: 4b 22 7d 20 7b 7d 0a 20 20 6c 69 73 74 20 5b 63  K"} {}.  list [c
2a60: 61 74 63 68 20 7b 20 72 62 75 20 63 6c 6f 73 65  atch { rbu close
2a70: 20 7d 20 6d 73 67 5d 20 24 6d 73 67 0a 7d 20 7b   } msg] $msg.} {
2a80: 31 20 7b 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  1 {SQLITE_ERROR 
2a90: 2d 20 6e 6f 20 73 75 63 68 20 63 6f 6c 6c 61 74  - no such collat
2aa0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 3a 20 6c 65  ion sequence: le
2ab0: 6e 67 74 68 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20  ngth}}..do_test 
2ac0: 33 2e 34 20 7b 0a 20 20 73 71 6c 69 74 65 33 72  3.4 {.  sqlite3r
2ad0: 62 75 5f 76 61 63 75 75 6d 20 72 62 75 20 74 65  bu_vacuum rbu te
2ae0: 73 74 2e 64 62 20 73 74 61 74 65 2e 64 62 0a 20  st.db state.db. 
2af0: 20 73 65 74 20 64 62 31 20 5b 72 62 75 20 64 62   set db1 [rbu db
2b00: 20 31 5d 0a 20 20 73 71 6c 69 74 65 33 5f 63 72   1].  sqlite3_cr
2b10: 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76  eate_collation_v
2b20: 32 20 24 64 62 31 20 6c 65 6e 67 74 68 20 6c 65  2 $db1 length le
2b30: 6e 67 74 68 5f 63 6d 70 20 6e 6f 6f 70 0a 20 20  ngth_cmp noop.  
2b40: 77 68 69 6c 65 20 7b 5b 72 62 75 20 73 74 65 70  while {[rbu step
2b50: 5d 3d 3d 22 53 51 4c 49 54 45 5f 4f 4b 22 7d 20  ]=="SQLITE_OK"} 
2b60: 7b 7d 0a 20 20 6c 69 73 74 20 5b 63 61 74 63 68  {}.  list [catch
2b70: 20 7b 20 72 62 75 20 63 6c 6f 73 65 20 7d 20 6d   { rbu close } m
2b80: 73 67 5d 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 53  sg] $msg.} {1 {S
2b90: 51 4c 49 54 45 5f 45 52 52 4f 52 20 2d 20 6e 6f  QLITE_ERROR - no
2ba0: 20 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20   such collation 
2bb0: 73 65 71 75 65 6e 63 65 3a 20 6c 65 6e 67 74 68  sequence: length
2bc0: 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20 33 2e 35 20  }}..do_test 3.5 
2bd0: 7b 0a 20 20 73 71 6c 69 74 65 33 72 62 75 5f 76  {.  sqlite3rbu_v
2be0: 61 63 75 75 6d 20 72 62 75 20 74 65 73 74 2e 64  acuum rbu test.d
2bf0: 62 20 73 74 61 74 65 2e 64 62 0a 20 20 73 65 74  b state.db.  set
2c00: 20 64 62 31 20 5b 72 62 75 20 64 62 20 30 5d 0a   db1 [rbu db 0].
2c10: 20 20 73 65 74 20 64 62 32 20 5b 72 62 75 20 64    set db2 [rbu d
2c20: 62 20 31 5d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  b 1]..  sqlite3_
2c30: 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
2c40: 5f 76 32 20 24 64 62 31 20 6c 65 6e 67 74 68 20  _v2 $db1 length 
2c50: 6c 65 6e 67 74 68 5f 63 6d 70 20 6e 6f 6f 70 0a  length_cmp noop.
2c60: 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
2c70: 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 20 24 64  _collation_v2 $d
2c80: 62 32 20 6c 65 6e 67 74 68 20 6c 65 6e 67 74 68  b2 length length
2c90: 5f 63 6d 70 20 6e 6f 6f 70 0a 0a 20 20 77 68 69  _cmp noop..  whi
2ca0: 6c 65 20 7b 5b 72 62 75 20 73 74 65 70 5d 3d 3d  le {[rbu step]==
2cb0: 22 53 51 4c 49 54 45 5f 4f 4b 22 7d 20 7b 7d 0a  "SQLITE_OK"} {}.
2cc0: 20 20 6c 69 73 74 20 5b 63 61 74 63 68 20 7b 20    list [catch { 
2cd0: 72 62 75 20 63 6c 6f 73 65 20 7d 20 6d 73 67 5d  rbu close } msg]
2ce0: 20 24 6d 73 67 0a 7d 20 7b 30 20 53 51 4c 49 54   $msg.} {0 SQLIT
2cf0: 45 5f 44 4f 4e 45 7d 0a 0a 63 61 74 63 68 20 7b  E_DONE}..catch {
2d00: 20 64 62 20 63 6c 6f 73 65 20 7d 0a 66 69 6e 69   db close }.fini
2d10: 73 68 5f 74 65 73 74 0a                          sh_test.