124168728Sdanielk1977# 2007 March 24 224168728Sdanielk1977# 324168728Sdanielk1977# The author disclaims copyright to this source code. In place of 424168728Sdanielk1977# a legal notice, here is a blessing: 524168728Sdanielk1977# 624168728Sdanielk1977# May you do good and not evil. 724168728Sdanielk1977# May you find forgiveness for yourself and forgive others. 824168728Sdanielk1977# May you share freely, never taking more than you give. 924168728Sdanielk1977# 1024168728Sdanielk1977#*********************************************************************** 1124168728Sdanielk1977# 1227641703Sdrh# $Id: cache.test,v 1.4 2007/08/22 02:56:44 drh Exp $ 1324168728Sdanielk1977 1424168728Sdanielk1977set testdir [file dirname $argv0] 1524168728Sdanielk1977source $testdir/tester.tcl 1624168728Sdanielk1977 172f56da3fSdanifcapable !pager_pragmas||!compound { 1824168728Sdanielk1977 finish_test 1924168728Sdanielk1977 return 2024168728Sdanielk1977} 213aefabafSdrhsqlite3_soft_heap_limit 0 2224168728Sdanielk1977 2324168728Sdanielk1977proc pager_cache_size {db} { 2424168728Sdanielk1977 set bt [btree_from_db $db] 2527641703Sdrh db_enter $db 2624168728Sdanielk1977 array set stats [btree_pager_stats $bt] 2727641703Sdrh db_leave $db 2824168728Sdanielk1977 return $stats(page) 2924168728Sdanielk1977} 3024168728Sdanielk1977 31cb354603Sdanif {[permutation] == ""} { 32cb354603Sdan do_test cache-1.1 { pager_cache_size db } {0} 33cb354603Sdan} 3424168728Sdanielk1977 3524168728Sdanielk1977do_test cache-1.2 { 3624168728Sdanielk1977 execsql { 371e9daa6aSdrh PRAGMA auto_vacuum=OFF; 3824168728Sdanielk1977 CREATE TABLE abc(a, b, c); 3924168728Sdanielk1977 INSERT INTO abc VALUES(1, 2, 3); 4024168728Sdanielk1977 } 4124168728Sdanielk1977 pager_cache_size db 4224168728Sdanielk1977} {2} 4324168728Sdanielk1977 4424168728Sdanielk1977# At one point, repeatedly locking and unlocking the cache was causing 4524168728Sdanielk1977# a resource leak of one page per repetition. The page wasn't actually 4624168728Sdanielk1977# leaked, but would not be reused until the pager-cache was full (i.e. 4724168728Sdanielk1977# 2000 pages by default). 4824168728Sdanielk1977# 49*48864df9Smistachkin# This tests that once the pager-cache is initialized, it can be locked 5024168728Sdanielk1977# and unlocked repeatedly without internally allocating any new pages. 5124168728Sdanielk1977# 5224168728Sdanielk1977set cache_size [pager_cache_size db] 5324168728Sdanielk1977for {set ii 0} {$ii < 10} {incr ii} { 5424168728Sdanielk1977 do_test cache-1.3.$ii { 5524168728Sdanielk1977 execsql {SELECT * FROM abc} 5624168728Sdanielk1977 pager_cache_size db 5724168728Sdanielk1977 } $::cache_size 5824168728Sdanielk1977} 5924168728Sdanielk1977 605957b1bcSdan#------------------------------------------------------------------------- 615957b1bcSdan# This block of tests checks that it is possible to set the cache_size of a 625957b1bcSdan# database to a small (< 10) value. More specifically: 635957b1bcSdan# 645957b1bcSdan# cache-2.1.*: Test that "PRAGMA cache_size" appears to work with small 655957b1bcSdan# values. 665957b1bcSdan# cache-2.2.*: Test that "PRAGMA main.cache_size" appears to work with 675957b1bcSdan# small values. 685957b1bcSdan# cache-2.3.*: Test cache_size=1 correctly spills/flushes the cache. 695957b1bcSdan# cache-2.4.*: Test cache_size=0 correctly spills/flushes the cache. 705957b1bcSdan# 715957b1bcSdan# 725957b1bcSdandb_delete_and_reopen 735957b1bcSdando_execsql_test cache-2.0 { 745957b1bcSdan PRAGMA auto_vacuum=OFF; 755957b1bcSdan PRAGMA journal_mode=DELETE; 765957b1bcSdan CREATE TABLE t1(a, b); 775957b1bcSdan CREATE TABLE t2(c, d); 785957b1bcSdan INSERT INTO t1 VALUES('x', 'y'); 795957b1bcSdan INSERT INTO t2 VALUES('i', 'j'); 805957b1bcSdan} {delete} 815957b1bcSdan 825957b1bcSdanfor {set i 0} {$i < 20} {incr i} { 835957b1bcSdan do_execsql_test cache-2.1.$i.1 "PRAGMA cache_size = $i" 845957b1bcSdan do_execsql_test cache-2.1.$i.2 "PRAGMA cache_size" $i 855957b1bcSdan do_execsql_test cache-2.1.$i.3 "SELECT * FROM t1" {x y} 865957b1bcSdan do_execsql_test cache-2.1.$i.4 "PRAGMA cache_size" $i 875957b1bcSdan} 885957b1bcSdanfor {set i 0} {$i < 20} {incr i} { 895957b1bcSdan do_execsql_test cache-2.2.$i.1 "PRAGMA main.cache_size = $i" 905957b1bcSdan do_execsql_test cache-2.2.$i.2 "PRAGMA main.cache_size" $i 915957b1bcSdan do_execsql_test cache-2.2.$i.3 "SELECT * FROM t1" {x y} 925957b1bcSdan do_execsql_test cache-2.2.$i.4 "PRAGMA main.cache_size" $i 935957b1bcSdan} 945957b1bcSdan 955957b1bcSdan# Tests for cache_size = 1. 965957b1bcSdan# 975957b1bcSdando_execsql_test cache-2.3.1 { 985957b1bcSdan PRAGMA cache_size = 1; 995957b1bcSdan BEGIN; 1005957b1bcSdan INSERT INTO t1 VALUES(1, 2); 1015957b1bcSdan PRAGMA lock_status; 1025957b1bcSdan} {main reserved temp closed} 1035957b1bcSdando_test cache-2.3.2 { pager_cache_size db } 2 1045957b1bcSdando_execsql_test cache-2.3.3 { 1055957b1bcSdan INSERT INTO t2 VALUES(1, 2); 1065957b1bcSdan PRAGMA lock_status; 1075957b1bcSdan} {main exclusive temp closed} 1085957b1bcSdando_test cache-2.3.4 { pager_cache_size db } 2 1095957b1bcSdando_execsql_test cache-2.3.5 COMMIT 1105957b1bcSdando_test cache-2.3.6 { pager_cache_size db } 1 1115957b1bcSdan 1125957b1bcSdando_execsql_test cache-2.3.7 { 1135957b1bcSdan SELECT * FROM t1 UNION SELECT * FROM t2; 1145957b1bcSdan} {1 2 i j x y} 1155957b1bcSdando_test cache-2.3.8 { pager_cache_size db } 1 1165957b1bcSdan 1175957b1bcSdan# Tests for cache_size = 0. 1185957b1bcSdan# 1195957b1bcSdando_execsql_test cache-2.4.1 { 1205957b1bcSdan PRAGMA cache_size = 0; 1215957b1bcSdan BEGIN; 1225957b1bcSdan INSERT INTO t1 VALUES(1, 2); 1235957b1bcSdan PRAGMA lock_status; 1245957b1bcSdan} {main reserved temp closed} 1255957b1bcSdando_test cache-2.4.2 { pager_cache_size db } 2 1265957b1bcSdando_execsql_test cache-2.4.3 { 1275957b1bcSdan INSERT INTO t2 VALUES(1, 2); 1285957b1bcSdan PRAGMA lock_status; 1295957b1bcSdan} {main exclusive temp closed} 1305957b1bcSdando_test cache-2.4.4 { pager_cache_size db } 2 1315957b1bcSdando_execsql_test cache-2.4.5 COMMIT 1325957b1bcSdan 1335957b1bcSdando_test cache-2.4.6 { pager_cache_size db } 0 1345957b1bcSdando_execsql_test cache-2.4.7 { 1355957b1bcSdan SELECT * FROM t1 UNION SELECT * FROM t2; 1365957b1bcSdan} {1 2 i j x y} 1375957b1bcSdando_test cache-2.4.8 { pager_cache_size db } 0 1385957b1bcSdan 1395957b1bcSdansqlite3_soft_heap_limit $cmdlinearg(soft-heap-limit) 14024168728Sdanielk1977finish_test 141