xref: /sqlite-3.40.0/ext/session/sessionF.test (revision 6ab91a7a)
1*6c39e6a8Sdan# 2015 June 02
2*6c39e6a8Sdan#
3*6c39e6a8Sdan# The author disclaims copyright to this source code.  In place of
4*6c39e6a8Sdan# a legal notice, here is a blessing:
5*6c39e6a8Sdan#
6*6c39e6a8Sdan#    May you do good and not evil.
7*6c39e6a8Sdan#    May you find forgiveness for yourself and forgive others.
8*6c39e6a8Sdan#    May you share freely, never taking more than you give.
9*6c39e6a8Sdan#
10*6c39e6a8Sdan#***********************************************************************
11*6c39e6a8Sdan#
12*6c39e6a8Sdan# This file implements regression tests for the sessions module.
13*6c39e6a8Sdan# Specifically, it tests that tables appear in the correct order
14*6c39e6a8Sdan# within changesets and patchsets.
15*6c39e6a8Sdan#
16*6c39e6a8Sdan
17*6c39e6a8Sdan
18*6c39e6a8Sdan
19*6c39e6a8Sdanif {![info exists testdir]} {
20*6c39e6a8Sdan  set testdir [file join [file dirname [info script]] .. .. test]
21*6c39e6a8Sdan}
22*6c39e6a8Sdansource [file join [file dirname [info script]] session_common.tcl]
23*6c39e6a8Sdansource $testdir/tester.tcl
24*6c39e6a8Sdanifcapable !session {finish_test; return}
25*6c39e6a8Sdanset testprefix sessionF
26*6c39e6a8Sdan
27*6c39e6a8Sdan#
28*6c39e6a8Sdan# Test plan:
29*6c39e6a8Sdan#
30*6c39e6a8Sdan#    1.*: Test that sqlite3session_changeset() and sqlite3session_patchset()
31*6c39e6a8Sdan#         output tables in the right order.
32*6c39e6a8Sdan#
33*6c39e6a8Sdan#    2.*: Test that sqlite3session_invert() does not modify the order of
34*6c39e6a8Sdan#         tables within a changeset.
35*6c39e6a8Sdan#
36*6c39e6a8Sdan#    3.*: Test that sqlite3session_concat outputs tables in the right order.
37*6c39e6a8Sdan#
38*6c39e6a8Sdan
39*6c39e6a8Sdan# Create a db schema to use.
40*6c39e6a8Sdan#
41*6c39e6a8Sdando_execsql_test 1.0 {
42*6c39e6a8Sdan  CREATE TABLE t3(e PRIMARY KEY, f);
43*6c39e6a8Sdan  CREATE TABLE t1(a PRIMARY KEY, b);
44*6c39e6a8Sdan  CREATE TABLE t2(c PRIMARY KEY, d);
45*6c39e6a8Sdan}
46*6c39e6a8Sdan
47*6c39e6a8Sdan#-----------------------------------------------------------------------
48*6c39e6a8Sdan# 1.* - changeset() and patchset().
49*6c39e6a8Sdan#
50*6c39e6a8Sdan
51*6c39e6a8Sdanforeach {tn setup result} {
52*6c39e6a8Sdan  1 {
53*6c39e6a8Sdan    S attach *
54*6c39e6a8Sdan  } {
55*6c39e6a8Sdan    {INSERT t2 0 X. {} {i 2 t two}}
56*6c39e6a8Sdan    {INSERT t1 0 X. {} {i 1 t one}}
57*6c39e6a8Sdan    {INSERT t3 0 X. {} {i 3 t three}}
58*6c39e6a8Sdan  }
59*6c39e6a8Sdan
60*6c39e6a8Sdan  2 {
61*6c39e6a8Sdan    S attach t1
62*6c39e6a8Sdan    S attach *
63*6c39e6a8Sdan  } {
64*6c39e6a8Sdan    {INSERT t1 0 X. {} {i 1 t one}}
65*6c39e6a8Sdan    {INSERT t2 0 X. {} {i 2 t two}}
66*6c39e6a8Sdan    {INSERT t3 0 X. {} {i 3 t three}}
67*6c39e6a8Sdan  }
68*6c39e6a8Sdan
69*6c39e6a8Sdan  3 {
70*6c39e6a8Sdan    S attach t3
71*6c39e6a8Sdan    S attach t2
72*6c39e6a8Sdan    S attach t1
73*6c39e6a8Sdan  } {
74*6c39e6a8Sdan    {INSERT t3 0 X. {} {i 3 t three}}
75*6c39e6a8Sdan    {INSERT t2 0 X. {} {i 2 t two}}
76*6c39e6a8Sdan    {INSERT t1 0 X. {} {i 1 t one}}
77*6c39e6a8Sdan  }
78*6c39e6a8Sdan} {
79*6c39e6a8Sdan  execsql {
80*6c39e6a8Sdan    DELETE FROM t1;
81*6c39e6a8Sdan    DELETE FROM t2;
82*6c39e6a8Sdan    DELETE FROM t3;
83*6c39e6a8Sdan  }
84*6c39e6a8Sdan  sqlite3session S db main
85*6c39e6a8Sdan  eval $setup
86*6c39e6a8Sdan
87*6c39e6a8Sdan  do_execsql_test 1.$tn.1 {
88*6c39e6a8Sdan    INSERT INTO t2 VALUES(2, 'two');
89*6c39e6a8Sdan    INSERT INTO t1 VALUES(1, 'one');
90*6c39e6a8Sdan    INSERT INTO t3 VALUES(3, 'three');
91*6c39e6a8Sdan  }
92*6c39e6a8Sdan
93*6c39e6a8Sdan  do_changeset_test 1.1.$tn.2 S $result
94*6c39e6a8Sdan  do_patchset_test  1.1.$tn.3 S $result
95*6c39e6a8Sdan
96*6c39e6a8Sdan  S delete
97*6c39e6a8Sdan}
98*6c39e6a8Sdan
99*6c39e6a8Sdanforeach {tn setup result} {
100*6c39e6a8Sdan  1 {
101*6c39e6a8Sdan    S attach *
102*6c39e6a8Sdan  } {
103*6c39e6a8Sdan    {INSERT t2 0 X. {} {i 4 t four}}
104*6c39e6a8Sdan    {INSERT t2 0 X. {} {i 5 t five}}
105*6c39e6a8Sdan    {INSERT t1 0 X. {} {i 1 t one}}
106*6c39e6a8Sdan    {INSERT t3 0 X. {} {i 6 t six}}
107*6c39e6a8Sdan  }
108*6c39e6a8Sdan
109*6c39e6a8Sdan  2 {
110*6c39e6a8Sdan    S attach t1
111*6c39e6a8Sdan    S attach *
112*6c39e6a8Sdan  } {
113*6c39e6a8Sdan    {INSERT t1 0 X. {} {i 1 t one}}
114*6c39e6a8Sdan    {INSERT t2 0 X. {} {i 4 t four}}
115*6c39e6a8Sdan    {INSERT t2 0 X. {} {i 5 t five}}
116*6c39e6a8Sdan    {INSERT t3 0 X. {} {i 6 t six}}
117*6c39e6a8Sdan  }
118*6c39e6a8Sdan
119*6c39e6a8Sdan  3 {
120*6c39e6a8Sdan    S attach t3
121*6c39e6a8Sdan    S attach t2
122*6c39e6a8Sdan    S attach t1
123*6c39e6a8Sdan  } {
124*6c39e6a8Sdan    {INSERT t3 0 X. {} {i 6 t six}}
125*6c39e6a8Sdan    {INSERT t2 0 X. {} {i 4 t four}}
126*6c39e6a8Sdan    {INSERT t2 0 X. {} {i 5 t five}}
127*6c39e6a8Sdan    {INSERT t1 0 X. {} {i 1 t one}}
128*6c39e6a8Sdan  }
129*6c39e6a8Sdan} {
130*6c39e6a8Sdan  execsql {
131*6c39e6a8Sdan    DELETE FROM t1;
132*6c39e6a8Sdan    DELETE FROM t2;
133*6c39e6a8Sdan    DELETE FROM t3;
134*6c39e6a8Sdan  }
135*6c39e6a8Sdan  sqlite3session S db main
136*6c39e6a8Sdan  eval $setup
137*6c39e6a8Sdan
138*6c39e6a8Sdan  do_execsql_test 1.$tn.1 {
139*6c39e6a8Sdan    INSERT INTO t2 VALUES(2, 'two');
140*6c39e6a8Sdan    INSERT INTO t1 VALUES(1, 'one');
141*6c39e6a8Sdan    DELETE FROM t2;
142*6c39e6a8Sdan    INSERT INTO t2 VALUES(4, 'four');
143*6c39e6a8Sdan    INSERT INTO t2 VALUES(5, 'five');
144*6c39e6a8Sdan    INSERT INTO t3 VALUES(6, 'six');
145*6c39e6a8Sdan  }
146*6c39e6a8Sdan
147*6c39e6a8Sdan  do_changeset_test 1.2.$tn.2 S $result
148*6c39e6a8Sdan  do_patchset_test 1.2.$tn.2 S $result
149*6c39e6a8Sdan
150*6c39e6a8Sdan  S delete
151*6c39e6a8Sdan}
152*6c39e6a8Sdan
153*6c39e6a8Sdan#-------------------------------------------------------------------------
154*6c39e6a8Sdan# 2.* - invert()
155*6c39e6a8Sdan#
156*6c39e6a8Sdan
157*6c39e6a8Sdanforeach {tn setup result} {
158*6c39e6a8Sdan  1 {
159*6c39e6a8Sdan    S attach *
160*6c39e6a8Sdan  } {
161*6c39e6a8Sdan    {DELETE t2 0 X. {i 4 t four} {}}
162*6c39e6a8Sdan    {DELETE t2 0 X. {i 5 t five} {}}
163*6c39e6a8Sdan    {DELETE t1 0 X. {i 1 t one} {}}
164*6c39e6a8Sdan    {DELETE t3 0 X. {i 6 t six} {}}
165*6c39e6a8Sdan  }
166*6c39e6a8Sdan
167*6c39e6a8Sdan  2 {
168*6c39e6a8Sdan    S attach t1
169*6c39e6a8Sdan    S attach *
170*6c39e6a8Sdan  } {
171*6c39e6a8Sdan    {DELETE t1 0 X. {i 1 t one} {}}
172*6c39e6a8Sdan    {DELETE t2 0 X. {i 4 t four} {}}
173*6c39e6a8Sdan    {DELETE t2 0 X. {i 5 t five} {}}
174*6c39e6a8Sdan    {DELETE t3 0 X. {i 6 t six} {}}
175*6c39e6a8Sdan  }
176*6c39e6a8Sdan
177*6c39e6a8Sdan  3 {
178*6c39e6a8Sdan    S attach t3
179*6c39e6a8Sdan    S attach t2
180*6c39e6a8Sdan    S attach t1
181*6c39e6a8Sdan  } {
182*6c39e6a8Sdan    {DELETE t3 0 X. {i 6 t six} {}}
183*6c39e6a8Sdan    {DELETE t2 0 X. {i 4 t four} {}}
184*6c39e6a8Sdan    {DELETE t2 0 X. {i 5 t five} {}}
185*6c39e6a8Sdan    {DELETE t1 0 X. {i 1 t one} {}}
186*6c39e6a8Sdan  }
187*6c39e6a8Sdan} {
188*6c39e6a8Sdan  execsql {
189*6c39e6a8Sdan    DELETE FROM t1;
190*6c39e6a8Sdan    DELETE FROM t2;
191*6c39e6a8Sdan    DELETE FROM t3;
192*6c39e6a8Sdan  }
193*6c39e6a8Sdan  sqlite3session S db main
194*6c39e6a8Sdan  eval $setup
195*6c39e6a8Sdan
196*6c39e6a8Sdan  do_execsql_test 1.$tn.1 {
197*6c39e6a8Sdan    INSERT INTO t2 VALUES(2, 'two');
198*6c39e6a8Sdan    INSERT INTO t1 VALUES(1, 'one');
199*6c39e6a8Sdan    DELETE FROM t2;
200*6c39e6a8Sdan    INSERT INTO t2 VALUES(4, 'four');
201*6c39e6a8Sdan    INSERT INTO t2 VALUES(5, 'five');
202*6c39e6a8Sdan    INSERT INTO t3 VALUES(6, 'six');
203*6c39e6a8Sdan  }
204*6c39e6a8Sdan
205*6c39e6a8Sdan  do_changeset_invert_test 2.$tn.2 S $result
206*6c39e6a8Sdan
207*6c39e6a8Sdan  S delete
208*6c39e6a8Sdan}
209*6c39e6a8Sdan
210*6c39e6a8Sdan#-------------------------------------------------------------------------
211*6c39e6a8Sdan# 3.* - concat()
212*6c39e6a8Sdan#
213*6c39e6a8Sdanforeach {tn setup1 sql1 setup2 sql2 result} {
214*6c39e6a8Sdan  1 {
215*6c39e6a8Sdan    S attach *
216*6c39e6a8Sdan  } {
217*6c39e6a8Sdan    INSERT INTO t1 VALUES(1, 'one');
218*6c39e6a8Sdan    INSERT INTO t2 VALUES(2, 'two');
219*6c39e6a8Sdan  } {
220*6c39e6a8Sdan    S attach t2
221*6c39e6a8Sdan    S attach t1
222*6c39e6a8Sdan  } {
223*6c39e6a8Sdan    INSERT INTO t1 VALUES(3, 'three');
224*6c39e6a8Sdan    INSERT INTO t2 VALUES(4, 'four');
225*6c39e6a8Sdan  } {
226*6c39e6a8Sdan    {INSERT t1 0 X. {} {i 1 t one}}
227*6c39e6a8Sdan    {INSERT t1 0 X. {} {i 3 t three}}
228*6c39e6a8Sdan    {INSERT t2 0 X. {} {i 2 t two}}
229*6c39e6a8Sdan    {INSERT t2 0 X. {} {i 4 t four}}
230*6c39e6a8Sdan  }
231*6c39e6a8Sdan
232*6c39e6a8Sdan  1 {
233*6c39e6a8Sdan    S attach t2
234*6c39e6a8Sdan    S attach t1
235*6c39e6a8Sdan  } {
236*6c39e6a8Sdan    INSERT INTO t1 VALUES(1, 'one');
237*6c39e6a8Sdan    INSERT INTO t2 VALUES(2, 'two');
238*6c39e6a8Sdan  } {
239*6c39e6a8Sdan    S attach *
240*6c39e6a8Sdan  } {
241*6c39e6a8Sdan    INSERT INTO t1 VALUES(3, 'three');
242*6c39e6a8Sdan    INSERT INTO t2 VALUES(4, 'four');
243*6c39e6a8Sdan  } {
244*6c39e6a8Sdan    {INSERT t2 0 X. {} {i 2 t two}}
245*6c39e6a8Sdan    {INSERT t2 0 X. {} {i 4 t four}}
246*6c39e6a8Sdan    {INSERT t1 0 X. {} {i 1 t one}}
247*6c39e6a8Sdan    {INSERT t1 0 X. {} {i 3 t three}}
248*6c39e6a8Sdan  }
249*6c39e6a8Sdan
250*6c39e6a8Sdan  1 {
251*6c39e6a8Sdan    S attach *
252*6c39e6a8Sdan  } {
253*6c39e6a8Sdan    INSERT INTO t2 VALUES(2, 'two');
254*6c39e6a8Sdan  } {
255*6c39e6a8Sdan    S attach *
256*6c39e6a8Sdan  } {
257*6c39e6a8Sdan    INSERT INTO t1 VALUES(3, 'three');
258*6c39e6a8Sdan    INSERT INTO t2 VALUES(4, 'four');
259*6c39e6a8Sdan    INSERT INTO t3 VALUES(5, 'five');
260*6c39e6a8Sdan  } {
261*6c39e6a8Sdan    {INSERT t2 0 X. {} {i 2 t two}}
262*6c39e6a8Sdan    {INSERT t2 0 X. {} {i 4 t four}}
263*6c39e6a8Sdan    {INSERT t1 0 X. {} {i 3 t three}}
264*6c39e6a8Sdan    {INSERT t3 0 X. {} {i 5 t five}}
265*6c39e6a8Sdan  }
266*6c39e6a8Sdan
267*6c39e6a8Sdan} {
268*6c39e6a8Sdan  execsql {
269*6c39e6a8Sdan    DELETE FROM t1;
270*6c39e6a8Sdan    DELETE FROM t2;
271*6c39e6a8Sdan    DELETE FROM t3;
272*6c39e6a8Sdan  }
273*6c39e6a8Sdan  sqlite3session S db main
274*6c39e6a8Sdan  eval $setup1
275*6c39e6a8Sdan  execsql $sql1
276*6c39e6a8Sdan  set c1 [S changeset]
277*6c39e6a8Sdan  S delete
278*6c39e6a8Sdan
279*6c39e6a8Sdan  sqlite3session S db main
280*6c39e6a8Sdan  eval $setup2
281*6c39e6a8Sdan  execsql $sql2
282*6c39e6a8Sdan  set c2 [S changeset]
283*6c39e6a8Sdan  S delete
284*6c39e6a8Sdan
285*6c39e6a8Sdan  set res [list]
286*6c39e6a8Sdan  sqlite3session_foreach x [sqlite3changeset_concat $c1 $c2] {
287*6c39e6a8Sdan    lappend res $x
288*6c39e6a8Sdan  }
289*6c39e6a8Sdan
290*6c39e6a8Sdan  do_test 3.$tn { set res } [list {*}$result]
291*6c39e6a8Sdan}
292*6c39e6a8Sdan
293*6c39e6a8Sdan
294*6c39e6a8Sdanfinish_test
295