xref: /sqlite-3.40.0/test/memsubsys2.test (revision 8adbb17c)
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