1# 2008 August 01 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# 12# Tests for the lookaside memory allocator. 13# 14# $Id: lookaside.test,v 1.10 2009/04/09 01:23:49 drh Exp $ 15 16set testdir [file dirname $argv0] 17source $testdir/tester.tcl 18 19ifcapable !lookaside { 20 finish_test 21 return 22} 23 24# The tests in this file configure the lookaside allocator after a 25# connection is opened. This will not work if there is any "presql" 26# configured (SQL run within the [sqlite3] wrapper in tester.tcl). 27if {[info exists ::G(perm:presql)]} { 28 finish_test 29 return 30} 31 32catch {db close} 33sqlite3_shutdown 34sqlite3_config_pagecache 0 0 35sqlite3_config_scratch 0 0 36sqlite3_initialize 37autoinstall_test_functions 38sqlite3 db test.db 39 40# Make sure sqlite3_db_config() and sqlite3_db_status are working. 41# 42do_test lookaside-1.1 { 43 catch {sqlite3_config_error db} 44} {0} 45 46do_test lookaside-1.2 { 47 sqlite3_db_config_lookaside db 1 18 18 48} {0} 49do_test lookaside-1.3.1 { 50 sqlite3_db_status db DBSTATUS_LOOKASIDE_USED 0 51} {0 0 0} 52do_test lookaside-1.3.2 { 53 sqlite3_db_status db DBSTATUS_LOOKASIDE_HIT 0 54} {0 0 0} 55do_test lookaside-1.3.3 { 56 sqlite3_db_status db DBSTATUS_LOOKASIDE_MISS_SIZE 0 57} {0 0 0} 58do_test lookaside-1.3.4 { 59 sqlite3_db_status db DBSTATUS_LOOKASIDE_MISS_FULL 0 60} {0 0 0} 61 62do_test lookaside-1.4 { 63 db eval {CREATE TABLE t1(w,x,y,z);} 64 foreach {x y z} [sqlite3_db_status db DBSTATUS_LOOKASIDE_USED 0] break 65 set p [lindex [sqlite3_db_status db DBSTATUS_LOOKASIDE_HIT 0] 2] 66 set q [lindex [sqlite3_db_status db DBSTATUS_LOOKASIDE_MISS_SIZE 0] 2] 67 set r [lindex [sqlite3_db_status db DBSTATUS_LOOKASIDE_MISS_FULL 0] 2] 68 expr {$x==0 && $y<$z && $z==18 && $p>0 && $q>0 && $r>0} 69} {0} 70do_test lookaside-1.5 { 71 foreach {x y z} [sqlite3_db_status db DBSTATUS_LOOKASIDE_USED 1] break 72 expr {$x==0 && $y<$z && $z==18} 73} {0} 74do_test lookaside-1.6 { 75 foreach {x y z} [sqlite3_db_status db DBSTATUS_LOOKASIDE_USED 0] break 76 expr {$x==0 && $y==$z && $y<18} 77} {1} 78do_test lookaside-1.7 { 79 db cache flush 80 foreach {x y z} [sqlite3_db_status db DBSTATUS_LOOKASIDE_USED 0] break 81 expr {$x==0 && $y==0 && $z<18} 82} {1} 83do_test lookaside-1.8 { 84 db cache flush 85 foreach {x y z} [sqlite3_db_status db DBSTATUS_LOOKASIDE_USED 1] break 86 expr {$x==0 && $y==0 && $z<18} 87} {1} 88do_test lookaside-1.9 { 89 db cache flush 90 sqlite3_db_status db DBSTATUS_LOOKASIDE_USED 0 91} {0 0 0} 92 93do_test lookaside-2.1 { 94 sqlite3_db_config_lookaside db 0 100 1000 95} {0} 96do_test lookaside-2.2 { 97 db eval {CREATE TABLE t2(x);} 98 foreach {x y z} [sqlite3_db_status db DBSTATUS_LOOKASIDE_USED 0] break 99 expr {$x==0 && $y<$z && $z>10 && $z<100} 100} {1} 101do_test lookaside-2.3 { 102 sqlite3_db_config_lookaside db 0 50 50 103} {5} ;# SQLITE_BUSY 104do_test lookaside-2.4 { 105 db cache flush 106 sqlite3_db_config_lookaside db 0 50 50 107} {0} ;# SQLITE_OK 108do_test lookaside-2.5 { 109 sqlite3_db_config_lookaside db 0 -1 50 110} {0} ;# SQLITE_OK 111do_test lookaside-2.6 { 112 sqlite3_db_config_lookaside db 0 50 -1 113} {0} ;# SQLITE_OK 114 115# sqlite3_db_status() with an invalid verb returns an error. 116# 117do_test lookaside-3.1 { 118 sqlite3_db_status db 99999 0 119} {1 0 0} 120 121# Test that an invalid verb on sqlite3_config() is detected and 122# reported as an error. 123# 124do_test lookaside-4.1 { 125 db close 126 sqlite3_shutdown 127 catch sqlite3_config_error 128} {0} 129sqlite3_initialize 130autoinstall_test_functions 131 132finish_test 133