Artifact
ae04573b73ad52179f56e194fff0fbe43b509d23:
- File
test/incrvacuum2.test
— part of check-in
[7b8e1761]
at
2011-04-08 17:22:30
on branch trunk
— Fix incrvacuum2.test so that it works with the inmemory_journal permutation.
(user:
dan
size: 5828)
[more...]
0000: 23 20 32 30 30 37 20 4d 61 79 20 30 34 0a 23 0a # 2007 May 04.#.
0010: 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73 # The author dis
0020: 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74 claims copyright
0030: 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20 to this source
0040: 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20 code. In place
0050: 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f 74 of.# a legal not
0060: 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 62 ice, here is a b
0070: 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20 20 lessing:.#.#
0080: 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 May you do good
0090: 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23 20 and not evil..#
00a0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 May you find
00b0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 forgiveness for
00c0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 yourself and for
00d0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20 20 give others..#
00e0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 May you share
00f0: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 freely, never ta
0100: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 king more than y
0110: 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a 2a ou 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 0a 23 20 54 68 69 73 20 66 69 6c 65 20 ***.# This file
0170: 69 6d 70 6c 65 6d 65 6e 74 73 20 72 65 67 72 65 implements regre
0180: 73 73 69 6f 6e 20 74 65 73 74 73 20 66 6f 72 20 ssion tests for
0190: 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 20 SQLite library.
01a0: 20 54 68 65 0a 23 20 66 6f 63 75 73 20 6f 66 20 The.# focus of
01b0: 74 68 69 73 20 66 69 6c 65 20 69 73 20 74 65 73 this file is tes
01c0: 74 69 6e 67 20 74 68 65 20 69 6e 63 72 65 6d 65 ting the increme
01d0: 6e 74 61 6c 20 76 61 63 75 75 6d 20 66 65 61 74 ntal vacuum feat
01e0: 75 72 65 2e 0a 23 0a 23 20 24 49 64 3a 20 69 6e ure..#.# $Id: in
01f0: 63 72 76 61 63 75 75 6d 32 2e 74 65 73 74 2c 76 crvacuum2.test,v
0200: 20 31 2e 36 20 32 30 30 39 2f 30 37 2f 32 35 20 1.6 2009/07/25
0210: 31 33 3a 34 32 3a 35 30 20 64 61 6e 69 65 6c 6b 13:42:50 danielk
0220: 31 39 37 37 20 45 78 70 20 24 0a 0a 73 65 74 20 1977 Exp $..set
0230: 74 65 73 74 64 69 72 20 5b 66 69 6c 65 20 64 69 testdir [file di
0240: 72 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f rname $argv0].so
0250: 75 72 63 65 20 24 74 65 73 74 64 69 72 2f 74 65 urce $testdir/te
0260: 73 74 65 72 2e 74 63 6c 0a 0a 23 20 49 66 20 74 ster.tcl..# If t
0270: 68 69 73 20 62 75 69 6c 64 20 6f 66 20 74 68 65 his build of the
0280: 20 6c 69 62 72 61 72 79 20 64 6f 65 73 20 6e 6f library does no
0290: 74 20 73 75 70 70 6f 72 74 20 61 75 74 6f 2d 76 t support auto-v
02a0: 61 63 75 75 6d 2c 20 6f 6d 69 74 20 74 68 69 73 acuum, omit this
02b0: 0a 23 20 77 68 6f 6c 65 20 66 69 6c 65 2e 0a 69 .# whole file..i
02c0: 66 63 61 70 61 62 6c 65 20 7b 21 61 75 74 6f 76 fcapable {!autov
02d0: 61 63 75 75 6d 20 7c 7c 20 21 70 72 61 67 6d 61 acuum || !pragma
02e0: 7d 20 7b 0a 20 20 66 69 6e 69 73 68 5f 74 65 73 } {. finish_tes
02f0: 74 0a 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 73 65 t. return.}..se
0300: 74 20 74 65 73 74 70 72 65 66 69 78 20 69 6e 63 t testprefix inc
0310: 72 76 61 63 75 75 6d 32 0a 0a 23 20 43 72 65 61 rvacuum2..# Crea
0320: 74 65 20 61 20 64 61 74 61 62 61 73 65 20 69 6e te a database in
0330: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 incremental vac
0340: 75 75 6d 20 6d 6f 64 65 20 74 68 61 74 20 68 61 uum mode that ha
0350: 73 20 6d 61 6e 79 0a 23 20 70 61 67 65 73 20 6f s many.# pages o
0360: 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a n the freelist..
0370: 23 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72 76 61 #.do_test incrva
0380: 63 75 75 6d 32 2d 31 2e 31 20 7b 0a 20 20 65 78 cuum2-1.1 {. ex
0390: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 ecsql {. PRAG
03a0: 4d 41 20 70 61 67 65 5f 73 69 7a 65 3d 31 30 32 MA page_size=102
03b0: 34 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75 4;. PRAGMA au
03c0: 74 6f 5f 76 61 63 75 75 6d 3d 69 6e 63 72 65 6d to_vacuum=increm
03d0: 65 6e 74 61 6c 3b 0a 20 20 20 20 43 52 45 41 54 ental;. CREAT
03e0: 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a 20 E TABLE t1(x);.
03f0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 INSERT INTO t
0400: 31 20 56 41 4c 55 45 53 28 7a 65 72 6f 62 6c 6f 1 VALUES(zeroblo
0410: 62 28 33 30 30 30 30 29 29 3b 0a 20 20 20 20 44 b(30000));. D
0420: 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 3b 0a 20 ELETE FROM t1;.
0430: 20 7d 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74 }. file size t
0440: 65 73 74 2e 64 62 0a 7d 20 7b 33 32 37 36 38 7d est.db.} {32768}
0450: 0a 0a 23 20 56 61 63 75 75 6d 20 6f 66 66 20 61 ..# Vacuum off a
0460: 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 0a 23 0a single page..#.
0470: 64 6f 5f 74 65 73 74 20 69 6e 63 72 76 61 63 75 do_test incrvacu
0480: 75 6d 32 2d 31 2e 32 20 7b 0a 20 20 65 78 65 63 um2-1.2 {. exec
0490: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 sql {. PRAGMA
04a0: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 5f 76 61 63 incremental_vac
04b0: 75 75 6d 28 31 29 3b 0a 20 20 7d 0a 20 20 66 69 uum(1);. }. fi
04c0: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a le size test.db.
04d0: 7d 20 7b 33 31 37 34 34 7d 0a 0a 23 20 56 61 63 } {31744}..# Vac
04e0: 75 75 6d 20 6f 66 66 20 66 69 76 65 20 70 61 67 uum off five pag
04f0: 65 73 0a 23 0a 64 6f 5f 74 65 73 74 20 69 6e 63 es.#.do_test inc
0500: 72 76 61 63 75 75 6d 32 2d 31 2e 33 20 7b 0a 20 rvacuum2-1.3 {.
0510: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 execsql {. P
0520: 52 41 47 4d 41 20 69 6e 63 72 65 6d 65 6e 74 61 RAGMA incrementa
0530: 6c 5f 76 61 63 75 75 6d 28 35 29 3b 0a 20 20 7d l_vacuum(5);. }
0540: 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 . file size tes
0550: 74 2e 64 62 0a 7d 20 7b 32 36 36 32 34 7d 0a 0a t.db.} {26624}..
0560: 23 20 56 61 63 75 75 6d 20 6f 66 66 20 61 6c 6c # Vacuum off all
0570: 20 74 68 65 20 72 65 73 74 0a 23 0a 64 6f 5f 74 the rest.#.do_t
0580: 65 73 74 20 69 6e 63 72 76 61 63 75 75 6d 32 2d est incrvacuum2-
0590: 31 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 1.4 {. execsql
05a0: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 63 {. PRAGMA inc
05b0: 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d 28 remental_vacuum(
05c0: 31 30 30 30 29 3b 0a 20 20 7d 0a 20 20 66 69 6c 1000);. }. fil
05d0: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 7d e size test.db.}
05e0: 20 7b 33 30 37 32 7d 0a 0a 23 20 4d 61 6b 65 20 {3072}..# Make
05f0: 73 75 72 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c sure incremental
0600: 20 76 61 63 75 75 6d 20 77 6f 72 6b 73 20 6f 6e vacuum works on
0610: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 attached databa
0620: 73 65 73 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65 ses..#.ifcapable
0630: 20 61 74 74 61 63 68 20 7b 0a 20 20 64 6f 5f 74 attach {. do_t
0640: 65 73 74 20 69 6e 63 72 76 61 63 75 75 6d 32 2d est incrvacuum2-
0650: 32 2e 31 20 7b 0a 20 20 20 20 66 69 6c 65 20 64 2.1 {. file d
0660: 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73 elete -force tes
0670: 74 32 2e 64 62 20 74 65 73 74 32 2e 64 62 2d 6a t2.db test2.db-j
0680: 6f 75 72 6e 61 6c 0a 20 20 20 20 65 78 65 63 73 ournal. execs
0690: 71 6c 20 7b 0a 20 20 20 20 20 20 41 54 54 41 43 ql {. ATTAC
06a0: 48 20 44 41 54 41 42 41 53 45 20 27 74 65 73 74 H DATABASE 'test
06b0: 32 2e 64 62 27 20 41 53 20 61 75 78 3b 0a 20 20 2.db' AS aux;.
06c0: 20 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e 61 PRAGMA aux.a
06d0: 75 74 6f 5f 76 61 63 75 75 6d 3d 69 6e 63 72 65 uto_vacuum=incre
06e0: 6d 65 6e 74 61 6c 3b 0a 20 20 20 20 20 20 43 52 mental;. CR
06f0: 45 41 54 45 20 54 41 42 4c 45 20 61 75 78 2e 74 EATE TABLE aux.t
0700: 32 28 78 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 2(x);. INSE
0710: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 RT INTO t2 VALUE
0720: 53 28 7a 65 72 6f 62 6c 6f 62 28 33 30 30 30 30 S(zeroblob(30000
0730: 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 ));. INSERT
0740: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 INTO t1 SELECT
0750: 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 20 * FROM t2;.
0760: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 32 3b DELETE FROM t2;
0770: 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 . DELETE FR
0780: 4f 4d 20 74 31 3b 0a 20 20 20 20 7d 0a 20 20 20 OM t1;. }.
0790: 20 6c 69 73 74 20 5b 66 69 6c 65 20 73 69 7a 65 list [file size
07a0: 20 74 65 73 74 2e 64 62 5d 20 5b 66 69 6c 65 20 test.db] [file
07b0: 73 69 7a 65 20 74 65 73 74 32 2e 64 62 5d 0a 20 size test2.db].
07c0: 20 7d 20 7b 33 32 37 36 38 20 33 32 37 36 38 7d } {32768 32768}
07d0: 0a 20 20 64 6f 5f 74 65 73 74 20 69 6e 63 72 76 . do_test incrv
07e0: 61 63 75 75 6d 32 2d 32 2e 32 20 7b 0a 20 20 20 acuum2-2.2 {.
07f0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 execsql {.
0800: 20 50 52 41 47 4d 41 20 61 75 78 2e 69 6e 63 72 PRAGMA aux.incr
0810: 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d 28 31 emental_vacuum(1
0820: 29 0a 20 20 20 20 7d 0a 20 20 20 20 6c 69 73 74 ). }. list
0830: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 [file size test
0840: 2e 64 62 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 .db] [file size
0850: 74 65 73 74 32 2e 64 62 5d 0a 20 20 7d 20 7b 33 test2.db]. } {3
0860: 32 37 36 38 20 33 31 37 34 34 7d 0a 20 20 64 6f 2768 31744}. do
0870: 5f 74 65 73 74 20 69 6e 63 72 76 61 63 75 75 6d _test incrvacuum
0880: 32 2d 32 2e 33 20 7b 0a 20 20 20 20 65 78 65 63 2-2.3 {. exec
0890: 73 71 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47 sql {. PRAG
08a0: 4d 41 20 61 75 78 2e 69 6e 63 72 65 6d 65 6e 74 MA aux.increment
08b0: 61 6c 5f 76 61 63 75 75 6d 28 35 29 0a 20 20 20 al_vacuum(5).
08c0: 20 7d 0a 20 20 20 20 6c 69 73 74 20 5b 66 69 6c }. list [fil
08d0: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 20 e size test.db]
08e0: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 32 [file size test2
08f0: 2e 64 62 5d 0a 20 20 7d 20 7b 33 32 37 36 38 20 .db]. } {32768
0900: 32 36 36 32 34 7d 0a 20 20 64 6f 5f 74 65 73 74 26624}. do_test
0910: 20 69 6e 63 72 76 61 63 75 75 6d 32 2d 32 2e 34 incrvacuum2-2.4
0920: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b {. execsql {
0930: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61 . PRAGMA ma
0940: 69 6e 2e 69 6e 63 72 65 6d 65 6e 74 61 6c 5f 76 in.incremental_v
0950: 61 63 75 75 6d 28 35 29 0a 20 20 20 20 7d 0a 20 acuum(5). }.
0960: 20 20 20 6c 69 73 74 20 5b 66 69 6c 65 20 73 69 list [file si
0970: 7a 65 20 74 65 73 74 2e 64 62 5d 20 5b 66 69 6c ze test.db] [fil
0980: 65 20 73 69 7a 65 20 74 65 73 74 32 2e 64 62 5d e size test2.db]
0990: 0a 20 20 7d 20 7b 32 37 36 34 38 20 32 36 36 32 . } {27648 2662
09a0: 34 7d 0a 20 20 64 6f 5f 74 65 73 74 20 69 6e 63 4}. do_test inc
09b0: 72 76 61 63 75 75 6d 32 2d 32 2e 35 20 7b 0a 20 rvacuum2-2.5 {.
09c0: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 execsql {.
09d0: 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e 69 6e PRAGMA aux.in
09e0: 63 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d cremental_vacuum
09f0: 0a 20 20 20 20 7d 0a 20 20 20 20 6c 69 73 74 20 . }. list
0a00: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e [file size test.
0a10: 64 62 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 db] [file size t
0a20: 65 73 74 32 2e 64 62 5d 0a 20 20 7d 20 7b 32 37 est2.db]. } {27
0a30: 36 34 38 20 33 30 37 32 7d 0a 20 20 64 6f 5f 74 648 3072}. do_t
0a40: 65 73 74 20 69 6e 63 72 76 61 63 75 75 6d 32 2d est incrvacuum2-
0a50: 32 2e 36 20 7b 0a 20 20 20 20 65 78 65 63 73 71 2.6 {. execsq
0a60: 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 l {. PRAGMA
0a70: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 5f 76 61 63 incremental_vac
0a80: 75 75 6d 28 31 29 0a 20 20 20 20 7d 0a 20 20 20 uum(1). }.
0a90: 20 6c 69 73 74 20 5b 66 69 6c 65 20 73 69 7a 65 list [file size
0aa0: 20 74 65 73 74 2e 64 62 5d 20 5b 66 69 6c 65 20 test.db] [file
0ab0: 73 69 7a 65 20 74 65 73 74 32 2e 64 62 5d 0a 20 size test2.db].
0ac0: 20 7d 20 7b 32 36 36 32 34 20 33 30 37 32 7d 0a } {26624 3072}.
0ad0: 7d 0a 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72 76 }..do_test incrv
0ae0: 61 63 75 75 6d 32 2d 33 2e 31 20 7b 0a 20 20 65 acuum2-3.1 {. e
0af0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 xecsql {. PRA
0b00: 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 GMA auto_vacuum
0b10: 3d 20 27 66 75 6c 6c 27 3b 0a 20 20 20 20 42 45 = 'full';. BE
0b20: 47 49 4e 3b 0a 20 20 20 20 43 52 45 41 54 45 20 GIN;. CREATE
0b30: 54 41 42 4c 45 20 61 62 63 28 61 29 3b 0a 20 20 TABLE abc(a);.
0b40: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 INSERT INTO ab
0b50: 63 20 56 41 4c 55 45 53 28 72 61 6e 64 73 74 72 c VALUES(randstr
0b60: 28 31 35 30 30 2c 31 35 30 30 29 29 3b 0a 20 20 (1500,1500));.
0b70: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 COMMIT;. }.}
0b80: 7b 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72 76 {}.do_test incrv
0b90: 61 63 75 75 6d 32 2d 33 2e 32 20 7b 0a 20 20 65 acuum2-3.2 {. e
0ba0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 xecsql {. BEG
0bb0: 49 4e 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 IN;. DELETE F
0bc0: 52 4f 4d 20 61 62 63 3b 0a 20 20 20 20 50 52 41 ROM abc;. PRA
0bd0: 47 4d 41 20 69 6e 63 72 65 6d 65 6e 74 61 6c 5f GMA incremental_
0be0: 76 61 63 75 75 6d 3b 0a 20 20 20 20 43 4f 4d 4d vacuum;. COMM
0bf0: 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 69 6e IT;. }.} {}..in
0c00: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 69 6e tegrity_check in
0c10: 63 72 76 61 63 75 75 6d 32 2d 33 2e 33 0a 0a 69 crvacuum2-3.3..i
0c20: 66 63 61 70 61 62 6c 65 20 77 61 6c 20 7b 0a 20 fcapable wal {.
0c30: 20 23 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 2c # At one point,
0c40: 20 77 68 65 6e 20 61 20 73 70 65 63 69 66 69 63 when a specific
0c50: 20 70 61 67 65 20 77 61 73 20 62 65 69 6e 67 20 page was being
0c60: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 extracted from t
0c70: 68 65 20 62 2d 74 72 65 65 0a 20 20 23 20 66 72 he b-tree. # fr
0c80: 65 65 2d 6c 69 73 74 20 28 65 2e 67 2e 20 64 75 ee-list (e.g. du
0c90: 72 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e ring an incremen
0ca0: 74 61 6c 2d 76 61 63 75 75 6d 29 2c 20 61 6c 6c tal-vacuum), all
0cb0: 20 74 72 75 6e 6b 20 70 61 67 65 73 20 74 68 61 trunk pages tha
0cc0: 74 0a 20 20 23 20 6f 63 63 75 72 72 65 64 20 62 t. # occurred b
0cd0: 65 66 6f 72 65 20 74 68 65 20 73 70 65 63 69 66 efore the specif
0ce0: 69 63 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 ic page in the f
0cf0: 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 77 ree-list trunk w
0d00: 65 72 65 20 62 65 69 6e 67 0a 20 20 23 20 77 72 ere being. # wr
0d10: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 itten to the jou
0d20: 72 6e 61 6c 20 6f 72 20 77 61 6c 20 66 69 6c 65 rnal or wal file
0d30: 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 6e 65 . This is not ne
0d40: 63 65 73 73 61 72 79 2e 20 4f 6e 6c 79 20 74 68 cessary. Only th
0d50: 65 20 0a 20 20 23 20 65 78 74 72 61 63 74 65 64 e . # extracted
0d60: 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 page and the pa
0d70: 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 ge that contains
0d80: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 the pointer to
0d90: 69 74 20 6e 65 65 64 20 74 6f 0a 20 20 23 20 62 it need to. # b
0da0: 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 2e 0a 20 20 e journalled..
0db0: 23 0a 20 20 23 20 54 68 69 73 20 70 72 6f 62 6c #. # This probl
0dc0: 65 6d 20 77 61 73 20 66 69 78 65 64 20 62 79 20 em was fixed by
0dd0: 5b 64 30 33 64 36 33 64 37 37 65 5d 20 28 6a 75 [d03d63d77e] (ju
0de0: 73 74 20 62 65 66 6f 72 65 20 33 2e 37 2e 36 20 st before 3.7.6
0df0: 72 65 6c 65 61 73 65 29 2e 0a 20 20 23 0a 20 20 release).. #.
0e00: 23 20 54 68 69 73 20 74 65 73 74 20 63 61 73 65 # This test case
0e10: 20 62 75 69 6c 64 73 20 61 20 64 61 74 61 62 61 builds a databa
0e20: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6d 61 se containing ma
0e30: 6e 79 20 66 72 65 65 20 70 61 67 65 73 2e 20 54 ny free pages. T
0e40: 68 65 6e 20 72 75 6e 73 0a 20 20 23 20 22 50 52 hen runs. # "PR
0e50: 41 47 4d 41 20 69 6e 63 72 65 6d 65 6e 74 61 6c AGMA incremental
0e60: 5f 76 61 63 75 75 6d 28 31 29 22 20 75 6e 74 69 _vacuum(1)" unti
0e70: 6c 20 74 68 65 20 64 62 20 63 6f 6e 74 61 69 6e l the db contain
0e80: 73 20 7a 65 72 6f 20 66 72 65 65 20 70 61 67 65 s zero free page
0e90: 73 2e 0a 20 20 23 20 45 61 63 68 20 22 50 52 41 s.. # Each "PRA
0ea0: 47 4d 41 20 69 6e 63 72 65 6d 65 6e 74 61 6c 5f GMA incremental_
0eb0: 76 61 63 75 75 6d 28 31 29 22 20 73 68 6f 75 6c vacuum(1)" shoul
0ec0: 64 20 6d 6f 64 69 66 79 20 61 74 20 6d 6f 73 74 d modify at most
0ed0: 20 34 20 70 61 67 65 73 2e 20 54 68 65 0a 20 20 4 pages. The.
0ee0: 23 20 77 6f 72 73 74 20 63 61 73 65 20 69 73 20 # worst case is
0ef0: 77 68 65 6e 20 61 20 74 72 75 6e 6b 20 70 61 67 when a trunk pag
0f00: 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f e is removed fro
0f10: 6d 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 m the end of the
0f20: 20 64 62 20 66 69 6c 65 2e 0a 20 20 23 20 49 6e db file.. # In
0f30: 20 74 68 69 73 20 63 61 73 65 20 70 61 67 65 73 this case pages
0f40: 20 77 72 69 74 74 65 6e 20 61 72 65 3a 0a 20 20 written are:.
0f50: 23 0a 20 20 23 20 20 20 31 2e 20 54 68 65 20 70 #. # 1. The p
0f60: 72 65 76 69 6f 75 73 20 74 72 75 6e 6b 20 70 61 revious trunk pa
0f70: 67 65 20 28 74 68 61 74 20 63 6f 6e 74 61 69 6e ge (that contain
0f80: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 s a pointer to t
0f90: 68 65 20 72 65 63 79 63 6c 65 64 0a 20 20 23 20 he recycled. #
0fa0: 20 20 20 20 20 74 72 75 6e 6b 20 70 61 67 65 29 trunk page)
0fb0: 2c 20 61 6e 64 0a 20 20 23 20 20 20 32 2e 20 54 , and. # 2. T
0fc0: 68 65 20 6c 65 61 66 20 70 61 67 65 20 74 72 61 he leaf page tra
0fd0: 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20 61 20 nsformed into a
0fe0: 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20 72 65 trunk page to re
0ff0: 70 6c 61 63 65 20 74 68 65 20 72 65 63 79 63 6c place the recycl
1000: 65 64 0a 20 20 23 20 20 20 20 20 20 70 61 67 65 ed. # page
1010: 2c 20 61 6e 64 0a 20 20 23 20 20 20 33 2e 20 54 , and. # 3. T
1020: 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74 68 he trunk page th
1030: 61 74 20 63 6f 6e 74 61 69 6e 65 64 20 61 20 70 at contained a p
1040: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6c 65 ointer to the le
1050: 61 66 20 70 61 67 65 20 75 73 65 64 20 0a 20 20 af page used .
1060: 23 20 20 20 20 20 20 69 6e 20 28 32 29 2c 20 61 # in (2), a
1070: 6e 64 0a 20 20 23 20 20 20 34 2e 20 50 61 67 65 nd. # 4. Page
1080: 20 31 2e 20 50 61 67 65 20 31 20 69 73 20 61 6c 1. Page 1 is al
1090: 77 61 79 73 20 75 70 64 61 74 65 64 2c 20 65 76 ways updated, ev
10a0: 65 6e 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2c 20 en in WAL mode,
10b0: 73 69 6e 63 65 20 69 74 20 63 6f 6e 74 61 69 6e since it contain
10c0: 73 0a 20 20 23 20 20 20 20 20 20 74 68 65 20 22 s. # the "
10d0: 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 2d 6c number of free-l
10e0: 69 73 74 20 70 61 67 65 73 22 20 66 69 65 6c 64 ist pages" field
10f0: 2e 0a 20 20 23 0a 20 20 64 62 20 63 6c 6f 73 65 .. #. db close
1100: 0a 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20 74 . forcedelete t
1110: 65 73 74 2e 64 62 0a 20 20 73 71 6c 69 74 65 33 est.db. sqlite3
1120: 20 64 62 20 74 65 73 74 2e 64 62 0a 0a 20 20 64 db test.db.. d
1130: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 34 o_execsql_test 4
1140: 2e 31 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 .1 {. PRAGMA
1150: 70 61 67 65 5f 73 69 7a 65 20 3d 20 35 31 32 3b page_size = 512;
1160: 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f . PRAGMA auto
1170: 5f 76 61 63 75 75 6d 20 3d 20 32 3b 0a 20 20 20 _vacuum = 2;.
1180: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 CREATE TABLE t1
1190: 28 78 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 (x);. INSERT
11a0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 72 INTO t1 VALUES(r
11b0: 61 6e 64 6f 6d 62 6c 6f 62 28 34 30 30 29 29 3b andomblob(400));
11c0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f . INSERT INTO
11d0: 20 74 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f t1 SELECT * FRO
11e0: 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 20 20 M t1;
11f0: 20 2d 2d 20 20 20 20 32 0a 20 20 20 20 49 4e 53 -- 2. INS
1200: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 ERT INTO t1 SELE
1210: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 20 20 20 CT * FROM t1;
1220: 20 20 20 20 20 20 20 20 20 2d 2d 20 20 20 20 34 -- 4
1230: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f . INSERT INTO
1240: 20 74 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f t1 SELECT * FRO
1250: 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 20 20 M t1;
1260: 20 2d 2d 20 20 20 20 38 0a 20 20 20 20 49 4e 53 -- 8. INS
1270: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 ERT INTO t1 SELE
1280: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 20 20 20 CT * FROM t1;
1290: 20 20 20 20 20 20 20 20 20 2d 2d 20 20 20 31 36 -- 16
12a0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f . INSERT INTO
12b0: 20 74 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f t1 SELECT * FRO
12c0: 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 20 20 M t1;
12d0: 20 2d 2d 20 20 20 33 32 0a 20 20 20 20 49 4e 53 -- 32. INS
12e0: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 ERT INTO t1 SELE
12f0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 20 20 20 CT * FROM t1;
1300: 20 20 20 20 20 20 20 20 20 2d 2d 20 20 31 32 38 -- 128
1310: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f . INSERT INTO
1320: 20 74 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f t1 SELECT * FRO
1330: 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 20 20 M t1;
1340: 20 2d 2d 20 20 32 35 36 0a 20 20 20 20 49 4e 53 -- 256. INS
1350: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 ERT INTO t1 SELE
1360: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 20 20 20 CT * FROM t1;
1370: 20 20 20 20 20 20 20 20 20 2d 2d 20 20 35 31 32 -- 512
1380: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f . INSERT INTO
1390: 20 74 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f t1 SELECT * FRO
13a0: 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 20 20 M t1;
13b0: 20 2d 2d 20 31 30 32 34 0a 20 20 20 20 49 4e 53 -- 1024. INS
13c0: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 ERT INTO t1 SELE
13d0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 20 20 20 CT * FROM t1;
13e0: 20 20 20 20 20 20 20 20 20 2d 2d 20 32 30 34 38 -- 2048
13f0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f . INSERT INTO
1400: 20 74 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f t1 SELECT * FRO
1410: 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 20 20 M t1;
1420: 20 2d 2d 20 34 30 39 36 0a 20 20 20 20 49 4e 53 -- 4096. INS
1430: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 ERT INTO t1 SELE
1440: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 20 20 20 CT * FROM t1;
1450: 20 20 20 20 20 20 20 20 20 2d 2d 20 38 31 39 32 -- 8192
1460: 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d . DELETE FROM
1470: 20 74 31 20 57 48 45 52 45 20 6f 69 64 3e 35 31 t1 WHERE oid>51
1480: 32 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 2;. DELETE FR
1490: 4f 4d 20 74 31 3b 0a 20 20 7d 0a 0a 20 20 64 6f OM t1;. }.. do
14a0: 5f 74 65 73 74 20 34 2e 32 20 7b 0a 20 20 20 20 _test 4.2 {.
14b0: 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20 execsql { .
14c0: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f PRAGMA journal_
14d0: 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 mode = WAL;.
14e0: 20 20 50 52 41 47 4d 41 20 69 6e 63 72 65 6d 65 PRAGMA increme
14f0: 6e 74 61 6c 5f 76 61 63 75 75 6d 28 31 29 3b 0a ntal_vacuum(1);.
1500: 20 20 20 20 20 20 50 52 41 47 4d 41 20 77 61 6c PRAGMA wal
1510: 5f 63 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 20 _checkpoint;.
1520: 20 7d 0a 20 20 20 20 66 69 6c 65 20 73 69 7a 65 }. file size
1530: 20 74 65 73 74 2e 64 62 2d 77 61 6c 0a 20 20 7d test.db-wal. }
1540: 20 7b 31 36 34 30 7d 0a 0a 20 20 64 6f 5f 74 65 {1640}.. do_te
1550: 73 74 20 34 2e 33 20 7b 0a 20 20 20 20 64 62 20 st 4.3 {. db
1560: 63 6c 6f 73 65 0a 20 20 20 20 73 71 6c 69 74 65 close. sqlite
1570: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 20 3 db test.db.
1580: 20 73 65 74 20 6d 61 78 73 7a 20 30 0a 20 20 20 set maxsz 0.
1590: 20 77 68 69 6c 65 20 7b 5b 66 69 6c 65 20 73 69 while {[file si
15a0: 7a 65 20 74 65 73 74 2e 64 62 5d 20 3e 20 5b 65 ze test.db] > [e
15b0: 78 70 72 20 35 31 32 2a 33 5d 7d 20 7b 0a 20 20 xpr 512*3]} {.
15c0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 execsql { PR
15d0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 AGMA journal_mod
15e0: 65 20 3d 20 57 41 4c 20 7d 0a 20 20 20 20 20 20 e = WAL }.
15f0: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 execsql { PRAGMA
1600: 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 wal_checkpoint
1610: 7d 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c 20 }. execsql
1620: 7b 20 50 52 41 47 4d 41 20 69 6e 63 72 65 6d 65 { PRAGMA increme
1630: 6e 74 61 6c 5f 76 61 63 75 75 6d 28 31 29 20 7d ntal_vacuum(1) }
1640: 0a 20 20 20 20 20 20 73 65 74 20 6e 65 77 73 7a . set newsz
1650: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 [file size test
1660: 2e 64 62 2d 77 61 6c 5d 0a 20 20 20 20 20 20 69 .db-wal]. i
1670: 66 20 7b 24 6e 65 77 73 7a 3e 24 6d 61 78 73 7a f {$newsz>$maxsz
1680: 7d 20 7b 73 65 74 20 6d 61 78 73 7a 20 24 6e 65 } {set maxsz $ne
1690: 77 73 7a 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 wsz}. }. s
16a0: 65 74 20 6d 61 78 73 7a 20 0a 20 20 7d 20 7b 32 et maxsz . } {2
16b0: 31 37 36 7d 0a 7d 0a 0a 66 69 6e 69 73 68 5f 74 176}.}..finish_t
16c0: 65 73 74 0a est.