3 # The author disclaims copyright to this source code. In place of
4 # a legal notice, here is a blessing:
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.
10 #***********************************************************************
13 if {![info exists testdir]} {
14 set testdir [file join [file dirname [info script]] .. .. test]
16 source [file join [file dirname [info script]] session_common.tcl]
17 source $testdir/tester.tcl
18 ifcapable !session {finish_test; return}
20 set testprefix sessionstat1
23 CREATE TABLE t1(a PRIMARY KEY, b, c);
24 CREATE INDEX t1b ON t1(b);
25 CREATE INDEX t1c ON t1(c);
28 SELECT 0 UNION ALL SELECT i+1 FROM s WHERE (i+1)<32
30 INSERT INTO t1 SELECT i, i%8, i%2 FROM s;
33 do_iterator_test 1.1 {} {
36 {INSERT sqlite_stat1 0 XX. {} {t t1 t sqlite_autoindex_t1_1 t {32 1}}}
37 {INSERT sqlite_stat1 0 XX. {} {t t1 t t1b t {32 4}}}
38 {INSERT sqlite_stat1 0 XX. {} {t t1 t t1c t {32 16}}}
43 SELECT 32 UNION ALL SELECT i+1 FROM s WHERE (i+1)<64
45 INSERT INTO t1 SELECT i, i%8, i%2 FROM s;
48 do_iterator_test 1.3 {} {
51 {UPDATE sqlite_stat1 0 XX. {t t1 t sqlite_autoindex_t1_1 t {32 1}} {{} {} {} {} t {64 1}}}
52 {UPDATE sqlite_stat1 0 XX. {t t1 t t1b t {32 4}} {{} {} {} {} t {64 8}}}
53 {UPDATE sqlite_stat1 0 XX. {t t1 t t1c t {32 16}} {{} {} {} {} t {64 32}}}
56 do_iterator_test 1.5 {} {
59 {DELETE sqlite_stat1 0 XX. {t t1 t t1b t {64 8}} {}}
62 do_iterator_test 1.6 {} {
65 {DELETE sqlite_stat1 0 XX. {t t1 t sqlite_autoindex_t1_1 t {64 1}} {}}
66 {DELETE sqlite_stat1 0 XX. {t t1 t t1c t {64 32}} {}}
69 #-------------------------------------------------------------------------
77 CREATE TABLE t1(a PRIMARY KEY, b, c);
78 CREATE INDEX t1b ON t1(b);
79 CREATE INDEX t1c ON t1(c);
87 SELECT 0 UNION ALL SELECT i+1 FROM s WHERE (i+1)<32
89 INSERT INTO t1 SELECT i, i%8, i%2 FROM s;
94 do_execsql_test -db db2 2.2 {
95 SELECT * FROM sqlite_stat1
97 t1 sqlite_autoindex_t1_1 {32 1}
103 do_then_apply_sql { DROP INDEX t1c }
106 do_execsql_test -db db2 2.4 {
107 SELECT * FROM sqlite_stat1
109 t1 sqlite_autoindex_t1_1 {32 1}
114 do_then_apply_sql { DROP TABLE t1 }
117 do_execsql_test -db db2 2.4 {
118 SELECT * FROM sqlite_stat1
122 do_execsql_test -db db2 2.5 { SELECT count(*) FROM t1 } 32
124 #-------------------------------------------------------------------------
132 CREATE TABLE t1(a, b, c);
134 DELETE FROM sqlite_stat1;
137 INSERT INTO t1 VALUES(1, 1, 1);
138 INSERT INTO t1 VALUES(2, 2, 2);
139 INSERT INTO t1 VALUES(3, 3, 3);
140 INSERT INTO t1 VALUES(4, 4, 4);
144 do_iterator_test 3.1 {} {
147 {INSERT sqlite_stat1 0 XX. {} {t t1 b {} t 4}}
151 do_execsql_test 3.2 {
152 SELECT * FROM sqlite_stat1;
155 execsql { DELETE FROM sqlite_stat1 }
156 do_then_apply_sql { ANALYZE }
157 execsql { SELECT * FROM sqlite_stat1 } db2
160 execsql { INSERT INTO t1 VALUES(5,5,5) }
161 do_then_apply_sql { ANALYZE }
162 execsql { SELECT * FROM sqlite_stat1 } db2
165 do_then_apply_sql { DROP TABLE t1 }
166 execsql { SELECT * FROM sqlite_stat1 } db2
171 CREATE TABLE t1(a, b, c);
172 CREATE TABLE t2(x, y, z);
173 INSERT INTO t1 VALUES(1,1,1), (2,2,2), (3,3,3), (4,4,4), (5,5,5);
174 INSERT INTO t2 SELECT * FROM t1;
175 DELETE FROM sqlite_stat1;
177 sqlite3session S db main
178 S attach sqlite_stat1
181 do_changeset_test 3.6.2 S {
182 {INSERT sqlite_stat1 0 XX. {} {t t2 b {} t 5}}
183 {INSERT sqlite_stat1 0 XX. {} {t t1 b {} t 5}}
185 do_changeset_invert_test 3.6.3 S {
186 {DELETE sqlite_stat1 0 XX. {t t2 b {} t 5} {}}
187 {DELETE sqlite_stat1 0 XX. {t t1 b {} t 5} {}}
189 do_test 3.6.4 { S delete } {}
191 proc sql_changeset_concat {args} {
193 sqlite3session S db main
194 S attach sqlite_stat1
196 set change [S changeset]
199 if {[info vars ret]!=""} {
200 set ret [sqlite3changeset_concat $ret $change]
206 changeset_to_list $ret
209 proc do_scc_test {tn args} {
211 do_test $tn [concat sql_changeset_concat [lrange $args 0 end-1]] \
212 [list {*}[ lindex $args end ]]
216 do_execsql_test 3.7.0 {
217 DELETE FROM sqlite_stat1;
222 INSERT INTO t2 VALUES(6,6,6);
225 {INSERT sqlite_stat1 0 XX. {} {t t1 b {} t 5}}
226 {INSERT sqlite_stat1 0 XX. {} {t t2 b {} t 6}}
229 #-------------------------------------------------------------------------
237 CREATE TABLE t1(a, b);
238 CREATE INDEX i1 ON t1(a);
239 CREATE INDEX i2 ON t1(b);
240 INSERT INTO t1 VALUES(1,1), (2,2);
243 execsql { DELETE FROM sqlite_stat1 }
247 execsql { INSERT INTO t1 VALUES(3,3); }
248 set C [changeset_from_sql {ANALYZE}]
250 proc xConflict {args} {
254 sqlite3changeset_apply db2 $C xConflict
257 {INSERT sqlite_stat1 CONFLICT {t t1 t i1 t {3 1}} {t t1 t i1 t {2 1}}}
258 {INSERT sqlite_stat1 CONFLICT {t t1 t i2 t {3 1}} {t t1 t i2 t {2 1}}}
261 do_execsql_test -db db2 4.1.2 {
262 SELECT * FROM sqlite_stat1 ORDER BY 1,2;
263 } {t1 i1 {2 1} t1 i2 {2 1}}
266 proc xConflict {args} {
269 sqlite3changeset_apply db2 $C xConflict
270 execsql { SELECT * FROM sqlite_stat1 ORDER BY 1,2 } db2
271 } {t1 i1 {3 1} t1 i2 {3 1}}
276 CREATE TABLE t3(x,y);
277 INSERT INTO t3 VALUES('a','a');
278 INSERT INTO t3 VALUES('b','b');
281 execsql { DELETE FROM sqlite_stat1 }
284 execsql { INSERT INTO t3 VALUES('c','c'); }
285 set C [changeset_from_sql {ANALYZE}]
287 proc xConflict {args} {
291 sqlite3changeset_apply db2 $C xConflict
294 {INSERT sqlite_stat1 CONFLICT {t t3 b {} t 3} {t t3 b {} t 2}}
298 do_execsql_test -db db2 4.2.2 {
299 SELECT * FROM sqlite_stat1 ORDER BY 1,2;
303 proc xConflict {args} {
306 sqlite3changeset_apply db2 $C xConflict
307 execsql { SELECT * FROM sqlite_stat1 ORDER BY 1,2 } db2