xref: /sqlite-3.40.0/ext/session/session5.test (revision 6cda207f)
1# 2011 April 13
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# This file implements regression tests for the session module.
12# Specifically, for the sqlite3changeset_concat() command.
13#
14
15if {![info exists testdir]} {
16  set testdir [file join [file dirname [info script]] .. .. test]
17}
18source [file join [file dirname [info script]] session_common.tcl]
19source $testdir/tester.tcl
20ifcapable !session {finish_test; return}
21
22set testprefix session5
23
24# Organization of tests:
25#
26#   session5-1.*: Simple tests to check the concat() function produces
27#                 correct results.
28#
29#   session5-2.*: More complicated tests.
30#
31#   session5-3.*: Schema mismatch errors.
32#
33
34proc changeset_to_list {c} {
35  set list [list]
36  sqlite3session_foreach elem $c { lappend list $elem }
37  lsort $list
38}
39
40proc do_concat_test {tn args} {
41
42  set subtest 0
43  foreach sql $args {
44    incr subtest
45    sqlite3session S db main ; S attach *
46    execsql $sql
47
48    set c [S changeset]
49    if {[info commands s_prev] != ""} {
50      set c_concat [sqlite3changeset_concat $c_prev $c]
51      set c_two [s_prev changeset]
52      s_prev delete
53
54      set h_concat [changeset_to_list $c_concat]
55      set h_two [changeset_to_list $c_two]
56
57      do_test $tn.$subtest [list set {} $h_concat] $h_two
58    }
59    set c_prev $c
60    rename S s_prev
61  }
62
63  catch { s_prev delete }
64}
65
66do_execsql_test 1.0 {
67  CREATE TABLE t1(a PRIMARY KEY, b);
68}
69
70do_concat_test 1.1.1 {
71  INSERT INTO t1 VALUES(1, 'one');
72} {
73  INSERT INTO t1 VALUES(2, 'two');
74}
75
76do_concat_test 1.1.2 {
77  UPDATE t1 SET b = 'five' WHERE a = 1;
78} {
79  UPDATE t1 SET b = 'six' WHERE a = 2;
80}
81
82do_concat_test 1.1.3 {
83  DELETE FROM t1 WHERE a = 1;
84} {
85  DELETE FROM t1 WHERE a = 2;
86}
87
88
89# 1.2.1:    INSERT + DELETE                     -> (none)
90# 1.2.2:    INSERT + UPDATE                     -> INSERT
91#
92# 1.2.3:    DELETE + INSERT (matching data)     -> (none)
93# 1.2.4:    DELETE + INSERT (non-matching data) -> UPDATE
94#
95# 1.2.5:    UPDATE + UPDATE (matching data)     -> (none)
96# 1.2.6:    UPDATE + UPDATE (non-matching data) -> UPDATE
97# 1.2.7:    UPDATE + DELETE                     -> DELETE
98#
99do_concat_test 1.2.1 {
100  INSERT INTO t1 VALUES('x', 'y');
101} {
102  DELETE FROM t1 WHERE a = 'x';
103}
104do_concat_test 1.2.2 {
105  INSERT INTO t1 VALUES(5.0, 'five');
106} {
107  UPDATE t1 SET b = 'six' WHERE a = 5.0;
108}
109
110do_execsql_test 1.2.3.1 "INSERT INTO t1 VALUES('I', 'one')"
111do_concat_test 1.2.3.2 {
112  DELETE FROM t1 WHERE a = 'I';
113} {
114  INSERT INTO t1 VALUES('I', 'one');
115}
116do_concat_test 1.2.4 {
117  DELETE FROM t1 WHERE a = 'I';
118} {
119  INSERT INTO t1 VALUES('I', 'two');
120}
121do_concat_test 1.2.5 {
122  UPDATE t1 SET b = 'five' WHERE a = 'I';
123} {
124  UPDATE t1 SET b = 'two' WHERE a = 'I';
125}
126do_concat_test 1.2.6 {
127  UPDATE t1 SET b = 'six' WHERE a = 'I';
128} {
129  UPDATE t1 SET b = 'seven' WHERE a = 'I';
130}
131do_concat_test 1.2.7 {
132  UPDATE t1 SET b = 'eight' WHERE a = 'I';
133} {
134  DELETE FROM t1 WHERE a = 'I';
135}
136
137db function indirect indirect
138proc indirect {{x -1}} {
139  S indirect $x
140  s_prev indirect $x
141}
142
143do_concat_test 2.1 {
144  CREATE TABLE abc(a, b, c PRIMARY KEY);
145  INSERT INTO abc VALUES(NULL, NULL, 1);
146  INSERT INTO abc VALUES('abcdefghijkl', NULL, 2);
147} {
148  DELETE FROM abc WHERE c = 1;
149  UPDATE abc SET c = 1 WHERE c = 2;
150} {
151  INSERT INTO abc VALUES('abcdefghijkl', NULL, 2);
152  INSERT INTO abc VALUES(1.0, 2.0, 3);
153} {
154  UPDATE abc SET a = a-1;
155} {
156  CREATE TABLE def(d, e, f, PRIMARY KEY(e, f));
157  INSERT INTO def VALUES('x', randomblob(11000), 67);
158  INSERT INTO def SELECT d, e, f+1 FROM def;
159  INSERT INTO def SELECT d, e, f+2 FROM def;
160  INSERT INTO def SELECT d, e, f+4 FROM def;
161} {
162  DELETE FROM def WHERE rowid>4;
163} {
164  INSERT INTO def SELECT d, e, f+4 FROM def;
165} {
166  INSERT INTO abc VALUES(22, 44, -1);
167} {
168  UPDATE abc SET c=-2 WHERE c=-1;
169  UPDATE abc SET c=-3 WHERE c=-2;
170} {
171  UPDATE abc SET c=-4 WHERE c=-3;
172} {
173  UPDATE abc SET a=a+1 WHERE c=-3;
174  UPDATE abc SET a=a+1 WHERE c=-3;
175} {
176  UPDATE abc SET a=a+1 WHERE c=-3;
177  UPDATE abc SET a=a+1 WHERE c=-3;
178} {
179  INSERT INTO abc VALUES('one', 'two', 'three');
180} {
181  SELECT indirect(1);
182  UPDATE abc SET a='one point five' WHERE c = 'three';
183} {
184  SELECT indirect(0);
185  UPDATE abc SET a='one point six' WHERE c = 'three';
186}
187
188finish_test
189