18a42cbd3Sdrh# 2008 June 18 28a42cbd3Sdrh# 38a42cbd3Sdrh# The author disclaims copyright to this source code. In place of 48a42cbd3Sdrh# a legal notice, here is a blessing: 58a42cbd3Sdrh# 68a42cbd3Sdrh# May you do good and not evil. 78a42cbd3Sdrh# May you find forgiveness for yourself and forgive others. 88a42cbd3Sdrh# May you share freely, never taking more than you give. 98a42cbd3Sdrh# 108a42cbd3Sdrh#*********************************************************************** 118a42cbd3Sdrh# 128a42cbd3Sdrh# This file contains tests of the memory allocation subsystem. 138a42cbd3Sdrh# 1493ed56d9Sdrh# $Id: memsubsys2.test,v 1.2 2008/08/12 15:21:12 drh Exp $ 158a42cbd3Sdrh 168a42cbd3Sdrhset testdir [file dirname $argv0] 178a42cbd3Sdrhsource $testdir/tester.tcl 188a42cbd3Sdrhsqlite3_reset_auto_extension 198a42cbd3Sdrh 208a42cbd3Sdrh# This procedure constructs a new database in test.db. It fills 218a42cbd3Sdrh# this database with many small records (enough to force multiple 228a42cbd3Sdrh# rebalance operations in the btree-layer and to require a large 238a42cbd3Sdrh# page cache), verifies correct results, then returns. 248a42cbd3Sdrh# 258a42cbd3Sdrhproc build_test_db {testname pragmas} { 268a42cbd3Sdrh catch {db close} 27fda06befSmistachkin forcedelete test.db test.db-journal 288a42cbd3Sdrh sqlite3 db test.db 298a42cbd3Sdrh db eval $pragmas 308a42cbd3Sdrh db eval { 318a42cbd3Sdrh CREATE TABLE t1(x, y); 328a42cbd3Sdrh CREATE TABLE t2(a, b); 338a42cbd3Sdrh CREATE INDEX i1 ON t1(x,y); 348a42cbd3Sdrh INSERT INTO t1 VALUES(1, 100); 358a42cbd3Sdrh INSERT INTO t1 VALUES(2, 200); 368a42cbd3Sdrh } 378a42cbd3Sdrh for {set i 2} {$i<5000} {incr i $i} { 388a42cbd3Sdrh db eval {INSERT INTO t2 SELECT * FROM t1} 398a42cbd3Sdrh db eval {INSERT INTO t1 SELECT a+$i, a+b*100 FROM t2} 408a42cbd3Sdrh db eval {DELETE FROM t2} 418a42cbd3Sdrh } 428a42cbd3Sdrh do_test $testname.1 { 438a42cbd3Sdrh db eval {SELECT count(*) FROM t1} 448a42cbd3Sdrh } 8192 458a42cbd3Sdrh integrity_check $testname.2 468a42cbd3Sdrh} 478a42cbd3Sdrh 4893ed56d9Sdrh# Reset all of the highwater marks. 4993ed56d9Sdrh# 5093ed56d9Sdrhproc reset_highwater_marks {} { 5193ed56d9Sdrh sqlite3_status SQLITE_STATUS_MEMORY_USED 1 5293ed56d9Sdrh sqlite3_status SQLITE_STATUS_MALLOC_SIZE 1 5393ed56d9Sdrh sqlite3_status SQLITE_STATUS_PAGECACHE_USED 1 5493ed56d9Sdrh sqlite3_status SQLITE_STATUS_PAGECACHE_OVERFLOW 1 5593ed56d9Sdrh sqlite3_status SQLITE_STATUS_PAGECACHE_SIZE 1 5693ed56d9Sdrh sqlite3_status SQLITE_STATUS_SCRATCH_USED 1 5793ed56d9Sdrh sqlite3_status SQLITE_STATUS_SCRATCH_OVERFLOW 1 5893ed56d9Sdrh sqlite3_status SQLITE_STATUS_SCRATCH_SIZE 1 5993ed56d9Sdrh sqlite3_status SQLITE_STATUS_PARSER_STACK 1 6093ed56d9Sdrh} 6193ed56d9Sdrh 628a42cbd3Sdrh# Test 1: Verify that calling sqlite3_malloc(0) returns a NULL 638a42cbd3Sdrh# pointer. 648a42cbd3Sdrh# 658a42cbd3Sdrhset highwater [sqlite3_memory_highwater 0] 668a42cbd3Sdrhdo_test memsubsys2-1.1 { 678a42cbd3Sdrh sqlite3_malloc 0 688a42cbd3Sdrh} {0} 698a42cbd3Sdrhdo_test memsubsys2-1.2 { 708a42cbd3Sdrh sqlite3_memory_highwater 0 718a42cbd3Sdrh} $highwater 728a42cbd3Sdrh 738a42cbd3Sdrh 748a42cbd3Sdrh# Test 2: Verify that the highwater mark increases after a large 758a42cbd3Sdrh# allocation. 768a42cbd3Sdrh# 778a42cbd3Sdrhsqlite3_memory_highwater 1 788a42cbd3Sdrhset highwater [sqlite3_memory_highwater 0] 798a42cbd3Sdrhdo_test memsubsys2-2.1 { 808a42cbd3Sdrh sqlite3_free [set x [sqlite3_malloc 100000]] 818a42cbd3Sdrh expr {$x!="0"} 828a42cbd3Sdrh} {1} 83*8adbb17cSdando_test memsubsys2-2.2.1 { 84*8adbb17cSdan expr {[sqlite3_memory_highwater 0]>=[sqlite3_memory_used]+100000} 85*8adbb17cSdan} {1} 86*8adbb17cSdando_test memsubsys2-2.2.2 { 87*8adbb17cSdan expr {[sqlite3_memory_highwater 0]>=$highwater+50000} 888a42cbd3Sdrh} {1} 898a42cbd3Sdrh 908a42cbd3Sdrh# Test 3: Verify that turning of memstatus disables the statistics 918a42cbd3Sdrh# tracking. 928a42cbd3Sdrh# 938a42cbd3Sdrhdb close 948a42cbd3Sdrhsqlite3_shutdown 958a42cbd3Sdrhsqlite3_config_memstatus 0 968a42cbd3Sdrhsqlite3_initialize 9793ed56d9Sdrhreset_highwater_marks 988a42cbd3Sdrhset highwater [sqlite3_memory_highwater 0] 998a42cbd3Sdrhdo_test memsubsys2-3.1 { 1008a42cbd3Sdrh set highwater 1018a42cbd3Sdrh} {0} 1028a42cbd3Sdrhdo_test memsubsys2-3.2 { 1038a42cbd3Sdrh sqlite3_malloc 0 1048a42cbd3Sdrh} {0} 1058a42cbd3Sdrhdo_test memsubsys2-3.3 { 1068a42cbd3Sdrh sqlite3_memory_highwater 0 1078a42cbd3Sdrh} {0} 1088a42cbd3Sdrhdo_test memsubsys2-3.4 { 1098a42cbd3Sdrh sqlite3_memory_used 1108a42cbd3Sdrh} {0} 1118a42cbd3Sdrhdo_test memsubsys2-3.5 { 1128a42cbd3Sdrh set ::allocation [sqlite3_malloc 100000] 1138a42cbd3Sdrh expr {$::allocation!="0"} 1148a42cbd3Sdrh} {1} 1158a42cbd3Sdrhdo_test memsubsys2-3.6 { 1168a42cbd3Sdrh sqlite3_memory_highwater 0 1178a42cbd3Sdrh} {0} 1188a42cbd3Sdrhdo_test memsubsys2-3.7 { 1198a42cbd3Sdrh sqlite3_memory_used 1208a42cbd3Sdrh} {0} 1218a42cbd3Sdrhdo_test memsubsys2-3.8 { 1228a42cbd3Sdrh sqlite3_free $::allocation 1238a42cbd3Sdrh} {} 1248a42cbd3Sdrhdo_test memsubsys2-3.9 { 1258a42cbd3Sdrh sqlite3_free 0 1268a42cbd3Sdrh} {} 1278a42cbd3Sdrh 1288a42cbd3Sdrh 1298a42cbd3Sdrh# Test 4: Verify that turning on memstatus reenables the statistics 1308a42cbd3Sdrh# tracking. 1318a42cbd3Sdrh# 1328a42cbd3Sdrhsqlite3_shutdown 1338a42cbd3Sdrhsqlite3_config_memstatus 1 1348a42cbd3Sdrhsqlite3_initialize 13593ed56d9Sdrhreset_highwater_marks 1368a42cbd3Sdrhset highwater [sqlite3_memory_highwater 0] 1378a42cbd3Sdrhdo_test memsubsys2-4.1 { 1388a42cbd3Sdrh set highwater 1398a42cbd3Sdrh} {0} 1408a42cbd3Sdrhdo_test memsubsys2-4.2 { 1418a42cbd3Sdrh sqlite3_malloc 0 1428a42cbd3Sdrh} {0} 1438a42cbd3Sdrhdo_test memsubsys2-4.3 { 1448a42cbd3Sdrh sqlite3_memory_highwater 0 1458a42cbd3Sdrh} {0} 1468a42cbd3Sdrhdo_test memsubsys2-4.4 { 1478a42cbd3Sdrh sqlite3_memory_used 1488a42cbd3Sdrh} {0} 1498a42cbd3Sdrhdo_test memsubsys2-4.5 { 1508a42cbd3Sdrh set ::allocation [sqlite3_malloc 100000] 1518a42cbd3Sdrh expr {$::allocation!="0"} 1528a42cbd3Sdrh} {1} 1538a42cbd3Sdrhdo_test memsubsys2-4.6 { 1548a42cbd3Sdrh expr {[sqlite3_memory_highwater 0]>=100000} 1558a42cbd3Sdrh} {1} 1568a42cbd3Sdrhdo_test memsubsys2-4.7 { 1578a42cbd3Sdrh expr {[sqlite3_memory_used]>=100000} 1588a42cbd3Sdrh} {1} 1598a42cbd3Sdrhdo_test memsubsys2-4.8 { 1608a42cbd3Sdrh sqlite3_free $::allocation 1618a42cbd3Sdrh} {} 1628a42cbd3Sdrhdo_test memsubsys2-4.9 { 1638a42cbd3Sdrh sqlite3_free 0 1648a42cbd3Sdrh} {} 1658a42cbd3Sdrhdo_test memsubsys2-4.10 { 1668a42cbd3Sdrh expr {[sqlite3_memory_highwater 0]>=100000} 1678a42cbd3Sdrh} {1} 1688a42cbd3Sdrhdo_test memsubsys2-4.11 { 1698a42cbd3Sdrh sqlite3_memory_used 1708a42cbd3Sdrh} {0} 1718a42cbd3Sdrh 1728a42cbd3Sdrh 1738a42cbd3Sdrh 1748a42cbd3Sdrh 1758a42cbd3Sdrhautoinstall_test_functions 1768a42cbd3Sdrhfinish_test 177