Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(66)

Side by Side Diff: third_party/sqlite/src/test/fkey2.test

Issue 901033002: Import SQLite 3.8.7.4. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Chromium changes to support SQLite 3.8.7.4. Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 # 2009 September 15 1 # 2009 September 15
2 # 2 #
3 # The author disclaims copyright to this source code. In place of 3 # The author disclaims copyright to this source code. In place of
4 # a legal notice, here is a blessing: 4 # a legal notice, here is a blessing:
5 # 5 #
6 # May you do good and not evil. 6 # May you do good and not evil.
7 # May you find forgiveness for yourself and forgive others. 7 # May you find forgiveness for yourself and forgive others.
8 # May you share freely, never taking more than you give. 8 # May you share freely, never taking more than you give.
9 # 9 #
10 #*********************************************************************** 10 #***********************************************************************
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
97 97
98 CREATE TABLE t7(a, b INTEGER PRIMARY KEY); 98 CREATE TABLE t7(a, b INTEGER PRIMARY KEY);
99 CREATE TABLE t8(c REFERENCES t7 /D/, d); 99 CREATE TABLE t8(c REFERENCES t7 /D/, d);
100 100
101 CREATE TABLE t9(a REFERENCES nosuchtable, b); 101 CREATE TABLE t9(a REFERENCES nosuchtable, b);
102 CREATE TABLE t10(a REFERENCES t9(c) /D/, b); 102 CREATE TABLE t10(a REFERENCES t9(c) /D/, b);
103 } 103 }
104 104
105 105
106 set FkeySimpleTests { 106 set FkeySimpleTests {
107 1.1 "INSERT INTO t2 VALUES(1, 3)" {1 {foreign key constraint failed}} 107 1.1 "INSERT INTO t2 VALUES(1, 3)" {1 {FOREIGN KEY constraint failed}}
108 1.2 "INSERT INTO t1 VALUES(1, 2)" {0 {}} 108 1.2 "INSERT INTO t1 VALUES(1, 2)" {0 {}}
109 1.3 "INSERT INTO t2 VALUES(1, 3)" {0 {}} 109 1.3 "INSERT INTO t2 VALUES(1, 3)" {0 {}}
110 1.4 "INSERT INTO t2 VALUES(2, 4)" {1 {foreign key constraint failed}} 110 1.4 "INSERT INTO t2 VALUES(2, 4)" {1 {FOREIGN KEY constraint failed}}
111 1.5 "INSERT INTO t2 VALUES(NULL, 4)" {0 {}} 111 1.5 "INSERT INTO t2 VALUES(NULL, 4)" {0 {}}
112 1.6 "UPDATE t2 SET c=2 WHERE d=4" {1 {foreign key constraint failed}} 112 1.6 "UPDATE t2 SET c=2 WHERE d=4" {1 {FOREIGN KEY constraint failed}}
113 1.7 "UPDATE t2 SET c=1 WHERE d=4" {0 {}} 113 1.7 "UPDATE t2 SET c=1 WHERE d=4" {0 {}}
114 1.9 "UPDATE t2 SET c=1 WHERE d=4" {0 {}} 114 1.9 "UPDATE t2 SET c=1 WHERE d=4" {0 {}}
115 1.10 "UPDATE t2 SET c=NULL WHERE d=4" {0 {}} 115 1.10 "UPDATE t2 SET c=NULL WHERE d=4" {0 {}}
116 1.11 "DELETE FROM t1 WHERE a=1" {1 {foreign key constraint failed}} 116 1.11 "DELETE FROM t1 WHERE a=1" {1 {FOREIGN KEY constraint failed}}
117 1.12 "UPDATE t1 SET a = 2" {1 {foreign key constraint failed}} 117 1.12 "UPDATE t1 SET a = 2" {1 {FOREIGN KEY constraint failed}}
118 1.13 "UPDATE t1 SET a = 1" {0 {}} 118 1.13 "UPDATE t1 SET a = 1" {0 {}}
119 119
120 2.1 "INSERT INTO t4 VALUES(1, 3)" {1 {foreign key constraint failed}} 120 2.1 "INSERT INTO t4 VALUES(1, 3)" {1 {FOREIGN KEY constraint failed}}
121 2.2 "INSERT INTO t3 VALUES(1, 2)" {0 {}} 121 2.2 "INSERT INTO t3 VALUES(1, 2)" {0 {}}
122 2.3 "INSERT INTO t4 VALUES(1, 3)" {0 {}} 122 2.3 "INSERT INTO t4 VALUES(1, 3)" {0 {}}
123 123
124 4.1 "INSERT INTO t8 VALUES(1, 3)" {1 {foreign key constraint failed}} 124 4.1 "INSERT INTO t8 VALUES(1, 3)" {1 {FOREIGN KEY constraint failed}}
125 4.2 "INSERT INTO t7 VALUES(2, 1)" {0 {}} 125 4.2 "INSERT INTO t7 VALUES(2, 1)" {0 {}}
126 4.3 "INSERT INTO t8 VALUES(1, 3)" {0 {}} 126 4.3 "INSERT INTO t8 VALUES(1, 3)" {0 {}}
127 4.4 "INSERT INTO t8 VALUES(2, 4)" {1 {foreign key constraint failed}} 127 4.4 "INSERT INTO t8 VALUES(2, 4)" {1 {FOREIGN KEY constraint failed}}
128 4.5 "INSERT INTO t8 VALUES(NULL, 4)" {0 {}} 128 4.5 "INSERT INTO t8 VALUES(NULL, 4)" {0 {}}
129 4.6 "UPDATE t8 SET c=2 WHERE d=4" {1 {foreign key constraint failed}} 129 4.6 "UPDATE t8 SET c=2 WHERE d=4" {1 {FOREIGN KEY constraint failed}}
130 4.7 "UPDATE t8 SET c=1 WHERE d=4" {0 {}} 130 4.7 "UPDATE t8 SET c=1 WHERE d=4" {0 {}}
131 4.9 "UPDATE t8 SET c=1 WHERE d=4" {0 {}} 131 4.9 "UPDATE t8 SET c=1 WHERE d=4" {0 {}}
132 4.10 "UPDATE t8 SET c=NULL WHERE d=4" {0 {}} 132 4.10 "UPDATE t8 SET c=NULL WHERE d=4" {0 {}}
133 4.11 "DELETE FROM t7 WHERE b=1" {1 {foreign key constraint failed}} 133 4.11 "DELETE FROM t7 WHERE b=1" {1 {FOREIGN KEY constraint failed}}
134 4.12 "UPDATE t7 SET b = 2" {1 {foreign key constraint failed}} 134 4.12 "UPDATE t7 SET b = 2" {1 {FOREIGN KEY constraint failed}}
135 4.13 "UPDATE t7 SET b = 1" {0 {}} 135 4.13 "UPDATE t7 SET b = 1" {0 {}}
136 4.14 "INSERT INTO t8 VALUES('a', 'b')" {1 {foreign key constraint failed}} 136 4.14 "INSERT INTO t8 VALUES('a', 'b')" {1 {FOREIGN KEY constraint failed}}
137 4.15 "UPDATE t7 SET b = 5" {1 {foreign key constraint failed}} 137 4.15 "UPDATE t7 SET b = 5" {1 {FOREIGN KEY constraint failed}}
138 4.16 "UPDATE t7 SET rowid = 5" {1 {foreign key constraint failed}} 138 4.16 "UPDATE t7 SET rowid = 5" {1 {FOREIGN KEY constraint failed}}
139 4.17 "UPDATE t7 SET a = 10" {0 {}} 139 4.17 "UPDATE t7 SET a = 10" {0 {}}
140 140
141 5.1 "INSERT INTO t9 VALUES(1, 3)" {1 {no such table: main.nosuchtable}} 141 5.1 "INSERT INTO t9 VALUES(1, 3)" {1 {no such table: main.nosuchtable}}
142 5.2 "INSERT INTO t10 VALUES(1, 3)" {1 {foreign key mismatch}} 142 5.2 "INSERT INTO t10 VALUES(1, 3)"
143 {1 {foreign key mismatch - "t10" referencing "t9"}}
143 } 144 }
144 145
145 do_test fkey2-1.1.0 { 146 do_test fkey2-1.1.0 {
146 execsql [string map {/D/ {}} $FkeySimpleSchema] 147 execsql [string map {/D/ {}} $FkeySimpleSchema]
147 } {} 148 } {}
148 foreach {tn zSql res} $FkeySimpleTests { 149 foreach {tn zSql res} $FkeySimpleTests {
149 do_test fkey2-1.1.$tn { catchsql $zSql } $res 150 do_test fkey2-1.1.$tn.1 { catchsql $zSql } $res
151 do_test fkey2-1.1.$tn.2 { execsql {PRAGMA foreign_key_check(t1)} } {}
152 do_test fkey2-1.1.$tn.3 { execsql {PRAGMA foreign_key_check(t2)} } {}
153 do_test fkey2-1.1.$tn.4 { execsql {PRAGMA foreign_key_check(t3)} } {}
154 do_test fkey2-1.1.$tn.5 { execsql {PRAGMA foreign_key_check(t4)} } {}
155 do_test fkey2-1.1.$tn.6 { execsql {PRAGMA foreign_key_check(t7)} } {}
156 do_test fkey2-1.1.$tn.7 { execsql {PRAGMA foreign_key_check(t8)} } {}
150 } 157 }
151 drop_all_tables 158 drop_all_tables
152 159
153 do_test fkey2-1.2.0 { 160 do_test fkey2-1.2.0 {
154 execsql [string map {/D/ {DEFERRABLE INITIALLY DEFERRED}} $FkeySimpleSchema] 161 execsql [string map {/D/ {DEFERRABLE INITIALLY DEFERRED}} $FkeySimpleSchema]
155 } {} 162 } {}
156 foreach {tn zSql res} $FkeySimpleTests { 163 foreach {tn zSql res} $FkeySimpleTests {
157 do_test fkey2-1.2.$tn { catchsql $zSql } $res 164 do_test fkey2-1.2.$tn { catchsql $zSql } $res
165 do_test fkey2-1.2.$tn.2 { execsql {PRAGMA foreign_key_check(t1)} } {}
166 do_test fkey2-1.2.$tn.3 { execsql {PRAGMA foreign_key_check(t2)} } {}
167 do_test fkey2-1.2.$tn.4 { execsql {PRAGMA foreign_key_check(t3)} } {}
168 do_test fkey2-1.2.$tn.5 { execsql {PRAGMA foreign_key_check(t4)} } {}
169 do_test fkey2-1.2.$tn.6 { execsql {PRAGMA foreign_key_check(t7)} } {}
170 do_test fkey2-1.2.$tn.7 { execsql {PRAGMA foreign_key_check(t8)} } {}
158 } 171 }
159 drop_all_tables 172 drop_all_tables
160 173
161 do_test fkey2-1.3.0 { 174 do_test fkey2-1.3.0 {
162 execsql [string map {/D/ {}} $FkeySimpleSchema] 175 execsql [string map {/D/ {}} $FkeySimpleSchema]
163 execsql { PRAGMA count_changes = 1 } 176 execsql { PRAGMA count_changes = 1 }
164 } {} 177 } {}
165 foreach {tn zSql res} $FkeySimpleTests { 178 foreach {tn zSql res} $FkeySimpleTests {
166 if {$res == "0 {}"} { set res {0 1} } 179 if {$res == "0 {}"} { set res {0 1} }
167 do_test fkey2-1.3.$tn { catchsql $zSql } $res 180 do_test fkey2-1.3.$tn { catchsql $zSql } $res
181 do_test fkey2-1.3.$tn.2 { execsql {PRAGMA foreign_key_check(t1)} } {}
182 do_test fkey2-1.3.$tn.3 { execsql {PRAGMA foreign_key_check(t2)} } {}
183 do_test fkey2-1.3.$tn.4 { execsql {PRAGMA foreign_key_check(t3)} } {}
184 do_test fkey2-1.3.$tn.5 { execsql {PRAGMA foreign_key_check(t4)} } {}
185 do_test fkey2-1.3.$tn.6 { execsql {PRAGMA foreign_key_check(t7)} } {}
186 do_test fkey2-1.3.$tn.7 { execsql {PRAGMA foreign_key_check(t8)} } {}
168 } 187 }
169 execsql { PRAGMA count_changes = 0 } 188 execsql { PRAGMA count_changes = 0 }
170 drop_all_tables 189 drop_all_tables
171 190
172 do_test fkey2-1.4.0 { 191 do_test fkey2-1.4.0 {
173 execsql [string map {/D/ {}} $FkeySimpleSchema] 192 execsql [string map {/D/ {}} $FkeySimpleSchema]
174 execsql { PRAGMA count_changes = 1 } 193 execsql { PRAGMA count_changes = 1 }
175 } {} 194 } {}
176 foreach {tn zSql res} $FkeySimpleTests { 195 foreach {tn zSql res} $FkeySimpleTests {
177 if {$res == "0 {}"} { set res {0 1} } 196 if {$res == "0 {}"} { set res {0 1} }
(...skipping 11 matching lines...) Expand all
189 execsql { 208 execsql {
190 CREATE TABLE i(i INTEGER PRIMARY KEY); 209 CREATE TABLE i(i INTEGER PRIMARY KEY);
191 CREATE TABLE j(j REFERENCES i); 210 CREATE TABLE j(j REFERENCES i);
192 INSERT INTO i VALUES(35); 211 INSERT INTO i VALUES(35);
193 INSERT INTO j VALUES('35.0'); 212 INSERT INTO j VALUES('35.0');
194 SELECT j, typeof(j) FROM j; 213 SELECT j, typeof(j) FROM j;
195 } 214 }
196 } {35.0 text} 215 } {35.0 text}
197 do_test fkey2-1.5.2 { 216 do_test fkey2-1.5.2 {
198 catchsql { DELETE FROM i } 217 catchsql { DELETE FROM i }
199 } {1 {foreign key constraint failed}} 218 } {1 {FOREIGN KEY constraint failed}}
200 219
201 # Same test using a regular primary key with integer affinity. 220 # Same test using a regular primary key with integer affinity.
202 drop_all_tables 221 drop_all_tables
203 do_test fkey2-1.6.1 { 222 do_test fkey2-1.6.1 {
204 execsql { 223 execsql {
205 CREATE TABLE i(i INT UNIQUE); 224 CREATE TABLE i(i INT UNIQUE);
206 CREATE TABLE j(j REFERENCES i(i)); 225 CREATE TABLE j(j REFERENCES i(i));
207 INSERT INTO i VALUES('35.0'); 226 INSERT INTO i VALUES('35.0');
208 INSERT INTO j VALUES('35.0'); 227 INSERT INTO j VALUES('35.0');
209 SELECT j, typeof(j) FROM j; 228 SELECT j, typeof(j) FROM j;
210 SELECT i, typeof(i) FROM i; 229 SELECT i, typeof(i) FROM i;
211 } 230 }
212 } {35.0 text 35 integer} 231 } {35.0 text 35 integer}
213 do_test fkey2-1.6.2 { 232 do_test fkey2-1.6.2 {
214 catchsql { DELETE FROM i } 233 catchsql { DELETE FROM i }
215 } {1 {foreign key constraint failed}} 234 } {1 {FOREIGN KEY constraint failed}}
216 235
217 # Use a collation sequence on the parent key. 236 # Use a collation sequence on the parent key.
218 drop_all_tables 237 drop_all_tables
219 do_test fkey2-1.7.1 { 238 do_test fkey2-1.7.1 {
220 execsql { 239 execsql {
221 CREATE TABLE i(i TEXT COLLATE nocase PRIMARY KEY); 240 CREATE TABLE i(i TEXT COLLATE nocase PRIMARY KEY);
222 CREATE TABLE j(j TEXT COLLATE binary REFERENCES i(i)); 241 CREATE TABLE j(j TEXT COLLATE binary REFERENCES i(i));
223 INSERT INTO i VALUES('SQLite'); 242 INSERT INTO i VALUES('SQLite');
224 INSERT INTO j VALUES('sqlite'); 243 INSERT INTO j VALUES('sqlite');
225 } 244 }
226 catchsql { DELETE FROM i } 245 catchsql { DELETE FROM i }
227 } {1 {foreign key constraint failed}} 246 } {1 {FOREIGN KEY constraint failed}}
228 247
229 # Use the parent key collation even if it is default and the child key 248 # Use the parent key collation even if it is default and the child key
230 # has an explicit value. 249 # has an explicit value.
231 drop_all_tables 250 drop_all_tables
232 do_test fkey2-1.7.2 { 251 do_test fkey2-1.7.2 {
233 execsql { 252 execsql {
234 CREATE TABLE i(i TEXT PRIMARY KEY); -- Colseq is "BINARY" 253 CREATE TABLE i(i TEXT PRIMARY KEY); -- Colseq is "BINARY"
235 CREATE TABLE j(j TEXT COLLATE nocase REFERENCES i(i)); 254 CREATE TABLE j(j TEXT COLLATE nocase REFERENCES i(i));
236 INSERT INTO i VALUES('SQLite'); 255 INSERT INTO i VALUES('SQLite');
237 } 256 }
238 catchsql { INSERT INTO j VALUES('sqlite') } 257 catchsql { INSERT INTO j VALUES('sqlite') }
239 } {1 {foreign key constraint failed}} 258 } {1 {FOREIGN KEY constraint failed}}
240 do_test fkey2-1.7.3 { 259 do_test fkey2-1.7.3 {
241 execsql { 260 execsql {
242 INSERT INTO i VALUES('sqlite'); 261 INSERT INTO i VALUES('sqlite');
243 INSERT INTO j VALUES('sqlite'); 262 INSERT INTO j VALUES('sqlite');
244 DELETE FROM i WHERE i = 'SQLite'; 263 DELETE FROM i WHERE i = 'SQLite';
245 } 264 }
246 catchsql { DELETE FROM i WHERE i = 'sqlite' } 265 catchsql { DELETE FROM i WHERE i = 'sqlite' }
247 } {1 {foreign key constraint failed}} 266 } {1 {FOREIGN KEY constraint failed}}
248 267
249 #------------------------------------------------------------------------- 268 #-------------------------------------------------------------------------
250 # This section (test cases fkey2-2.*) contains tests to check that the 269 # This section (test cases fkey2-2.*) contains tests to check that the
251 # deferred foreign key constraint logic works. 270 # deferred foreign key constraint logic works.
252 # 271 #
253 proc fkey2-2-test {tn nocommit sql {res {}}} { 272 proc fkey2-2-test {tn nocommit sql {res {}}} {
254 if {$res eq "FKV"} { 273 if {$res eq "FKV"} {
255 set expected {1 {foreign key constraint failed}} 274 set expected {1 {FOREIGN KEY constraint failed}}
256 } else { 275 } else {
257 set expected [list 0 $res] 276 set expected [list 0 $res]
258 } 277 }
259 do_test fkey2-2.$tn [list catchsql $sql] $expected 278 do_test fkey2-2.$tn [list catchsql $sql] $expected
260 if {$nocommit} { 279 if {$nocommit} {
261 do_test fkey2-2.${tn}c { 280 do_test fkey2-2.${tn}c {
262 catchsql COMMIT 281 catchsql COMMIT
263 } {1 {foreign key constraint failed}} 282 } {1 {FOREIGN KEY constraint failed}}
264 } 283 }
265 } 284 }
266 285
267 fkey2-2-test 1 0 { 286 fkey2-2-test 1 0 {
268 CREATE TABLE node( 287 CREATE TABLE node(
269 nodeid PRIMARY KEY, 288 nodeid PRIMARY KEY,
270 parent REFERENCES node DEFERRABLE INITIALLY DEFERRED 289 parent REFERENCES node DEFERRABLE INITIALLY DEFERRED
271 ); 290 );
272 CREATE TABLE leaf( 291 CREATE TABLE leaf(
273 cellid PRIMARY KEY, 292 cellid PRIMARY KEY,
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
349 # had before the statement-transaction was opened. 368 # had before the statement-transaction was opened.
350 # 369 #
351 fkey2-2-test 61 0 "BEGIN" 370 fkey2-2-test 61 0 "BEGIN"
352 fkey2-2-test 62 0 "DELETE FROM leaf" 371 fkey2-2-test 62 0 "DELETE FROM leaf"
353 fkey2-2-test 63 0 "DELETE FROM node" 372 fkey2-2-test 63 0 "DELETE FROM node"
354 fkey2-2-test 64 1 "INSERT INTO leaf VALUES('a', 1)" 373 fkey2-2-test 64 1 "INSERT INTO leaf VALUES('a', 1)"
355 fkey2-2-test 65 1 "INSERT INTO leaf VALUES('b', 2)" 374 fkey2-2-test 65 1 "INSERT INTO leaf VALUES('b', 2)"
356 fkey2-2-test 66 1 "INSERT INTO leaf VALUES('c', 1)" 375 fkey2-2-test 66 1 "INSERT INTO leaf VALUES('c', 1)"
357 do_test fkey2-2-test-67 { 376 do_test fkey2-2-test-67 {
358 catchsql "INSERT INTO node SELECT parent, 3 FROM leaf" 377 catchsql "INSERT INTO node SELECT parent, 3 FROM leaf"
359 } {1 {column nodeid is not unique}} 378 } {1 {UNIQUE constraint failed: node.nodeid}}
360 fkey2-2-test 68 0 "COMMIT" FKV 379 fkey2-2-test 68 0 "COMMIT" FKV
361 fkey2-2-test 69 1 "INSERT INTO node VALUES(1, NULL)" 380 fkey2-2-test 69 1 "INSERT INTO node VALUES(1, NULL)"
362 fkey2-2-test 70 0 "INSERT INTO node VALUES(2, NULL)" 381 fkey2-2-test 70 0 "INSERT INTO node VALUES(2, NULL)"
363 fkey2-2-test 71 0 "COMMIT" 382 fkey2-2-test 71 0 "COMMIT"
364 383
365 fkey2-2-test 72 0 "BEGIN" 384 fkey2-2-test 72 0 "BEGIN"
366 fkey2-2-test 73 1 "DELETE FROM node" 385 fkey2-2-test 73 1 "DELETE FROM node"
367 fkey2-2-test 74 0 "INSERT INTO node(nodeid) SELECT DISTINCT parent FROM leaf" 386 fkey2-2-test 74 0 "INSERT INTO node(nodeid) SELECT DISTINCT parent FROM leaf"
368 fkey2-2-test 75 0 "COMMIT" 387 fkey2-2-test 75 0 "COMMIT"
369 388
(...skipping 21 matching lines...) Expand all
391 } {} 410 } {}
392 do_test fkey2-3.1.2 { 411 do_test fkey2-3.1.2 {
393 execsql { 412 execsql {
394 INSERT INTO ab VALUES(1, 'b'); 413 INSERT INTO ab VALUES(1, 'b');
395 INSERT INTO cd VALUES(1, 'd'); 414 INSERT INTO cd VALUES(1, 'd');
396 INSERT INTO ef VALUES(1, 'e'); 415 INSERT INTO ef VALUES(1, 'e');
397 } 416 }
398 } {} 417 } {}
399 do_test fkey2-3.1.3 { 418 do_test fkey2-3.1.3 {
400 catchsql { UPDATE ab SET a = 5 } 419 catchsql { UPDATE ab SET a = 5 }
401 } {1 {constraint failed}} 420 } {1 {CHECK constraint failed: ef}}
402 do_test fkey2-3.1.4 { 421 do_test fkey2-3.1.4 {
403 execsql { SELECT * FROM ab } 422 execsql { SELECT * FROM ab }
404 } {1 b} 423 } {1 b}
405 do_test fkey2-3.1.4 { 424 do_test fkey2-3.1.4 {
406 execsql BEGIN; 425 execsql BEGIN;
407 catchsql { UPDATE ab SET a = 5 } 426 catchsql { UPDATE ab SET a = 5 }
408 } {1 {constraint failed}} 427 } {1 {CHECK constraint failed: ef}}
409 do_test fkey2-3.1.5 { 428 do_test fkey2-3.1.5 {
410 execsql COMMIT; 429 execsql COMMIT;
411 execsql { SELECT * FROM ab; SELECT * FROM cd; SELECT * FROM ef } 430 execsql { SELECT * FROM ab; SELECT * FROM cd; SELECT * FROM ef }
412 } {1 b 1 d 1 e} 431 } {1 b 1 d 1 e}
413 432
414 do_test fkey2-3.2.1 { 433 do_test fkey2-3.2.1 {
415 execsql BEGIN; 434 execsql BEGIN;
416 catchsql { DELETE FROM ab } 435 catchsql { DELETE FROM ab }
417 } {1 {foreign key constraint failed}} 436 } {1 {FOREIGN KEY constraint failed}}
418 do_test fkey2-3.2.2 { 437 do_test fkey2-3.2.2 {
419 execsql COMMIT 438 execsql COMMIT
420 execsql { SELECT * FROM ab; SELECT * FROM cd; SELECT * FROM ef } 439 execsql { SELECT * FROM ab; SELECT * FROM cd; SELECT * FROM ef }
421 } {1 b 1 d 1 e} 440 } {1 b 1 d 1 e}
422 441
423 #------------------------------------------------------------------------- 442 #-------------------------------------------------------------------------
424 # Test cases fkey2-4.* test that recursive foreign key actions 443 # Test cases fkey2-4.* test that recursive foreign key actions
425 # (i.e. CASCADE) are allowed even if recursive triggers are disabled. 444 # (i.e. CASCADE) are allowed even if recursive triggers are disabled.
426 # 445 #
427 drop_all_tables 446 drop_all_tables
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
529 # 548 #
530 drop_all_tables 549 drop_all_tables
531 do_test fkey2-7.1 { 550 do_test fkey2-7.1 {
532 execsql { 551 execsql {
533 CREATE TABLE t1(a PRIMARY KEY, b); 552 CREATE TABLE t1(a PRIMARY KEY, b);
534 CREATE TABLE t2(c INTEGER PRIMARY KEY REFERENCES t1, b); 553 CREATE TABLE t2(c INTEGER PRIMARY KEY REFERENCES t1, b);
535 } 554 }
536 } {} 555 } {}
537 do_test fkey2-7.2 { 556 do_test fkey2-7.2 {
538 catchsql { INSERT INTO t2 VALUES(1, 'A'); } 557 catchsql { INSERT INTO t2 VALUES(1, 'A'); }
539 } {1 {foreign key constraint failed}} 558 } {1 {FOREIGN KEY constraint failed}}
540 do_test fkey2-7.3 { 559 do_test fkey2-7.3 {
541 execsql { 560 execsql {
542 INSERT INTO t1 VALUES(1, 2); 561 INSERT INTO t1 VALUES(1, 2);
543 INSERT INTO t1 VALUES(2, 3); 562 INSERT INTO t1 VALUES(2, 3);
544 INSERT INTO t2 VALUES(1, 'A'); 563 INSERT INTO t2 VALUES(1, 'A');
545 } 564 }
546 } {} 565 } {}
547 do_test fkey2-7.4 { 566 do_test fkey2-7.4 {
548 execsql { UPDATE t2 SET c = 2 } 567 execsql { UPDATE t2 SET c = 2 }
549 } {} 568 } {}
550 do_test fkey2-7.5 { 569 do_test fkey2-7.5 {
551 catchsql { UPDATE t2 SET c = 3 } 570 catchsql { UPDATE t2 SET c = 3 }
552 } {1 {foreign key constraint failed}} 571 } {1 {FOREIGN KEY constraint failed}}
553 do_test fkey2-7.6 { 572 do_test fkey2-7.6 {
554 catchsql { DELETE FROM t1 WHERE a = 2 } 573 catchsql { DELETE FROM t1 WHERE a = 2 }
555 } {1 {foreign key constraint failed}} 574 } {1 {FOREIGN KEY constraint failed}}
556 do_test fkey2-7.7 { 575 do_test fkey2-7.7 {
557 execsql { DELETE FROM t1 WHERE a = 1 } 576 execsql { DELETE FROM t1 WHERE a = 1 }
558 } {} 577 } {}
559 do_test fkey2-7.8 { 578 do_test fkey2-7.8 {
560 catchsql { UPDATE t1 SET a = 3 } 579 catchsql { UPDATE t1 SET a = 3 }
561 } {1 {foreign key constraint failed}} 580 } {1 {FOREIGN KEY constraint failed}}
562 do_test fkey2-7.9 { 581 do_test fkey2-7.9 {
563 catchsql { UPDATE t2 SET rowid = 3 } 582 catchsql { UPDATE t2 SET rowid = 3 }
564 } {1 {foreign key constraint failed}} 583 } {1 {FOREIGN KEY constraint failed}}
565 584
566 #------------------------------------------------------------------------- 585 #-------------------------------------------------------------------------
567 # Test that it is not possible to enable/disable FK support while a 586 # Test that it is not possible to enable/disable FK support while a
568 # transaction is open. 587 # transaction is open.
569 # 588 #
570 drop_all_tables 589 drop_all_tables
571 proc fkey2-8-test {tn zSql value} { 590 proc fkey2-8-test {tn zSql value} {
572 do_test fkey-2.8.$tn.1 [list execsql $zSql] {} 591 do_test fkey-2.8.$tn.1 [list execsql $zSql] {}
573 do_test fkey-2.8.$tn.2 { execsql "PRAGMA foreign_keys" } $value 592 do_test fkey-2.8.$tn.2 { execsql "PRAGMA foreign_keys" } $value
574 } 593 }
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
619 UPDATE t2 SET d = 2; 638 UPDATE t2 SET d = 2;
620 DELETE FROM t1 WHERE a = 1; 639 DELETE FROM t1 WHERE a = 1;
621 SELECT * FROM t2; 640 SELECT * FROM t2;
622 } 641 }
623 } {1 2} 642 } {1 2}
624 do_test fkey2-9.1.4 { 643 do_test fkey2-9.1.4 {
625 execsql { SELECT * FROM t1 } 644 execsql { SELECT * FROM t1 }
626 } {2 two} 645 } {2 two}
627 do_test fkey2-9.1.5 { 646 do_test fkey2-9.1.5 {
628 catchsql { DELETE FROM t1 } 647 catchsql { DELETE FROM t1 }
629 } {1 {foreign key constraint failed}} 648 } {1 {FOREIGN KEY constraint failed}}
630 649
631 do_test fkey2-9.2.1 { 650 do_test fkey2-9.2.1 {
632 execsql { 651 execsql {
633 CREATE TABLE pp(a, b, c, PRIMARY KEY(b, c)); 652 CREATE TABLE pp(a, b, c, PRIMARY KEY(b, c));
634 CREATE TABLE cc(d DEFAULT 3, e DEFAULT 1, f DEFAULT 2, 653 CREATE TABLE cc(d DEFAULT 3, e DEFAULT 1, f DEFAULT 2,
635 FOREIGN KEY(f, d) REFERENCES pp 654 FOREIGN KEY(f, d) REFERENCES pp
636 ON UPDATE SET DEFAULT 655 ON UPDATE SET DEFAULT
637 ON DELETE SET NULL 656 ON DELETE SET NULL
638 ); 657 );
639 INSERT INTO pp VALUES(1, 2, 3); 658 INSERT INTO pp VALUES(1, 2, 3);
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
674 CREATE TABLE c(x REFERENCES p); 693 CREATE TABLE c(x REFERENCES p);
675 } { 694 } {
676 CREATE TABLE p(a COLLATE binary, b); 695 CREATE TABLE p(a COLLATE binary, b);
677 CREATE UNIQUE INDEX i ON p(a COLLATE nocase); 696 CREATE UNIQUE INDEX i ON p(a COLLATE nocase);
678 CREATE TABLE c(x REFERENCES p(a)); 697 CREATE TABLE c(x REFERENCES p(a));
679 }] { 698 }] {
680 drop_all_tables 699 drop_all_tables
681 do_test fkey2-10.1.[incr tn] { 700 do_test fkey2-10.1.[incr tn] {
682 execsql $zSql 701 execsql $zSql
683 catchsql { INSERT INTO c DEFAULT VALUES } 702 catchsql { INSERT INTO c DEFAULT VALUES }
684 } {1 {foreign key mismatch}} 703 } {/1 {foreign key mismatch - "c" referencing "."}/}
685 } 704 }
686 705
687 # "rowid" cannot be used as part of a child or parent key definition 706 # "rowid" cannot be used as part of a child or parent key definition
688 # unless it happens to be the name of an explicitly declared column. 707 # unless it happens to be the name of an explicitly declared column.
689 # 708 #
690 do_test fkey2-10.2.1 { 709 do_test fkey2-10.2.1 {
691 drop_all_tables 710 drop_all_tables
692 catchsql { 711 catchsql {
693 CREATE TABLE t1(a PRIMARY KEY, b); 712 CREATE TABLE t1(a PRIMARY KEY, b);
694 CREATE TABLE t2(c, d, FOREIGN KEY(rowid) REFERENCES t1(a)); 713 CREATE TABLE t2(c, d, FOREIGN KEY(rowid) REFERENCES t1(a));
695 } 714 }
696 } {1 {unknown column "rowid" in foreign key definition}} 715 } {1 {unknown column "rowid" in foreign key definition}}
697 do_test fkey2-10.2.2 { 716 do_test fkey2-10.2.2 {
698 drop_all_tables 717 drop_all_tables
699 catchsql { 718 catchsql {
700 CREATE TABLE t1(a PRIMARY KEY, b); 719 CREATE TABLE t1(a PRIMARY KEY, b);
701 CREATE TABLE t2(rowid, d, FOREIGN KEY(rowid) REFERENCES t1(a)); 720 CREATE TABLE t2(rowid, d, FOREIGN KEY(rowid) REFERENCES t1(a));
702 } 721 }
703 } {0 {}} 722 } {0 {}}
704 do_test fkey2-10.2.1 { 723 do_test fkey2-10.2.1 {
705 drop_all_tables 724 drop_all_tables
706 catchsql { 725 catchsql {
707 CREATE TABLE t1(a, b); 726 CREATE TABLE t1(a, b);
708 CREATE TABLE t2(c, d, FOREIGN KEY(c) REFERENCES t1(rowid)); 727 CREATE TABLE t2(c, d, FOREIGN KEY(c) REFERENCES t1(rowid));
709 INSERT INTO t1(rowid, a, b) VALUES(1, 1, 1); 728 INSERT INTO t1(rowid, a, b) VALUES(1, 1, 1);
710 INSERT INTO t2 VALUES(1, 1); 729 INSERT INTO t2 VALUES(1, 1);
711 } 730 }
712 } {1 {foreign key mismatch}} 731 } {1 {foreign key mismatch - "t2" referencing "t1"}}
713 do_test fkey2-10.2.2 { 732 do_test fkey2-10.2.2 {
714 drop_all_tables 733 drop_all_tables
715 catchsql { 734 catchsql {
716 CREATE TABLE t1(rowid PRIMARY KEY, b); 735 CREATE TABLE t1(rowid PRIMARY KEY, b);
717 CREATE TABLE t2(c, d, FOREIGN KEY(c) REFERENCES t1(rowid)); 736 CREATE TABLE t2(c, d, FOREIGN KEY(c) REFERENCES t1(rowid));
718 INSERT INTO t1(rowid, b) VALUES(1, 1); 737 INSERT INTO t1(rowid, b) VALUES(1, 1);
719 INSERT INTO t2 VALUES(1, 1); 738 INSERT INTO t2 VALUES(1, 1);
720 } 739 }
721 } {0 {}} 740 } {0 {}}
722 741
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
754 } {} 773 } {}
755 do_test fkey2-12.1.2 { 774 do_test fkey2-12.1.2 {
756 execsql "BEGIN" 775 execsql "BEGIN"
757 execsql "INSERT INTO t2 VALUES('two')" 776 execsql "INSERT INTO t2 VALUES('two')"
758 } {} 777 } {}
759 do_test fkey2-12.1.3 { 778 do_test fkey2-12.1.3 {
760 execsql "UPDATE t1 SET b = 'four' WHERE b = 'one'" 779 execsql "UPDATE t1 SET b = 'four' WHERE b = 'one'"
761 } {} 780 } {}
762 do_test fkey2-12.1.4 { 781 do_test fkey2-12.1.4 {
763 catchsql "UPDATE t1 SET b = 'five' WHERE b = 'two'" 782 catchsql "UPDATE t1 SET b = 'five' WHERE b = 'two'"
764 } {1 {foreign key constraint failed}} 783 } {1 {FOREIGN KEY constraint failed}}
765 do_test fkey2-12.1.5 { 784 do_test fkey2-12.1.5 {
766 execsql "DELETE FROM t1 WHERE b = 'two'" 785 execsql "DELETE FROM t1 WHERE b = 'two'"
767 } {} 786 } {}
768 do_test fkey2-12.1.6 { 787 do_test fkey2-12.1.6 {
769 catchsql "COMMIT" 788 catchsql "COMMIT"
770 } {1 {foreign key constraint failed}} 789 } {1 {FOREIGN KEY constraint failed}}
771 do_test fkey2-12.1.7 { 790 do_test fkey2-12.1.7 {
772 execsql { 791 execsql {
773 INSERT INTO t1 VALUES(2, 'two'); 792 INSERT INTO t1 VALUES(2, 'two');
774 COMMIT; 793 COMMIT;
775 } 794 }
776 } {} 795 } {}
777 796
778 drop_all_tables 797 drop_all_tables
779 do_test fkey2-12.2.1 { 798 do_test fkey2-12.2.1 {
780 execsql { 799 execsql {
(...skipping 21 matching lines...) Expand all
802 } 821 }
803 } {A B a b} 822 } {A B a b}
804 do_test fkey2-12.2.3 { 823 do_test fkey2-12.2.3 {
805 execsql { 824 execsql {
806 DROP TABLE t2; 825 DROP TABLE t2;
807 CREATE TABLE t2(y REFERENCES t1 ON DELETE RESTRICT); 826 CREATE TABLE t2(y REFERENCES t1 ON DELETE RESTRICT);
808 INSERT INTO t2 VALUES('a'); 827 INSERT INTO t2 VALUES('a');
809 INSERT INTO t2 VALUES('b'); 828 INSERT INTO t2 VALUES('b');
810 } 829 }
811 catchsql { DELETE FROM t1 } 830 catchsql { DELETE FROM t1 }
812 } {1 {foreign key constraint failed}} 831 } {1 {FOREIGN KEY constraint failed}}
813 do_test fkey2-12.2.4 { 832 do_test fkey2-12.2.4 {
814 execsql { 833 execsql {
815 SELECT * FROM t1; 834 SELECT * FROM t1;
816 SELECT * FROM t2; 835 SELECT * FROM t2;
817 } 836 }
818 } {A B a b} 837 } {A B a b}
819 838
820 drop_all_tables 839 drop_all_tables
821 do_test fkey2-12.3.1 { 840 do_test fkey2-12.3.1 {
822 execsql { 841 execsql {
(...skipping 17 matching lines...) Expand all
840 execsql { 859 execsql {
841 INSERT INTO up(c34, c35) VALUES('yes', 'no'); 860 INSERT INTO up(c34, c35) VALUES('yes', 'no');
842 INSERT INTO down(c39, c38) VALUES('yes', 'no'); 861 INSERT INTO down(c39, c38) VALUES('yes', 'no');
843 UPDATE up SET c34 = 'possibly'; 862 UPDATE up SET c34 = 'possibly';
844 SELECT c38, c39 FROM down; 863 SELECT c38, c39 FROM down;
845 DELETE FROM down; 864 DELETE FROM down;
846 } 865 }
847 } {no possibly} 866 } {no possibly}
848 do_test fkey2-12.3.3 { 867 do_test fkey2-12.3.3 {
849 catchsql { INSERT INTO down(c39, c38) VALUES('yes', 'no') } 868 catchsql { INSERT INTO down(c39, c38) VALUES('yes', 'no') }
850 } {1 {foreign key constraint failed}} 869 } {1 {FOREIGN KEY constraint failed}}
851 do_test fkey2-12.3.4 { 870 do_test fkey2-12.3.4 {
852 execsql { 871 execsql {
853 INSERT INTO up(c34, c35) VALUES('yes', 'no'); 872 INSERT INTO up(c34, c35) VALUES('yes', 'no');
854 INSERT INTO down(c39, c38) VALUES('yes', 'no'); 873 INSERT INTO down(c39, c38) VALUES('yes', 'no');
855 } 874 }
856 catchsql { DELETE FROM up WHERE c34 = 'yes' } 875 catchsql { DELETE FROM up WHERE c34 = 'yes' }
857 } {1 {foreign key constraint failed}} 876 } {1 {FOREIGN KEY constraint failed}}
858 do_test fkey2-12.3.5 { 877 do_test fkey2-12.3.5 {
859 execsql { 878 execsql {
860 DELETE FROM up WHERE c34 = 'possibly'; 879 DELETE FROM up WHERE c34 = 'possibly';
861 SELECT c34, c35 FROM up; 880 SELECT c34, c35 FROM up;
862 SELECT c39, c38 FROM down; 881 SELECT c39, c38 FROM down;
863 } 882 }
864 } {yes no yes no} 883 } {yes no yes no}
865 884
866 #------------------------------------------------------------------------- 885 #-------------------------------------------------------------------------
867 # The following tests, fkey2-13.*, test that FK processing is performed 886 # The following tests, fkey2-13.*, test that FK processing is performed
868 # when rows are REPLACEd. 887 # when rows are REPLACEd.
869 # 888 #
870 drop_all_tables 889 drop_all_tables
871 do_test fkey2-13.1.1 { 890 do_test fkey2-13.1.1 {
872 execsql { 891 execsql {
873 CREATE TABLE pp(a UNIQUE, b, c, PRIMARY KEY(b, c)); 892 CREATE TABLE pp(a UNIQUE, b, c, PRIMARY KEY(b, c));
874 CREATE TABLE cc(d, e, f UNIQUE, FOREIGN KEY(d, e) REFERENCES pp); 893 CREATE TABLE cc(d, e, f UNIQUE, FOREIGN KEY(d, e) REFERENCES pp);
875 INSERT INTO pp VALUES(1, 2, 3); 894 INSERT INTO pp VALUES(1, 2, 3);
876 INSERT INTO cc VALUES(2, 3, 1); 895 INSERT INTO cc VALUES(2, 3, 1);
877 } 896 }
878 } {} 897 } {}
879 foreach {tn stmt} { 898 foreach {tn stmt} {
880 1 "REPLACE INTO pp VALUES(1, 4, 5)" 899 1 "REPLACE INTO pp VALUES(1, 4, 5)"
881 2 "REPLACE INTO pp(rowid, a, b, c) VALUES(1, 2, 3, 4)" 900 2 "REPLACE INTO pp(rowid, a, b, c) VALUES(1, 2, 3, 4)"
882 } { 901 } {
883 do_test fkey2-13.1.$tn.1 { 902 do_test fkey2-13.1.$tn.1 {
884 catchsql $stmt 903 catchsql $stmt
885 } {1 {foreign key constraint failed}} 904 } {1 {FOREIGN KEY constraint failed}}
886 do_test fkey2-13.1.$tn.2 { 905 do_test fkey2-13.1.$tn.2 {
887 execsql { 906 execsql {
888 SELECT * FROM pp; 907 SELECT * FROM pp;
889 SELECT * FROM cc; 908 SELECT * FROM cc;
890 } 909 }
891 } {1 2 3 2 3 1} 910 } {1 2 3 2 3 1}
892 do_test fkey2-13.1.$tn.3 { 911 do_test fkey2-13.1.$tn.3 {
893 execsql BEGIN; 912 execsql BEGIN;
894 catchsql $stmt 913 catchsql $stmt
895 } {1 {foreign key constraint failed}} 914 } {1 {FOREIGN KEY constraint failed}}
896 do_test fkey2-13.1.$tn.4 { 915 do_test fkey2-13.1.$tn.4 {
897 execsql { 916 execsql {
898 COMMIT; 917 COMMIT;
899 SELECT * FROM pp; 918 SELECT * FROM pp;
900 SELECT * FROM cc; 919 SELECT * FROM cc;
901 } 920 }
902 } {1 2 3 2 3 1} 921 } {1 2 3 2 3 1}
903 } 922 }
904 do_test fkey2-13.1.3 { 923 do_test fkey2-13.1.3 {
905 execsql { 924 execsql {
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
989 do_test fkey2-14.2.2.2 { 1008 do_test fkey2-14.2.2.2 {
990 execsql { ALTER TABLE t1 RENAME TO t4 } 1009 execsql { ALTER TABLE t1 RENAME TO t4 }
991 execsql { SELECT sql FROM sqlite_master WHERE type = 'table'} 1010 execsql { SELECT sql FROM sqlite_master WHERE type = 'table'}
992 } [list \ 1011 } [list \
993 {CREATE TABLE "t4"(a PRIMARY KEY, b REFERENCES "t4")} \ 1012 {CREATE TABLE "t4"(a PRIMARY KEY, b REFERENCES "t4")} \
994 {CREATE TABLE t2(a PRIMARY KEY, b REFERENCES "t4", c REFERENCES t2)} \ 1013 {CREATE TABLE t2(a PRIMARY KEY, b REFERENCES "t4", c REFERENCES t2)} \
995 {CREATE TABLE t3(a REFERENCES "t4", b REFERENCES t2, c REFERENCES "t4")} \ 1014 {CREATE TABLE t3(a REFERENCES "t4", b REFERENCES t2, c REFERENCES "t4")} \
996 ] 1015 ]
997 do_test fkey2-14.2.2.3 { 1016 do_test fkey2-14.2.2.3 {
998 catchsql { INSERT INTO t3 VALUES(1, 2, 3) } 1017 catchsql { INSERT INTO t3 VALUES(1, 2, 3) }
999 } {1 {foreign key constraint failed}} 1018 } {1 {FOREIGN KEY constraint failed}}
1000 do_test fkey2-14.2.2.4 { 1019 do_test fkey2-14.2.2.4 {
1001 execsql { INSERT INTO t4 VALUES(1, NULL) } 1020 execsql { INSERT INTO t4 VALUES(1, NULL) }
1002 } {} 1021 } {}
1003 do_test fkey2-14.2.2.5 { 1022 do_test fkey2-14.2.2.5 {
1004 catchsql { UPDATE t4 SET b = 5 } 1023 catchsql { UPDATE t4 SET b = 5 }
1005 } {1 {foreign key constraint failed}} 1024 } {1 {FOREIGN KEY constraint failed}}
1006 do_test fkey2-14.2.2.6 { 1025 do_test fkey2-14.2.2.6 {
1007 catchsql { UPDATE t4 SET b = 1 } 1026 catchsql { UPDATE t4 SET b = 1 }
1008 } {0 {}} 1027 } {0 {}}
1009 do_test fkey2-14.2.2.7 { 1028 do_test fkey2-14.2.2.7 {
1010 execsql { INSERT INTO t3 VALUES(1, NULL, 1) } 1029 execsql { INSERT INTO t3 VALUES(1, NULL, 1) }
1011 } {} 1030 } {}
1012 1031
1013 # Repeat for TEMP tables 1032 # Repeat for TEMP tables
1014 # 1033 #
1015 drop_all_tables 1034 drop_all_tables
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
1070 do_test fkey2-14.2tmp.2.2 { 1089 do_test fkey2-14.2tmp.2.2 {
1071 execsql { ALTER TABLE t1 RENAME TO t4 } 1090 execsql { ALTER TABLE t1 RENAME TO t4 }
1072 execsql { SELECT sql FROM sqlite_temp_master WHERE type = 'table'} 1091 execsql { SELECT sql FROM sqlite_temp_master WHERE type = 'table'}
1073 } [list \ 1092 } [list \
1074 {CREATE TABLE "t4"(a PRIMARY KEY, b REFERENCES "t4")} \ 1093 {CREATE TABLE "t4"(a PRIMARY KEY, b REFERENCES "t4")} \
1075 {CREATE TABLE t2(a PRIMARY KEY, b REFERENCES "t4", c REFERENCES t2)} \ 1094 {CREATE TABLE t2(a PRIMARY KEY, b REFERENCES "t4", c REFERENCES t2)} \
1076 {CREATE TABLE t3(a REFERENCES "t4", b REFERENCES t2, c REFERENCES "t4")} \ 1095 {CREATE TABLE t3(a REFERENCES "t4", b REFERENCES t2, c REFERENCES "t4")} \
1077 ] 1096 ]
1078 do_test fkey2-14.2tmp.2.3 { 1097 do_test fkey2-14.2tmp.2.3 {
1079 catchsql { INSERT INTO t3 VALUES(1, 2, 3) } 1098 catchsql { INSERT INTO t3 VALUES(1, 2, 3) }
1080 } {1 {foreign key constraint failed}} 1099 } {1 {FOREIGN KEY constraint failed}}
1081 do_test fkey2-14.2tmp.2.4 { 1100 do_test fkey2-14.2tmp.2.4 {
1082 execsql { INSERT INTO t4 VALUES(1, NULL) } 1101 execsql { INSERT INTO t4 VALUES(1, NULL) }
1083 } {} 1102 } {}
1084 do_test fkey2-14.2tmp.2.5 { 1103 do_test fkey2-14.2tmp.2.5 {
1085 catchsql { UPDATE t4 SET b = 5 } 1104 catchsql { UPDATE t4 SET b = 5 }
1086 } {1 {foreign key constraint failed}} 1105 } {1 {FOREIGN KEY constraint failed}}
1087 do_test fkey2-14.2tmp.2.6 { 1106 do_test fkey2-14.2tmp.2.6 {
1088 catchsql { UPDATE t4 SET b = 1 } 1107 catchsql { UPDATE t4 SET b = 1 }
1089 } {0 {}} 1108 } {0 {}}
1090 do_test fkey2-14.2tmp.2.7 { 1109 do_test fkey2-14.2tmp.2.7 {
1091 execsql { INSERT INTO t3 VALUES(1, NULL, 1) } 1110 execsql { INSERT INTO t3 VALUES(1, NULL, 1) }
1092 } {} 1111 } {}
1093 1112
1094 # Repeat for ATTACH-ed tables 1113 # Repeat for ATTACH-ed tables
1095 # 1114 #
1096 drop_all_tables 1115 drop_all_tables
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
1152 do_test fkey2-14.2aux.2.2 { 1171 do_test fkey2-14.2aux.2.2 {
1153 execsql { ALTER TABLE t1 RENAME TO t4 } 1172 execsql { ALTER TABLE t1 RENAME TO t4 }
1154 execsql { SELECT sql FROM aux.sqlite_master WHERE type = 'table'} 1173 execsql { SELECT sql FROM aux.sqlite_master WHERE type = 'table'}
1155 } [list \ 1174 } [list \
1156 {CREATE TABLE "t4"(a PRIMARY KEY, b REFERENCES "t4")} \ 1175 {CREATE TABLE "t4"(a PRIMARY KEY, b REFERENCES "t4")} \
1157 {CREATE TABLE t2(a PRIMARY KEY, b REFERENCES "t4", c REFERENCES t2)} \ 1176 {CREATE TABLE t2(a PRIMARY KEY, b REFERENCES "t4", c REFERENCES t2)} \
1158 {CREATE TABLE t3(a REFERENCES "t4", b REFERENCES t2, c REFERENCES "t4")} \ 1177 {CREATE TABLE t3(a REFERENCES "t4", b REFERENCES t2, c REFERENCES "t4")} \
1159 ] 1178 ]
1160 do_test fkey2-14.2aux.2.3 { 1179 do_test fkey2-14.2aux.2.3 {
1161 catchsql { INSERT INTO t3 VALUES(1, 2, 3) } 1180 catchsql { INSERT INTO t3 VALUES(1, 2, 3) }
1162 } {1 {foreign key constraint failed}} 1181 } {1 {FOREIGN KEY constraint failed}}
1163 do_test fkey2-14.2aux.2.4 { 1182 do_test fkey2-14.2aux.2.4 {
1164 execsql { INSERT INTO t4 VALUES(1, NULL) } 1183 execsql { INSERT INTO t4 VALUES(1, NULL) }
1165 } {} 1184 } {}
1166 do_test fkey2-14.2aux.2.5 { 1185 do_test fkey2-14.2aux.2.5 {
1167 catchsql { UPDATE t4 SET b = 5 } 1186 catchsql { UPDATE t4 SET b = 5 }
1168 } {1 {foreign key constraint failed}} 1187 } {1 {FOREIGN KEY constraint failed}}
1169 do_test fkey2-14.2aux.2.6 { 1188 do_test fkey2-14.2aux.2.6 {
1170 catchsql { UPDATE t4 SET b = 1 } 1189 catchsql { UPDATE t4 SET b = 1 }
1171 } {0 {}} 1190 } {0 {}}
1172 do_test fkey2-14.2aux.2.7 { 1191 do_test fkey2-14.2aux.2.7 {
1173 execsql { INSERT INTO t3 VALUES(1, NULL, 1) } 1192 execsql { INSERT INTO t3 VALUES(1, NULL, 1) }
1174 } {} 1193 } {}
1175 } 1194 }
1176 1195
1177 do_test fkey-2.14.3.1 { 1196 do_test fkey-2.14.3.1 {
1178 drop_all_tables 1197 drop_all_tables
1179 execsql { 1198 execsql {
1180 CREATE TABLE t1(a, b REFERENCES nosuchtable); 1199 CREATE TABLE t1(a, b REFERENCES nosuchtable);
1181 DROP TABLE t1; 1200 DROP TABLE t1;
1182 } 1201 }
1183 } {} 1202 } {}
1184 do_test fkey-2.14.3.2 { 1203 do_test fkey-2.14.3.2 {
1185 execsql { 1204 execsql {
1186 CREATE TABLE t1(a PRIMARY KEY, b); 1205 CREATE TABLE t1(a PRIMARY KEY, b);
1187 INSERT INTO t1 VALUES('a', 1); 1206 INSERT INTO t1 VALUES('a', 1);
1188 CREATE TABLE t2(x REFERENCES t1); 1207 CREATE TABLE t2(x REFERENCES t1);
1189 INSERT INTO t2 VALUES('a'); 1208 INSERT INTO t2 VALUES('a');
1190 } 1209 }
1191 } {} 1210 } {}
1192 do_test fkey-2.14.3.3 { 1211 do_test fkey-2.14.3.3 {
1193 catchsql { DROP TABLE t1 } 1212 catchsql { DROP TABLE t1 }
1194 } {1 {foreign key constraint failed}} 1213 } {1 {FOREIGN KEY constraint failed}}
1195 do_test fkey-2.14.3.4 { 1214 do_test fkey-2.14.3.4 {
1196 execsql { 1215 execsql {
1197 DELETE FROM t2; 1216 DELETE FROM t2;
1198 DROP TABLE t1; 1217 DROP TABLE t1;
1199 } 1218 }
1200 } {} 1219 } {}
1201 do_test fkey-2.14.3.4 { 1220 do_test fkey-2.14.3.4 {
1202 catchsql { INSERT INTO t2 VALUES('x') } 1221 catchsql { INSERT INTO t2 VALUES('x') }
1203 } {1 {no such table: main.t1}} 1222 } {1 {no such table: main.t1}}
1204 do_test fkey-2.14.3.5 { 1223 do_test fkey-2.14.3.5 {
1205 execsql { 1224 execsql {
1206 CREATE TABLE t1(x PRIMARY KEY); 1225 CREATE TABLE t1(x PRIMARY KEY);
1207 INSERT INTO t1 VALUES('x'); 1226 INSERT INTO t1 VALUES('x');
1208 } 1227 }
1209 execsql { INSERT INTO t2 VALUES('x') } 1228 execsql { INSERT INTO t2 VALUES('x') }
1210 } {} 1229 } {}
1211 do_test fkey-2.14.3.6 { 1230 do_test fkey-2.14.3.6 {
1212 catchsql { DROP TABLE t1 } 1231 catchsql { DROP TABLE t1 }
1213 } {1 {foreign key constraint failed}} 1232 } {1 {FOREIGN KEY constraint failed}}
1214 do_test fkey-2.14.3.7 { 1233 do_test fkey-2.14.3.7 {
1215 execsql { 1234 execsql {
1216 DROP TABLE t2; 1235 DROP TABLE t2;
1217 DROP TABLE t1; 1236 DROP TABLE t1;
1218 } 1237 }
1219 } {} 1238 } {}
1220 do_test fkey-2.14.3.8 { 1239 do_test fkey-2.14.3.8 {
1221 execsql { 1240 execsql {
1222 CREATE TABLE pp(x, y, PRIMARY KEY(x, y)); 1241 CREATE TABLE pp(x, y, PRIMARY KEY(x, y));
1223 CREATE TABLE cc(a, b, FOREIGN KEY(a, b) REFERENCES pp(x, z)); 1242 CREATE TABLE cc(a, b, FOREIGN KEY(a, b) REFERENCES pp(x, z));
1224 } 1243 }
1225 catchsql { INSERT INTO cc VALUES(1, 2) } 1244 catchsql { INSERT INTO cc VALUES(1, 2) }
1226 } {1 {foreign key mismatch}} 1245 } {1 {foreign key mismatch - "cc" referencing "pp"}}
1227 do_test fkey-2.14.3.9 { 1246 do_test fkey-2.14.3.9 {
1228 execsql { DROP TABLE cc } 1247 execsql { DROP TABLE cc }
1229 } {} 1248 } {}
1230 do_test fkey-2.14.3.10 { 1249 do_test fkey-2.14.3.10 {
1231 execsql { 1250 execsql {
1232 CREATE TABLE cc(a, b, 1251 CREATE TABLE cc(a, b,
1233 FOREIGN KEY(a, b) REFERENCES pp DEFERRABLE INITIALLY DEFERRED 1252 FOREIGN KEY(a, b) REFERENCES pp DEFERRABLE INITIALLY DEFERRED
1234 ); 1253 );
1235 } 1254 }
1236 execsql { 1255 execsql {
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
1361 do_test fkey2-16.1.$tn.1 { 1380 do_test fkey2-16.1.$tn.1 {
1362 execsql $zSchema 1381 execsql $zSchema
1363 execsql { INSERT INTO self VALUES(13, 13) } 1382 execsql { INSERT INTO self VALUES(13, 13) }
1364 } {} 1383 } {}
1365 do_test fkey2-16.1.$tn.2 { 1384 do_test fkey2-16.1.$tn.2 {
1366 execsql { UPDATE self SET a = 14, b = 14 } 1385 execsql { UPDATE self SET a = 14, b = 14 }
1367 } {} 1386 } {}
1368 1387
1369 do_test fkey2-16.1.$tn.3 { 1388 do_test fkey2-16.1.$tn.3 {
1370 catchsql { UPDATE self SET b = 15 } 1389 catchsql { UPDATE self SET b = 15 }
1371 } {1 {foreign key constraint failed}} 1390 } {1 {FOREIGN KEY constraint failed}}
1372 1391
1373 do_test fkey2-16.1.$tn.4 { 1392 do_test fkey2-16.1.$tn.4 {
1374 catchsql { UPDATE self SET a = 15 } 1393 catchsql { UPDATE self SET a = 15 }
1375 } {1 {foreign key constraint failed}} 1394 } {1 {FOREIGN KEY constraint failed}}
1376 1395
1377 do_test fkey2-16.1.$tn.5 { 1396 do_test fkey2-16.1.$tn.5 {
1378 catchsql { UPDATE self SET a = 15, b = 16 } 1397 catchsql { UPDATE self SET a = 15, b = 16 }
1379 } {1 {foreign key constraint failed}} 1398 } {1 {FOREIGN KEY constraint failed}}
1380 1399
1381 do_test fkey2-16.1.$tn.6 { 1400 do_test fkey2-16.1.$tn.6 {
1382 catchsql { UPDATE self SET a = 17, b = 17 } 1401 catchsql { UPDATE self SET a = 17, b = 17 }
1383 } {0 {}} 1402 } {0 {}}
1384 1403
1385 do_test fkey2-16.1.$tn.7 { 1404 do_test fkey2-16.1.$tn.7 {
1386 execsql { DELETE FROM self } 1405 execsql { DELETE FROM self }
1387 } {} 1406 } {}
1388 do_test fkey2-16.1.$tn.8 { 1407 do_test fkey2-16.1.$tn.8 {
1389 catchsql { INSERT INTO self VALUES(20, 21) } 1408 catchsql { INSERT INTO self VALUES(20, 21) }
1390 } {1 {foreign key constraint failed}} 1409 } {1 {FOREIGN KEY constraint failed}}
1391 } 1410 }
1392 1411
1393 #------------------------------------------------------------------------- 1412 #-------------------------------------------------------------------------
1394 # This next block of tests, fkey2-17.*, tests that if "PRAGMA count_changes" 1413 # This next block of tests, fkey2-17.*, tests that if "PRAGMA count_changes"
1395 # is turned on statements that violate immediate FK constraints return 1414 # is turned on statements that violate immediate FK constraints return
1396 # SQLITE_CONSTRAINT immediately, not after returning a number of rows. 1415 # SQLITE_CONSTRAINT immediately, not after returning a number of rows.
1397 # Whereas statements that violate deferred FK constraints return the number 1416 # Whereas statements that violate deferred FK constraints return the number
1398 # of rows before failing. 1417 # of rows before failing.
1399 # 1418 #
1400 # Also test that rows modified by FK actions are not counted in either the 1419 # Also test that rows modified by FK actions are not counted in either the
1401 # returned row count or the values returned by sqlite3_changes(). Like 1420 # returned row count or the values returned by sqlite3_changes(). Like
1402 # trigger related changes, they are included in sqlite3_total_changes() though. 1421 # trigger related changes, they are included in sqlite3_total_changes() though.
1403 # 1422 #
1404 drop_all_tables 1423 drop_all_tables
1405 do_test fkey2-17.1.1 { 1424 do_test fkey2-17.1.1 {
1406 execsql { PRAGMA count_changes = 1 } 1425 execsql { PRAGMA count_changes = 1 }
1407 execsql { 1426 execsql {
1408 CREATE TABLE one(a, b, c, UNIQUE(b, c)); 1427 CREATE TABLE one(a, b, c, UNIQUE(b, c));
1409 CREATE TABLE two(d, e, f, FOREIGN KEY(e, f) REFERENCES one(b, c)); 1428 CREATE TABLE two(d, e, f, FOREIGN KEY(e, f) REFERENCES one(b, c));
1410 INSERT INTO one VALUES(1, 2, 3); 1429 INSERT INTO one VALUES(1, 2, 3);
1411 } 1430 }
1412 } {1} 1431 } {1}
1413 do_test fkey2-17.1.2 { 1432 do_test fkey2-17.1.2 {
1414 set STMT [sqlite3_prepare_v2 db "INSERT INTO two VALUES(4, 5, 6)" -1 dummy] 1433 set STMT [sqlite3_prepare_v2 db "INSERT INTO two VALUES(4, 5, 6)" -1 dummy]
1415 sqlite3_step $STMT 1434 sqlite3_step $STMT
1416 } {SQLITE_CONSTRAINT} 1435 } {SQLITE_CONSTRAINT}
1436 verify_ex_errcode fkey2-17.1.2b SQLITE_CONSTRAINT_FOREIGNKEY
1417 ifcapable autoreset { 1437 ifcapable autoreset {
1418 do_test fkey2-17.1.3 { 1438 do_test fkey2-17.1.3 {
1419 sqlite3_step $STMT 1439 sqlite3_step $STMT
1420 } {SQLITE_CONSTRAINT} 1440 } {SQLITE_CONSTRAINT}
1441 verify_ex_errcode fkey2-17.1.3b SQLITE_CONSTRAINT_FOREIGNKEY
1421 } else { 1442 } else {
1422 do_test fkey2-17.1.3 { 1443 do_test fkey2-17.1.3 {
1423 sqlite3_step $STMT 1444 sqlite3_step $STMT
1424 } {SQLITE_MISUSE} 1445 } {SQLITE_MISUSE}
1425 } 1446 }
1426 do_test fkey2-17.1.4 { 1447 do_test fkey2-17.1.4 {
1427 sqlite3_finalize $STMT 1448 sqlite3_finalize $STMT
1428 } {SQLITE_CONSTRAINT} 1449 } {SQLITE_CONSTRAINT}
1450 verify_ex_errcode fkey2-17.1.4b SQLITE_CONSTRAINT_FOREIGNKEY
1429 do_test fkey2-17.1.5 { 1451 do_test fkey2-17.1.5 {
1430 execsql { 1452 execsql {
1431 INSERT INTO one VALUES(2, 3, 4); 1453 INSERT INTO one VALUES(2, 3, 4);
1432 INSERT INTO one VALUES(3, 4, 5); 1454 INSERT INTO one VALUES(3, 4, 5);
1433 INSERT INTO two VALUES(1, 2, 3); 1455 INSERT INTO two VALUES(1, 2, 3);
1434 INSERT INTO two VALUES(2, 3, 4); 1456 INSERT INTO two VALUES(2, 3, 4);
1435 INSERT INTO two VALUES(3, 4, 5); 1457 INSERT INTO two VALUES(3, 4, 5);
1436 } 1458 }
1437 } {1 1 1 1 1} 1459 } {1 1 1 1 1}
1438 do_test fkey2-17.1.6 { 1460 do_test fkey2-17.1.6 {
1439 catchsql { 1461 catchsql {
1440 BEGIN; 1462 BEGIN;
1441 INSERT INTO one VALUES(0, 0, 0); 1463 INSERT INTO one VALUES(0, 0, 0);
1442 UPDATE two SET e=e+1, f=f+1; 1464 UPDATE two SET e=e+1, f=f+1;
1443 } 1465 }
1444 } {1 {foreign key constraint failed}} 1466 } {1 {FOREIGN KEY constraint failed}}
1445 do_test fkey2-17.1.7 { 1467 do_test fkey2-17.1.7 {
1446 execsql { SELECT * FROM one } 1468 execsql { SELECT * FROM one }
1447 } {1 2 3 2 3 4 3 4 5 0 0 0} 1469 } {1 2 3 2 3 4 3 4 5 0 0 0}
1448 do_test fkey2-17.1.8 { 1470 do_test fkey2-17.1.8 {
1449 execsql { SELECT * FROM two } 1471 execsql { SELECT * FROM two }
1450 } {1 2 3 2 3 4 3 4 5} 1472 } {1 2 3 2 3 4 3 4 5}
1451 do_test fkey2-17.1.9 { 1473 do_test fkey2-17.1.9 {
1452 execsql COMMIT 1474 execsql COMMIT
1453 } {} 1475 } {}
1454 do_test fkey2-17.1.10 { 1476 do_test fkey2-17.1.10 {
1455 execsql { 1477 execsql {
1456 CREATE TABLE three( 1478 CREATE TABLE three(
1457 g, h, i, 1479 g, h, i,
1458 FOREIGN KEY(h, i) REFERENCES one(b, c) DEFERRABLE INITIALLY DEFERRED 1480 FOREIGN KEY(h, i) REFERENCES one(b, c) DEFERRABLE INITIALLY DEFERRED
1459 ); 1481 );
1460 } 1482 }
1461 } {} 1483 } {}
1462 do_test fkey2-17.1.11 { 1484 do_test fkey2-17.1.11 {
1463 set STMT [sqlite3_prepare_v2 db "INSERT INTO three VALUES(7, 8, 9)" -1 dummy] 1485 set STMT [sqlite3_prepare_v2 db "INSERT INTO three VALUES(7, 8, 9)" -1 dummy]
1464 sqlite3_step $STMT 1486 sqlite3_step $STMT
1465 } {SQLITE_ROW} 1487 } {SQLITE_ROW}
1466 do_test fkey2-17.1.12 { 1488 do_test fkey2-17.1.12 {
1467 sqlite3_column_text $STMT 0 1489 sqlite3_column_text $STMT 0
1468 } {1} 1490 } {1}
1469 do_test fkey2-17.1.13 { 1491 do_test fkey2-17.1.13 {
1470 sqlite3_step $STMT 1492 sqlite3_step $STMT
1471 } {SQLITE_CONSTRAINT} 1493 } {SQLITE_CONSTRAINT}
1494 verify_ex_errcode fkey2-17.1.13b SQLITE_CONSTRAINT_FOREIGNKEY
1472 do_test fkey2-17.1.14 { 1495 do_test fkey2-17.1.14 {
1473 sqlite3_finalize $STMT 1496 sqlite3_finalize $STMT
1474 } {SQLITE_CONSTRAINT} 1497 } {SQLITE_CONSTRAINT}
1498 verify_ex_errcode fkey2-17.1.14b SQLITE_CONSTRAINT_FOREIGNKEY
1475 1499
1476 drop_all_tables 1500 drop_all_tables
1477 do_test fkey2-17.2.1 { 1501 do_test fkey2-17.2.1 {
1478 execsql { 1502 execsql {
1479 CREATE TABLE high("a'b!" PRIMARY KEY, b); 1503 CREATE TABLE high("a'b!" PRIMARY KEY, b);
1480 CREATE TABLE low( 1504 CREATE TABLE low(
1481 c, 1505 c,
1482 "d&6" REFERENCES high ON UPDATE CASCADE ON DELETE CASCADE 1506 "d&6" REFERENCES high ON UPDATE CASCADE ON DELETE CASCADE
1483 ); 1507 );
1484 } 1508 }
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1523 1547
1524 ifcapable auth { 1548 ifcapable auth {
1525 do_test fkey2-18.1 { 1549 do_test fkey2-18.1 {
1526 execsql { 1550 execsql {
1527 CREATE TABLE long(a, b PRIMARY KEY, c); 1551 CREATE TABLE long(a, b PRIMARY KEY, c);
1528 CREATE TABLE short(d, e, f REFERENCES long); 1552 CREATE TABLE short(d, e, f REFERENCES long);
1529 CREATE TABLE mid(g, h, i REFERENCES long DEFERRABLE INITIALLY DEFERRED); 1553 CREATE TABLE mid(g, h, i REFERENCES long DEFERRABLE INITIALLY DEFERRED);
1530 } 1554 }
1531 } {} 1555 } {}
1532 1556
1533 proc auth {args} {eval lappend ::authargs $args ; return SQLITE_OK} 1557 proc auth {args} {eval lappend ::authargs [lrange $args 0 4]; return SQLITE_OK }
1534 db auth auth 1558 db auth auth
1535 1559
1536 # An insert on the parent table must read the child key of any deferred 1560 # An insert on the parent table must read the child key of any deferred
1537 # foreign key constraints. But not the child key of immediate constraints. 1561 # foreign key constraints. But not the child key of immediate constraints.
1538 set authargs {} 1562 set authargs {}
1539 do_test fkey2-18.2 { 1563 do_test fkey2-18.2 {
1540 execsql { INSERT INTO long VALUES(1, 2, 3) } 1564 execsql { INSERT INTO long VALUES(1, 2, 3) }
1541 set authargs 1565 set authargs
1542 } {SQLITE_INSERT long {} main {} SQLITE_READ mid i main {}} 1566 } {SQLITE_INSERT long {} main {} SQLITE_READ mid i main {}}
1543 1567
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
1588 # Return SQLITE_IGNORE to requests to read from the parent table. This 1612 # Return SQLITE_IGNORE to requests to read from the parent table. This
1589 # causes inserts of non-NULL keys into the child table to fail. 1613 # causes inserts of non-NULL keys into the child table to fail.
1590 # 1614 #
1591 rename auth {} 1615 rename auth {}
1592 proc auth {args} { 1616 proc auth {args} {
1593 if {[lindex $args 1] == "long"} {return SQLITE_IGNORE} 1617 if {[lindex $args 1] == "long"} {return SQLITE_IGNORE}
1594 return SQLITE_OK 1618 return SQLITE_OK
1595 } 1619 }
1596 do_test fkey2-18.8 { 1620 do_test fkey2-18.8 {
1597 catchsql { INSERT INTO short VALUES(1, 3, 2) } 1621 catchsql { INSERT INTO short VALUES(1, 3, 2) }
1598 } {1 {foreign key constraint failed}} 1622 } {1 {FOREIGN KEY constraint failed}}
1599 do_test fkey2-18.9 { 1623 do_test fkey2-18.9 {
1600 execsql { INSERT INTO short VALUES(1, 3, NULL) } 1624 execsql { INSERT INTO short VALUES(1, 3, NULL) }
1601 } {} 1625 } {}
1602 do_test fkey2-18.10 { 1626 do_test fkey2-18.10 {
1603 execsql { SELECT * FROM short } 1627 execsql { SELECT * FROM short }
1604 } {1 3 2 1 3 {}} 1628 } {1 3 2 1 3 {}}
1605 do_test fkey2-18.11 { 1629 do_test fkey2-18.11 {
1606 catchsql { UPDATE short SET f = 2 WHERE f IS NULL } 1630 catchsql { UPDATE short SET f = 2 WHERE f IS NULL }
1607 } {1 {foreign key constraint failed}} 1631 } {1 {FOREIGN KEY constraint failed}}
1608 1632
1609 db auth {} 1633 db auth {}
1610 unset authargs 1634 unset authargs
1611 } 1635 }
1612 1636
1613 1637
1614 do_test fkey2-19.1 { 1638 do_test fkey2-19.1 {
1615 execsql { 1639 execsql {
1616 CREATE TABLE main(id INTEGER PRIMARY KEY); 1640 CREATE TABLE main(id INTEGER PRIMARY KEY);
1617 CREATE TABLE sub(id INT REFERENCES main(id)); 1641 CREATE TABLE sub(id INT REFERENCES main(id));
1618 INSERT INTO main VALUES(1); 1642 INSERT INTO main VALUES(1);
1619 INSERT INTO main VALUES(2); 1643 INSERT INTO main VALUES(2);
1620 INSERT INTO sub VALUES(2); 1644 INSERT INTO sub VALUES(2);
1621 } 1645 }
1622 } {} 1646 } {}
1623 do_test fkey2-19.2 { 1647 do_test fkey2-19.2 {
1624 set S [sqlite3_prepare_v2 db "DELETE FROM main WHERE id = ?" -1 dummy] 1648 set S [sqlite3_prepare_v2 db "DELETE FROM main WHERE id = ?" -1 dummy]
1625 sqlite3_bind_int $S 1 2 1649 sqlite3_bind_int $S 1 2
1626 sqlite3_step $S 1650 sqlite3_step $S
1627 } {SQLITE_CONSTRAINT} 1651 } {SQLITE_CONSTRAINT}
1652 verify_ex_errcode fkey2-19.2b SQLITE_CONSTRAINT_FOREIGNKEY
1628 do_test fkey2-19.3 { 1653 do_test fkey2-19.3 {
1629 sqlite3_reset $S 1654 sqlite3_reset $S
1630 } {SQLITE_CONSTRAINT} 1655 } {SQLITE_CONSTRAINT}
1656 verify_ex_errcode fkey2-19.3b SQLITE_CONSTRAINT_FOREIGNKEY
1631 do_test fkey2-19.4 { 1657 do_test fkey2-19.4 {
1632 sqlite3_bind_int $S 1 1 1658 sqlite3_bind_int $S 1 1
1633 sqlite3_step $S 1659 sqlite3_step $S
1634 } {SQLITE_DONE} 1660 } {SQLITE_DONE}
1635 do_test fkey2-19.4 { 1661 do_test fkey2-19.4 {
1636 sqlite3_finalize $S 1662 sqlite3_finalize $S
1637 } {SQLITE_OK} 1663 } {SQLITE_OK}
1638 1664
1639 drop_all_tables 1665 drop_all_tables
1640 do_test fkey2-20.1 { 1666 do_test fkey2-20.1 {
1641 execsql { 1667 execsql {
1642 CREATE TABLE pp(a PRIMARY KEY, b); 1668 CREATE TABLE pp(a PRIMARY KEY, b);
1643 CREATE TABLE cc(c PRIMARY KEY, d REFERENCES pp); 1669 CREATE TABLE cc(c PRIMARY KEY, d REFERENCES pp);
1644 } 1670 }
1645 } {} 1671 } {}
1646 1672
1647 foreach {tn insert} { 1673 foreach {tn insert} {
1648 1 "INSERT" 1674 1 "INSERT"
1649 2 "INSERT OR IGNORE" 1675 2 "INSERT OR IGNORE"
1650 3 "INSERT OR ABORT" 1676 3 "INSERT OR ABORT"
1651 4 "INSERT OR ROLLBACK" 1677 4 "INSERT OR ROLLBACK"
1652 5 "INSERT OR REPLACE" 1678 5 "INSERT OR REPLACE"
1653 6 "INSERT OR FAIL" 1679 6 "INSERT OR FAIL"
1654 } { 1680 } {
1655 do_test fkey2-20.2.$tn.1 { 1681 do_test fkey2-20.2.$tn.1 {
1656 catchsql "$insert INTO cc VALUES(1, 2)" 1682 catchsql "$insert INTO cc VALUES(1, 2)"
1657 } {1 {foreign key constraint failed}} 1683 } {1 {FOREIGN KEY constraint failed}}
1658 do_test fkey2-20.2.$tn.2 { 1684 do_test fkey2-20.2.$tn.2 {
1659 execsql { SELECT * FROM cc } 1685 execsql { SELECT * FROM cc }
1660 } {} 1686 } {}
1661 do_test fkey2-20.2.$tn.3 { 1687 do_test fkey2-20.2.$tn.3 {
1662 execsql { 1688 execsql {
1663 BEGIN; 1689 BEGIN;
1664 INSERT INTO pp VALUES(2, 'two'); 1690 INSERT INTO pp VALUES(2, 'two');
1665 INSERT INTO cc VALUES(1, 2); 1691 INSERT INTO cc VALUES(1, 2);
1666 } 1692 }
1667 catchsql "$insert INTO cc VALUES(3, 4)" 1693 catchsql "$insert INTO cc VALUES(3, 4)"
1668 } {1 {foreign key constraint failed}} 1694 } {1 {FOREIGN KEY constraint failed}}
1669 do_test fkey2-20.2.$tn.4 { 1695 do_test fkey2-20.2.$tn.4 {
1670 execsql { COMMIT ; SELECT * FROM cc } 1696 execsql { COMMIT ; SELECT * FROM cc }
1671 } {1 2} 1697 } {1 2}
1672 do_test fkey2-20.2.$tn.5 { 1698 do_test fkey2-20.2.$tn.5 {
1673 execsql { DELETE FROM cc ; DELETE FROM pp } 1699 execsql { DELETE FROM cc ; DELETE FROM pp }
1674 } {} 1700 } {}
1675 } 1701 }
1676 1702
1677 foreach {tn update} { 1703 foreach {tn update} {
1678 1 "UPDATE" 1704 1 "UPDATE"
1679 2 "UPDATE OR IGNORE" 1705 2 "UPDATE OR IGNORE"
1680 3 "UPDATE OR ABORT" 1706 3 "UPDATE OR ABORT"
1681 4 "UPDATE OR ROLLBACK" 1707 4 "UPDATE OR ROLLBACK"
1682 5 "UPDATE OR REPLACE" 1708 5 "UPDATE OR REPLACE"
1683 6 "UPDATE OR FAIL" 1709 6 "UPDATE OR FAIL"
1684 } { 1710 } {
1685 do_test fkey2-20.3.$tn.1 { 1711 do_test fkey2-20.3.$tn.1 {
1686 execsql { 1712 execsql {
1687 INSERT INTO pp VALUES(2, 'two'); 1713 INSERT INTO pp VALUES(2, 'two');
1688 INSERT INTO cc VALUES(1, 2); 1714 INSERT INTO cc VALUES(1, 2);
1689 } 1715 }
1690 } {} 1716 } {}
1691 do_test fkey2-20.3.$tn.2 { 1717 do_test fkey2-20.3.$tn.2 {
1692 catchsql "$update pp SET a = 1" 1718 catchsql "$update pp SET a = 1"
1693 } {1 {foreign key constraint failed}} 1719 } {1 {FOREIGN KEY constraint failed}}
1694 do_test fkey2-20.3.$tn.3 { 1720 do_test fkey2-20.3.$tn.3 {
1695 execsql { SELECT * FROM pp } 1721 execsql { SELECT * FROM pp }
1696 } {2 two} 1722 } {2 two}
1697 do_test fkey2-20.3.$tn.4 { 1723 do_test fkey2-20.3.$tn.4 {
1698 catchsql "$update cc SET d = 1" 1724 catchsql "$update cc SET d = 1"
1699 } {1 {foreign key constraint failed}} 1725 } {1 {FOREIGN KEY constraint failed}}
1700 do_test fkey2-20.3.$tn.5 { 1726 do_test fkey2-20.3.$tn.5 {
1701 execsql { SELECT * FROM cc } 1727 execsql { SELECT * FROM cc }
1702 } {1 2} 1728 } {1 2}
1703 do_test fkey2-20.3.$tn.6 { 1729 do_test fkey2-20.3.$tn.6 {
1704 execsql { 1730 execsql {
1705 BEGIN; 1731 BEGIN;
1706 INSERT INTO pp VALUES(3, 'three'); 1732 INSERT INTO pp VALUES(3, 'three');
1707 } 1733 }
1708 catchsql "$update pp SET a = 1 WHERE a = 2" 1734 catchsql "$update pp SET a = 1 WHERE a = 2"
1709 } {1 {foreign key constraint failed}} 1735 } {1 {FOREIGN KEY constraint failed}}
1710 do_test fkey2-20.3.$tn.7 { 1736 do_test fkey2-20.3.$tn.7 {
1711 execsql { COMMIT ; SELECT * FROM pp } 1737 execsql { COMMIT ; SELECT * FROM pp }
1712 } {2 two 3 three} 1738 } {2 two 3 three}
1713 do_test fkey2-20.3.$tn.8 { 1739 do_test fkey2-20.3.$tn.8 {
1714 execsql { 1740 execsql {
1715 BEGIN; 1741 BEGIN;
1716 INSERT INTO cc VALUES(2, 2); 1742 INSERT INTO cc VALUES(2, 2);
1717 } 1743 }
1718 catchsql "$update cc SET d = 1 WHERE c = 1" 1744 catchsql "$update cc SET d = 1 WHERE c = 1"
1719 } {1 {foreign key constraint failed}} 1745 } {1 {FOREIGN KEY constraint failed}}
1720 do_test fkey2-20.3.$tn.9 { 1746 do_test fkey2-20.3.$tn.9 {
1721 execsql { COMMIT ; SELECT * FROM cc } 1747 execsql { COMMIT ; SELECT * FROM cc }
1722 } {1 2 2 2} 1748 } {1 2 2 2}
1723 do_test fkey2-20.3.$tn.10 { 1749 do_test fkey2-20.3.$tn.10 {
1724 execsql { DELETE FROM cc ; DELETE FROM pp } 1750 execsql { DELETE FROM cc ; DELETE FROM pp }
1725 } {} 1751 } {}
1726 } 1752 }
1727 1753
1728 #------------------------------------------------------------------------- 1754 #-------------------------------------------------------------------------
1729 # The following block of tests, those prefixed with "fkey2-genfkey.", are 1755 # The following block of tests, those prefixed with "fkey2-genfkey.", are
1730 # the same tests that were used to test the ".genfkey" command provided 1756 # the same tests that were used to test the ".genfkey" command provided
1731 # by the shell tool. So these tests show that the built-in foreign key 1757 # by the shell tool. So these tests show that the built-in foreign key
1732 # implementation is more or less compatible with the triggers generated 1758 # implementation is more or less compatible with the triggers generated
1733 # by genfkey. 1759 # by genfkey.
1734 # 1760 #
1735 drop_all_tables 1761 drop_all_tables
1736 do_test fkey2-genfkey.1.1 { 1762 do_test fkey2-genfkey.1.1 {
1737 execsql { 1763 execsql {
1738 CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c, UNIQUE(b, c)); 1764 CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c, UNIQUE(b, c));
1739 CREATE TABLE t2(e REFERENCES t1, f); 1765 CREATE TABLE t2(e REFERENCES t1, f);
1740 CREATE TABLE t3(g, h, i, FOREIGN KEY (h, i) REFERENCES t1(b, c)); 1766 CREATE TABLE t3(g, h, i, FOREIGN KEY (h, i) REFERENCES t1(b, c));
1741 } 1767 }
1742 } {} 1768 } {}
1743 do_test fkey2-genfkey.1.2 { 1769 do_test fkey2-genfkey.1.2 {
1744 catchsql { INSERT INTO t2 VALUES(1, 2) } 1770 catchsql { INSERT INTO t2 VALUES(1, 2) }
1745 } {1 {foreign key constraint failed}} 1771 } {1 {FOREIGN KEY constraint failed}}
1746 do_test fkey2-genfkey.1.3 { 1772 do_test fkey2-genfkey.1.3 {
1747 execsql { 1773 execsql {
1748 INSERT INTO t1 VALUES(1, 2, 3); 1774 INSERT INTO t1 VALUES(1, 2, 3);
1749 INSERT INTO t2 VALUES(1, 2); 1775 INSERT INTO t2 VALUES(1, 2);
1750 } 1776 }
1751 } {} 1777 } {}
1752 do_test fkey2-genfkey.1.4 { 1778 do_test fkey2-genfkey.1.4 {
1753 execsql { INSERT INTO t2 VALUES(NULL, 3) } 1779 execsql { INSERT INTO t2 VALUES(NULL, 3) }
1754 } {} 1780 } {}
1755 do_test fkey2-genfkey.1.5 { 1781 do_test fkey2-genfkey.1.5 {
1756 catchsql { UPDATE t2 SET e = 5 WHERE e IS NULL } 1782 catchsql { UPDATE t2 SET e = 5 WHERE e IS NULL }
1757 } {1 {foreign key constraint failed}} 1783 } {1 {FOREIGN KEY constraint failed}}
1758 do_test fkey2-genfkey.1.6 { 1784 do_test fkey2-genfkey.1.6 {
1759 execsql { UPDATE t2 SET e = 1 WHERE e IS NULL } 1785 execsql { UPDATE t2 SET e = 1 WHERE e IS NULL }
1760 } {} 1786 } {}
1761 do_test fkey2-genfkey.1.7 { 1787 do_test fkey2-genfkey.1.7 {
1762 execsql { UPDATE t2 SET e = NULL WHERE f = 3 } 1788 execsql { UPDATE t2 SET e = NULL WHERE f = 3 }
1763 } {} 1789 } {}
1764 do_test fkey2-genfkey.1.8 { 1790 do_test fkey2-genfkey.1.8 {
1765 catchsql { UPDATE t1 SET a = 10 } 1791 catchsql { UPDATE t1 SET a = 10 }
1766 } {1 {foreign key constraint failed}} 1792 } {1 {FOREIGN KEY constraint failed}}
1767 do_test fkey2-genfkey.1.9 { 1793 do_test fkey2-genfkey.1.9 {
1768 catchsql { UPDATE t1 SET a = NULL } 1794 catchsql { UPDATE t1 SET a = NULL }
1769 } {1 {datatype mismatch}} 1795 } {1 {datatype mismatch}}
1770 do_test fkey2-genfkey.1.10 { 1796 do_test fkey2-genfkey.1.10 {
1771 catchsql { DELETE FROM t1 } 1797 catchsql { DELETE FROM t1 }
1772 } {1 {foreign key constraint failed}} 1798 } {1 {FOREIGN KEY constraint failed}}
1773 do_test fkey2-genfkey.1.11 { 1799 do_test fkey2-genfkey.1.11 {
1774 execsql { UPDATE t2 SET e = NULL } 1800 execsql { UPDATE t2 SET e = NULL }
1775 } {} 1801 } {}
1776 do_test fkey2-genfkey.1.12 { 1802 do_test fkey2-genfkey.1.12 {
1777 execsql { 1803 execsql {
1778 UPDATE t1 SET a = 10; 1804 UPDATE t1 SET a = 10;
1779 DELETE FROM t1; 1805 DELETE FROM t1;
1780 DELETE FROM t2; 1806 DELETE FROM t2;
1781 } 1807 }
1782 } {} 1808 } {}
1783 do_test fkey2-genfkey.1.13 { 1809 do_test fkey2-genfkey.1.13 {
1784 execsql { 1810 execsql {
1785 INSERT INTO t3 VALUES(1, NULL, NULL); 1811 INSERT INTO t3 VALUES(1, NULL, NULL);
1786 INSERT INTO t3 VALUES(1, 2, NULL); 1812 INSERT INTO t3 VALUES(1, 2, NULL);
1787 INSERT INTO t3 VALUES(1, NULL, 3); 1813 INSERT INTO t3 VALUES(1, NULL, 3);
1788 } 1814 }
1789 } {} 1815 } {}
1790 do_test fkey2-genfkey.1.14 { 1816 do_test fkey2-genfkey.1.14 {
1791 catchsql { INSERT INTO t3 VALUES(3, 1, 4) } 1817 catchsql { INSERT INTO t3 VALUES(3, 1, 4) }
1792 } {1 {foreign key constraint failed}} 1818 } {1 {FOREIGN KEY constraint failed}}
1793 do_test fkey2-genfkey.1.15 { 1819 do_test fkey2-genfkey.1.15 {
1794 execsql { 1820 execsql {
1795 INSERT INTO t1 VALUES(1, 1, 4); 1821 INSERT INTO t1 VALUES(1, 1, 4);
1796 INSERT INTO t3 VALUES(3, 1, 4); 1822 INSERT INTO t3 VALUES(3, 1, 4);
1797 } 1823 }
1798 } {} 1824 } {}
1799 do_test fkey2-genfkey.1.16 { 1825 do_test fkey2-genfkey.1.16 {
1800 catchsql { DELETE FROM t1 } 1826 catchsql { DELETE FROM t1 }
1801 } {1 {foreign key constraint failed}} 1827 } {1 {FOREIGN KEY constraint failed}}
1802 do_test fkey2-genfkey.1.17 { 1828 do_test fkey2-genfkey.1.17 {
1803 catchsql { UPDATE t1 SET b = 10} 1829 catchsql { UPDATE t1 SET b = 10}
1804 } {1 {foreign key constraint failed}} 1830 } {1 {FOREIGN KEY constraint failed}}
1805 do_test fkey2-genfkey.1.18 { 1831 do_test fkey2-genfkey.1.18 {
1806 execsql { UPDATE t1 SET a = 10} 1832 execsql { UPDATE t1 SET a = 10}
1807 } {} 1833 } {}
1808 do_test fkey2-genfkey.1.19 { 1834 do_test fkey2-genfkey.1.19 {
1809 catchsql { UPDATE t3 SET h = 'hello' WHERE i = 3} 1835 catchsql { UPDATE t3 SET h = 'hello' WHERE i = 3}
1810 } {1 {foreign key constraint failed}} 1836 } {1 {FOREIGN KEY constraint failed}}
1811 1837
1812 drop_all_tables 1838 drop_all_tables
1813 do_test fkey2-genfkey.2.1 { 1839 do_test fkey2-genfkey.2.1 {
1814 execsql { 1840 execsql {
1815 CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c, UNIQUE(b, c)); 1841 CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c, UNIQUE(b, c));
1816 CREATE TABLE t2(e REFERENCES t1 ON UPDATE CASCADE ON DELETE CASCADE, f); 1842 CREATE TABLE t2(e REFERENCES t1 ON UPDATE CASCADE ON DELETE CASCADE, f);
1817 CREATE TABLE t3(g, h, i, 1843 CREATE TABLE t3(g, h, i,
1818 FOREIGN KEY (h, i) 1844 FOREIGN KEY (h, i)
1819 REFERENCES t1(b, c) ON UPDATE CASCADE ON DELETE CASCADE 1845 REFERENCES t1(b, c) ON UPDATE CASCADE ON DELETE CASCADE
1820 ); 1846 );
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
1913 INSERT INTO tdd08 VALUES(200,300); 1939 INSERT INTO tdd08 VALUES(200,300);
1914 1940
1915 CREATE TABLE tdd08_b(w,x,y, FOREIGN KEY(x,y) REFERENCES tdd08(a,b)); 1941 CREATE TABLE tdd08_b(w,x,y, FOREIGN KEY(x,y) REFERENCES tdd08(a,b));
1916 INSERT INTO tdd08_b VALUES(100,200,300); 1942 INSERT INTO tdd08_b VALUES(100,200,300);
1917 } 1943 }
1918 } {} 1944 } {}
1919 do_test fkey2-dd08e5.1.2 { 1945 do_test fkey2-dd08e5.1.2 {
1920 catchsql { 1946 catchsql {
1921 DELETE FROM tdd08; 1947 DELETE FROM tdd08;
1922 } 1948 }
1923 } {1 {foreign key constraint failed}} 1949 } {1 {FOREIGN KEY constraint failed}}
1924 do_test fkey2-dd08e5.1.3 { 1950 do_test fkey2-dd08e5.1.3 {
1925 execsql { 1951 execsql {
1926 SELECT * FROM tdd08; 1952 SELECT * FROM tdd08;
1927 } 1953 }
1928 } {200 300} 1954 } {200 300}
1929 do_test fkey2-dd08e5.1.4 { 1955 do_test fkey2-dd08e5.1.4 {
1930 catchsql { 1956 catchsql {
1931 INSERT INTO tdd08_b VALUES(400,500,300); 1957 INSERT INTO tdd08_b VALUES(400,500,300);
1932 } 1958 }
1933 } {1 {foreign key constraint failed}} 1959 } {1 {FOREIGN KEY constraint failed}}
1934 do_test fkey2-dd08e5.1.5 { 1960 do_test fkey2-dd08e5.1.5 {
1935 catchsql { 1961 catchsql {
1936 UPDATE tdd08_b SET x=x+1; 1962 UPDATE tdd08_b SET x=x+1;
1937 } 1963 }
1938 } {1 {foreign key constraint failed}} 1964 } {1 {FOREIGN KEY constraint failed}}
1939 do_test fkey2-dd08e5.1.6 { 1965 do_test fkey2-dd08e5.1.6 {
1940 catchsql { 1966 catchsql {
1941 UPDATE tdd08 SET a=a+1; 1967 UPDATE tdd08 SET a=a+1;
1942 } 1968 }
1943 } {1 {foreign key constraint failed}} 1969 } {1 {FOREIGN KEY constraint failed}}
1944 1970
1945 #------------------------------------------------------------------------- 1971 #-------------------------------------------------------------------------
1946 # Verify that ticket ce7c133ea6cc9ccdc1a60d80441f80b6180f5eba 1972 # Verify that ticket ce7c133ea6cc9ccdc1a60d80441f80b6180f5eba
1947 # fixed. 1973 # fixed.
1948 # 1974 #
1949 do_test fkey2-ce7c13.1.1 { 1975 do_test fkey2-ce7c13.1.1 {
1950 execsql { 1976 execsql {
1951 CREATE TABLE tce71(a INTEGER PRIMARY KEY, b); 1977 CREATE TABLE tce71(a INTEGER PRIMARY KEY, b);
1952 CREATE UNIQUE INDEX ice71 ON tce71(a,b); 1978 CREATE UNIQUE INDEX ice71 ON tce71(a,b);
1953 INSERT INTO tce71 VALUES(100,200); 1979 INSERT INTO tce71 VALUES(100,200);
1954 CREATE TABLE tce72(w, x, y, FOREIGN KEY(x,y) REFERENCES tce71(a,b)); 1980 CREATE TABLE tce72(w, x, y, FOREIGN KEY(x,y) REFERENCES tce71(a,b));
1955 INSERT INTO tce72 VALUES(300,100,200); 1981 INSERT INTO tce72 VALUES(300,100,200);
1956 UPDATE tce71 set b = 200 where a = 100; 1982 UPDATE tce71 set b = 200 where a = 100;
1957 SELECT * FROM tce71, tce72; 1983 SELECT * FROM tce71, tce72;
1958 } 1984 }
1959 } {100 200 300 100 200} 1985 } {100 200 300 100 200}
1960 do_test fkey2-ce7c13.1.2 { 1986 do_test fkey2-ce7c13.1.2 {
1961 catchsql { 1987 catchsql {
1962 UPDATE tce71 set b = 201 where a = 100; 1988 UPDATE tce71 set b = 201 where a = 100;
1963 } 1989 }
1964 } {1 {foreign key constraint failed}} 1990 } {1 {FOREIGN KEY constraint failed}}
1965 do_test fkey2-ce7c13.1.3 { 1991 do_test fkey2-ce7c13.1.3 {
1966 catchsql { 1992 catchsql {
1967 UPDATE tce71 set a = 101 where a = 100; 1993 UPDATE tce71 set a = 101 where a = 100;
1968 } 1994 }
1969 } {1 {foreign key constraint failed}} 1995 } {1 {FOREIGN KEY constraint failed}}
1970 do_test fkey2-ce7c13.1.4 { 1996 do_test fkey2-ce7c13.1.4 {
1971 execsql { 1997 execsql {
1972 CREATE TABLE tce73(a INTEGER PRIMARY KEY, b, UNIQUE(a,b)); 1998 CREATE TABLE tce73(a INTEGER PRIMARY KEY, b, UNIQUE(a,b));
1973 INSERT INTO tce73 VALUES(100,200); 1999 INSERT INTO tce73 VALUES(100,200);
1974 CREATE TABLE tce74(w, x, y, FOREIGN KEY(x,y) REFERENCES tce73(a,b)); 2000 CREATE TABLE tce74(w, x, y, FOREIGN KEY(x,y) REFERENCES tce73(a,b));
1975 INSERT INTO tce74 VALUES(300,100,200); 2001 INSERT INTO tce74 VALUES(300,100,200);
1976 UPDATE tce73 set b = 200 where a = 100; 2002 UPDATE tce73 set b = 200 where a = 100;
1977 SELECT * FROM tce73, tce74; 2003 SELECT * FROM tce73, tce74;
1978 } 2004 }
1979 } {100 200 300 100 200} 2005 } {100 200 300 100 200}
1980 do_test fkey2-ce7c13.1.5 { 2006 do_test fkey2-ce7c13.1.5 {
1981 catchsql { 2007 catchsql {
1982 UPDATE tce73 set b = 201 where a = 100; 2008 UPDATE tce73 set b = 201 where a = 100;
1983 } 2009 }
1984 } {1 {foreign key constraint failed}} 2010 } {1 {FOREIGN KEY constraint failed}}
1985 do_test fkey2-ce7c13.1.6 { 2011 do_test fkey2-ce7c13.1.6 {
1986 catchsql { 2012 catchsql {
1987 UPDATE tce73 set a = 101 where a = 100; 2013 UPDATE tce73 set a = 101 where a = 100;
1988 } 2014 }
1989 } {1 {foreign key constraint failed}} 2015 } {1 {FOREIGN KEY constraint failed}}
1990 2016
1991 finish_test 2017 finish_test
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698