xref: /sqlite-3.40.0/test/autovacuum2.test (revision 1bbfc674)
1# 2021-10-15
2#
3# The author disclaims copyright to this source code.  In place of
4# a legal notice, here is a blessing:
5#
6#    May you do good and not evil.
7#    May you find forgiveness for yourself and forgive others.
8#    May you share freely, never taking more than you give.
9#
10#***********************************************************************
11# This file implements regression tests for SQLite library.  The
12# focus of this file is testing the sqlite3_autovacuum_pages() interface
13#
14
15set testdir [file dirname $argv0]
16source $testdir/tester.tcl
17
18# If this build of the library does not support auto-vacuum, omit this
19# whole file.
20ifcapable {!autovacuum || !pragma} {
21  finish_test
22  return
23}
24
25# Demonstrate basic sqlite3_autovacuum_pages functionality
26#
27do_execsql_test autovacuum2-1.0 {
28  PRAGMA page_size=1024;
29  PRAGMA auto_vacuum=FULL;
30  CREATE TABLE t1(x);
31  VACUUM;
32  INSERT INTO t1(x) VALUES(zeroblob(10000));
33  PRAGMA page_count;
34} {12}
35proc autovac_page_callback {schema filesize freesize pagesize} {
36  global autovac_callback_data
37  lappend autovac_callback_data $schema $filesize $freesize $pagesize
38  return [expr {$freesize/2}]
39}
40sqlite3_autovacuum_pages db autovac_page_callback
41set autovac_callback_data {}
42do_execsql_test autovacuum2-1.1 {
43  BEGIN;
44  DELETE FROM t1;
45  PRAGMA freelist_count;
46  PRAGMA page_count;
47} {9 12}
48do_execsql_test autovacuum2-1.2 {
49  COMMIT;
50} {}
51do_test autovacuum2-1.3 {
52  set autovac_callback_data
53} {main 12 9 1024}
54do_execsql_test autovacuum2-1.4 {
55  PRAGMA freelist_count;
56  PRAGMA page_count;
57} {5 8}
58do_execsql_test autovacuum2-1.5 {
59  PRAGMA integrity_check;
60} {ok}
61
62# Disable the autovacuum-pages callback.  Then do any transaction.
63# The database should shrink to minimal size
64#
65sqlite3_autovacuum_pages db
66do_execsql_test autovacuum2-1.10 {
67  CREATE TABLE t2(x);
68  PRAGMA freelist_count;
69} {0}
70
71# Rig the autovacuum-pages callback to always return zero.  No
72# autovacuum will happen.
73#
74proc autovac_page_callback_off {schema filesize freesize pagesize} {
75  return 0
76}
77sqlite3_autovacuum_pages db autovac_page_callback_off
78do_execsql_test autovacuum2-1.20 {
79  BEGIN;
80  INSERT INTO t1(x) VALUES(zeroblob(10000));
81  DELETE FROM t1;
82  PRAGMA freelist_count;
83  COMMIT;
84  PRAGMA freelist_count;
85} {9 9}
86
87finish_test
88