Snapshot of upstream SQLite 3.45.3
[sqlcipher.git] / ext / session / sessionF.test
blob6a6eabcfd54b290609af3142b0615c4102fc2cbe
1 # 2015 June 02
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 #***********************************************************************
12 # This file implements regression tests for the sessions module.
13 # Specifically, it tests that tables appear in the correct order
14 # within changesets and patchsets.
19 if {![info exists testdir]} {
20   set testdir [file join [file dirname [info script]] .. .. test]
21
22 source [file join [file dirname [info script]] session_common.tcl]
23 source $testdir/tester.tcl
24 ifcapable !session {finish_test; return}
25 set testprefix sessionF
28 # Test plan:
30 #    1.*: Test that sqlite3session_changeset() and sqlite3session_patchset()
31 #         output tables in the right order.
33 #    2.*: Test that sqlite3session_invert() does not modify the order of
34 #         tables within a changeset.
36 #    3.*: Test that sqlite3session_concat outputs tables in the right order.
39 # Create a db schema to use.
41 do_execsql_test 1.0 {
42   CREATE TABLE t3(e PRIMARY KEY, f);
43   CREATE TABLE t1(a PRIMARY KEY, b);
44   CREATE TABLE t2(c PRIMARY KEY, d);
47 #-----------------------------------------------------------------------
48 # 1.* - changeset() and patchset().
51 foreach {tn setup result} {
52   1 {
53     S attach *
54   } {
55     {INSERT t2 0 X. {} {i 2 t two}} 
56     {INSERT t1 0 X. {} {i 1 t one}} 
57     {INSERT t3 0 X. {} {i 3 t three}}
58   }
60   2 {
61     S attach t1
62     S attach *
63   } {
64     {INSERT t1 0 X. {} {i 1 t one}} 
65     {INSERT t2 0 X. {} {i 2 t two}} 
66     {INSERT t3 0 X. {} {i 3 t three}}
67   }
69   3 {
70     S attach t3
71     S attach t2
72     S attach t1
73   } {
74     {INSERT t3 0 X. {} {i 3 t three}}
75     {INSERT t2 0 X. {} {i 2 t two}} 
76     {INSERT t1 0 X. {} {i 1 t one}} 
77   }
78 } {
79   execsql {
80     DELETE FROM t1;
81     DELETE FROM t2;
82     DELETE FROM t3;
83   }
84   sqlite3session S db main
85   eval $setup
87   do_execsql_test 1.$tn.1 {
88     INSERT INTO t2 VALUES(2, 'two');
89     INSERT INTO t1 VALUES(1, 'one');
90     INSERT INTO t3 VALUES(3, 'three');
91   }
93   do_changeset_test 1.1.$tn.2 S $result
94   do_patchset_test  1.1.$tn.3 S $result
96   S delete
99 foreach {tn setup result} {
100   1 {
101     S attach *
102   } {
103     {INSERT t2 0 X. {} {i 4 t four}} 
104     {INSERT t2 0 X. {} {i 5 t five}}
105     {INSERT t1 0 X. {} {i 1 t one}} 
106     {INSERT t3 0 X. {} {i 6 t six}}
107   }
109   2 {
110     S attach t1
111     S attach *
112   } {
113     {INSERT t1 0 X. {} {i 1 t one}} 
114     {INSERT t2 0 X. {} {i 4 t four}} 
115     {INSERT t2 0 X. {} {i 5 t five}}
116     {INSERT t3 0 X. {} {i 6 t six}}
117   }
119   3 {
120     S attach t3
121     S attach t2
122     S attach t1
123   } {
124     {INSERT t3 0 X. {} {i 6 t six}}
125     {INSERT t2 0 X. {} {i 4 t four}} 
126     {INSERT t2 0 X. {} {i 5 t five}}
127     {INSERT t1 0 X. {} {i 1 t one}} 
128   }
129 } {
130   execsql {
131     DELETE FROM t1;
132     DELETE FROM t2;
133     DELETE FROM t3;
134   }
135   sqlite3session S db main
136   eval $setup
138   do_execsql_test 1.$tn.1 {
139     INSERT INTO t2 VALUES(2, 'two');
140     INSERT INTO t1 VALUES(1, 'one');
141     DELETE FROM t2;
142     INSERT INTO t2 VALUES(4, 'four');
143     INSERT INTO t2 VALUES(5, 'five');
144     INSERT INTO t3 VALUES(6, 'six');
145   }
147   do_changeset_test 1.2.$tn.2 S $result
148   do_patchset_test 1.2.$tn.2 S $result
150   S delete
153 #-------------------------------------------------------------------------
154 # 2.* - invert()
157 foreach {tn setup result} {
158   1 {
159     S attach *
160   } {
161     {DELETE t2 0 X. {i 4 t four} {}} 
162     {DELETE t2 0 X. {i 5 t five} {}} 
163     {DELETE t1 0 X. {i 1 t one} {}}
164     {DELETE t3 0 X. {i 6 t six} {}} 
165   }
167   2 {
168     S attach t1
169     S attach *
170   } {
171     {DELETE t1 0 X. {i 1 t one} {}}
172     {DELETE t2 0 X. {i 4 t four} {}} 
173     {DELETE t2 0 X. {i 5 t five} {}} 
174     {DELETE t3 0 X. {i 6 t six} {}} 
175   }
177   3 {
178     S attach t3
179     S attach t2
180     S attach t1
181   } {
182     {DELETE t3 0 X. {i 6 t six} {}} 
183     {DELETE t2 0 X. {i 4 t four} {}} 
184     {DELETE t2 0 X. {i 5 t five} {}} 
185     {DELETE t1 0 X. {i 1 t one} {}}
186   }
187 } {
188   execsql {
189     DELETE FROM t1;
190     DELETE FROM t2;
191     DELETE FROM t3;
192   }
193   sqlite3session S db main
194   eval $setup
196   do_execsql_test 1.$tn.1 {
197     INSERT INTO t2 VALUES(2, 'two');
198     INSERT INTO t1 VALUES(1, 'one');
199     DELETE FROM t2;
200     INSERT INTO t2 VALUES(4, 'four');
201     INSERT INTO t2 VALUES(5, 'five');
202     INSERT INTO t3 VALUES(6, 'six');
203   }
205   do_changeset_invert_test 2.$tn.2 S $result
207   S delete
210 #-------------------------------------------------------------------------
211 # 3.* - concat()
213 foreach {tn setup1 sql1 setup2 sql2 result} {
214   1 {
215     S attach *
216   } {
217     INSERT INTO t1 VALUES(1, 'one');
218     INSERT INTO t2 VALUES(2, 'two');
219   } {
220     S attach t2
221     S attach t1
222   } {
223     INSERT INTO t1 VALUES(3, 'three');
224     INSERT INTO t2 VALUES(4, 'four');
225   } {
226     {INSERT t1 0 X. {} {i 1 t one}} 
227     {INSERT t1 0 X. {} {i 3 t three}} 
228     {INSERT t2 0 X. {} {i 2 t two}}
229     {INSERT t2 0 X. {} {i 4 t four}}
230   }
232   1 {
233     S attach t2
234     S attach t1
235   } {
236     INSERT INTO t1 VALUES(1, 'one');
237     INSERT INTO t2 VALUES(2, 'two');
238   } {
239     S attach *
240   } {
241     INSERT INTO t1 VALUES(3, 'three');
242     INSERT INTO t2 VALUES(4, 'four');
243   } {
244     {INSERT t2 0 X. {} {i 2 t two}}
245     {INSERT t2 0 X. {} {i 4 t four}}
246     {INSERT t1 0 X. {} {i 1 t one}} 
247     {INSERT t1 0 X. {} {i 3 t three}} 
248   }
250   1 {
251     S attach *
252   } {
253     INSERT INTO t2 VALUES(2, 'two');
254   } {
255     S attach *
256   } {
257     INSERT INTO t1 VALUES(3, 'three');
258     INSERT INTO t2 VALUES(4, 'four');
259     INSERT INTO t3 VALUES(5, 'five');
260   } {
261     {INSERT t2 0 X. {} {i 2 t two}}
262     {INSERT t2 0 X. {} {i 4 t four}}
263     {INSERT t1 0 X. {} {i 3 t three}} 
264     {INSERT t3 0 X. {} {i 5 t five}} 
265   }
267 } {
268   execsql {
269     DELETE FROM t1;
270     DELETE FROM t2;
271     DELETE FROM t3;
272   }
273   sqlite3session S db main
274   eval $setup1
275   execsql $sql1
276   set c1 [S changeset]
277   S delete
279   sqlite3session S db main
280   eval $setup2
281   execsql $sql2
282   set c2 [S changeset]
283   S delete
285   set res [list]
286   sqlite3session_foreach x [sqlite3changeset_concat $c1 $c2] {
287     lappend res $x
288   }
290   do_test 3.$tn { set res } [list {*}$result]
294 finish_test