1b2fe7d8cSdrh# 2001 September 15 2b2fe7d8cSdrh# 3b2fe7d8cSdrh# The author disclaims copyright to this source code. In place of 4b2fe7d8cSdrh# a legal notice, here is a blessing: 5b2fe7d8cSdrh# 6b2fe7d8cSdrh# May you do good and not evil. 7b2fe7d8cSdrh# May you find forgiveness for yourself and forgive others. 8b2fe7d8cSdrh# May you share freely, never taking more than you give. 9b2fe7d8cSdrh# 10b2fe7d8cSdrh#*********************************************************************** 11b2fe7d8cSdrh# This file implements regression tests for SQLite library. The 12b2fe7d8cSdrh# focus of this script is in-memory database backend. 13b2fe7d8cSdrh# 148d76ff9fSdanielk1977# $Id: memdb.test,v 1.19 2009/05/18 16:04:38 danielk1977 Exp $ 15b2fe7d8cSdrh 16b2fe7d8cSdrh 17b2fe7d8cSdrhset testdir [file dirname $argv0] 18b2fe7d8cSdrhsource $testdir/tester.tcl 19b2fe7d8cSdrh 2003aded49Sdanielk1977ifcapable memorydb { 2103aded49Sdanielk1977 22b2fe7d8cSdrh# In the following sequence of tests, compute the MD5 sum of the content 23b2fe7d8cSdrh# of a table, make lots of modifications to that table, then do a rollback. 24b2fe7d8cSdrh# Verify that after the rollback, the MD5 checksum is unchanged. 25b2fe7d8cSdrh# 26b2fe7d8cSdrh# These tests were browed from trans.tcl. 27b2fe7d8cSdrh# 28b2fe7d8cSdrhdo_test memdb-1.1 { 29b2fe7d8cSdrh db close 30ef4ac8f9Sdrh sqlite3 db :memory: 31ef4ac8f9Sdrh # sqlite3 db test.db 32b2fe7d8cSdrh execsql { 33b2fe7d8cSdrh BEGIN; 34b2fe7d8cSdrh CREATE TABLE t3(x TEXT); 35b2fe7d8cSdrh INSERT INTO t3 VALUES(randstr(10,400)); 36b2fe7d8cSdrh INSERT INTO t3 VALUES(randstr(10,400)); 37b2fe7d8cSdrh INSERT INTO t3 SELECT randstr(10,400) FROM t3; 38b2fe7d8cSdrh INSERT INTO t3 SELECT randstr(10,400) FROM t3; 39b2fe7d8cSdrh INSERT INTO t3 SELECT randstr(10,400) FROM t3; 40b2fe7d8cSdrh INSERT INTO t3 SELECT randstr(10,400) FROM t3; 41b2fe7d8cSdrh INSERT INTO t3 SELECT randstr(10,400) FROM t3; 42b2fe7d8cSdrh INSERT INTO t3 SELECT randstr(10,400) FROM t3; 43b2fe7d8cSdrh INSERT INTO t3 SELECT randstr(10,400) FROM t3; 44b2fe7d8cSdrh INSERT INTO t3 SELECT randstr(10,400) FROM t3; 45b2fe7d8cSdrh INSERT INTO t3 SELECT randstr(10,400) FROM t3; 46b2fe7d8cSdrh COMMIT; 47b2fe7d8cSdrh SELECT count(*) FROM t3; 48b2fe7d8cSdrh } 49b2fe7d8cSdrh} {1024} 50b2fe7d8cSdrh 51b2fe7d8cSdrh# The following procedure computes a "signature" for table "t3". If 52b2fe7d8cSdrh# T3 changes in any way, the signature should change. 53b2fe7d8cSdrh# 54b2fe7d8cSdrh# This is used to test ROLLBACK. We gather a signature for t3, then 55b2fe7d8cSdrh# make lots of changes to t3, then rollback and take another signature. 56b2fe7d8cSdrh# The two signatures should be the same. 57b2fe7d8cSdrh# 586a3ea0e6Sdrhproc signature {{fn {}}} { 596a3ea0e6Sdrh set rx [db eval {SELECT x FROM t3}] 606a3ea0e6Sdrh # set r1 [md5 $rx\n] 616a3ea0e6Sdrh if {$fn!=""} { 626a3ea0e6Sdrh # set fd [open $fn w] 636a3ea0e6Sdrh # puts $fd $rx 646a3ea0e6Sdrh # close $fd 656a3ea0e6Sdrh } 666a3ea0e6Sdrh # set r [db eval {SELECT count(*), md5sum(x) FROM t3}] 676a3ea0e6Sdrh # puts "SIG($fn)=$r1" 686a3ea0e6Sdrh return [list [string length $rx] $rx] 69b2fe7d8cSdrh} 70b2fe7d8cSdrh 71b2fe7d8cSdrh# Do rollbacks. Make sure the signature does not change. 72b2fe7d8cSdrh# 73b2fe7d8cSdrhset limit 10 74b2fe7d8cSdrhfor {set i 2} {$i<=$limit} {incr i} { 756a3ea0e6Sdrh set ::sig [signature one] 766a3ea0e6Sdrh # puts "sig=$sig" 77b2fe7d8cSdrh set cnt [lindex $::sig 0] 78b2fe7d8cSdrh if {$i%2==0} { 79b2fe7d8cSdrh execsql {PRAGMA synchronous=FULL} 80b2fe7d8cSdrh } else { 81b2fe7d8cSdrh execsql {PRAGMA synchronous=NORMAL} 82b2fe7d8cSdrh } 83b2fe7d8cSdrh do_test memdb-1.$i.1-$cnt { 84b2fe7d8cSdrh execsql { 85b2fe7d8cSdrh BEGIN; 86b2fe7d8cSdrh DELETE FROM t3 WHERE random()%10!=0; 87b2fe7d8cSdrh INSERT INTO t3 SELECT randstr(10,10)||x FROM t3; 88b2fe7d8cSdrh INSERT INTO t3 SELECT randstr(10,10)||x FROM t3; 89b2fe7d8cSdrh ROLLBACK; 90b2fe7d8cSdrh } 916a3ea0e6Sdrh set sig2 [signature two] 92b2fe7d8cSdrh } $sig 936a3ea0e6Sdrh # puts "sig2=$sig2" 946a3ea0e6Sdrh # if {$sig2!=$sig} exit 95b2fe7d8cSdrh do_test memdb-1.$i.2-$cnt { 96b2fe7d8cSdrh execsql { 97b2fe7d8cSdrh BEGIN; 98b2fe7d8cSdrh DELETE FROM t3 WHERE random()%10!=0; 99b2fe7d8cSdrh INSERT INTO t3 SELECT randstr(10,10)||x FROM t3; 100b2fe7d8cSdrh DELETE FROM t3 WHERE random()%10!=0; 101b2fe7d8cSdrh INSERT INTO t3 SELECT randstr(10,10)||x FROM t3; 102b2fe7d8cSdrh ROLLBACK; 103b2fe7d8cSdrh } 104b2fe7d8cSdrh signature 105b2fe7d8cSdrh } $sig 106b2fe7d8cSdrh if {$i<$limit} { 107b2fe7d8cSdrh do_test memdb-1.$i.9-$cnt { 108b2fe7d8cSdrh execsql { 109b2fe7d8cSdrh INSERT INTO t3 SELECT randstr(10,400) FROM t3 WHERE random()%10==0; 110b2fe7d8cSdrh } 111b2fe7d8cSdrh } {} 112b2fe7d8cSdrh } 113b2fe7d8cSdrh set ::pager_old_format 0 114b2fe7d8cSdrh} 115b2fe7d8cSdrh 11640e016e4Sdrhintegrity_check memdb-2.1 117b2fe7d8cSdrh 118b2fe7d8cSdrhdo_test memdb-3.1 { 119b2fe7d8cSdrh execsql { 120b2fe7d8cSdrh CREATE TABLE t4(a,b,c,d); 121b2fe7d8cSdrh BEGIN; 122b2fe7d8cSdrh INSERT INTO t4 VALUES(1,2,3,4); 123b2fe7d8cSdrh SELECT * FROM t4; 124b2fe7d8cSdrh } 125b2fe7d8cSdrh} {1 2 3 4} 126b2fe7d8cSdrhdo_test memdb-3.2 { 127b2fe7d8cSdrh execsql { 128b2fe7d8cSdrh SELECT name FROM sqlite_master WHERE type='table'; 129b2fe7d8cSdrh } 130b2fe7d8cSdrh} {t3 t4} 131b2fe7d8cSdrhdo_test memdb-3.3 { 132b2fe7d8cSdrh execsql { 133b2fe7d8cSdrh DROP TABLE t4; 134b2fe7d8cSdrh SELECT name FROM sqlite_master WHERE type='table'; 135b2fe7d8cSdrh } 136b2fe7d8cSdrh} {t3} 137b2fe7d8cSdrhdo_test memdb-3.4 { 138b2fe7d8cSdrh execsql { 139b2fe7d8cSdrh ROLLBACK; 140b2fe7d8cSdrh SELECT name FROM sqlite_master WHERE type='table'; 141b2fe7d8cSdrh } 142b2fe7d8cSdrh} {t3 t4} 143b2fe7d8cSdrh 144b2fe7d8cSdrh# Create tables for the first group of tests. 145b2fe7d8cSdrh# 146b2fe7d8cSdrhdo_test memdb-4.0 { 147b2fe7d8cSdrh execsql { 148b2fe7d8cSdrh CREATE TABLE t1(a, b, c, UNIQUE(a,b)); 149b2fe7d8cSdrh CREATE TABLE t2(x); 150b2fe7d8cSdrh SELECT c FROM t1 ORDER BY c; 151b2fe7d8cSdrh } 152b2fe7d8cSdrh} {} 153b2fe7d8cSdrh 154b2fe7d8cSdrh# Six columns of configuration data as follows: 155b2fe7d8cSdrh# 156b2fe7d8cSdrh# i The reference number of the test 157b2fe7d8cSdrh# conf The conflict resolution algorithm on the BEGIN statement 158b2fe7d8cSdrh# cmd An INSERT or REPLACE command to execute against table t1 159b2fe7d8cSdrh# t0 True if there is an error from $cmd 160b2fe7d8cSdrh# t1 Content of "c" column of t1 assuming no error in $cmd 161b2fe7d8cSdrh# t2 Content of "x" column of t2 162b2fe7d8cSdrh# 163b2fe7d8cSdrhforeach {i conf cmd t0 t1 t2} { 164b2fe7d8cSdrh 1 {} INSERT 1 {} 1 165b2fe7d8cSdrh 2 {} {INSERT OR IGNORE} 0 3 1 166b2fe7d8cSdrh 3 {} {INSERT OR REPLACE} 0 4 1 167b2fe7d8cSdrh 4 {} REPLACE 0 4 1 168b2fe7d8cSdrh 5 {} {INSERT OR FAIL} 1 {} 1 169b2fe7d8cSdrh 6 {} {INSERT OR ABORT} 1 {} 1 170b2fe7d8cSdrh 7 {} {INSERT OR ROLLBACK} 1 {} {} 171b2fe7d8cSdrh} { 1723bdca9c9Sdanielk1977 1733bdca9c9Sdanielk1977 # All tests after test 1 depend on conflict resolution. So end the 1743bdca9c9Sdanielk1977 # loop if that is not available in this build. 1753bdca9c9Sdanielk1977 ifcapable !conflict {if {$i>1} break} 1763bdca9c9Sdanielk1977 177b2fe7d8cSdrh do_test memdb-4.$i { 178b2fe7d8cSdrh if {$conf!=""} {set conf "ON CONFLICT $conf"} 179b2fe7d8cSdrh set r0 [catch {execsql [subst { 180b2fe7d8cSdrh DELETE FROM t1; 181b2fe7d8cSdrh DELETE FROM t2; 182b2fe7d8cSdrh INSERT INTO t1 VALUES(1,2,3); 183b2fe7d8cSdrh BEGIN $conf; 184b2fe7d8cSdrh INSERT INTO t2 VALUES(1); 185b2fe7d8cSdrh $cmd INTO t1 VALUES(1,2,4); 186b2fe7d8cSdrh }]} r1] 187b2fe7d8cSdrh catch {execsql {COMMIT}} 188b2fe7d8cSdrh if {$r0} {set r1 {}} {set r1 [execsql {SELECT c FROM t1}]} 189b2fe7d8cSdrh set r2 [execsql {SELECT x FROM t2}] 190b2fe7d8cSdrh list $r0 $r1 $r2 191b2fe7d8cSdrh } [list $t0 $t1 $t2] 192b2fe7d8cSdrh} 193b2fe7d8cSdrh 194b2fe7d8cSdrhdo_test memdb-5.0 { 195b2fe7d8cSdrh execsql { 196b2fe7d8cSdrh DROP TABLE t2; 197b2fe7d8cSdrh DROP TABLE t3; 198b2fe7d8cSdrh CREATE TABLE t2(a,b,c); 199b2fe7d8cSdrh INSERT INTO t2 VALUES(1,2,1); 200b2fe7d8cSdrh INSERT INTO t2 VALUES(2,3,2); 201b2fe7d8cSdrh INSERT INTO t2 VALUES(3,4,1); 202b2fe7d8cSdrh INSERT INTO t2 VALUES(4,5,4); 203b2fe7d8cSdrh SELECT c FROM t2 ORDER BY b; 204b2fe7d8cSdrh CREATE TABLE t3(x); 205b2fe7d8cSdrh INSERT INTO t3 VALUES(1); 206b2fe7d8cSdrh } 207b2fe7d8cSdrh} {1 2 1 4} 208b2fe7d8cSdrh 209b2fe7d8cSdrh# Six columns of configuration data as follows: 210b2fe7d8cSdrh# 211b2fe7d8cSdrh# i The reference number of the test 212b2fe7d8cSdrh# conf1 The conflict resolution algorithm on the UNIQUE constraint 213b2fe7d8cSdrh# conf2 The conflict resolution algorithm on the BEGIN statement 214b2fe7d8cSdrh# cmd An UPDATE command to execute against table t1 215b2fe7d8cSdrh# t0 True if there is an error from $cmd 216b2fe7d8cSdrh# t1 Content of "b" column of t1 assuming no error in $cmd 217b2fe7d8cSdrh# t2 Content of "x" column of t3 218b2fe7d8cSdrh# 219b2fe7d8cSdrhforeach {i conf1 conf2 cmd t0 t1 t2} { 220b2fe7d8cSdrh 1 {} {} UPDATE 1 {6 7 8 9} 1 221b2fe7d8cSdrh 2 REPLACE {} UPDATE 0 {7 6 9} 1 222b2fe7d8cSdrh 3 IGNORE {} UPDATE 0 {6 7 3 9} 1 223b2fe7d8cSdrh 4 FAIL {} UPDATE 1 {6 7 3 4} 1 224b2fe7d8cSdrh 5 ABORT {} UPDATE 1 {1 2 3 4} 1 225b2fe7d8cSdrh 6 ROLLBACK {} UPDATE 1 {1 2 3 4} 0 226b2fe7d8cSdrh 7 REPLACE {} {UPDATE OR IGNORE} 0 {6 7 3 9} 1 227b2fe7d8cSdrh 8 IGNORE {} {UPDATE OR REPLACE} 0 {7 6 9} 1 228b2fe7d8cSdrh 9 FAIL {} {UPDATE OR IGNORE} 0 {6 7 3 9} 1 229b2fe7d8cSdrh 10 ABORT {} {UPDATE OR REPLACE} 0 {7 6 9} 1 230b2fe7d8cSdrh 11 ROLLBACK {} {UPDATE OR IGNORE} 0 {6 7 3 9} 1 231b2fe7d8cSdrh 12 {} {} {UPDATE OR IGNORE} 0 {6 7 3 9} 1 232b2fe7d8cSdrh 13 {} {} {UPDATE OR REPLACE} 0 {7 6 9} 1 233b2fe7d8cSdrh 14 {} {} {UPDATE OR FAIL} 1 {6 7 3 4} 1 234b2fe7d8cSdrh 15 {} {} {UPDATE OR ABORT} 1 {1 2 3 4} 1 235b2fe7d8cSdrh 16 {} {} {UPDATE OR ROLLBACK} 1 {1 2 3 4} 0 236b2fe7d8cSdrh} { 2373bdca9c9Sdanielk1977 # All tests after test 1 depend on conflict resolution. So end the 2383bdca9c9Sdanielk1977 # loop if that is not available in this build. 2393bdca9c9Sdanielk1977 ifcapable !conflict { 2403bdca9c9Sdanielk1977 if {$i>1} break 2413bdca9c9Sdanielk1977 } 2423bdca9c9Sdanielk1977 243f9c8ce3cSdrh if {$t0} {set t1 {UNIQUE constraint failed: t1.a}} 244b2fe7d8cSdrh do_test memdb-5.$i { 245b2fe7d8cSdrh if {$conf1!=""} {set conf1 "ON CONFLICT $conf1"} 246b2fe7d8cSdrh if {$conf2!=""} {set conf2 "ON CONFLICT $conf2"} 247bd43455cSdanielk1977 set r0 [catch {execsql " 248b2fe7d8cSdrh DROP TABLE t1; 249b2fe7d8cSdrh CREATE TABLE t1(a,b,c, UNIQUE(a) $conf1); 250b2fe7d8cSdrh INSERT INTO t1 SELECT * FROM t2; 251b2fe7d8cSdrh UPDATE t3 SET x=0; 252b2fe7d8cSdrh BEGIN $conf2; 253b2fe7d8cSdrh $cmd t3 SET x=1; 254b2fe7d8cSdrh $cmd t1 SET b=b*2; 255b2fe7d8cSdrh $cmd t1 SET a=c+5; 256bd43455cSdanielk1977 "} r1] 257b2fe7d8cSdrh catch {execsql {COMMIT}} 258b2fe7d8cSdrh if {!$r0} {set r1 [execsql {SELECT a FROM t1 ORDER BY b}]} 259b2fe7d8cSdrh set r2 [execsql {SELECT x FROM t3}] 260b2fe7d8cSdrh list $r0 $r1 $r2 261b2fe7d8cSdrh } [list $t0 $t1 $t2] 262b2fe7d8cSdrh} 263b2fe7d8cSdrh 264b2fe7d8cSdrhdo_test memdb-6.1 { 265b2fe7d8cSdrh execsql { 266b2fe7d8cSdrh SELECT * FROM t2; 267b2fe7d8cSdrh } 268b2fe7d8cSdrh} {1 2 1 2 3 2 3 4 1 4 5 4} 269b2fe7d8cSdrhdo_test memdb-6.2 { 270b2fe7d8cSdrh execsql { 271b2fe7d8cSdrh BEGIN; 272b2fe7d8cSdrh DROP TABLE t2; 273b2fe7d8cSdrh SELECT name FROM sqlite_master WHERE type='table' ORDER BY 1; 274b2fe7d8cSdrh } 275b2fe7d8cSdrh} {t1 t3 t4} 276b2fe7d8cSdrhdo_test memdb-6.3 { 277b2fe7d8cSdrh execsql { 278b2fe7d8cSdrh ROLLBACK; 279b2fe7d8cSdrh SELECT name FROM sqlite_master WHERE type='table' ORDER BY 1; 280b2fe7d8cSdrh } 281b2fe7d8cSdrh} {t1 t2 t3 t4} 282b2fe7d8cSdrhdo_test memdb-6.4 { 283b2fe7d8cSdrh execsql { 284b2fe7d8cSdrh SELECT * FROM t2; 285b2fe7d8cSdrh } 286b2fe7d8cSdrh} {1 2 1 2 3 2 3 4 1 4 5 4} 28727c77438Sdanielk1977ifcapable compound { 288b2fe7d8cSdrhdo_test memdb-6.5 { 289b2fe7d8cSdrh execsql { 290b2fe7d8cSdrh SELECT a FROM t2 UNION SELECT b FROM t2 ORDER BY 1; 291b2fe7d8cSdrh } 292b2fe7d8cSdrh} {1 2 3 4 5} 29327c77438Sdanielk1977} ;# ifcapable compound 294b2fe7d8cSdrhdo_test memdb-6.6 { 295b2fe7d8cSdrh execsql { 296b2fe7d8cSdrh CREATE INDEX i2 ON t2(c); 297b2fe7d8cSdrh SELECT a FROM t2 ORDER BY c; 298b2fe7d8cSdrh } 299b2fe7d8cSdrh} {1 3 2 4} 300b2fe7d8cSdrhdo_test memdb-6.6 { 301b2fe7d8cSdrh execsql { 302b2fe7d8cSdrh SELECT a FROM t2 ORDER BY c DESC; 303b2fe7d8cSdrh } 304b2fe7d8cSdrh} {4 2 3 1} 305b2fe7d8cSdrhdo_test memdb-6.7 { 306b2fe7d8cSdrh execsql { 307b2fe7d8cSdrh BEGIN; 308b2fe7d8cSdrh CREATE TABLE t5(x,y); 309b2fe7d8cSdrh INSERT INTO t5 VALUES(1,2); 310b2fe7d8cSdrh SELECT * FROM t5; 311b2fe7d8cSdrh } 312b2fe7d8cSdrh} {1 2} 313b2fe7d8cSdrhdo_test memdb-6.8 { 314b2fe7d8cSdrh execsql { 315b2fe7d8cSdrh SELECT name FROM sqlite_master WHERE type='table' ORDER BY 1; 316b2fe7d8cSdrh } 317b2fe7d8cSdrh} {t1 t2 t3 t4 t5} 318b2fe7d8cSdrhdo_test memdb-6.9 { 319b2fe7d8cSdrh execsql { 320b2fe7d8cSdrh ROLLBACK; 321b2fe7d8cSdrh SELECT name FROM sqlite_master WHERE type='table' ORDER BY 1; 322b2fe7d8cSdrh } 323b2fe7d8cSdrh} {t1 t2 t3 t4} 324b2fe7d8cSdrhdo_test memdb-6.10 { 325b2fe7d8cSdrh execsql { 326b2fe7d8cSdrh CREATE TABLE t5(x PRIMARY KEY, y UNIQUE); 327b2fe7d8cSdrh SELECT * FROM t5; 328b2fe7d8cSdrh } 329b2fe7d8cSdrh} {} 330b2fe7d8cSdrhdo_test memdb-6.11 { 331b2fe7d8cSdrh execsql { 332b2fe7d8cSdrh SELECT * FROM t5 ORDER BY y DESC; 333b2fe7d8cSdrh } 334b2fe7d8cSdrh} {} 3353bdca9c9Sdanielk1977 3363bdca9c9Sdanielk1977ifcapable conflict { 337b2fe7d8cSdrh do_test memdb-6.12 { 338b2fe7d8cSdrh execsql { 339b2fe7d8cSdrh INSERT INTO t5 VALUES(1,2); 340b2fe7d8cSdrh INSERT INTO t5 VALUES(3,4); 341b2fe7d8cSdrh REPLACE INTO t5 VALUES(1,4); 342b2fe7d8cSdrh SELECT rowid,* FROM t5; 343b2fe7d8cSdrh } 344b2fe7d8cSdrh } {3 1 4} 345b2fe7d8cSdrh do_test memdb-6.13 { 346b2fe7d8cSdrh execsql { 347b2fe7d8cSdrh DELETE FROM t5 WHERE x>5; 348b2fe7d8cSdrh SELECT * FROM t5; 349b2fe7d8cSdrh } 350b2fe7d8cSdrh } {1 4} 351b2fe7d8cSdrh do_test memdb-6.14 { 352b2fe7d8cSdrh execsql { 353b2fe7d8cSdrh DELETE FROM t5 WHERE y<3; 354b2fe7d8cSdrh SELECT * FROM t5; 355b2fe7d8cSdrh } 356b2fe7d8cSdrh } {1 4} 3573bdca9c9Sdanielk1977} 3583bdca9c9Sdanielk1977 359b2fe7d8cSdrhdo_test memdb-6.15 { 360b2fe7d8cSdrh execsql { 361b2fe7d8cSdrh DELETE FROM t5 WHERE x>0; 362b2fe7d8cSdrh SELECT * FROM t5; 363b2fe7d8cSdrh } 364b2fe7d8cSdrh} {} 365b2fe7d8cSdrh 36682346d98Sdanifcapable subquery&&vtab { 367881b890aSdrh do_test memdb-7.1 { 36824b6422dSdrh load_static_extension db wholenumber 369881b890aSdrh execsql { 370881b890aSdrh CREATE TABLE t6(x); 37170586bebSdrh CREATE VIRTUAL TABLE nums USING wholenumber; 37270586bebSdrh INSERT INTO t6 SELECT value FROM nums WHERE value BETWEEN 1 AND 256; 373881b890aSdrh SELECT count(*) FROM (SELECT DISTINCT x FROM t6); 374881b890aSdrh } 375881b890aSdrh } {256} 376881b890aSdrh for {set i 1} {$i<=256} {incr i} { 377881b890aSdrh do_test memdb-7.2.$i { 378881b890aSdrh execsql "DELETE FROM t6 WHERE x=\ 379881b890aSdrh (SELECT x FROM t6 ORDER BY random() LIMIT 1)" 380881b890aSdrh execsql {SELECT count(*) FROM t6} 381881b890aSdrh } [expr {256-$i}] 382881b890aSdrh } 383e61b9f4fSdanielk1977} 384b2fe7d8cSdrh 3853caf58eaSdrh# Ticket #1524 3863caf58eaSdrh# 3873caf58eaSdrhdo_test memdb-8.1 { 3883caf58eaSdrh db close 3893caf58eaSdrh sqlite3 db {:memory:} 3903caf58eaSdrh execsql { 3913caf58eaSdrh PRAGMA auto_vacuum=TRUE; 3923caf58eaSdrh CREATE TABLE t1(a); 3933caf58eaSdrh INSERT INTO t1 VALUES(randstr(5000,6000)); 3943caf58eaSdrh INSERT INTO t1 VALUES(randstr(5000,6000)); 3953caf58eaSdrh INSERT INTO t1 VALUES(randstr(5000,6000)); 3963caf58eaSdrh INSERT INTO t1 VALUES(randstr(5000,6000)); 3973caf58eaSdrh INSERT INTO t1 VALUES(randstr(5000,6000)); 3983caf58eaSdrh SELECT count(*) FROM t1; 3993caf58eaSdrh } 4003caf58eaSdrh} 5 4013caf58eaSdrhdo_test memdb-8.2 { 4023caf58eaSdrh execsql { 4033caf58eaSdrh DELETE FROM t1; 4043caf58eaSdrh SELECT count(*) FROM t1; 4053caf58eaSdrh } 4063caf58eaSdrh} 0 4073caf58eaSdrh 408f90b7260Sdanielk1977# Test that auto-vacuum works with in-memory databases. 409f90b7260Sdanielk1977# 410b5126ddeSdanifcapable autovacuum { 411f90b7260Sdanielk1977 do_test memdb-9.1 { 412f90b7260Sdanielk1977 db close 413f90b7260Sdanielk1977 sqlite3 db test.db 414f90b7260Sdanielk1977 db cache size 0 415f90b7260Sdanielk1977 execsql { 416f90b7260Sdanielk1977 PRAGMA auto_vacuum = full; 417f90b7260Sdanielk1977 CREATE TABLE t1(a); 418f90b7260Sdanielk1977 INSERT INTO t1 VALUES(randstr(1000,1000)); 419f90b7260Sdanielk1977 INSERT INTO t1 VALUES(randstr(1000,1000)); 420f90b7260Sdanielk1977 INSERT INTO t1 VALUES(randstr(1000,1000)); 421f90b7260Sdanielk1977 } 422*c54357ccSdrh set before [db one {PRAGMA page_count}] 423f90b7260Sdanielk1977 execsql { DELETE FROM t1 } 424*c54357ccSdrh set after [db one {PRAGMA page_count}] 425*c54357ccSdrh expr {$before>$after} 426f90b7260Sdanielk1977 } {1} 4278d76ff9fSdanielk1977} 4283caf58eaSdrh 42903aded49Sdanielk1977} ;# ifcapable memorydb 43003aded49Sdanielk1977 431b2fe7d8cSdrhfinish_test 432