xref: /sqlite-3.40.0/ext/session/sessionC.test (revision abae0c4f)
1# 2014 August 16
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#
12#
13
14if {![info exists testdir]} {
15  set testdir [file join [file dirname [info script]] .. .. test]
16}
17source [file join [file dirname [info script]] session_common.tcl]
18source $testdir/tester.tcl
19ifcapable !session {finish_test; return}
20
21set testprefix sessionC
22
23#-------------------------------------------------------------------------
24# Test the outcome of a DELETE operation made as part of applying a
25# changeset failing with SQLITE_CONSTRAINT. This may happen if an
26# ON DELETE RESTRICT foreign key action is triggered, or if a trigger
27# program raises a constraint somehow.
28#
29do_execsql_test 1.0 {
30  PRAGMA foreign_keys = 1;
31
32  CREATE TABLE p(a PRIMARY KEY, b, c);
33  CREATE TABLE c(d PRIMARY KEY, e REFERENCES p ON DELETE RESTRICT);
34
35  INSERT INTO p VALUES('one', 1, 1);
36  INSERT INTO p VALUES('two', 2, 2);
37  INSERT INTO p VALUES('three', 3, 3);
38
39  INSERT INTO c VALUES(1, 'one');
40  INSERT INTO c VALUES(3, 'three');
41}
42
43do_test 1.1 {
44  execsql BEGIN
45  set C [changeset_from_sql {
46    INSERT INTO c VALUES(4, 'one');
47    DELETE FROM p WHERE a='two';
48  }]
49  execsql ROLLBACK
50  execsql {
51    INSERT INTO c VALUES(2, 'two');
52  }
53} {}
54
55do_test 1.2.1 {
56  proc xConflict {args} { return "ABORT" }
57  catch { sqlite3changeset_apply db $C xConflict } msg
58  set msg
59} {SQLITE_ABORT}
60do_execsql_test 1.2.2 { SELECT * FROM c } {1 one 3 three 2 two}
61
62do_test 1.3.1 {
63  proc xConflict {args} { return "OMIT" }
64  catch { sqlite3changeset_apply db $C xConflict } msg
65  set msg
66} {}
67do_execsql_test 1.3.2 { SELECT * FROM c } {1 one 3 three 2 two 4 one}
68do_execsql_test 1.3.3 {
69  SELECT * FROM p;
70} {one 1 1 two 2 2 three 3 3}
71
72
73#-------------------------------------------------------------------------
74# Test that concatenating a changeset with a patchset does not work.
75# Any attempt to do so returns SQLITE_ERROR.
76#
77reset_db
78do_execsql_test 2.0 {
79  CREATE TABLE x1(t, v PRIMARY KEY);
80  INSERT INTO x1 VALUES(12, 55);
81  INSERT INTO x1 VALUES(55, 14);
82}
83
84do_test 2.1 {
85  execsql BEGIN
86
87  sqlite3session S1 db main
88  S1 attach *
89  execsql {
90    UPDATE x1 SET t=13 WHERE v=55;
91    INSERT INTO x1 VALUES(99, 123);
92  }
93  set patchset [S1 patchset]
94  S1 delete
95
96  sqlite3session S1 db main
97  S1 attach *
98  execsql {
99    UPDATE x1 SET t=56 WHERE v=14;
100    INSERT INTO x1 VALUES(22, 998);
101  }
102  set changeset [S1 changeset]
103  S1 delete
104
105  execsql ROLLBACK
106} {}
107
108do_test 2.2 {
109  set rc [catch { sqlite3changeset_concat $patchset $changeset } msg]
110  list $rc $msg
111} {1 SQLITE_ERROR}
112
113do_test 2.3 {
114  set rc [catch { sqlite3changeset_concat $changeset $patchset } msg]
115  list $rc $msg
116} {1 SQLITE_ERROR}
117
118do_test 2.4 {
119  set rc [catch { sqlite3changeset_concat {} $patchset } msg]
120  list $rc $msg
121} [list 0 $patchset]
122
123do_test 2.5 {
124  set rc [catch { sqlite3changeset_concat $patchset {} } msg]
125  list $rc $msg
126} [list 0 $patchset]
127
128do_test 2.6 {
129  set rc [catch { sqlite3changeset_concat {} $changeset } msg]
130  list $rc $msg
131} [list 0 $changeset]
132
133do_test 2.7 {
134  set rc [catch { sqlite3changeset_concat $changeset {} } msg]
135  list $rc $msg
136} [list 0 $changeset]
137
138do_test 2.8 {
139  set rc [catch { sqlite3changeset_concat {} {} } msg]
140  list $rc $msg
141} [list 0 {}]
142
143
144#-------------------------------------------------------------------------
145# Test that the xFilter argument to sqlite3changeset_apply() works.
146#
147reset_db
148do_execsql_test 3.0 {
149  CREATE TABLE t1(a PRIMARY KEY, b);
150  CREATE TABLE t2(a PRIMARY KEY, b);
151  CREATE TABLE t3(a PRIMARY KEY, b);
152}
153do_test 3.1 {
154  execsql BEGIN
155  set changeset [changeset_from_sql {
156    INSERT INTO t1 VALUES(1, 1);
157    INSERT INTO t2 VALUES(2, 2);
158    INSERT INTO t3 VALUES(3, 3);
159  }]
160  execsql ROLLBACK
161} {}
162do_test 3.2 {
163  proc xFilter {zName} {
164    if {$zName == "t1"} { return 1 }
165    return 0
166  }
167  sqlite3changeset_apply db $changeset noop xFilter
168  execsql {
169    SELECT * FROM t1;
170    SELECT * FROM t2;
171    SELECT * FROM t3;
172  }
173} {1 1}
174do_test 3.3 {
175  proc xFilter {zName} {
176    if {$zName == "t3"} { return 1 }
177    return 0
178  }
179  sqlite3changeset_apply db $changeset noop xFilter
180  execsql {
181    SELECT * FROM t1;
182    SELECT * FROM t2;
183    SELECT * FROM t3;
184  }
185} {1 1 3 3}
186
187
188
189finish_test
190
191