xref: /illumos-gate/usr/src/lib/libsqlite/test/memdb.test (revision 1da57d551424de5a9d469760be7c4b4d4f10a755)
1*1da57d55SToomas Soome#
2c5c4113dSnw141292# 2001 September 15
3c5c4113dSnw141292#
4c5c4113dSnw141292# The author disclaims copyright to this source code.  In place of
5c5c4113dSnw141292# a legal notice, here is a blessing:
6c5c4113dSnw141292#
7c5c4113dSnw141292#    May you do good and not evil.
8c5c4113dSnw141292#    May you find forgiveness for yourself and forgive others.
9c5c4113dSnw141292#    May you share freely, never taking more than you give.
10c5c4113dSnw141292#
11c5c4113dSnw141292#***********************************************************************
12c5c4113dSnw141292# This file implements regression tests for SQLite library.  The
13c5c4113dSnw141292# focus of this script is in-memory database backend.
14c5c4113dSnw141292#
15c5c4113dSnw141292# $Id: memdb.test,v 1.6 2003/08/05 13:13:39 drh Exp $
16c5c4113dSnw141292
17c5c4113dSnw141292
18c5c4113dSnw141292set testdir [file dirname $argv0]
19c5c4113dSnw141292source $testdir/tester.tcl
20c5c4113dSnw141292
21c5c4113dSnw141292# In the following sequence of tests, compute the MD5 sum of the content
22c5c4113dSnw141292# of a table, make lots of modifications to that table, then do a rollback.
23c5c4113dSnw141292# Verify that after the rollback, the MD5 checksum is unchanged.
24c5c4113dSnw141292#
25c5c4113dSnw141292# These tests were browed from trans.tcl.
26c5c4113dSnw141292#
27c5c4113dSnw141292do_test memdb-1.1 {
28c5c4113dSnw141292  db close
29c5c4113dSnw141292  sqlite db :memory:
30c5c4113dSnw141292  # sqlite db test.db
31c5c4113dSnw141292  execsql {
32c5c4113dSnw141292    BEGIN;
33c5c4113dSnw141292    CREATE TABLE t3(x TEXT);
34c5c4113dSnw141292    INSERT INTO t3 VALUES(randstr(10,400));
35c5c4113dSnw141292    INSERT INTO t3 VALUES(randstr(10,400));
36c5c4113dSnw141292    INSERT INTO t3 SELECT randstr(10,400) FROM t3;
37c5c4113dSnw141292    INSERT INTO t3 SELECT randstr(10,400) FROM t3;
38c5c4113dSnw141292    INSERT INTO t3 SELECT randstr(10,400) FROM t3;
39c5c4113dSnw141292    INSERT INTO t3 SELECT randstr(10,400) FROM t3;
40c5c4113dSnw141292    INSERT INTO t3 SELECT randstr(10,400) FROM t3;
41c5c4113dSnw141292    INSERT INTO t3 SELECT randstr(10,400) FROM t3;
42c5c4113dSnw141292    INSERT INTO t3 SELECT randstr(10,400) FROM t3;
43c5c4113dSnw141292    INSERT INTO t3 SELECT randstr(10,400) FROM t3;
44c5c4113dSnw141292    INSERT INTO t3 SELECT randstr(10,400) FROM t3;
45c5c4113dSnw141292    COMMIT;
46c5c4113dSnw141292    SELECT count(*) FROM t3;
47c5c4113dSnw141292  }
48c5c4113dSnw141292} {1024}
49c5c4113dSnw141292
50c5c4113dSnw141292# The following procedure computes a "signature" for table "t3".  If
51c5c4113dSnw141292# T3 changes in any way, the signature should change.
52c5c4113dSnw141292#
53c5c4113dSnw141292# This is used to test ROLLBACK.  We gather a signature for t3, then
54c5c4113dSnw141292# make lots of changes to t3, then rollback and take another signature.
55c5c4113dSnw141292# The two signatures should be the same.
56c5c4113dSnw141292#
57c5c4113dSnw141292proc signature {{fn {}}} {
58c5c4113dSnw141292  set rx [db eval {SELECT x FROM t3}]
59c5c4113dSnw141292  # set r1 [md5 $rx\n]
60c5c4113dSnw141292  if {$fn!=""} {
61c5c4113dSnw141292    # set fd [open $fn w]
62c5c4113dSnw141292    # puts $fd $rx
63c5c4113dSnw141292    # close $fd
64c5c4113dSnw141292  }
65c5c4113dSnw141292  # set r [db eval {SELECT count(*), md5sum(x) FROM t3}]
66c5c4113dSnw141292  # puts "SIG($fn)=$r1"
67c5c4113dSnw141292  return [list [string length $rx] $rx]
68c5c4113dSnw141292}
69c5c4113dSnw141292
70c5c4113dSnw141292# Do rollbacks.  Make sure the signature does not change.
71c5c4113dSnw141292#
72c5c4113dSnw141292set limit 10
73c5c4113dSnw141292for {set i 2} {$i<=$limit} {incr i} {
74c5c4113dSnw141292  set ::sig [signature one]
75c5c4113dSnw141292  # puts "sig=$sig"
76c5c4113dSnw141292  set cnt [lindex $::sig 0]
77c5c4113dSnw141292  set ::journal_format [expr {($i%3)+1}]
78c5c4113dSnw141292  if {$i%2==0} {
79c5c4113dSnw141292    execsql {PRAGMA synchronous=FULL}
80c5c4113dSnw141292  } else {
81c5c4113dSnw141292    execsql {PRAGMA synchronous=NORMAL}
82c5c4113dSnw141292  }
83c5c4113dSnw141292  do_test memdb-1.$i.1-$cnt {
84c5c4113dSnw141292     execsql {
85c5c4113dSnw141292       BEGIN;
86c5c4113dSnw141292       DELETE FROM t3 WHERE random()%10!=0;
87c5c4113dSnw141292       INSERT INTO t3 SELECT randstr(10,10)||x FROM t3;
88c5c4113dSnw141292       INSERT INTO t3 SELECT randstr(10,10)||x FROM t3;
89c5c4113dSnw141292       ROLLBACK;
90c5c4113dSnw141292     }
91c5c4113dSnw141292     set sig2 [signature two]
92c5c4113dSnw141292  } $sig
93c5c4113dSnw141292  # puts "sig2=$sig2"
94c5c4113dSnw141292  # if {$sig2!=$sig} exit
95c5c4113dSnw141292  do_test memdb-1.$i.2-$cnt {
96c5c4113dSnw141292     execsql {
97c5c4113dSnw141292       BEGIN;
98c5c4113dSnw141292       DELETE FROM t3 WHERE random()%10!=0;
99c5c4113dSnw141292       INSERT INTO t3 SELECT randstr(10,10)||x FROM t3;
100c5c4113dSnw141292       DELETE FROM t3 WHERE random()%10!=0;
101c5c4113dSnw141292       INSERT INTO t3 SELECT randstr(10,10)||x FROM t3;
102c5c4113dSnw141292       ROLLBACK;
103c5c4113dSnw141292     }
104c5c4113dSnw141292     signature
105c5c4113dSnw141292  } $sig
106c5c4113dSnw141292  if {$i<$limit} {
107c5c4113dSnw141292    do_test memdb-1.$i.9-$cnt {
108c5c4113dSnw141292       execsql {
109c5c4113dSnw141292         INSERT INTO t3 SELECT randstr(10,400) FROM t3 WHERE random()%10==0;
110c5c4113dSnw141292       }
111c5c4113dSnw141292    } {}
112c5c4113dSnw141292  }
113c5c4113dSnw141292  set ::pager_old_format 0
114c5c4113dSnw141292}
115c5c4113dSnw141292
116c5c4113dSnw141292do_test memdb-2.1 {
117c5c4113dSnw141292  execsql {
118c5c4113dSnw141292    PRAGMA integrity_check
119c5c4113dSnw141292  }
120c5c4113dSnw141292} {ok}
121c5c4113dSnw141292
122c5c4113dSnw141292do_test memdb-3.1 {
123c5c4113dSnw141292  execsql {
124c5c4113dSnw141292    CREATE TABLE t4(a,b,c,d);
125c5c4113dSnw141292    BEGIN;
126c5c4113dSnw141292    INSERT INTO t4 VALUES(1,2,3,4);
127c5c4113dSnw141292    SELECT * FROM t4;
128c5c4113dSnw141292  }
129c5c4113dSnw141292} {1 2 3 4}
130c5c4113dSnw141292do_test memdb-3.2 {
131c5c4113dSnw141292  execsql {
132c5c4113dSnw141292    SELECT name FROM sqlite_master WHERE type='table';
133c5c4113dSnw141292  }
134c5c4113dSnw141292} {t3 t4}
135c5c4113dSnw141292do_test memdb-3.3 {
136c5c4113dSnw141292  execsql {
137c5c4113dSnw141292    DROP TABLE t4;
138c5c4113dSnw141292    SELECT name FROM sqlite_master WHERE type='table';
139c5c4113dSnw141292  }
140c5c4113dSnw141292} {t3}
141c5c4113dSnw141292do_test memdb-3.4 {
142c5c4113dSnw141292  execsql {
143c5c4113dSnw141292    ROLLBACK;
144c5c4113dSnw141292    SELECT name FROM sqlite_master WHERE type='table';
145c5c4113dSnw141292  }
146c5c4113dSnw141292} {t3 t4}
147c5c4113dSnw141292
148c5c4113dSnw141292# Create tables for the first group of tests.
149c5c4113dSnw141292#
150c5c4113dSnw141292do_test memdb-4.0 {
151c5c4113dSnw141292  execsql {
152c5c4113dSnw141292    CREATE TABLE t1(a, b, c, UNIQUE(a,b));
153c5c4113dSnw141292    CREATE TABLE t2(x);
154c5c4113dSnw141292    SELECT c FROM t1 ORDER BY c;
155c5c4113dSnw141292  }
156c5c4113dSnw141292} {}
157c5c4113dSnw141292
158c5c4113dSnw141292# Six columns of configuration data as follows:
159c5c4113dSnw141292#
160c5c4113dSnw141292#   i      The reference number of the test
161c5c4113dSnw141292#   conf   The conflict resolution algorithm on the BEGIN statement
162c5c4113dSnw141292#   cmd    An INSERT or REPLACE command to execute against table t1
163c5c4113dSnw141292#   t0     True if there is an error from $cmd
164c5c4113dSnw141292#   t1     Content of "c" column of t1 assuming no error in $cmd
165c5c4113dSnw141292#   t2     Content of "x" column of t2
166c5c4113dSnw141292#
167c5c4113dSnw141292foreach {i conf cmd t0 t1 t2} {
168c5c4113dSnw141292  1 {}       INSERT                  1 {}  1
169c5c4113dSnw141292  2 {}       {INSERT OR IGNORE}      0 3   1
170c5c4113dSnw141292  3 {}       {INSERT OR REPLACE}     0 4   1
171c5c4113dSnw141292  4 {}       REPLACE                 0 4   1
172c5c4113dSnw141292  5 {}       {INSERT OR FAIL}        1 {}  1
173c5c4113dSnw141292  6 {}       {INSERT OR ABORT}       1 {}  1
174c5c4113dSnw141292  7 {}       {INSERT OR ROLLBACK}    1 {}  {}
175c5c4113dSnw141292  8 IGNORE   INSERT                  0 3   1
176c5c4113dSnw141292  9 IGNORE   {INSERT OR IGNORE}      0 3   1
177c5c4113dSnw141292 10 IGNORE   {INSERT OR REPLACE}     0 4   1
178c5c4113dSnw141292 11 IGNORE   REPLACE                 0 4   1
179c5c4113dSnw141292 12 IGNORE   {INSERT OR FAIL}        1 {}  1
180c5c4113dSnw141292 13 IGNORE   {INSERT OR ABORT}       1 {}  1
181c5c4113dSnw141292 14 IGNORE   {INSERT OR ROLLBACK}    1 {}  {}
182c5c4113dSnw141292 15 REPLACE  INSERT                  0 4   1
183c5c4113dSnw141292 16 FAIL     INSERT                  1 {}  1
184c5c4113dSnw141292 17 ABORT    INSERT                  1 {}  1
185c5c4113dSnw141292 18 ROLLBACK INSERT                  1 {}  {}
186c5c4113dSnw141292} {
187c5c4113dSnw141292  do_test memdb-4.$i {
188c5c4113dSnw141292    if {$conf!=""} {set conf "ON CONFLICT $conf"}
189c5c4113dSnw141292    set r0 [catch {execsql [subst {
190c5c4113dSnw141292      DELETE FROM t1;
191c5c4113dSnw141292      DELETE FROM t2;
192c5c4113dSnw141292      INSERT INTO t1 VALUES(1,2,3);
193c5c4113dSnw141292      BEGIN $conf;
194c5c4113dSnw141292      INSERT INTO t2 VALUES(1);
195c5c4113dSnw141292      $cmd INTO t1 VALUES(1,2,4);
196c5c4113dSnw141292    }]} r1]
197c5c4113dSnw141292    catch {execsql {COMMIT}}
198c5c4113dSnw141292    if {$r0} {set r1 {}} {set r1 [execsql {SELECT c FROM t1}]}
199c5c4113dSnw141292    set r2 [execsql {SELECT x FROM t2}]
200c5c4113dSnw141292    list $r0 $r1 $r2
201c5c4113dSnw141292  } [list $t0 $t1 $t2]
202c5c4113dSnw141292}
203c5c4113dSnw141292
204c5c4113dSnw141292do_test memdb-5.0 {
205c5c4113dSnw141292  execsql {
206c5c4113dSnw141292    DROP TABLE t2;
207c5c4113dSnw141292    DROP TABLE t3;
208c5c4113dSnw141292    CREATE TABLE t2(a,b,c);
209c5c4113dSnw141292    INSERT INTO t2 VALUES(1,2,1);
210c5c4113dSnw141292    INSERT INTO t2 VALUES(2,3,2);
211c5c4113dSnw141292    INSERT INTO t2 VALUES(3,4,1);
212c5c4113dSnw141292    INSERT INTO t2 VALUES(4,5,4);
213c5c4113dSnw141292    SELECT c FROM t2 ORDER BY b;
214c5c4113dSnw141292    CREATE TABLE t3(x);
215c5c4113dSnw141292    INSERT INTO t3 VALUES(1);
216c5c4113dSnw141292  }
217c5c4113dSnw141292} {1 2 1 4}
218c5c4113dSnw141292
219c5c4113dSnw141292# Six columns of configuration data as follows:
220c5c4113dSnw141292#
221c5c4113dSnw141292#   i      The reference number of the test
222c5c4113dSnw141292#   conf1  The conflict resolution algorithm on the UNIQUE constraint
223c5c4113dSnw141292#   conf2  The conflict resolution algorithm on the BEGIN statement
224c5c4113dSnw141292#   cmd    An UPDATE command to execute against table t1
225c5c4113dSnw141292#   t0     True if there is an error from $cmd
226c5c4113dSnw141292#   t1     Content of "b" column of t1 assuming no error in $cmd
227c5c4113dSnw141292#   t2     Content of "x" column of t3
228c5c4113dSnw141292#
229c5c4113dSnw141292foreach {i conf1 conf2 cmd t0 t1 t2} {
230c5c4113dSnw141292  1 {}       {}       UPDATE                  1 {6 7 8 9}  1
231c5c4113dSnw141292  2 REPLACE  {}       UPDATE                  0 {7 6 9}    1
232c5c4113dSnw141292  3 IGNORE   {}       UPDATE                  0 {6 7 3 9}  1
233c5c4113dSnw141292  4 FAIL     {}       UPDATE                  1 {6 7 3 4}  1
234c5c4113dSnw141292  5 ABORT    {}       UPDATE                  1 {1 2 3 4}  1
235c5c4113dSnw141292  6 ROLLBACK {}       UPDATE                  1 {1 2 3 4}  0
236c5c4113dSnw141292  7 REPLACE  {}       {UPDATE OR IGNORE}      0 {6 7 3 9}  1
237c5c4113dSnw141292  8 IGNORE   {}       {UPDATE OR REPLACE}     0 {7 6 9}    1
238c5c4113dSnw141292  9 FAIL     {}       {UPDATE OR IGNORE}      0 {6 7 3 9}  1
239c5c4113dSnw141292 10 ABORT    {}       {UPDATE OR REPLACE}     0 {7 6 9}    1
240c5c4113dSnw141292 11 ROLLBACK {}       {UPDATE OR IGNORE}      0 {6 7 3 9}   1
241c5c4113dSnw141292 12 {}       {}       {UPDATE OR IGNORE}      0 {6 7 3 9}  1
242c5c4113dSnw141292 13 {}       {}       {UPDATE OR REPLACE}     0 {7 6 9}    1
243c5c4113dSnw141292 14 {}       {}       {UPDATE OR FAIL}        1 {6 7 3 4}  1
244c5c4113dSnw141292 15 {}       {}       {UPDATE OR ABORT}       1 {1 2 3 4}  1
245c5c4113dSnw141292 16 {}       {}       {UPDATE OR ROLLBACK}    1 {1 2 3 4}  0
246c5c4113dSnw141292 17 {}       IGNORE   UPDATE                  0 {6 7 3 9}  1
247c5c4113dSnw141292 18 {}       REPLACE  UPDATE                  0 {7 6 9}    1
248c5c4113dSnw141292 19 {}       FAIL     UPDATE                  1 {6 7 3 4}  1
249c5c4113dSnw141292 20 {}       ABORT    UPDATE                  1 {1 2 3 4}  1
250c5c4113dSnw141292 21 {}       ROLLBACK UPDATE                  1 {1 2 3 4}  0
251c5c4113dSnw141292 22 REPLACE  IGNORE   UPDATE                  0 {6 7 3 9}  1
252c5c4113dSnw141292 23 IGNORE   REPLACE  UPDATE                  0 {7 6 9}    1
253c5c4113dSnw141292 24 REPLACE  FAIL     UPDATE                  1 {6 7 3 4}  1
254c5c4113dSnw141292 25 IGNORE   ABORT    UPDATE                  1 {1 2 3 4}  1
255c5c4113dSnw141292 26 REPLACE  ROLLBACK UPDATE                  1 {1 2 3 4}  0
256c5c4113dSnw141292} {
257c5c4113dSnw141292  if {$t0} {set t1 {column a is not unique}}
258c5c4113dSnw141292  do_test memdb-5.$i {
259c5c4113dSnw141292    if {$conf1!=""} {set conf1 "ON CONFLICT $conf1"}
260c5c4113dSnw141292    if {$conf2!=""} {set conf2 "ON CONFLICT $conf2"}
261c5c4113dSnw141292    set r0 [catch {execsql [subst {
262c5c4113dSnw141292      DROP TABLE t1;
263c5c4113dSnw141292      CREATE TABLE t1(a,b,c, UNIQUE(a) $conf1);
264c5c4113dSnw141292      INSERT INTO t1 SELECT * FROM t2;
265c5c4113dSnw141292      UPDATE t3 SET x=0;
266c5c4113dSnw141292      BEGIN $conf2;
267c5c4113dSnw141292      $cmd t3 SET x=1;
268c5c4113dSnw141292      $cmd t1 SET b=b*2;
269c5c4113dSnw141292      $cmd t1 SET a=c+5;
270c5c4113dSnw141292    }]} r1]
271c5c4113dSnw141292    catch {execsql {COMMIT}}
272c5c4113dSnw141292    if {!$r0} {set r1 [execsql {SELECT a FROM t1 ORDER BY b}]}
273c5c4113dSnw141292    set r2 [execsql {SELECT x FROM t3}]
274c5c4113dSnw141292    list $r0 $r1 $r2
275c5c4113dSnw141292  } [list $t0 $t1 $t2]
276c5c4113dSnw141292}
277c5c4113dSnw141292
278c5c4113dSnw141292do_test memdb-6.1 {
279c5c4113dSnw141292  execsql {
280c5c4113dSnw141292    SELECT * FROM t2;
281c5c4113dSnw141292  }
282c5c4113dSnw141292} {1 2 1 2 3 2 3 4 1 4 5 4}
283c5c4113dSnw141292do_test memdb-6.2 {
284c5c4113dSnw141292  execsql {
285c5c4113dSnw141292    BEGIN;
286c5c4113dSnw141292    DROP TABLE t2;
287c5c4113dSnw141292    SELECT name FROM sqlite_master WHERE type='table' ORDER BY 1;
288c5c4113dSnw141292  }
289c5c4113dSnw141292} {t1 t3 t4}
290c5c4113dSnw141292do_test memdb-6.3 {
291c5c4113dSnw141292  execsql {
292c5c4113dSnw141292    ROLLBACK;
293c5c4113dSnw141292    SELECT name FROM sqlite_master WHERE type='table' ORDER BY 1;
294c5c4113dSnw141292  }
295c5c4113dSnw141292} {t1 t2 t3 t4}
296c5c4113dSnw141292do_test memdb-6.4 {
297c5c4113dSnw141292  execsql {
298c5c4113dSnw141292    SELECT * FROM t2;
299c5c4113dSnw141292  }
300c5c4113dSnw141292} {1 2 1 2 3 2 3 4 1 4 5 4}
301c5c4113dSnw141292do_test memdb-6.5 {
302c5c4113dSnw141292  execsql {
303c5c4113dSnw141292    SELECT a FROM t2 UNION SELECT b FROM t2 ORDER BY 1;
304c5c4113dSnw141292  }
305c5c4113dSnw141292} {1 2 3 4 5}
306c5c4113dSnw141292do_test memdb-6.6 {
307c5c4113dSnw141292  execsql {
308c5c4113dSnw141292    CREATE INDEX i2 ON t2(c);
309c5c4113dSnw141292    SELECT a FROM t2 ORDER BY c;
310c5c4113dSnw141292  }
311c5c4113dSnw141292} {1 3 2 4}
312c5c4113dSnw141292do_test memdb-6.6 {
313c5c4113dSnw141292  execsql {
314c5c4113dSnw141292    SELECT a FROM t2 ORDER BY c DESC;
315c5c4113dSnw141292  }
316c5c4113dSnw141292} {4 2 3 1}
317c5c4113dSnw141292do_test memdb-6.7 {
318c5c4113dSnw141292  execsql {
319c5c4113dSnw141292    BEGIN;
320c5c4113dSnw141292    CREATE TABLE t5(x,y);
321c5c4113dSnw141292    INSERT INTO t5 VALUES(1,2);
322c5c4113dSnw141292    SELECT * FROM t5;
323c5c4113dSnw141292  }
324c5c4113dSnw141292} {1 2}
325c5c4113dSnw141292do_test memdb-6.8 {
326c5c4113dSnw141292  execsql {
327c5c4113dSnw141292    SELECT name FROM sqlite_master WHERE type='table' ORDER BY 1;
328c5c4113dSnw141292  }
329c5c4113dSnw141292} {t1 t2 t3 t4 t5}
330c5c4113dSnw141292do_test memdb-6.9 {
331c5c4113dSnw141292  execsql {
332c5c4113dSnw141292    ROLLBACK;
333c5c4113dSnw141292    SELECT name FROM sqlite_master WHERE type='table' ORDER BY 1;
334c5c4113dSnw141292  }
335c5c4113dSnw141292} {t1 t2 t3 t4}
336c5c4113dSnw141292do_test memdb-6.10 {
337c5c4113dSnw141292  execsql {
338c5c4113dSnw141292    CREATE TABLE t5(x PRIMARY KEY, y UNIQUE);
339c5c4113dSnw141292    SELECT * FROM t5;
340c5c4113dSnw141292  }
341c5c4113dSnw141292} {}
342c5c4113dSnw141292do_test memdb-6.11 {
343c5c4113dSnw141292  execsql {
344c5c4113dSnw141292    SELECT * FROM t5 ORDER BY y DESC;
345c5c4113dSnw141292  }
346c5c4113dSnw141292} {}
347c5c4113dSnw141292do_test memdb-6.12 {
348c5c4113dSnw141292  execsql {
349c5c4113dSnw141292    INSERT INTO t5 VALUES(1,2);
350c5c4113dSnw141292    INSERT INTO t5 VALUES(3,4);
351c5c4113dSnw141292    REPLACE INTO t5 VALUES(1,4);
352c5c4113dSnw141292    SELECT rowid,* FROM t5;
353c5c4113dSnw141292  }
354c5c4113dSnw141292} {3 1 4}
355c5c4113dSnw141292do_test memdb-6.13 {
356c5c4113dSnw141292  execsql {
357c5c4113dSnw141292    DELETE FROM t5 WHERE x>5;
358c5c4113dSnw141292    SELECT * FROM t5;
359c5c4113dSnw141292  }
360c5c4113dSnw141292} {1 4}
361c5c4113dSnw141292do_test memdb-6.14 {
362c5c4113dSnw141292  execsql {
363c5c4113dSnw141292    DELETE FROM t5 WHERE y<3;
364c5c4113dSnw141292    SELECT * FROM t5;
365c5c4113dSnw141292  }
366c5c4113dSnw141292} {1 4}
367c5c4113dSnw141292do_test memdb-6.15 {
368c5c4113dSnw141292  execsql {
369c5c4113dSnw141292    DELETE FROM t5 WHERE x>0;
370c5c4113dSnw141292    SELECT * FROM t5;
371c5c4113dSnw141292  }
372c5c4113dSnw141292} {}
373c5c4113dSnw141292
374c5c4113dSnw141292do_test memdb-7.1 {
375c5c4113dSnw141292  execsql {
376c5c4113dSnw141292    CREATE TABLE t6(x);
377c5c4113dSnw141292    INSERT INTO t6 VALUES(1);
378c5c4113dSnw141292    INSERT INTO t6 SELECT x+1 FROM t6;
379c5c4113dSnw141292    INSERT INTO t6 SELECT x+2 FROM t6;
380c5c4113dSnw141292    INSERT INTO t6 SELECT x+4 FROM t6;
381c5c4113dSnw141292    INSERT INTO t6 SELECT x+8 FROM t6;
382c5c4113dSnw141292    INSERT INTO t6 SELECT x+16 FROM t6;
383c5c4113dSnw141292    INSERT INTO t6 SELECT x+32 FROM t6;
384c5c4113dSnw141292    INSERT INTO t6 SELECT x+64 FROM t6;
385c5c4113dSnw141292    INSERT INTO t6 SELECT x+128 FROM t6;
386c5c4113dSnw141292    SELECT count(*) FROM (SELECT DISTINCT x FROM t6);
387c5c4113dSnw141292  }
388c5c4113dSnw141292} {256}
389c5c4113dSnw141292for {set i 1} {$i<=256} {incr i} {
390c5c4113dSnw141292  do_test memdb-7.2.$i {
391c5c4113dSnw141292     execsql "DELETE FROM t6 WHERE x=\
392c5c4113dSnw141292              (SELECT x FROM t6 ORDER BY random() LIMIT 1)"
393c5c4113dSnw141292     execsql {SELECT count(*) FROM t6}
394c5c4113dSnw141292  } [expr {256-$i}]
395c5c4113dSnw141292}
396c5c4113dSnw141292
397c5c4113dSnw141292finish_test
398