xref: /sqlite-3.40.0/test/temptable2.test (revision 0e55da2e)
1# 2016 March 3
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
12set testdir [file dirname $argv0]
13source $testdir/tester.tcl
14set testprefix temptable2
15
16do_execsql_test 1.1 {
17  CREATE TEMP TABLE t1(a, b);
18  CREATE INDEX i1 ON t1(a, b);
19}
20
21do_execsql_test 1.2 {
22  WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<100000 )
23  INSERT INTO t1 SELECT randomblob(100), randomblob(100) FROM X;
24} {}
25
26do_execsql_test 1.3 {
27  PRAGMA temp.integrity_check;
28} {ok}
29
30#-------------------------------------------------------------------------
31#
32reset_db
33do_execsql_test 2.1 {
34  CREATE TEMP TABLE t2(a, b);
35  INSERT INTO t2 VALUES(1, 2);
36} {}
37
38do_execsql_test 2.2 {
39  BEGIN;
40    INSERT INTO t2 VALUES(3, 4);
41    SELECT * FROM t2;
42} {1 2 3 4}
43
44do_execsql_test 2.3 {
45  ROLLBACK;
46  SELECT * FROM t2;
47} {1 2}
48
49#-------------------------------------------------------------------------
50#
51reset_db
52do_execsql_test 3.1.1 {
53  PRAGMA main.cache_size = 10;
54  PRAGMA temp.cache_size = 10;
55
56  CREATE TEMP TABLE t1(a, b);
57  CREATE INDEX i1 ON t1(a, b);
58
59  WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<1000 )
60  INSERT INTO t1 SELECT randomblob(100), randomblob(100) FROM x;
61
62  SELECT count(*) FROM t1;
63} {1000}
64do_execsql_test 3.1.2 {
65  BEGIN;
66    UPDATE t1 SET b=randomblob(100) WHERE (rowid%10)==0;
67  ROLLBACK;
68}
69do_execsql_test 3.1.3 {
70  SELECT count(*) FROM t1;
71} {1000}
72do_execsql_test 3.1.4 { PRAGMA temp.integrity_check } {ok}
73
74do_execsql_test 3.2.1 {
75  BEGIN;
76    UPDATE t1 SET b=randomblob(100) WHERE (rowid%10)==0;
77    SAVEPOINT abc;
78      UPDATE t1 SET b=randomblob(100) WHERE (rowid%10)==1;
79    ROLLBACK TO abc;
80    UPDATE t1 SET b=randomblob(100) WHERE (rowid%10)==2;
81  COMMIT;
82}
83do_execsql_test 3.2.2 { PRAGMA temp.integrity_check } {ok}
84
85#-------------------------------------------------------------------------
86#
87reset_db
88do_execsql_test 4.1.1 {
89  PRAGMA main.cache_size = 10;
90  PRAGMA temp.cache_size = 10;
91
92  CREATE TEMP TABLE t1(a, b);
93  CREATE INDEX i1 ON t1(a, b);
94
95  WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<10 )
96  INSERT INTO t1 SELECT randomblob(100), randomblob(100) FROM x;
97
98  SELECT count(*) FROM t1;
99  PRAGMA temp.page_count;
100} {10 9}
101
102do_execsql_test 4.1.2 {
103  BEGIN;
104    UPDATE t1 SET b=randomblob(100);
105  ROLLBACK;
106}
107
108do_execsql_test 4.1.3 {
109  CREATE TEMP TABLE t2(a, b);
110  CREATE INDEX i2 ON t2(a, b);
111  WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<500 )
112  INSERT INTO t2 SELECT randomblob(100), randomblob(100) FROM x;
113
114  SELECT count(*) FROM t2;
115  SELECT count(*) FROM t1;
116} {500 10}
117
118do_test 4.1.4 {
119  set n [db one { PRAGMA temp.page_count }]
120  expr ($n >280 && $n < 300)
121} 1
122
123do_execsql_test 4.1.4 { PRAGMA temp.integrity_check } {ok}
124
125#-------------------------------------------------------------------------
126#
127reset_db
128do_execsql_test 5.1.1 {
129  PRAGMA main.cache_size = 10;
130  PRAGMA temp.cache_size = 10;
131
132  CREATE TEMP TABLE t2(a, b);
133  CREATE INDEX i2 ON t2(a, b);
134  WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<500 )
135  INSERT INTO t2 SELECT randomblob(100), randomblob(100) FROM x;
136
137  CREATE TEMP TABLE t1(a, b);
138  CREATE INDEX i1 ON t1(a, b);
139  INSERT INTO t1 VALUES(1, 2);
140}
141
142do_test 5.1.2 {
143  set n [db one { PRAGMA temp.page_count }]
144  expr ($n > 280 && $n < 290)
145} {1}
146
147do_execsql_test 5.1.3 {
148  BEGIN;
149    UPDATE t1 SET a=2;
150    UPDATE t2 SET a=randomblob(100);
151    SELECT count(*) FROM t1;
152  ROLLBACK;
153} {1}
154
155do_execsql_test 5.1.4 {
156  UPDATE t2 SET a=randomblob(100);
157
158  SELECT * FROM t1;
159} {1 2}
160
161do_execsql_test 5.1.5 { PRAGMA temp.integrity_check } {ok}
162
163#-------------------------------------------------------------------------
164# Test this:
165#
166#   1. Page is DIRTY at the start of a transaction.
167#   2. Page is written out as part of the transaction.
168#   3. Page is then read back in.
169#   4. Transaction is rolled back. Is the page now clean or dirty?
170#
171# This actually does work. Step 4 marks the page as clean. But it also
172# writes to the database file itself. So marking it clean is correct -
173# the page does match the contents of the db file.
174#
175reset_db
176
177do_execsql_test 6.1 {
178  PRAGMA main.cache_size = 10;
179  PRAGMA temp.cache_size = 10;
180
181  CREATE TEMP TABLE t1(x);
182  INSERT INTO t1 VALUES('one');
183
184  CREATE TEMP TABLE t2(a, b);
185  CREATE INDEX i2 ON t2(a, b);
186  WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<500 )
187  INSERT INTO t2 SELECT randomblob(100), randomblob(100) FROM x;
188}
189
190do_execsql_test 6.2 {
191  UPDATE t1 SET x='two';             -- step 1
192  BEGIN;
193    UPDATE t2 SET a=randomblob(100); -- step 2
194    SELECT * FROM t1;                -- step 3
195  ROLLBACK;                          -- step 4
196
197  SELECT count(*) FROM t2;
198  SELECT * FROM t1;
199} {two 500 two}
200
201#-------------------------------------------------------------------------
202#
203reset_db
204sqlite3 db ""
205do_execsql_test 7.1 {
206  PRAGMA auto_vacuum=INCREMENTAL;
207  CREATE TABLE t1(x);
208  INSERT INTO t1 VALUES(zeroblob(900));
209  INSERT INTO t1 VALUES(zeroblob(900));
210  INSERT INTO t1 SELECT x FROM t1;
211  INSERT INTO t1 SELECT x FROM t1;
212  INSERT INTO t1 SELECT x FROM t1;
213  INSERT INTO t1 SELECT x FROM t1;
214  BEGIN;
215  DELETE FROM t1 WHERE rowid%2;
216  PRAGMA incremental_vacuum(4);
217  ROLLBACK;
218  PRAGMA integrity_check;
219} {ok}
220
221#-------------------------------------------------------------------------
222# Try changing the page size using a backup operation when pages are
223# stored in main-memory only.
224#
225reset_db
226do_execsql_test 8.1 {
227  CREATE TABLE t2(a, b);
228  CREATE INDEX i2 ON t2(a, b);
229  WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<20 )
230  INSERT INTO t2 SELECT randomblob(100), randomblob(100) FROM x;
231  PRAGMA page_count;
232} {13}
233
234do_test 8.2 {
235  sqlite3 tmp ""
236  execsql {
237    PRAGMA page_size = 8192;
238    CREATE TABLE t1(a, b);
239    CREATE INDEX i1 ON t1(a, b);
240    WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<100 )
241    INSERT INTO t1 SELECT randomblob(100), randomblob(100) FROM x;
242    PRAGMA page_count;
243  } tmp
244} {10}
245
246do_test 8.3 {
247  sqlite3_backup B tmp main db main
248  B step 5
249  B finish
250} {SQLITE_READONLY}
251
252do_test 8.4 {
253  execsql {
254    SELECT count(*) FROM t1;
255    PRAGMA integrity_check;
256    PRAGMA page_size;
257  } tmp
258} {100 ok 8192}
259
260do_test 8.5 {
261  tmp eval { UPDATE t1 SET a=randomblob(100) }
262} {}
263
264do_test 8.6 {
265  sqlite3_backup B tmp main db main
266  B step 1000
267  B finish
268} {SQLITE_READONLY}
269
270tmp close
271
272#-------------------------------------------------------------------------
273# Try inserts and deletes with a large db in auto-vacuum mode. Check
274#
275foreach {tn mode} {
276  1 delete
277  2 wal
278} {
279  reset_db
280  sqlite3 db ""
281  do_execsql_test 9.$tn.1.1 {
282    PRAGMA cache_size = 15;
283    PRAGMA auto_vacuum = 1;
284  }
285  do_execsql_test 9.$tn.1.2 "PRAGMA journal_mode = $mode" delete
286
287  do_execsql_test 9.$tn.1.3 {
288    CREATE TABLE tx(a, b);
289    CREATE INDEX i1 ON tx(a);
290    CREATE INDEX i2 ON tx(b);
291    WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<1000 )
292      INSERT INTO tx SELECT randomblob(100), randomblob(100) FROM x;
293  }
294
295  for {set i 2} {$i<20} {incr i} {
296    do_execsql_test 9.$tn.$i.1 { DELETE FROM tx WHERE (random()%3)==0 }
297
298    do_execsql_test 9.$tn.$i.2 { PRAGMA integrity_check } ok
299
300      do_execsql_test 9.$tn.$i.3 {
301        WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<400 )
302          INSERT INTO tx SELECT randomblob(100), randomblob(100) FROM x;
303      }
304
305    do_execsql_test 9.$tn.$i.4 { PRAGMA integrity_check } ok
306
307    do_execsql_test 9.$tn.$i.5 {
308      BEGIN;
309      DELETE FROM tx WHERE (random()%3)==0;
310      WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<500 )
311        INSERT INTO tx SELECT randomblob(100), randomblob(100) FROM x;
312      COMMIT;
313    }
314
315    do_execsql_test 9.$tn.$i.6 { PRAGMA integrity_check } ok
316  }
317}
318
319finish_test
320
321