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