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