xref: /sqlite-3.40.0/test/memdb.test (revision c54357cc)
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