modernc.org/cc@v1.0.1/v2/testdata/_sqlite/ext/session/session3.test (about) 1 # 2011 March 24 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. More 12 # specifically, it focuses on testing the session modules response to 13 # database schema modifications and mismatches. 14 # 15 16 if {![info exists testdir]} { 17 set testdir [file join [file dirname [info script]] .. .. test] 18 } 19 source [file join [file dirname [info script]] session_common.tcl] 20 source $testdir/tester.tcl 21 ifcapable !session {finish_test; return} 22 23 set testprefix session3 24 25 #------------------------------------------------------------------------- 26 # These tests - session3-1.* - verify that the session module behaves 27 # correctly when confronted with a schema mismatch when applying a 28 # changeset (in function sqlite3changeset_apply()). 29 # 30 # session3-1.1.*: Table does not exist in target db. 31 # session3-1.2.*: Table has wrong number of columns in target db. 32 # session3-1.3.*: Table has wrong PK columns in target db. 33 # 34 db close 35 sqlite3_shutdown 36 test_sqlite3_log log 37 sqlite3 db test.db 38 39 proc log {code msg} { lappend ::log $code $msg } 40 41 forcedelete test.db2 42 sqlite3 db2 test.db2 43 44 do_execsql_test 1.0 { 45 CREATE TABLE t1(a PRIMARY KEY, b); 46 } 47 do_test 1.1 { 48 set ::log {} 49 do_then_apply_sql { 50 INSERT INTO t1 VALUES(1, 2); 51 INSERT INTO t1 VALUES(3, 4); 52 } 53 set ::log 54 } {SQLITE_SCHEMA {sqlite3changeset_apply(): no such table: t1}} 55 56 do_test 1.2.0 { 57 execsql { CREATE TABLE t1(a PRIMARY KEY, b, c) } db2 58 } {} 59 do_test 1.2.1 { 60 set ::log {} 61 do_then_apply_sql { 62 INSERT INTO t1 VALUES(5, 6); 63 INSERT INTO t1 VALUES(7, 8); 64 } 65 set ::log 66 } {} 67 do_test 1.2.2 { 68 db2 eval { SELECT * FROM t1 } 69 } {5 6 {} 7 8 {}} 70 71 do_test 1.3.0 { 72 execsql { 73 DROP TABLE t1; 74 CREATE TABLE t1(a, b PRIMARY KEY); 75 } db2 76 } {} 77 do_test 1.3.1 { 78 set ::log {} 79 do_then_apply_sql { 80 INSERT INTO t1 VALUES(9, 10); 81 INSERT INTO t1 VALUES(11, 12); 82 } 83 set ::log 84 } {SQLITE_SCHEMA {sqlite3changeset_apply(): primary key mismatch for table t1}} 85 86 #------------------------------------------------------------------------- 87 # These tests - session3-2.* - verify that the session module behaves 88 # correctly when the schema of an attached table is modified during the 89 # session. 90 # 91 # session3-2.1.*: Table is dropped midway through the session. 92 # session3-2.2.*: Table is dropped and recreated with a different # cols. 93 # session3-2.3.*: Table is dropped and recreated with a different PK. 94 # 95 # In all of these scenarios, the call to sqlite3session_changeset() will 96 # return SQLITE_SCHEMA. Also: 97 # 98 # session3-2.4.*: Table is dropped and recreated with an identical schema. 99 # In this case sqlite3session_changeset() returns SQLITE_OK. 100 # 101 102 do_test 2.1 { 103 execsql { CREATE TABLE t2(a, b PRIMARY KEY) } 104 sqlite3session S db main 105 S attach t2 106 execsql { 107 INSERT INTO t2 VALUES(1, 2); 108 DROP TABLE t2; 109 } 110 list [catch { S changeset } msg] $msg 111 } {1 SQLITE_SCHEMA} 112 113 do_test 2.2.1 { 114 S delete 115 sqlite3session S db main 116 execsql { CREATE TABLE t2(a, b PRIMARY KEY, c) } 117 S attach t2 118 execsql { 119 INSERT INTO t2 VALUES(1, 2, 3); 120 DROP TABLE t2; 121 CREATE TABLE t2(a, b PRIMARY KEY); 122 } 123 list [catch { S changeset } msg] $msg 124 } {1 SQLITE_SCHEMA} 125 do_test 2.2.2 { 126 S delete 127 sqlite3session S db main 128 execsql { 129 DROP TABLE t2; 130 CREATE TABLE t2(a, b PRIMARY KEY, c); 131 } 132 S attach t2 133 execsql { 134 INSERT INTO t2 VALUES(1, 2, 3); 135 DROP TABLE t2; 136 CREATE TABLE t2(a, b PRIMARY KEY, c, d); 137 } 138 list [catch { S changeset } msg] $msg 139 } {1 SQLITE_SCHEMA} 140 do_test 2.2.3 { 141 S delete 142 sqlite3session S db main 143 execsql { 144 DROP TABLE t2; 145 CREATE TABLE t2(a, b PRIMARY KEY, c); 146 } 147 S attach t2 148 execsql { 149 INSERT INTO t2 VALUES(1, 2, 3); 150 DROP TABLE t2; 151 CREATE TABLE t2(a, b PRIMARY KEY); 152 INSERT INTO t2 VALUES(4, 5); 153 } 154 list [catch { S changeset } msg] $msg 155 } {1 SQLITE_SCHEMA} 156 do_test 2.2.4 { 157 S delete 158 sqlite3session S db main 159 execsql { 160 DROP TABLE t2; 161 CREATE TABLE t2(a, b PRIMARY KEY, c); 162 } 163 S attach t2 164 execsql { 165 INSERT INTO t2 VALUES(1, 2, 3); 166 DROP TABLE t2; 167 CREATE TABLE t2(a, b PRIMARY KEY, c, d); 168 INSERT INTO t2 VALUES(4, 5, 6, 7); 169 } 170 list [catch { S changeset } msg] $msg 171 } {1 SQLITE_SCHEMA} 172 173 do_test 2.3 { 174 S delete 175 sqlite3session S db main 176 execsql { 177 DROP TABLE t2; 178 CREATE TABLE t2(a, b PRIMARY KEY); 179 } 180 S attach t2 181 execsql { 182 INSERT INTO t2 VALUES(1, 2); 183 DROP TABLE t2; 184 CREATE TABLE t2(a PRIMARY KEY, b); 185 } 186 list [catch { S changeset } msg] $msg 187 } {1 SQLITE_SCHEMA} 188 189 do_test 2.4 { 190 S delete 191 sqlite3session S db main 192 execsql { 193 DROP TABLE t2; 194 CREATE TABLE t2(a, b PRIMARY KEY); 195 } 196 S attach t2 197 execsql { 198 INSERT INTO t2 VALUES(1, 2); 199 DROP TABLE t2; 200 CREATE TABLE t2(a, b PRIMARY KEY); 201 } 202 list [catch { S changeset } msg] $msg 203 } {0 {}} 204 205 S delete 206 207 208 catch { db close } 209 catch { db2 close } 210 sqlite3_shutdown 211 test_sqlite3_log 212 sqlite3_initialize 213 214 finish_test