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 16 set testdir [file dirname $argv0] 17 source $testdir/tester.tcl 18 19 ifcapable !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). 27 if {[info exists ::G(perm:presql)]} { 28 finish_test 29 return 30 } 31 32 catch {db close} 33 sqlite3_shutdown 34 sqlite3_config_pagecache 0 0 35 sqlite3_config_scratch 0 0 36 sqlite3_initialize 37 autoinstall_test_functions 38 sqlite3 db test.db 39 40 # Make sure sqlite3_db_config() and sqlite3_db_status are working. 41 # 42 do_test lookaside-1.1 { 43 catch {sqlite3_config_error db} 44 } {0} 45 46 do_test lookaside-1.2 { 47 sqlite3_db_config_lookaside db 1 18 18 48 } {0} 49 do_test lookaside-1.3.1 { 50 sqlite3_db_status db DBSTATUS_LOOKASIDE_USED 0 51 } {0 0 0} 52 do_test lookaside-1.3.2 { 53 sqlite3_db_status db DBSTATUS_LOOKASIDE_HIT 0 54 } {0 0 0} 55 do_test lookaside-1.3.3 { 56 sqlite3_db_status db DBSTATUS_LOOKASIDE_MISS_SIZE 0 57 } {0 0 0} 58 do_test lookaside-1.3.4 { 59 sqlite3_db_status db DBSTATUS_LOOKASIDE_MISS_FULL 0 60 } {0 0 0} 61 62 do_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} 70 do_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} 74 do_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} 78 do_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} 83 do_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} 88 do_test lookaside-1.9 { 89 db cache flush 90 sqlite3_db_status db DBSTATUS_LOOKASIDE_USED 0 91 } {0 0 0} 92 93 do_test lookaside-2.1 { 94 sqlite3_db_config_lookaside db 0 100 1000 95 } {0} 96 do_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} 101 do_test lookaside-2.3 { 102 sqlite3_db_config_lookaside db 0 50 50 103 } {5} ;# SQLITE_BUSY 104 do_test lookaside-2.4 { 105 db cache flush 106 sqlite3_db_config_lookaside db 0 50 50 107 } {0} ;# SQLITE_OK 108 do_test lookaside-2.5 { 109 sqlite3_db_config_lookaside db 0 -1 50 110 } {0} ;# SQLITE_OK 111 do_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 # 117 do_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 # 124 do_test lookaside-4.1 { 125 db close 126 sqlite3_shutdown 127 catch sqlite3_config_error 128 } {0} 129 sqlite3_initialize 130 autoinstall_test_functions 131 132 finish_test 133