xref: /sqlite-3.40.0/test/temptable2.test (revision d87efd72)
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  PRAGMA temp.page_count;
117} {500 10 292}
118
119do_execsql_test 4.1.4 { PRAGMA temp.integrity_check } {ok}
120
121#-------------------------------------------------------------------------
122#
123reset_db
124do_execsql_test 5.1.1 {
125  PRAGMA main.cache_size = 10;
126  PRAGMA temp.cache_size = 10;
127
128  CREATE TEMP TABLE t2(a, b);
129  CREATE INDEX i2 ON t2(a, b);
130  WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<500 )
131  INSERT INTO t2 SELECT randomblob(100), randomblob(100) FROM x;
132
133  CREATE TEMP TABLE t1(a, b);
134  CREATE INDEX i1 ON t1(a, b);
135  INSERT INTO t1 VALUES(1, 2);
136
137  PRAGMA temp.page_count;
138} {286}
139
140do_execsql_test 5.1.2 {
141  BEGIN;
142    UPDATE t1 SET a=2;
143    UPDATE t2 SET a=randomblob(100);
144    SELECT count(*) FROM t1;
145  ROLLBACK;
146} {1}
147
148do_execsql_test 5.1.3 {
149  UPDATE t2 SET a=randomblob(100);
150
151  SELECT * FROM t1;
152} {1 2}
153
154do_execsql_test 5.1.4 { PRAGMA temp.integrity_check } {ok}
155
156#-------------------------------------------------------------------------
157# Test this:
158#
159#   1. Page is DIRTY at the start of a transaction.
160#   2. Page is written out as part of the transaction.
161#   3. Page is then read back in.
162#   4. Transaction is rolled back. Is the page now clean or dirty?
163#
164# This actually does work. Step 4 marks the page as clean. But it also
165# writes to the database file itself. So marking it clean is correct -
166# the page does match the contents of the db file.
167#
168reset_db
169
170do_execsql_test 6.1 {
171  PRAGMA main.cache_size = 10;
172  PRAGMA temp.cache_size = 10;
173
174  CREATE TEMP TABLE t1(x);
175  INSERT INTO t1 VALUES('one');
176
177  CREATE TEMP TABLE t2(a, b);
178  CREATE INDEX i2 ON t2(a, b);
179  WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<500 )
180  INSERT INTO t2 SELECT randomblob(100), randomblob(100) FROM x;
181}
182
183do_execsql_test 6.2 {
184  UPDATE t1 SET x='two';             -- step 1
185  BEGIN;
186    UPDATE t2 SET a=randomblob(100); -- step 2
187    SELECT * FROM t1;                -- step 3
188  ROLLBACK;                          -- step 4
189
190  SELECT count(*) FROM t2;
191  SELECT * FROM t1;
192} {two 500 two}
193
194#-------------------------------------------------------------------------
195
196reset_db
197sqlite3 db ""
198do_execsql_test 7.1 {
199  PRAGMA auto_vacuum=INCREMENTAL;
200  CREATE TABLE t1(x);
201  INSERT INTO t1 VALUES(zeroblob(900));
202  INSERT INTO t1 VALUES(zeroblob(900));
203  INSERT INTO t1 SELECT x FROM t1;
204  INSERT INTO t1 SELECT x FROM t1;
205  INSERT INTO t1 SELECT x FROM t1;
206  INSERT INTO t1 SELECT x FROM t1;
207  BEGIN;
208  DELETE FROM t1 WHERE rowid%2;
209  PRAGMA incremental_vacuum(4);
210  ROLLBACK;
211  PRAGMA integrity_check;
212} {ok}
213
214finish_test
215
216