github.com/jdgcs/sqlite3@v1.12.1-0.20210908114423-bc5f96e4dd51/testdata/tcl/e_fkey.test (about) 1 # 2009 October 7 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 # This file implements tests to verify the "testable statements" in the 13 # foreignkeys.in document. 14 # 15 # The tests in this file are arranged to mirror the structure of 16 # foreignkey.in, with one exception: The statements in section 2, which 17 # deals with enabling/disabling foreign key support, is tested first, 18 # before section 1. This is because some statements in section 2 deal 19 # with builds that do not include complete foreign key support (because 20 # either SQLITE_OMIT_TRIGGER or SQLITE_OMIT_FOREIGN_KEY was defined 21 # at build time). 22 # 23 24 set testdir [file dirname $argv0] 25 source $testdir/tester.tcl 26 27 proc eqp {sql {db db}} { 28 uplevel [subst -nocommands { 29 set eqpres [list] 30 $db eval "$sql" { 31 lappend eqpres [set detail] 32 } 33 set eqpres 34 }] 35 } 36 37 proc do_detail_test {tn sql res} { 38 set normalres [list {*}$res] 39 uplevel [subst -nocommands { 40 do_test $tn { 41 eqp { $sql } 42 } {$normalres} 43 }] 44 } 45 46 ########################################################################### 47 ### SECTION 2: Enabling Foreign Key Support 48 ########################################################################### 49 50 #------------------------------------------------------------------------- 51 # EVIDENCE-OF: R-33710-56344 In order to use foreign key constraints in 52 # SQLite, the library must be compiled with neither 53 # SQLITE_OMIT_FOREIGN_KEY or SQLITE_OMIT_TRIGGER defined. 54 # 55 ifcapable trigger&&foreignkey { 56 do_test e_fkey-1 { 57 execsql { 58 PRAGMA foreign_keys = ON; 59 CREATE TABLE p(i PRIMARY KEY); 60 CREATE TABLE c(j REFERENCES p ON UPDATE CASCADE); 61 INSERT INTO p VALUES('hello'); 62 INSERT INTO c VALUES('hello'); 63 UPDATE p SET i = 'world'; 64 SELECT * FROM c; 65 } 66 } {world} 67 } 68 69 #------------------------------------------------------------------------- 70 # Test the effects of defining OMIT_TRIGGER but not OMIT_FOREIGN_KEY. 71 # 72 # EVIDENCE-OF: R-10109-20452 If SQLITE_OMIT_TRIGGER is defined but 73 # SQLITE_OMIT_FOREIGN_KEY is not, then SQLite behaves as it did prior to 74 # version 3.6.19 (2009-10-14) - foreign key definitions are parsed and 75 # may be queried using PRAGMA foreign_key_list, but foreign key 76 # constraints are not enforced. 77 # 78 # Specifically, test that "PRAGMA foreign_keys" is a no-op in this case. 79 # When using the pragma to query the current setting, 0 rows are returned. 80 # 81 # EVIDENCE-OF: R-22567-44039 The PRAGMA foreign_keys command is a no-op 82 # in this configuration. 83 # 84 # EVIDENCE-OF: R-41784-13339 Tip: If the command "PRAGMA foreign_keys" 85 # returns no data instead of a single row containing "0" or "1", then 86 # the version of SQLite you are using does not support foreign keys 87 # (either because it is older than 3.6.19 or because it was compiled 88 # with SQLITE_OMIT_FOREIGN_KEY or SQLITE_OMIT_TRIGGER defined). 89 # 90 reset_db 91 ifcapable !trigger&&foreignkey { 92 do_test e_fkey-2.1 { 93 execsql { 94 PRAGMA foreign_keys = ON; 95 CREATE TABLE p(i PRIMARY KEY); 96 CREATE TABLE c(j REFERENCES p ON UPDATE CASCADE); 97 INSERT INTO p VALUES('hello'); 98 INSERT INTO c VALUES('hello'); 99 UPDATE p SET i = 'world'; 100 SELECT * FROM c; 101 } 102 } {hello} 103 do_test e_fkey-2.2 { 104 execsql { PRAGMA foreign_key_list(c) } 105 } {0 0 p j {} CASCADE {NO ACTION} NONE} 106 do_test e_fkey-2.3 { 107 execsql { PRAGMA foreign_keys } 108 } {} 109 } 110 111 112 #------------------------------------------------------------------------- 113 # Test the effects of defining OMIT_FOREIGN_KEY. 114 # 115 # EVIDENCE-OF: R-58428-36660 If OMIT_FOREIGN_KEY is defined, then 116 # foreign key definitions cannot even be parsed (attempting to specify a 117 # foreign key definition is a syntax error). 118 # 119 # Specifically, test that foreign key constraints cannot even be parsed 120 # in such a build. 121 # 122 reset_db 123 ifcapable !foreignkey { 124 do_test e_fkey-3.1 { 125 execsql { CREATE TABLE p(i PRIMARY KEY) } 126 catchsql { CREATE TABLE c(j REFERENCES p ON UPDATE CASCADE) } 127 } {1 {near "ON": syntax error}} 128 do_test e_fkey-3.2 { 129 # This is allowed, as in this build, "REFERENCES" is not a keyword. 130 # The declared datatype of column j is "REFERENCES p". 131 execsql { CREATE TABLE c(j REFERENCES p) } 132 } {} 133 do_test e_fkey-3.3 { 134 execsql { PRAGMA table_info(c) } 135 } {0 j {REFERENCES p} 0 {} 0} 136 do_test e_fkey-3.4 { 137 execsql { PRAGMA foreign_key_list(c) } 138 } {} 139 do_test e_fkey-3.5 { 140 execsql { PRAGMA foreign_keys } 141 } {} 142 } 143 144 ifcapable !foreignkey||!trigger { finish_test ; return } 145 reset_db 146 147 148 #------------------------------------------------------------------------- 149 # EVIDENCE-OF: R-07280-60510 Assuming the library is compiled with 150 # foreign key constraints enabled, it must still be enabled by the 151 # application at runtime, using the PRAGMA foreign_keys command. 152 # 153 # This also tests that foreign key constraints are disabled by default. 154 # 155 # EVIDENCE-OF: R-44261-39702 Foreign key constraints are disabled by 156 # default (for backwards compatibility), so must be enabled separately 157 # for each database connection. 158 # 159 drop_all_tables 160 do_test e_fkey-4.1 { 161 execsql { 162 CREATE TABLE p(i PRIMARY KEY); 163 CREATE TABLE c(j REFERENCES p ON UPDATE CASCADE); 164 INSERT INTO p VALUES('hello'); 165 INSERT INTO c VALUES('hello'); 166 UPDATE p SET i = 'world'; 167 SELECT * FROM c; 168 } 169 } {hello} 170 do_test e_fkey-4.2 { 171 execsql { 172 DELETE FROM c; 173 DELETE FROM p; 174 PRAGMA foreign_keys = ON; 175 INSERT INTO p VALUES('hello'); 176 INSERT INTO c VALUES('hello'); 177 UPDATE p SET i = 'world'; 178 SELECT * FROM c; 179 } 180 } {world} 181 182 #------------------------------------------------------------------------- 183 # EVIDENCE-OF: R-08013-37737 The application can also use a PRAGMA 184 # foreign_keys statement to determine if foreign keys are currently 185 # enabled. 186 187 # 188 # This also tests the example code in section 2 of foreignkeys.in. 189 # 190 # EVIDENCE-OF: R-11255-19907 191 # 192 reset_db 193 do_test e_fkey-5.1 { 194 execsql { PRAGMA foreign_keys } 195 } {0} 196 do_test e_fkey-5.2 { 197 execsql { 198 PRAGMA foreign_keys = ON; 199 PRAGMA foreign_keys; 200 } 201 } {1} 202 do_test e_fkey-5.3 { 203 execsql { 204 PRAGMA foreign_keys = OFF; 205 PRAGMA foreign_keys; 206 } 207 } {0} 208 209 #------------------------------------------------------------------------- 210 # Test that it is not possible to enable or disable foreign key support 211 # while not in auto-commit mode. 212 # 213 # EVIDENCE-OF: R-46649-58537 It is not possible to enable or disable 214 # foreign key constraints in the middle of a multi-statement transaction 215 # (when SQLite is not in autocommit mode). Attempting to do so does not 216 # return an error; it simply has no effect. 217 # 218 reset_db 219 do_test e_fkey-6.1 { 220 execsql { 221 PRAGMA foreign_keys = ON; 222 CREATE TABLE t1(a UNIQUE, b); 223 CREATE TABLE t2(c, d REFERENCES t1(a)); 224 INSERT INTO t1 VALUES(1, 2); 225 INSERT INTO t2 VALUES(2, 1); 226 BEGIN; 227 PRAGMA foreign_keys = OFF; 228 } 229 catchsql { 230 DELETE FROM t1 231 } 232 } {1 {FOREIGN KEY constraint failed}} 233 do_test e_fkey-6.2 { 234 execsql { PRAGMA foreign_keys } 235 } {1} 236 do_test e_fkey-6.3 { 237 execsql { 238 COMMIT; 239 PRAGMA foreign_keys = OFF; 240 BEGIN; 241 PRAGMA foreign_keys = ON; 242 DELETE FROM t1; 243 PRAGMA foreign_keys; 244 } 245 } {0} 246 do_test e_fkey-6.4 { 247 execsql COMMIT 248 } {} 249 250 ########################################################################### 251 ### SECTION 1: Introduction to Foreign Key Constraints 252 ########################################################################### 253 execsql "PRAGMA foreign_keys = ON" 254 255 #------------------------------------------------------------------------- 256 # Verify that the syntax in the first example in section 1 is valid. 257 # 258 # EVIDENCE-OF: R-04042-24825 To do so, a foreign key definition may be 259 # added by modifying the declaration of the track table to the 260 # following: CREATE TABLE track( trackid INTEGER, trackname TEXT, 261 # trackartist INTEGER, FOREIGN KEY(trackartist) REFERENCES 262 # artist(artistid) ); 263 # 264 do_test e_fkey-7.1 { 265 execsql { 266 CREATE TABLE artist( 267 artistid INTEGER PRIMARY KEY, 268 artistname TEXT 269 ); 270 CREATE TABLE track( 271 trackid INTEGER, 272 trackname TEXT, 273 trackartist INTEGER, 274 FOREIGN KEY(trackartist) REFERENCES artist(artistid) 275 ); 276 } 277 } {} 278 279 #------------------------------------------------------------------------- 280 # EVIDENCE-OF: R-61362-32087 Attempting to insert a row into the track 281 # table that does not correspond to any row in the artist table will 282 # fail, 283 # 284 do_test e_fkey-8.1 { 285 catchsql { INSERT INTO track VALUES(1, 'track 1', 1) } 286 } {1 {FOREIGN KEY constraint failed}} 287 do_test e_fkey-8.2 { 288 execsql { INSERT INTO artist VALUES(2, 'artist 1') } 289 catchsql { INSERT INTO track VALUES(1, 'track 1', 1) } 290 } {1 {FOREIGN KEY constraint failed}} 291 do_test e_fkey-8.2 { 292 execsql { INSERT INTO track VALUES(1, 'track 1', 2) } 293 } {} 294 295 #------------------------------------------------------------------------- 296 # Attempting to delete a row from the 'artist' table while there are 297 # dependent rows in the track table also fails. 298 # 299 # EVIDENCE-OF: R-24401-52400 as will attempting to delete a row from the 300 # artist table when there exist dependent rows in the track table 301 # 302 do_test e_fkey-9.1 { 303 catchsql { DELETE FROM artist WHERE artistid = 2 } 304 } {1 {FOREIGN KEY constraint failed}} 305 do_test e_fkey-9.2 { 306 execsql { 307 DELETE FROM track WHERE trackartist = 2; 308 DELETE FROM artist WHERE artistid = 2; 309 } 310 } {} 311 312 #------------------------------------------------------------------------- 313 # If the foreign key column (trackartist) in table 'track' is set to NULL, 314 # there is no requirement for a matching row in the 'artist' table. 315 # 316 # EVIDENCE-OF: R-23980-48859 There is one exception: if the foreign key 317 # column in the track table is NULL, then no corresponding entry in the 318 # artist table is required. 319 # 320 do_test e_fkey-10.1 { 321 execsql { 322 INSERT INTO track VALUES(1, 'track 1', NULL); 323 INSERT INTO track VALUES(2, 'track 2', NULL); 324 } 325 } {} 326 do_test e_fkey-10.2 { 327 execsql { SELECT * FROM artist } 328 } {} 329 do_test e_fkey-10.3 { 330 # Setting the trackid to a non-NULL value fails, of course. 331 catchsql { UPDATE track SET trackartist = 5 WHERE trackid = 1 } 332 } {1 {FOREIGN KEY constraint failed}} 333 do_test e_fkey-10.4 { 334 execsql { 335 INSERT INTO artist VALUES(5, 'artist 5'); 336 UPDATE track SET trackartist = 5 WHERE trackid = 1; 337 } 338 catchsql { DELETE FROM artist WHERE artistid = 5} 339 } {1 {FOREIGN KEY constraint failed}} 340 do_test e_fkey-10.5 { 341 execsql { 342 UPDATE track SET trackartist = NULL WHERE trackid = 1; 343 DELETE FROM artist WHERE artistid = 5; 344 } 345 } {} 346 347 #------------------------------------------------------------------------- 348 # Test that the following is true fo all rows in the track table: 349 # 350 # trackartist IS NULL OR 351 # EXISTS(SELECT 1 FROM artist WHERE artistid=trackartist) 352 # 353 # EVIDENCE-OF: R-52486-21352 Expressed in SQL, this means that for every 354 # row in the track table, the following expression evaluates to true: 355 # trackartist IS NULL OR EXISTS(SELECT 1 FROM artist WHERE 356 # artistid=trackartist) 357 358 # This procedure executes a test case to check that statement 359 # R-52486-21352 is true after executing the SQL statement passed. 360 # as the second argument. 361 proc test_r52486_21352 {tn sql} { 362 set res [catchsql $sql] 363 set results { 364 {0 {}} 365 {1 {UNIQUE constraint failed: artist.artistid}} 366 {1 {FOREIGN KEY constraint failed}} 367 } 368 if {[lsearch $results $res]<0} { 369 error $res 370 } 371 372 do_test e_fkey-11.$tn { 373 execsql { 374 SELECT count(*) FROM track WHERE NOT ( 375 trackartist IS NULL OR 376 EXISTS(SELECT 1 FROM artist WHERE artistid=trackartist) 377 ) 378 } 379 } {0} 380 } 381 382 # Execute a series of random INSERT, UPDATE and DELETE operations 383 # (some of which may fail due to FK or PK constraint violations) on 384 # the two tables in the example schema. Test that R-52486-21352 385 # is true after executing each operation. 386 # 387 set Template { 388 {INSERT INTO track VALUES($t, 'track $t', $a)} 389 {DELETE FROM track WHERE trackid = $t} 390 {UPDATE track SET trackartist = $a WHERE trackid = $t} 391 {INSERT INTO artist VALUES($a, 'artist $a')} 392 {DELETE FROM artist WHERE artistid = $a} 393 {UPDATE artist SET artistid = $a2 WHERE artistid = $a} 394 } 395 for {set i 0} {$i < 500} {incr i} { 396 set a [expr int(rand()*10)] 397 set a2 [expr int(rand()*10)] 398 set t [expr int(rand()*50)] 399 set sql [subst [lindex $Template [expr int(rand()*6)]]] 400 401 test_r52486_21352 $i $sql 402 } 403 404 #------------------------------------------------------------------------- 405 # Check that a NOT NULL constraint can be added to the example schema 406 # to prohibit NULL child keys from being inserted. 407 # 408 # EVIDENCE-OF: R-42412-59321 Tip: If the application requires a stricter 409 # relationship between artist and track, where NULL values are not 410 # permitted in the trackartist column, simply add the appropriate "NOT 411 # NULL" constraint to the schema. 412 # 413 drop_all_tables 414 do_test e_fkey-12.1 { 415 execsql { 416 CREATE TABLE artist( 417 artistid INTEGER PRIMARY KEY, 418 artistname TEXT 419 ); 420 CREATE TABLE track( 421 trackid INTEGER, 422 trackname TEXT, 423 trackartist INTEGER NOT NULL, 424 FOREIGN KEY(trackartist) REFERENCES artist(artistid) 425 ); 426 } 427 } {} 428 do_test e_fkey-12.2 { 429 catchsql { INSERT INTO track VALUES(14, 'Mr. Bojangles', NULL) } 430 } {1 {NOT NULL constraint failed: track.trackartist}} 431 432 #------------------------------------------------------------------------- 433 # EVIDENCE-OF: R-16127-35442 434 # 435 # Test an example from foreignkeys.html. 436 # 437 drop_all_tables 438 do_test e_fkey-13.1 { 439 execsql { 440 CREATE TABLE artist( 441 artistid INTEGER PRIMARY KEY, 442 artistname TEXT 443 ); 444 CREATE TABLE track( 445 trackid INTEGER, 446 trackname TEXT, 447 trackartist INTEGER, 448 FOREIGN KEY(trackartist) REFERENCES artist(artistid) 449 ); 450 INSERT INTO artist VALUES(1, 'Dean Martin'); 451 INSERT INTO artist VALUES(2, 'Frank Sinatra'); 452 INSERT INTO track VALUES(11, 'That''s Amore', 1); 453 INSERT INTO track VALUES(12, 'Christmas Blues', 1); 454 INSERT INTO track VALUES(13, 'My Way', 2); 455 } 456 } {} 457 do_test e_fkey-13.2 { 458 catchsql { INSERT INTO track VALUES(14, 'Mr. Bojangles', 3) } 459 } {1 {FOREIGN KEY constraint failed}} 460 do_test e_fkey-13.3 { 461 execsql { INSERT INTO track VALUES(14, 'Mr. Bojangles', NULL) } 462 } {} 463 do_test e_fkey-13.4 { 464 catchsql { 465 UPDATE track SET trackartist = 3 WHERE trackname = 'Mr. Bojangles'; 466 } 467 } {1 {FOREIGN KEY constraint failed}} 468 do_test e_fkey-13.5 { 469 execsql { 470 INSERT INTO artist VALUES(3, 'Sammy Davis Jr.'); 471 UPDATE track SET trackartist = 3 WHERE trackname = 'Mr. Bojangles'; 472 INSERT INTO track VALUES(15, 'Boogie Woogie', 3); 473 } 474 } {} 475 476 #------------------------------------------------------------------------- 477 # EVIDENCE-OF: R-15958-50233 478 # 479 # Test the second example from the first section of foreignkeys.html. 480 # 481 do_test e_fkey-14.1 { 482 catchsql { 483 DELETE FROM artist WHERE artistname = 'Frank Sinatra'; 484 } 485 } {1 {FOREIGN KEY constraint failed}} 486 do_test e_fkey-14.2 { 487 execsql { 488 DELETE FROM track WHERE trackname = 'My Way'; 489 DELETE FROM artist WHERE artistname = 'Frank Sinatra'; 490 } 491 } {} 492 do_test e_fkey-14.3 { 493 catchsql { 494 UPDATE artist SET artistid=4 WHERE artistname = 'Dean Martin'; 495 } 496 } {1 {FOREIGN KEY constraint failed}} 497 do_test e_fkey-14.4 { 498 execsql { 499 DELETE FROM track WHERE trackname IN('That''s Amore', 'Christmas Blues'); 500 UPDATE artist SET artistid=4 WHERE artistname = 'Dean Martin'; 501 } 502 } {} 503 504 505 #------------------------------------------------------------------------- 506 # EVIDENCE-OF: R-56032-24923 The foreign key constraint is satisfied if 507 # for each row in the child table either one or more of the child key 508 # columns are NULL, or there exists a row in the parent table for which 509 # each parent key column contains a value equal to the value in its 510 # associated child key column. 511 # 512 # Test also that the usual comparison rules are used when testing if there 513 # is a matching row in the parent table of a foreign key constraint. 514 # 515 # EVIDENCE-OF: R-57765-12380 In the above paragraph, the term "equal" 516 # means equal when values are compared using the rules specified here. 517 # 518 drop_all_tables 519 do_test e_fkey-15.1 { 520 execsql { 521 CREATE TABLE par(p PRIMARY KEY); 522 CREATE TABLE chi(c REFERENCES par); 523 524 INSERT INTO par VALUES(1); 525 INSERT INTO par VALUES('1'); 526 INSERT INTO par VALUES(X'31'); 527 SELECT typeof(p) FROM par; 528 } 529 } {integer text blob} 530 531 proc test_efkey_45 {tn isError sql} { 532 do_test e_fkey-15.$tn.1 " 533 catchsql {$sql} 534 " [lindex {{0 {}} {1 {FOREIGN KEY constraint failed}}} $isError] 535 536 do_test e_fkey-15.$tn.2 { 537 execsql { 538 SELECT * FROM chi WHERE c IS NOT NULL AND c NOT IN (SELECT p FROM par) 539 } 540 } {} 541 } 542 543 test_efkey_45 1 0 "INSERT INTO chi VALUES(1)" 544 test_efkey_45 2 1 "INSERT INTO chi VALUES('1.0')" 545 test_efkey_45 3 0 "INSERT INTO chi VALUES('1')" 546 test_efkey_45 4 1 "DELETE FROM par WHERE p = '1'" 547 test_efkey_45 5 0 "DELETE FROM chi WHERE c = '1'" 548 test_efkey_45 6 0 "DELETE FROM par WHERE p = '1'" 549 test_efkey_45 7 1 "INSERT INTO chi VALUES('1')" 550 test_efkey_45 8 0 "INSERT INTO chi VALUES(X'31')" 551 test_efkey_45 9 1 "INSERT INTO chi VALUES(X'32')" 552 553 #------------------------------------------------------------------------- 554 # Specifically, test that when comparing child and parent key values the 555 # default collation sequence of the parent key column is used. 556 # 557 # EVIDENCE-OF: R-15796-47513 When comparing text values, the collating 558 # sequence associated with the parent key column is always used. 559 # 560 drop_all_tables 561 do_test e_fkey-16.1 { 562 execsql { 563 CREATE TABLE t1(a COLLATE nocase PRIMARY KEY); 564 CREATE TABLE t2(b REFERENCES t1); 565 } 566 } {} 567 do_test e_fkey-16.2 { 568 execsql { 569 INSERT INTO t1 VALUES('oNe'); 570 INSERT INTO t2 VALUES('one'); 571 INSERT INTO t2 VALUES('ONE'); 572 UPDATE t2 SET b = 'OnE'; 573 UPDATE t1 SET a = 'ONE'; 574 } 575 } {} 576 do_test e_fkey-16.3 { 577 catchsql { UPDATE t2 SET b = 'two' WHERE rowid = 1 } 578 } {1 {FOREIGN KEY constraint failed}} 579 do_test e_fkey-16.4 { 580 catchsql { DELETE FROM t1 WHERE rowid = 1 } 581 } {1 {FOREIGN KEY constraint failed}} 582 583 #------------------------------------------------------------------------- 584 # Specifically, test that when comparing child and parent key values the 585 # affinity of the parent key column is applied to the child key value 586 # before the comparison takes place. 587 # 588 # EVIDENCE-OF: R-04240-13860 When comparing values, if the parent key 589 # column has an affinity, then that affinity is applied to the child key 590 # value before the comparison is performed. 591 # 592 drop_all_tables 593 do_test e_fkey-17.1 { 594 execsql { 595 CREATE TABLE t1(a NUMERIC PRIMARY KEY); 596 CREATE TABLE t2(b TEXT REFERENCES t1); 597 } 598 } {} 599 do_test e_fkey-17.2 { 600 execsql { 601 INSERT INTO t1 VALUES(1); 602 INSERT INTO t1 VALUES(2); 603 INSERT INTO t1 VALUES('three'); 604 INSERT INTO t2 VALUES('2.0'); 605 SELECT b, typeof(b) FROM t2; 606 } 607 } {2.0 text} 608 do_test e_fkey-17.3 { 609 execsql { SELECT typeof(a) FROM t1 } 610 } {integer integer text} 611 do_test e_fkey-17.4 { 612 catchsql { DELETE FROM t1 WHERE rowid = 2 } 613 } {1 {FOREIGN KEY constraint failed}} 614 615 ########################################################################### 616 ### SECTION 3: Required and Suggested Database Indexes 617 ########################################################################### 618 619 #------------------------------------------------------------------------- 620 # A parent key must be either a PRIMARY KEY, subject to a UNIQUE 621 # constraint, or have a UNIQUE index created on it. 622 # 623 # EVIDENCE-OF: R-13435-26311 Usually, the parent key of a foreign key 624 # constraint is the primary key of the parent table. If they are not the 625 # primary key, then the parent key columns must be collectively subject 626 # to a UNIQUE constraint or have a UNIQUE index. 627 # 628 # Also test that if a parent key is not subject to a PRIMARY KEY or UNIQUE 629 # constraint, but does have a UNIQUE index created on it, then the UNIQUE index 630 # must use the default collation sequences associated with the parent key 631 # columns. 632 # 633 # EVIDENCE-OF: R-00376-39212 If the parent key columns have a UNIQUE 634 # index, then that index must use the collation sequences that are 635 # specified in the CREATE TABLE statement for the parent table. 636 # 637 drop_all_tables 638 do_test e_fkey-18.1 { 639 execsql { 640 CREATE TABLE t2(a REFERENCES t1(x)); 641 } 642 } {} 643 proc test_efkey_57 {tn isError sql} { 644 catchsql { DROP TABLE t1 } 645 execsql $sql 646 do_test e_fkey-18.$tn { 647 catchsql { INSERT INTO t2 VALUES(NULL) } 648 } [lindex {{0 {}} {/1 {foreign key mismatch - ".*" referencing ".*"}/}} \ 649 $isError] 650 } 651 test_efkey_57 2 0 { CREATE TABLE t1(x PRIMARY KEY) } 652 test_efkey_57 3 0 { CREATE TABLE t1(x UNIQUE) } 653 test_efkey_57 4 0 { CREATE TABLE t1(x); CREATE UNIQUE INDEX t1i ON t1(x) } 654 test_efkey_57 5 1 { 655 CREATE TABLE t1(x); 656 CREATE UNIQUE INDEX t1i ON t1(x COLLATE nocase); 657 } 658 test_efkey_57 6 1 { CREATE TABLE t1(x) } 659 test_efkey_57 7 1 { CREATE TABLE t1(x, y, PRIMARY KEY(x, y)) } 660 test_efkey_57 8 1 { CREATE TABLE t1(x, y, UNIQUE(x, y)) } 661 test_efkey_57 9 1 { 662 CREATE TABLE t1(x, y); 663 CREATE UNIQUE INDEX t1i ON t1(x, y); 664 } 665 666 667 #------------------------------------------------------------------------- 668 # This block tests an example in foreignkeys.html. Several testable 669 # statements refer to this example, as follows 670 # 671 # EVIDENCE-OF: R-27484-01467 672 # 673 # FK Constraints on child1, child2 and child3 are Ok. 674 # 675 # Problem with FK on child4: 676 # 677 # EVIDENCE-OF: R-51039-44840 The foreign key declared as part of table 678 # child4 is an error because even though the parent key column is 679 # indexed, the index is not UNIQUE. 680 # 681 # Problem with FK on child5: 682 # 683 # EVIDENCE-OF: R-01060-48788 The foreign key for table child5 is an 684 # error because even though the parent key column has a unique index, 685 # the index uses a different collating sequence. 686 # 687 # Problem with FK on child6 and child7: 688 # 689 # EVIDENCE-OF: R-63088-37469 Tables child6 and child7 are incorrect 690 # because while both have UNIQUE indices on their parent keys, the keys 691 # are not an exact match to the columns of a single UNIQUE index. 692 # 693 drop_all_tables 694 do_test e_fkey-19.1 { 695 execsql { 696 CREATE TABLE parent(a PRIMARY KEY, b UNIQUE, c, d, e, f); 697 CREATE UNIQUE INDEX i1 ON parent(c, d); 698 CREATE INDEX i2 ON parent(e); 699 CREATE UNIQUE INDEX i3 ON parent(f COLLATE nocase); 700 701 CREATE TABLE child1(f, g REFERENCES parent(a)); -- Ok 702 CREATE TABLE child2(h, i REFERENCES parent(b)); -- Ok 703 CREATE TABLE child3(j, k, FOREIGN KEY(j, k) REFERENCES parent(c, d)); -- Ok 704 CREATE TABLE child4(l, m REFERENCES parent(e)); -- Err 705 CREATE TABLE child5(n, o REFERENCES parent(f)); -- Err 706 CREATE TABLE child6(p, q, FOREIGN KEY(p,q) REFERENCES parent(b, c)); -- Err 707 CREATE TABLE child7(r REFERENCES parent(c)); -- Err 708 } 709 } {} 710 do_test e_fkey-19.2 { 711 execsql { 712 INSERT INTO parent VALUES(1, 2, 3, 4, 5, 6); 713 INSERT INTO child1 VALUES('xxx', 1); 714 INSERT INTO child2 VALUES('xxx', 2); 715 INSERT INTO child3 VALUES(3, 4); 716 } 717 } {} 718 do_test e_fkey-19.2 { 719 catchsql { INSERT INTO child4 VALUES('xxx', 5) } 720 } {1 {foreign key mismatch - "child4" referencing "parent"}} 721 do_test e_fkey-19.3 { 722 catchsql { INSERT INTO child5 VALUES('xxx', 6) } 723 } {1 {foreign key mismatch - "child5" referencing "parent"}} 724 do_test e_fkey-19.4 { 725 catchsql { INSERT INTO child6 VALUES(2, 3) } 726 } {1 {foreign key mismatch - "child6" referencing "parent"}} 727 do_test e_fkey-19.5 { 728 catchsql { INSERT INTO child7 VALUES(3) } 729 } {1 {foreign key mismatch - "child7" referencing "parent"}} 730 731 #------------------------------------------------------------------------- 732 # Test errors in the database schema that are detected while preparing 733 # DML statements. The error text for these messages always matches 734 # either "foreign key mismatch" or "no such table*" (using [string match]). 735 # 736 # EVIDENCE-OF: R-45488-08504 If the database schema contains foreign key 737 # errors that require looking at more than one table definition to 738 # identify, then those errors are not detected when the tables are 739 # created. 740 # 741 # EVIDENCE-OF: R-48391-38472 Instead, such errors prevent the 742 # application from preparing SQL statements that modify the content of 743 # the child or parent tables in ways that use the foreign keys. 744 # 745 # EVIDENCE-OF: R-03108-63659 The English language error message for 746 # foreign key DML errors is usually "foreign key mismatch" but can also 747 # be "no such table" if the parent table does not exist. 748 # 749 # EVIDENCE-OF: R-35763-48267 Foreign key DML errors are reported if: The 750 # parent table does not exist, or The parent key columns named in the 751 # foreign key constraint do not exist, or The parent key columns named 752 # in the foreign key constraint are not the primary key of the parent 753 # table and are not subject to a unique constraint using collating 754 # sequence specified in the CREATE TABLE, or The child table references 755 # the primary key of the parent without specifying the primary key 756 # columns and the number of primary key columns in the parent do not 757 # match the number of child key columns. 758 # 759 do_test e_fkey-20.1 { 760 execsql { 761 CREATE TABLE c1(c REFERENCES nosuchtable, d); 762 763 CREATE TABLE p2(a, b, UNIQUE(a, b)); 764 CREATE TABLE c2(c, d, FOREIGN KEY(c, d) REFERENCES p2(a, x)); 765 766 CREATE TABLE p3(a PRIMARY KEY, b); 767 CREATE TABLE c3(c REFERENCES p3(b), d); 768 769 CREATE TABLE p4(a PRIMARY KEY, b); 770 CREATE UNIQUE INDEX p4i ON p4(b COLLATE nocase); 771 CREATE TABLE c4(c REFERENCES p4(b), d); 772 773 CREATE TABLE p5(a PRIMARY KEY, b COLLATE nocase); 774 CREATE UNIQUE INDEX p5i ON p5(b COLLATE binary); 775 CREATE TABLE c5(c REFERENCES p5(b), d); 776 777 CREATE TABLE p6(a PRIMARY KEY, b); 778 CREATE TABLE c6(c, d, FOREIGN KEY(c, d) REFERENCES p6); 779 780 CREATE TABLE p7(a, b, PRIMARY KEY(a, b)); 781 CREATE TABLE c7(c, d REFERENCES p7); 782 } 783 } {} 784 785 foreach {tn tbl ptbl err} { 786 2 c1 {} "no such table: main.nosuchtable" 787 3 c2 p2 "foreign key mismatch - \"c2\" referencing \"p2\"" 788 4 c3 p3 "foreign key mismatch - \"c3\" referencing \"p3\"" 789 5 c4 p4 "foreign key mismatch - \"c4\" referencing \"p4\"" 790 6 c5 p5 "foreign key mismatch - \"c5\" referencing \"p5\"" 791 7 c6 p6 "foreign key mismatch - \"c6\" referencing \"p6\"" 792 8 c7 p7 "foreign key mismatch - \"c7\" referencing \"p7\"" 793 } { 794 do_test e_fkey-20.$tn.1 { 795 catchsql "INSERT INTO $tbl VALUES('a', 'b')" 796 } [list 1 $err] 797 do_test e_fkey-20.$tn.2 { 798 catchsql "UPDATE $tbl SET c = ?, d = ?" 799 } [list 1 $err] 800 do_test e_fkey-20.$tn.3 { 801 catchsql "INSERT INTO $tbl SELECT ?, ?" 802 } [list 1 $err] 803 804 if {$ptbl ne ""} { 805 do_test e_fkey-20.$tn.4 { 806 catchsql "DELETE FROM $ptbl" 807 } [list 1 $err] 808 do_test e_fkey-20.$tn.5 { 809 catchsql "UPDATE $ptbl SET a = ?, b = ?" 810 } [list 1 $err] 811 do_test e_fkey-20.$tn.6 { 812 catchsql "INSERT INTO $ptbl SELECT ?, ?" 813 } [list 1 $err] 814 } 815 } 816 817 #------------------------------------------------------------------------- 818 # EVIDENCE-OF: R-19353-43643 819 # 820 # Test the example of foreign key mismatch errors caused by implicitly 821 # mapping a child key to the primary key of the parent table when the 822 # child key consists of a different number of columns to that primary key. 823 # 824 drop_all_tables 825 do_test e_fkey-21.1 { 826 execsql { 827 CREATE TABLE parent2(a, b, PRIMARY KEY(a,b)); 828 829 CREATE TABLE child8(x, y, FOREIGN KEY(x,y) REFERENCES parent2); -- Ok 830 CREATE TABLE child9(x REFERENCES parent2); -- Err 831 CREATE TABLE child10(x,y,z, FOREIGN KEY(x,y,z) REFERENCES parent2); -- Err 832 } 833 } {} 834 do_test e_fkey-21.2 { 835 execsql { 836 INSERT INTO parent2 VALUES('I', 'II'); 837 INSERT INTO child8 VALUES('I', 'II'); 838 } 839 } {} 840 do_test e_fkey-21.3 { 841 catchsql { INSERT INTO child9 VALUES('I') } 842 } {1 {foreign key mismatch - "child9" referencing "parent2"}} 843 do_test e_fkey-21.4 { 844 catchsql { INSERT INTO child9 VALUES('II') } 845 } {1 {foreign key mismatch - "child9" referencing "parent2"}} 846 do_test e_fkey-21.5 { 847 catchsql { INSERT INTO child9 VALUES(NULL) } 848 } {1 {foreign key mismatch - "child9" referencing "parent2"}} 849 do_test e_fkey-21.6 { 850 catchsql { INSERT INTO child10 VALUES('I', 'II', 'III') } 851 } {1 {foreign key mismatch - "child10" referencing "parent2"}} 852 do_test e_fkey-21.7 { 853 catchsql { INSERT INTO child10 VALUES(1, 2, 3) } 854 } {1 {foreign key mismatch - "child10" referencing "parent2"}} 855 do_test e_fkey-21.8 { 856 catchsql { INSERT INTO child10 VALUES(NULL, NULL, NULL) } 857 } {1 {foreign key mismatch - "child10" referencing "parent2"}} 858 859 #------------------------------------------------------------------------- 860 # Test errors that are reported when creating the child table. 861 # Specifically: 862 # 863 # * different number of child and parent key columns, and 864 # * child columns that do not exist. 865 # 866 # EVIDENCE-OF: R-23682-59820 By contrast, if foreign key errors can be 867 # recognized simply by looking at the definition of the child table and 868 # without having to consult the parent table definition, then the CREATE 869 # TABLE statement for the child table fails. 870 # 871 # These errors are reported whether or not FK support is enabled. 872 # 873 # EVIDENCE-OF: R-33883-28833 Foreign key DDL errors are reported 874 # regardless of whether or not foreign key constraints are enabled when 875 # the table is created. 876 # 877 drop_all_tables 878 foreach fk [list OFF ON] { 879 execsql "PRAGMA foreign_keys = $fk" 880 set i 0 881 foreach {sql error} { 882 "CREATE TABLE child1(a, b, FOREIGN KEY(a, b) REFERENCES p(c))" 883 {number of columns in foreign key does not match the number of columns in the referenced table} 884 "CREATE TABLE child2(a, b, FOREIGN KEY(a, b) REFERENCES p(c, d, e))" 885 {number of columns in foreign key does not match the number of columns in the referenced table} 886 "CREATE TABLE child2(a, b, FOREIGN KEY(a, c) REFERENCES p(c, d))" 887 {unknown column "c" in foreign key definition} 888 "CREATE TABLE child2(a, b, FOREIGN KEY(c, b) REFERENCES p(c, d))" 889 {unknown column "c" in foreign key definition} 890 } { 891 do_test e_fkey-22.$fk.[incr i] { 892 catchsql $sql 893 } [list 1 $error] 894 } 895 } 896 897 #------------------------------------------------------------------------- 898 # Test that a REFERENCING clause that does not specify parent key columns 899 # implicitly maps to the primary key of the parent table. 900 # 901 # EVIDENCE-OF: R-43879-08025 Attaching a "REFERENCES <parent-table>" 902 # clause to a column definition creates a foreign 903 # key constraint that maps the column to the primary key of 904 # <parent-table>. 905 # 906 do_test e_fkey-23.1 { 907 execsql { 908 CREATE TABLE p1(a, b, PRIMARY KEY(a, b)); 909 CREATE TABLE p2(a, b PRIMARY KEY); 910 CREATE TABLE c1(c, d, FOREIGN KEY(c, d) REFERENCES p1); 911 CREATE TABLE c2(a, b REFERENCES p2); 912 } 913 } {} 914 proc test_efkey_60 {tn isError sql} { 915 do_test e_fkey-23.$tn " 916 catchsql {$sql} 917 " [lindex {{0 {}} {1 {FOREIGN KEY constraint failed}}} $isError] 918 } 919 920 test_efkey_60 2 1 "INSERT INTO c1 VALUES(239, 231)" 921 test_efkey_60 3 0 "INSERT INTO p1 VALUES(239, 231)" 922 test_efkey_60 4 0 "INSERT INTO c1 VALUES(239, 231)" 923 test_efkey_60 5 1 "INSERT INTO c2 VALUES(239, 231)" 924 test_efkey_60 6 0 "INSERT INTO p2 VALUES(239, 231)" 925 test_efkey_60 7 0 "INSERT INTO c2 VALUES(239, 231)" 926 927 #------------------------------------------------------------------------- 928 # Test that an index on on the child key columns of an FK constraint 929 # is optional. 930 # 931 # EVIDENCE-OF: R-15417-28014 Indices are not required for child key 932 # columns 933 # 934 # Also test that if an index is created on the child key columns, it does 935 # not make a difference whether or not it is a UNIQUE index. 936 # 937 # EVIDENCE-OF: R-15741-50893 The child key index does not have to be 938 # (and usually will not be) a UNIQUE index. 939 # 940 drop_all_tables 941 do_test e_fkey-24.1 { 942 execsql { 943 CREATE TABLE parent(x, y, UNIQUE(y, x)); 944 CREATE TABLE c1(a, b, FOREIGN KEY(a, b) REFERENCES parent(x, y)); 945 CREATE TABLE c2(a, b, FOREIGN KEY(a, b) REFERENCES parent(x, y)); 946 CREATE TABLE c3(a, b, FOREIGN KEY(a, b) REFERENCES parent(x, y)); 947 CREATE INDEX c2i ON c2(a, b); 948 CREATE UNIQUE INDEX c3i ON c2(b, a); 949 } 950 } {} 951 proc test_efkey_61 {tn isError sql} { 952 do_test e_fkey-24.$tn " 953 catchsql {$sql} 954 " [lindex {{0 {}} {1 {FOREIGN KEY constraint failed}}} $isError] 955 } 956 foreach {tn c} [list 2 c1 3 c2 4 c3] { 957 test_efkey_61 $tn.1 1 "INSERT INTO $c VALUES(1, 2)" 958 test_efkey_61 $tn.2 0 "INSERT INTO parent VALUES(1, 2)" 959 test_efkey_61 $tn.3 0 "INSERT INTO $c VALUES(1, 2)" 960 961 execsql "DELETE FROM $c ; DELETE FROM parent" 962 } 963 964 #------------------------------------------------------------------------- 965 # EVIDENCE-OF: R-00279-52283 966 # 967 # Test an example showing that when a row is deleted from the parent 968 # table, the child table is queried for orphaned rows as follows: 969 # 970 # SELECT rowid FROM track WHERE trackartist = ? 971 # 972 # EVIDENCE-OF: R-23302-30956 If this SELECT returns any rows at all, 973 # then SQLite concludes that deleting the row from the parent table 974 # would violate the foreign key constraint and returns an error. 975 # 976 do_test e_fkey-25.1 { 977 execsql { 978 CREATE TABLE artist( 979 artistid INTEGER PRIMARY KEY, 980 artistname TEXT 981 ); 982 CREATE TABLE track( 983 trackid INTEGER, 984 trackname TEXT, 985 trackartist INTEGER, 986 FOREIGN KEY(trackartist) REFERENCES artist(artistid) 987 ); 988 } 989 } {} 990 do_detail_test e_fkey-25.2 { 991 PRAGMA foreign_keys = OFF; 992 EXPLAIN QUERY PLAN DELETE FROM artist WHERE 1; 993 EXPLAIN QUERY PLAN SELECT rowid FROM track WHERE trackartist = ?; 994 } { 995 {SCAN artist} 996 {SCAN track} 997 } 998 do_detail_test e_fkey-25.3 { 999 PRAGMA foreign_keys = ON; 1000 EXPLAIN QUERY PLAN DELETE FROM artist WHERE 1; 1001 } { 1002 {SCAN artist} 1003 {SCAN track} 1004 } 1005 do_test e_fkey-25.4 { 1006 execsql { 1007 INSERT INTO artist VALUES(5, 'artist 5'); 1008 INSERT INTO artist VALUES(6, 'artist 6'); 1009 INSERT INTO artist VALUES(7, 'artist 7'); 1010 INSERT INTO track VALUES(1, 'track 1', 5); 1011 INSERT INTO track VALUES(2, 'track 2', 6); 1012 } 1013 } {} 1014 1015 do_test e_fkey-25.5 { 1016 concat \ 1017 [execsql { SELECT rowid FROM track WHERE trackartist = 5 }] \ 1018 [catchsql { DELETE FROM artist WHERE artistid = 5 }] 1019 } {1 1 {FOREIGN KEY constraint failed}} 1020 1021 do_test e_fkey-25.6 { 1022 concat \ 1023 [execsql { SELECT rowid FROM track WHERE trackartist = 7 }] \ 1024 [catchsql { DELETE FROM artist WHERE artistid = 7 }] 1025 } {0 {}} 1026 1027 do_test e_fkey-25.7 { 1028 concat \ 1029 [execsql { SELECT rowid FROM track WHERE trackartist = 6 }] \ 1030 [catchsql { DELETE FROM artist WHERE artistid = 6 }] 1031 } {2 1 {FOREIGN KEY constraint failed}} 1032 1033 #------------------------------------------------------------------------- 1034 # EVIDENCE-OF: R-47936-10044 Or, more generally: 1035 # SELECT rowid FROM <child-table> WHERE <child-key> = :parent_key_value 1036 # 1037 # Test that when a row is deleted from the parent table of an FK 1038 # constraint, the child table is queried for orphaned rows. The 1039 # query is equivalent to: 1040 # 1041 # SELECT rowid FROM <child-table> WHERE <child-key> = :parent_key_value 1042 # 1043 # Also test that when a row is inserted into the parent table, or when the 1044 # parent key values of an existing row are modified, a query equivalent 1045 # to the following is planned. In some cases it is not executed, but it 1046 # is always planned. 1047 # 1048 # SELECT rowid FROM <child-table> WHERE <child-key> = :parent_key_value 1049 # 1050 # EVIDENCE-OF: R-61616-46700 Similar queries may be run if the content 1051 # of the parent key is modified or a new row is inserted into the parent 1052 # table. 1053 # 1054 # 1055 drop_all_tables 1056 do_test e_fkey-26.1 { 1057 execsql { CREATE TABLE parent(x, y, UNIQUE(y, x)) } 1058 } {} 1059 foreach {tn sql} { 1060 2 { 1061 CREATE TABLE child(a, b, FOREIGN KEY(a, b) REFERENCES parent(x, y)) 1062 } 1063 3 { 1064 CREATE TABLE child(a, b, FOREIGN KEY(a, b) REFERENCES parent(x, y)); 1065 CREATE INDEX childi ON child(a, b); 1066 } 1067 4 { 1068 CREATE TABLE child(a, b, FOREIGN KEY(a, b) REFERENCES parent(x, y)); 1069 CREATE UNIQUE INDEX childi ON child(b, a); 1070 } 1071 } { 1072 execsql $sql 1073 1074 execsql {PRAGMA foreign_keys = OFF} 1075 set delete [concat \ 1076 [eqp "DELETE FROM parent WHERE 1"] \ 1077 [eqp "SELECT rowid FROM child WHERE a = ? AND b = ?"] 1078 ] 1079 set update [concat \ 1080 [eqp "UPDATE parent SET x=?, y=?"] \ 1081 [eqp "SELECT rowid FROM child WHERE a = ? AND b = ?"] \ 1082 [eqp "SELECT rowid FROM child WHERE a = ? AND b = ?"] 1083 ] 1084 execsql {PRAGMA foreign_keys = ON} 1085 1086 do_test e_fkey-26.$tn.1 { eqp "DELETE FROM parent WHERE 1" } $delete 1087 do_test e_fkey-26.$tn.2 { eqp "UPDATE parent set x=?, y=?" } $update 1088 1089 execsql {DROP TABLE child} 1090 } 1091 1092 #------------------------------------------------------------------------- 1093 # EVIDENCE-OF: R-14553-34013 1094 # 1095 # Test the example schema at the end of section 3. Also test that is 1096 # is "efficient". In this case "efficient" means that foreign key 1097 # related operations on the parent table do not provoke linear scans. 1098 # 1099 drop_all_tables 1100 do_test e_fkey-27.1 { 1101 execsql { 1102 CREATE TABLE artist( 1103 artistid INTEGER PRIMARY KEY, 1104 artistname TEXT 1105 ); 1106 CREATE TABLE track( 1107 trackid INTEGER, 1108 trackname TEXT, 1109 trackartist INTEGER REFERENCES artist 1110 ); 1111 CREATE INDEX trackindex ON track(trackartist); 1112 } 1113 } {} 1114 do_test e_fkey-27.2 { 1115 eqp { INSERT INTO artist VALUES(?, ?) } 1116 } {} 1117 do_detail_test e_fkey-27.3 { 1118 EXPLAIN QUERY PLAN UPDATE artist SET artistid = ?, artistname = ? 1119 } { 1120 {SCAN artist} 1121 {SEARCH track USING COVERING INDEX trackindex (trackartist=?)} 1122 {SEARCH track USING COVERING INDEX trackindex (trackartist=?)} 1123 } 1124 do_detail_test e_fkey-27.4 { 1125 EXPLAIN QUERY PLAN DELETE FROM artist 1126 } { 1127 {SCAN artist} 1128 {SEARCH track USING COVERING INDEX trackindex (trackartist=?)} 1129 } 1130 1131 ########################################################################### 1132 ### SECTION 4.1: Composite Foreign Key Constraints 1133 ########################################################################### 1134 1135 #------------------------------------------------------------------------- 1136 # Check that parent and child keys must have the same number of columns. 1137 # 1138 # EVIDENCE-OF: R-41062-34431 Parent and child keys must have the same 1139 # cardinality. 1140 # 1141 foreach {tn sql err} { 1142 1 "CREATE TABLE c(jj REFERENCES p(x, y))" 1143 {foreign key on jj should reference only one column of table p} 1144 1145 2 "CREATE TABLE c(jj REFERENCES p())" {near ")": syntax error} 1146 1147 3 "CREATE TABLE c(jj, FOREIGN KEY(jj) REFERENCES p(x, y))" 1148 {number of columns in foreign key does not match the number of columns in the referenced table} 1149 1150 4 "CREATE TABLE c(jj, FOREIGN KEY(jj) REFERENCES p())" 1151 {near ")": syntax error} 1152 1153 5 "CREATE TABLE c(ii, jj, FOREIGN KEY(jj, ii) REFERENCES p())" 1154 {near ")": syntax error} 1155 1156 6 "CREATE TABLE c(ii, jj, FOREIGN KEY(jj, ii) REFERENCES p(x))" 1157 {number of columns in foreign key does not match the number of columns in the referenced table} 1158 1159 7 "CREATE TABLE c(ii, jj, FOREIGN KEY(jj, ii) REFERENCES p(x,y,z))" 1160 {number of columns in foreign key does not match the number of columns in the referenced table} 1161 } { 1162 drop_all_tables 1163 do_test e_fkey-28.$tn [list catchsql $sql] [list 1 $err] 1164 } 1165 do_test e_fkey-28.8 { 1166 drop_all_tables 1167 execsql { 1168 CREATE TABLE p(x PRIMARY KEY); 1169 CREATE TABLE c(a, b, FOREIGN KEY(a,b) REFERENCES p); 1170 } 1171 catchsql {DELETE FROM p} 1172 } {1 {foreign key mismatch - "c" referencing "p"}} 1173 do_test e_fkey-28.9 { 1174 drop_all_tables 1175 execsql { 1176 CREATE TABLE p(x, y, PRIMARY KEY(x,y)); 1177 CREATE TABLE c(a REFERENCES p); 1178 } 1179 catchsql {DELETE FROM p} 1180 } {1 {foreign key mismatch - "c" referencing "p"}} 1181 1182 1183 #------------------------------------------------------------------------- 1184 # EVIDENCE-OF: R-24676-09859 1185 # 1186 # Test the example schema in the "Composite Foreign Key Constraints" 1187 # section. 1188 # 1189 do_test e_fkey-29.1 { 1190 execsql { 1191 CREATE TABLE album( 1192 albumartist TEXT, 1193 albumname TEXT, 1194 albumcover BINARY, 1195 PRIMARY KEY(albumartist, albumname) 1196 ); 1197 CREATE TABLE song( 1198 songid INTEGER, 1199 songartist TEXT, 1200 songalbum TEXT, 1201 songname TEXT, 1202 FOREIGN KEY(songartist, songalbum) REFERENCES album(albumartist,albumname) 1203 ); 1204 } 1205 } {} 1206 1207 do_test e_fkey-29.2 { 1208 execsql { 1209 INSERT INTO album VALUES('Elvis Presley', 'Elvis'' Christmas Album', NULL); 1210 INSERT INTO song VALUES( 1211 1, 'Elvis Presley', 'Elvis'' Christmas Album', 'Here Comes Santa Clause' 1212 ); 1213 } 1214 } {} 1215 do_test e_fkey-29.3 { 1216 catchsql { 1217 INSERT INTO song VALUES(2, 'Elvis Presley', 'Elvis Is Back!', 'Fever'); 1218 } 1219 } {1 {FOREIGN KEY constraint failed}} 1220 1221 1222 #------------------------------------------------------------------------- 1223 # EVIDENCE-OF: R-33626-48418 In SQLite, if any of the child key columns 1224 # (in this case songartist and songalbum) are NULL, then there is no 1225 # requirement for a corresponding row in the parent table. 1226 # 1227 do_test e_fkey-30.1 { 1228 execsql { 1229 INSERT INTO song VALUES(2, 'Elvis Presley', NULL, 'Fever'); 1230 INSERT INTO song VALUES(3, NULL, 'Elvis Is Back', 'Soldier Boy'); 1231 } 1232 } {} 1233 1234 ########################################################################### 1235 ### SECTION 4.2: Deferred Foreign Key Constraints 1236 ########################################################################### 1237 1238 #------------------------------------------------------------------------- 1239 # Test that if a statement violates an immediate FK constraint, and the 1240 # database does not satisfy the FK constraint once all effects of the 1241 # statement have been applied, an error is reported and the effects of 1242 # the statement rolled back. 1243 # 1244 # EVIDENCE-OF: R-09323-30470 If a statement modifies the contents of the 1245 # database so that an immediate foreign key constraint is in violation 1246 # at the conclusion the statement, an exception is thrown and the 1247 # effects of the statement are reverted. 1248 # 1249 drop_all_tables 1250 do_test e_fkey-31.1 { 1251 execsql { 1252 CREATE TABLE king(a, b, PRIMARY KEY(a)); 1253 CREATE TABLE prince(c REFERENCES king, d); 1254 } 1255 } {} 1256 1257 do_test e_fkey-31.2 { 1258 # Execute a statement that violates the immediate FK constraint. 1259 catchsql { INSERT INTO prince VALUES(1, 2) } 1260 } {1 {FOREIGN KEY constraint failed}} 1261 1262 do_test e_fkey-31.3 { 1263 # This time, use a trigger to fix the constraint violation before the 1264 # statement has finished executing. Then execute the same statement as 1265 # in the previous test case. This time, no error. 1266 execsql { 1267 CREATE TRIGGER kt AFTER INSERT ON prince WHEN 1268 NOT EXISTS (SELECT a FROM king WHERE a = new.c) 1269 BEGIN 1270 INSERT INTO king VALUES(new.c, NULL); 1271 END 1272 } 1273 execsql { INSERT INTO prince VALUES(1, 2) } 1274 } {} 1275 1276 # Test that operating inside a transaction makes no difference to 1277 # immediate constraint violation handling. 1278 do_test e_fkey-31.4 { 1279 execsql { 1280 BEGIN; 1281 INSERT INTO prince VALUES(2, 3); 1282 DROP TRIGGER kt; 1283 } 1284 catchsql { INSERT INTO prince VALUES(3, 4) } 1285 } {1 {FOREIGN KEY constraint failed}} 1286 do_test e_fkey-31.5 { 1287 execsql { 1288 COMMIT; 1289 SELECT * FROM king; 1290 } 1291 } {1 {} 2 {}} 1292 1293 #------------------------------------------------------------------------- 1294 # Test that if a deferred constraint is violated within a transaction, 1295 # nothing happens immediately and the database is allowed to persist 1296 # in a state that does not satisfy the FK constraint. However attempts 1297 # to COMMIT the transaction fail until the FK constraint is satisfied. 1298 # 1299 # EVIDENCE-OF: R-49178-21358 By contrast, if a statement modifies the 1300 # contents of the database such that a deferred foreign key constraint 1301 # is violated, the violation is not reported immediately. 1302 # 1303 # EVIDENCE-OF: R-39692-12488 Deferred foreign key constraints are not 1304 # checked until the transaction tries to COMMIT. 1305 # 1306 # EVIDENCE-OF: R-55147-47664 For as long as the user has an open 1307 # transaction, the database is allowed to exist in a state that violates 1308 # any number of deferred foreign key constraints. 1309 # 1310 # EVIDENCE-OF: R-29604-30395 However, COMMIT will fail as long as 1311 # foreign key constraints remain in violation. 1312 # 1313 proc test_efkey_34 {tn isError sql} { 1314 do_test e_fkey-32.$tn " 1315 catchsql {$sql} 1316 " [lindex {{0 {}} {1 {FOREIGN KEY constraint failed}}} $isError] 1317 } 1318 drop_all_tables 1319 1320 test_efkey_34 1 0 { 1321 CREATE TABLE ll(k PRIMARY KEY); 1322 CREATE TABLE kk(c REFERENCES ll DEFERRABLE INITIALLY DEFERRED); 1323 } 1324 test_efkey_34 2 0 "BEGIN" 1325 test_efkey_34 3 0 "INSERT INTO kk VALUES(5)" 1326 test_efkey_34 4 0 "INSERT INTO kk VALUES(10)" 1327 test_efkey_34 5 1 "COMMIT" 1328 test_efkey_34 6 0 "INSERT INTO ll VALUES(10)" 1329 test_efkey_34 7 1 "COMMIT" 1330 test_efkey_34 8 0 "INSERT INTO ll VALUES(5)" 1331 test_efkey_34 9 0 "COMMIT" 1332 1333 #------------------------------------------------------------------------- 1334 # When not running inside a transaction, a deferred constraint is similar 1335 # to an immediate constraint (violations are reported immediately). 1336 # 1337 # EVIDENCE-OF: R-56844-61705 If the current statement is not inside an 1338 # explicit transaction (a BEGIN/COMMIT/ROLLBACK block), then an implicit 1339 # transaction is committed as soon as the statement has finished 1340 # executing. In this case deferred constraints behave the same as 1341 # immediate constraints. 1342 # 1343 drop_all_tables 1344 proc test_efkey_35 {tn isError sql} { 1345 do_test e_fkey-33.$tn " 1346 catchsql {$sql} 1347 " [lindex {{0 {}} {1 {FOREIGN KEY constraint failed}}} $isError] 1348 } 1349 do_test e_fkey-33.1 { 1350 execsql { 1351 CREATE TABLE parent(x, y); 1352 CREATE UNIQUE INDEX pi ON parent(x, y); 1353 CREATE TABLE child(a, b, 1354 FOREIGN KEY(a, b) REFERENCES parent(x, y) DEFERRABLE INITIALLY DEFERRED 1355 ); 1356 } 1357 } {} 1358 test_efkey_35 2 1 "INSERT INTO child VALUES('x', 'y')" 1359 test_efkey_35 3 0 "INSERT INTO parent VALUES('x', 'y')" 1360 test_efkey_35 4 0 "INSERT INTO child VALUES('x', 'y')" 1361 1362 1363 #------------------------------------------------------------------------- 1364 # EVIDENCE-OF: R-12782-61841 1365 # 1366 # Test that an FK constraint is made deferred by adding the following 1367 # to the definition: 1368 # 1369 # DEFERRABLE INITIALLY DEFERRED 1370 # 1371 # EVIDENCE-OF: R-09005-28791 1372 # 1373 # Also test that adding any of the following to a foreign key definition 1374 # makes the constraint IMMEDIATE: 1375 # 1376 # NOT DEFERRABLE INITIALLY DEFERRED 1377 # NOT DEFERRABLE INITIALLY IMMEDIATE 1378 # NOT DEFERRABLE 1379 # DEFERRABLE INITIALLY IMMEDIATE 1380 # DEFERRABLE 1381 # 1382 # Foreign keys are IMMEDIATE by default (if there is no DEFERRABLE or NOT 1383 # DEFERRABLE clause). 1384 # 1385 # EVIDENCE-OF: R-35290-16460 Foreign key constraints are immediate by 1386 # default. 1387 # 1388 # EVIDENCE-OF: R-30323-21917 Each foreign key constraint in SQLite is 1389 # classified as either immediate or deferred. 1390 # 1391 drop_all_tables 1392 do_test e_fkey-34.1 { 1393 execsql { 1394 CREATE TABLE parent(x, y, z, PRIMARY KEY(x,y,z)); 1395 CREATE TABLE c1(a, b, c, 1396 FOREIGN KEY(a, b, c) REFERENCES parent NOT DEFERRABLE INITIALLY DEFERRED 1397 ); 1398 CREATE TABLE c2(a, b, c, 1399 FOREIGN KEY(a, b, c) REFERENCES parent NOT DEFERRABLE INITIALLY IMMEDIATE 1400 ); 1401 CREATE TABLE c3(a, b, c, 1402 FOREIGN KEY(a, b, c) REFERENCES parent NOT DEFERRABLE 1403 ); 1404 CREATE TABLE c4(a, b, c, 1405 FOREIGN KEY(a, b, c) REFERENCES parent DEFERRABLE INITIALLY IMMEDIATE 1406 ); 1407 CREATE TABLE c5(a, b, c, 1408 FOREIGN KEY(a, b, c) REFERENCES parent DEFERRABLE 1409 ); 1410 CREATE TABLE c6(a, b, c, FOREIGN KEY(a, b, c) REFERENCES parent); 1411 1412 -- This FK constraint is the only deferrable one. 1413 CREATE TABLE c7(a, b, c, 1414 FOREIGN KEY(a, b, c) REFERENCES parent DEFERRABLE INITIALLY DEFERRED 1415 ); 1416 1417 INSERT INTO parent VALUES('a', 'b', 'c'); 1418 INSERT INTO parent VALUES('d', 'e', 'f'); 1419 INSERT INTO parent VALUES('g', 'h', 'i'); 1420 INSERT INTO parent VALUES('j', 'k', 'l'); 1421 INSERT INTO parent VALUES('m', 'n', 'o'); 1422 INSERT INTO parent VALUES('p', 'q', 'r'); 1423 INSERT INTO parent VALUES('s', 't', 'u'); 1424 1425 INSERT INTO c1 VALUES('a', 'b', 'c'); 1426 INSERT INTO c2 VALUES('d', 'e', 'f'); 1427 INSERT INTO c3 VALUES('g', 'h', 'i'); 1428 INSERT INTO c4 VALUES('j', 'k', 'l'); 1429 INSERT INTO c5 VALUES('m', 'n', 'o'); 1430 INSERT INTO c6 VALUES('p', 'q', 'r'); 1431 INSERT INTO c7 VALUES('s', 't', 'u'); 1432 } 1433 } {} 1434 1435 proc test_efkey_29 {tn sql isError} { 1436 do_test e_fkey-34.$tn "catchsql {$sql}" [ 1437 lindex {{0 {}} {1 {FOREIGN KEY constraint failed}}} $isError 1438 ] 1439 } 1440 test_efkey_29 2 "BEGIN" 0 1441 test_efkey_29 3 "DELETE FROM parent WHERE x = 'a'" 1 1442 test_efkey_29 4 "DELETE FROM parent WHERE x = 'd'" 1 1443 test_efkey_29 5 "DELETE FROM parent WHERE x = 'g'" 1 1444 test_efkey_29 6 "DELETE FROM parent WHERE x = 'j'" 1 1445 test_efkey_29 7 "DELETE FROM parent WHERE x = 'm'" 1 1446 test_efkey_29 8 "DELETE FROM parent WHERE x = 'p'" 1 1447 test_efkey_29 9 "DELETE FROM parent WHERE x = 's'" 0 1448 test_efkey_29 10 "COMMIT" 1 1449 test_efkey_29 11 "ROLLBACK" 0 1450 1451 test_efkey_29 9 "BEGIN" 0 1452 test_efkey_29 10 "UPDATE parent SET z = 'z' WHERE z = 'c'" 1 1453 test_efkey_29 11 "UPDATE parent SET z = 'z' WHERE z = 'f'" 1 1454 test_efkey_29 12 "UPDATE parent SET z = 'z' WHERE z = 'i'" 1 1455 test_efkey_29 13 "UPDATE parent SET z = 'z' WHERE z = 'l'" 1 1456 test_efkey_29 14 "UPDATE parent SET z = 'z' WHERE z = 'o'" 1 1457 test_efkey_29 15 "UPDATE parent SET z = 'z' WHERE z = 'r'" 1 1458 test_efkey_29 16 "UPDATE parent SET z = 'z' WHERE z = 'u'" 0 1459 test_efkey_29 17 "COMMIT" 1 1460 test_efkey_29 18 "ROLLBACK" 0 1461 1462 test_efkey_29 17 "BEGIN" 0 1463 test_efkey_29 18 "INSERT INTO c1 VALUES(1, 2, 3)" 1 1464 test_efkey_29 19 "INSERT INTO c2 VALUES(1, 2, 3)" 1 1465 test_efkey_29 20 "INSERT INTO c3 VALUES(1, 2, 3)" 1 1466 test_efkey_29 21 "INSERT INTO c4 VALUES(1, 2, 3)" 1 1467 test_efkey_29 22 "INSERT INTO c5 VALUES(1, 2, 3)" 1 1468 test_efkey_29 22 "INSERT INTO c6 VALUES(1, 2, 3)" 1 1469 test_efkey_29 22 "INSERT INTO c7 VALUES(1, 2, 3)" 0 1470 test_efkey_29 23 "COMMIT" 1 1471 test_efkey_29 24 "INSERT INTO parent VALUES(1, 2, 3)" 0 1472 test_efkey_29 25 "COMMIT" 0 1473 1474 test_efkey_29 26 "BEGIN" 0 1475 test_efkey_29 27 "UPDATE c1 SET a = 10" 1 1476 test_efkey_29 28 "UPDATE c2 SET a = 10" 1 1477 test_efkey_29 29 "UPDATE c3 SET a = 10" 1 1478 test_efkey_29 30 "UPDATE c4 SET a = 10" 1 1479 test_efkey_29 31 "UPDATE c5 SET a = 10" 1 1480 test_efkey_29 31 "UPDATE c6 SET a = 10" 1 1481 test_efkey_29 31 "UPDATE c7 SET a = 10" 0 1482 test_efkey_29 32 "COMMIT" 1 1483 test_efkey_29 33 "ROLLBACK" 0 1484 1485 #------------------------------------------------------------------------- 1486 # EVIDENCE-OF: R-24499-57071 1487 # 1488 # Test an example from foreignkeys.html dealing with a deferred foreign 1489 # key constraint. 1490 # 1491 do_test e_fkey-35.1 { 1492 drop_all_tables 1493 execsql { 1494 CREATE TABLE artist( 1495 artistid INTEGER PRIMARY KEY, 1496 artistname TEXT 1497 ); 1498 CREATE TABLE track( 1499 trackid INTEGER, 1500 trackname TEXT, 1501 trackartist INTEGER REFERENCES artist(artistid) DEFERRABLE INITIALLY DEFERRED 1502 ); 1503 } 1504 } {} 1505 do_test e_fkey-35.2 { 1506 execsql { 1507 BEGIN; 1508 INSERT INTO track VALUES(1, 'White Christmas', 5); 1509 } 1510 catchsql COMMIT 1511 } {1 {FOREIGN KEY constraint failed}} 1512 do_test e_fkey-35.3 { 1513 execsql { 1514 INSERT INTO artist VALUES(5, 'Bing Crosby'); 1515 COMMIT; 1516 } 1517 } {} 1518 1519 #------------------------------------------------------------------------- 1520 # Verify that a nested savepoint may be released without satisfying 1521 # deferred foreign key constraints. 1522 # 1523 # EVIDENCE-OF: R-07223-48323 A nested savepoint transaction may be 1524 # RELEASEd while the database is in a state that does not satisfy a 1525 # deferred foreign key constraint. 1526 # 1527 drop_all_tables 1528 do_test e_fkey-36.1 { 1529 execsql { 1530 CREATE TABLE t1(a PRIMARY KEY, 1531 b REFERENCES t1 DEFERRABLE INITIALLY DEFERRED 1532 ); 1533 INSERT INTO t1 VALUES(1, 1); 1534 INSERT INTO t1 VALUES(2, 2); 1535 INSERT INTO t1 VALUES(3, 3); 1536 } 1537 } {} 1538 do_test e_fkey-36.2 { 1539 execsql { 1540 BEGIN; 1541 SAVEPOINT one; 1542 INSERT INTO t1 VALUES(4, 5); 1543 RELEASE one; 1544 } 1545 } {} 1546 do_test e_fkey-36.3 { 1547 catchsql COMMIT 1548 } {1 {FOREIGN KEY constraint failed}} 1549 do_test e_fkey-36.4 { 1550 execsql { 1551 UPDATE t1 SET a = 5 WHERE a = 4; 1552 COMMIT; 1553 } 1554 } {} 1555 1556 1557 #------------------------------------------------------------------------- 1558 # Check that a transaction savepoint (an outermost savepoint opened when 1559 # the database was in auto-commit mode) cannot be released without 1560 # satisfying deferred foreign key constraints. It may be rolled back. 1561 # 1562 # EVIDENCE-OF: R-44295-13823 A transaction savepoint (a non-nested 1563 # savepoint that was opened while there was not currently an open 1564 # transaction), on the other hand, is subject to the same restrictions 1565 # as a COMMIT - attempting to RELEASE it while the database is in such a 1566 # state will fail. 1567 # 1568 do_test e_fkey-37.1 { 1569 execsql { 1570 SAVEPOINT one; 1571 SAVEPOINT two; 1572 INSERT INTO t1 VALUES(6, 7); 1573 RELEASE two; 1574 } 1575 } {} 1576 do_test e_fkey-37.2 { 1577 catchsql {RELEASE one} 1578 } {1 {FOREIGN KEY constraint failed}} 1579 do_test e_fkey-37.3 { 1580 execsql { 1581 UPDATE t1 SET a = 7 WHERE a = 6; 1582 RELEASE one; 1583 } 1584 } {} 1585 do_test e_fkey-37.4 { 1586 execsql { 1587 SAVEPOINT one; 1588 SAVEPOINT two; 1589 INSERT INTO t1 VALUES(9, 10); 1590 RELEASE two; 1591 } 1592 } {} 1593 do_test e_fkey-37.5 { 1594 catchsql {RELEASE one} 1595 } {1 {FOREIGN KEY constraint failed}} 1596 do_test e_fkey-37.6 { 1597 execsql {ROLLBACK TO one ; RELEASE one} 1598 } {} 1599 1600 #------------------------------------------------------------------------- 1601 # Test that if a COMMIT operation fails due to deferred foreign key 1602 # constraints, any nested savepoints remain open. 1603 # 1604 # EVIDENCE-OF: R-37736-42616 If a COMMIT statement (or the RELEASE of a 1605 # transaction SAVEPOINT) fails because the database is currently in a 1606 # state that violates a deferred foreign key constraint and there are 1607 # currently nested savepoints, the nested savepoints remain open. 1608 # 1609 do_test e_fkey-38.1 { 1610 execsql { 1611 DELETE FROM t1 WHERE a>3; 1612 SELECT * FROM t1; 1613 } 1614 } {1 1 2 2 3 3} 1615 do_test e_fkey-38.2 { 1616 execsql { 1617 BEGIN; 1618 INSERT INTO t1 VALUES(4, 4); 1619 SAVEPOINT one; 1620 INSERT INTO t1 VALUES(5, 6); 1621 SELECT * FROM t1; 1622 } 1623 } {1 1 2 2 3 3 4 4 5 6} 1624 do_test e_fkey-38.3 { 1625 catchsql COMMIT 1626 } {1 {FOREIGN KEY constraint failed}} 1627 do_test e_fkey-38.4 { 1628 execsql { 1629 ROLLBACK TO one; 1630 COMMIT; 1631 SELECT * FROM t1; 1632 } 1633 } {1 1 2 2 3 3 4 4} 1634 1635 do_test e_fkey-38.5 { 1636 execsql { 1637 SAVEPOINT a; 1638 INSERT INTO t1 VALUES(5, 5); 1639 SAVEPOINT b; 1640 INSERT INTO t1 VALUES(6, 7); 1641 SAVEPOINT c; 1642 INSERT INTO t1 VALUES(7, 8); 1643 } 1644 } {} 1645 do_test e_fkey-38.6 { 1646 catchsql {RELEASE a} 1647 } {1 {FOREIGN KEY constraint failed}} 1648 do_test e_fkey-38.7 { 1649 execsql {ROLLBACK TO c} 1650 catchsql {RELEASE a} 1651 } {1 {FOREIGN KEY constraint failed}} 1652 do_test e_fkey-38.8 { 1653 execsql { 1654 ROLLBACK TO b; 1655 RELEASE a; 1656 SELECT * FROM t1; 1657 } 1658 } {1 1 2 2 3 3 4 4 5 5} 1659 1660 ########################################################################### 1661 ### SECTION 4.3: ON DELETE and ON UPDATE Actions 1662 ########################################################################### 1663 1664 #------------------------------------------------------------------------- 1665 # Test that configured ON DELETE and ON UPDATE actions take place when 1666 # deleting or modifying rows of the parent table, respectively. 1667 # 1668 # EVIDENCE-OF: R-48270-44282 Foreign key ON DELETE and ON UPDATE clauses 1669 # are used to configure actions that take place when deleting rows from 1670 # the parent table (ON DELETE), or modifying the parent key values of 1671 # existing rows (ON UPDATE). 1672 # 1673 # Test that a single FK constraint may have different actions configured 1674 # for ON DELETE and ON UPDATE. 1675 # 1676 # EVIDENCE-OF: R-48124-63225 A single foreign key constraint may have 1677 # different actions configured for ON DELETE and ON UPDATE. 1678 # 1679 do_test e_fkey-39.1 { 1680 execsql { 1681 CREATE TABLE p(a, b PRIMARY KEY, c); 1682 CREATE TABLE c1(d, e, f DEFAULT 'k0' REFERENCES p 1683 ON UPDATE SET DEFAULT 1684 ON DELETE SET NULL 1685 ); 1686 1687 INSERT INTO p VALUES(0, 'k0', ''); 1688 INSERT INTO p VALUES(1, 'k1', 'I'); 1689 INSERT INTO p VALUES(2, 'k2', 'II'); 1690 INSERT INTO p VALUES(3, 'k3', 'III'); 1691 1692 INSERT INTO c1 VALUES(1, 'xx', 'k1'); 1693 INSERT INTO c1 VALUES(2, 'xx', 'k2'); 1694 INSERT INTO c1 VALUES(3, 'xx', 'k3'); 1695 } 1696 } {} 1697 do_test e_fkey-39.2 { 1698 execsql { 1699 UPDATE p SET b = 'k4' WHERE a = 1; 1700 SELECT * FROM c1; 1701 } 1702 } {1 xx k0 2 xx k2 3 xx k3} 1703 do_test e_fkey-39.3 { 1704 execsql { 1705 DELETE FROM p WHERE a = 2; 1706 SELECT * FROM c1; 1707 } 1708 } {1 xx k0 2 xx {} 3 xx k3} 1709 do_test e_fkey-39.4 { 1710 execsql { 1711 CREATE UNIQUE INDEX pi ON p(c); 1712 REPLACE INTO p VALUES(5, 'k5', 'III'); 1713 SELECT * FROM c1; 1714 } 1715 } {1 xx k0 2 xx {} 3 xx {}} 1716 1717 #------------------------------------------------------------------------- 1718 # Each foreign key in the system has an ON UPDATE and ON DELETE action, 1719 # either "NO ACTION", "RESTRICT", "SET NULL", "SET DEFAULT" or "CASCADE". 1720 # 1721 # EVIDENCE-OF: R-33326-45252 The ON DELETE and ON UPDATE action 1722 # associated with each foreign key in an SQLite database is one of "NO 1723 # ACTION", "RESTRICT", "SET NULL", "SET DEFAULT" or "CASCADE". 1724 # 1725 # If none is specified explicitly, "NO ACTION" is the default. 1726 # 1727 # EVIDENCE-OF: R-19803-45884 If an action is not explicitly specified, 1728 # it defaults to "NO ACTION". 1729 # 1730 drop_all_tables 1731 do_test e_fkey-40.1 { 1732 execsql { 1733 CREATE TABLE parent(x PRIMARY KEY, y); 1734 CREATE TABLE child1(a, 1735 b REFERENCES parent ON UPDATE NO ACTION ON DELETE RESTRICT 1736 ); 1737 CREATE TABLE child2(a, 1738 b REFERENCES parent ON UPDATE RESTRICT ON DELETE SET NULL 1739 ); 1740 CREATE TABLE child3(a, 1741 b REFERENCES parent ON UPDATE SET NULL ON DELETE SET DEFAULT 1742 ); 1743 CREATE TABLE child4(a, 1744 b REFERENCES parent ON UPDATE SET DEFAULT ON DELETE CASCADE 1745 ); 1746 1747 -- Create some foreign keys that use the default action - "NO ACTION" 1748 CREATE TABLE child5(a, b REFERENCES parent ON UPDATE CASCADE); 1749 CREATE TABLE child6(a, b REFERENCES parent ON DELETE RESTRICT); 1750 CREATE TABLE child7(a, b REFERENCES parent ON DELETE NO ACTION); 1751 CREATE TABLE child8(a, b REFERENCES parent ON UPDATE NO ACTION); 1752 } 1753 } {} 1754 1755 foreach {tn zTab lRes} { 1756 2 child1 {0 0 parent b {} {NO ACTION} RESTRICT NONE} 1757 3 child2 {0 0 parent b {} RESTRICT {SET NULL} NONE} 1758 4 child3 {0 0 parent b {} {SET NULL} {SET DEFAULT} NONE} 1759 5 child4 {0 0 parent b {} {SET DEFAULT} CASCADE NONE} 1760 6 child5 {0 0 parent b {} CASCADE {NO ACTION} NONE} 1761 7 child6 {0 0 parent b {} {NO ACTION} RESTRICT NONE} 1762 8 child7 {0 0 parent b {} {NO ACTION} {NO ACTION} NONE} 1763 9 child8 {0 0 parent b {} {NO ACTION} {NO ACTION} NONE} 1764 } { 1765 do_test e_fkey-40.$tn { execsql "PRAGMA foreign_key_list($zTab)" } $lRes 1766 } 1767 1768 #------------------------------------------------------------------------- 1769 # Test that "NO ACTION" means that nothing happens to a child row when 1770 # it's parent row is updated or deleted. 1771 # 1772 # EVIDENCE-OF: R-19971-54976 Configuring "NO ACTION" means just that: 1773 # when a parent key is modified or deleted from the database, no special 1774 # action is taken. 1775 # 1776 drop_all_tables 1777 do_test e_fkey-41.1 { 1778 execsql { 1779 CREATE TABLE parent(p1, p2, PRIMARY KEY(p1, p2)); 1780 CREATE TABLE child(c1, c2, 1781 FOREIGN KEY(c1, c2) REFERENCES parent 1782 ON UPDATE NO ACTION 1783 ON DELETE NO ACTION 1784 DEFERRABLE INITIALLY DEFERRED 1785 ); 1786 INSERT INTO parent VALUES('j', 'k'); 1787 INSERT INTO parent VALUES('l', 'm'); 1788 INSERT INTO child VALUES('j', 'k'); 1789 INSERT INTO child VALUES('l', 'm'); 1790 } 1791 } {} 1792 do_test e_fkey-41.2 { 1793 execsql { 1794 BEGIN; 1795 UPDATE parent SET p1='k' WHERE p1='j'; 1796 DELETE FROM parent WHERE p1='l'; 1797 SELECT * FROM child; 1798 } 1799 } {j k l m} 1800 do_test e_fkey-41.3 { 1801 catchsql COMMIT 1802 } {1 {FOREIGN KEY constraint failed}} 1803 do_test e_fkey-41.4 { 1804 execsql ROLLBACK 1805 } {} 1806 1807 #------------------------------------------------------------------------- 1808 # Test that "RESTRICT" means the application is prohibited from deleting 1809 # or updating a parent table row when there exists one or more child keys 1810 # mapped to it. 1811 # 1812 # EVIDENCE-OF: R-04272-38653 The "RESTRICT" action means that the 1813 # application is prohibited from deleting (for ON DELETE RESTRICT) or 1814 # modifying (for ON UPDATE RESTRICT) a parent key when there exists one 1815 # or more child keys mapped to it. 1816 # 1817 drop_all_tables 1818 do_test e_fkey-41.1 { 1819 execsql { 1820 CREATE TABLE parent(p1, p2); 1821 CREATE UNIQUE INDEX parent_i ON parent(p1, p2); 1822 CREATE TABLE child1(c1, c2, 1823 FOREIGN KEY(c2, c1) REFERENCES parent(p1, p2) ON DELETE RESTRICT 1824 ); 1825 CREATE TABLE child2(c1, c2, 1826 FOREIGN KEY(c2, c1) REFERENCES parent(p1, p2) ON UPDATE RESTRICT 1827 ); 1828 } 1829 } {} 1830 do_test e_fkey-41.2 { 1831 execsql { 1832 INSERT INTO parent VALUES('a', 'b'); 1833 INSERT INTO parent VALUES('c', 'd'); 1834 INSERT INTO child1 VALUES('b', 'a'); 1835 INSERT INTO child2 VALUES('d', 'c'); 1836 } 1837 } {} 1838 do_test e_fkey-41.3 { 1839 catchsql { DELETE FROM parent WHERE p1 = 'a' } 1840 } {1 {FOREIGN KEY constraint failed}} 1841 do_test e_fkey-41.4 { 1842 catchsql { UPDATE parent SET p2 = 'e' WHERE p1 = 'c' } 1843 } {1 {FOREIGN KEY constraint failed}} 1844 1845 #------------------------------------------------------------------------- 1846 # Test that RESTRICT is slightly different from NO ACTION for IMMEDIATE 1847 # constraints, in that it is enforced immediately, not at the end of the 1848 # statement. 1849 # 1850 # EVIDENCE-OF: R-37997-42187 The difference between the effect of a 1851 # RESTRICT action and normal foreign key constraint enforcement is that 1852 # the RESTRICT action processing happens as soon as the field is updated 1853 # - not at the end of the current statement as it would with an 1854 # immediate constraint, or at the end of the current transaction as it 1855 # would with a deferred constraint. 1856 # 1857 drop_all_tables 1858 do_test e_fkey-42.1 { 1859 execsql { 1860 CREATE TABLE parent(x PRIMARY KEY); 1861 CREATE TABLE child1(c REFERENCES parent ON UPDATE RESTRICT); 1862 CREATE TABLE child2(c REFERENCES parent ON UPDATE NO ACTION); 1863 1864 INSERT INTO parent VALUES('key1'); 1865 INSERT INTO parent VALUES('key2'); 1866 INSERT INTO child1 VALUES('key1'); 1867 INSERT INTO child2 VALUES('key2'); 1868 1869 CREATE TRIGGER parent_t AFTER UPDATE ON parent BEGIN 1870 UPDATE child1 set c = new.x WHERE c = old.x; 1871 UPDATE child2 set c = new.x WHERE c = old.x; 1872 END; 1873 } 1874 } {} 1875 do_test e_fkey-42.2 { 1876 catchsql { UPDATE parent SET x = 'key one' WHERE x = 'key1' } 1877 } {1 {FOREIGN KEY constraint failed}} 1878 do_test e_fkey-42.3 { 1879 execsql { 1880 UPDATE parent SET x = 'key two' WHERE x = 'key2'; 1881 SELECT * FROM child2; 1882 } 1883 } {{key two}} 1884 1885 drop_all_tables 1886 do_test e_fkey-42.4 { 1887 execsql { 1888 CREATE TABLE parent(x PRIMARY KEY); 1889 CREATE TABLE child1(c REFERENCES parent ON DELETE RESTRICT); 1890 CREATE TABLE child2(c REFERENCES parent ON DELETE NO ACTION); 1891 1892 INSERT INTO parent VALUES('key1'); 1893 INSERT INTO parent VALUES('key2'); 1894 INSERT INTO child1 VALUES('key1'); 1895 INSERT INTO child2 VALUES('key2'); 1896 1897 CREATE TRIGGER parent_t AFTER DELETE ON parent BEGIN 1898 UPDATE child1 SET c = NULL WHERE c = old.x; 1899 UPDATE child2 SET c = NULL WHERE c = old.x; 1900 END; 1901 } 1902 } {} 1903 do_test e_fkey-42.5 { 1904 catchsql { DELETE FROM parent WHERE x = 'key1' } 1905 } {1 {FOREIGN KEY constraint failed}} 1906 do_test e_fkey-42.6 { 1907 execsql { 1908 DELETE FROM parent WHERE x = 'key2'; 1909 SELECT * FROM child2; 1910 } 1911 } {{}} 1912 1913 drop_all_tables 1914 do_test e_fkey-42.7 { 1915 execsql { 1916 CREATE TABLE parent(x PRIMARY KEY); 1917 CREATE TABLE child1(c REFERENCES parent ON DELETE RESTRICT); 1918 CREATE TABLE child2(c REFERENCES parent ON DELETE NO ACTION); 1919 1920 INSERT INTO parent VALUES('key1'); 1921 INSERT INTO parent VALUES('key2'); 1922 INSERT INTO child1 VALUES('key1'); 1923 INSERT INTO child2 VALUES('key2'); 1924 } 1925 } {} 1926 do_test e_fkey-42.8 { 1927 catchsql { REPLACE INTO parent VALUES('key1') } 1928 } {1 {FOREIGN KEY constraint failed}} 1929 do_test e_fkey-42.9 { 1930 execsql { 1931 REPLACE INTO parent VALUES('key2'); 1932 SELECT * FROM child2; 1933 } 1934 } {key2} 1935 1936 #------------------------------------------------------------------------- 1937 # Test that RESTRICT is enforced immediately, even for a DEFERRED constraint. 1938 # 1939 # EVIDENCE-OF: R-24179-60523 Even if the foreign key constraint it is 1940 # attached to is deferred, configuring a RESTRICT action causes SQLite 1941 # to return an error immediately if a parent key with dependent child 1942 # keys is deleted or modified. 1943 # 1944 drop_all_tables 1945 do_test e_fkey-43.1 { 1946 execsql { 1947 CREATE TABLE parent(x PRIMARY KEY); 1948 CREATE TABLE child1(c REFERENCES parent ON UPDATE RESTRICT 1949 DEFERRABLE INITIALLY DEFERRED 1950 ); 1951 CREATE TABLE child2(c REFERENCES parent ON UPDATE NO ACTION 1952 DEFERRABLE INITIALLY DEFERRED 1953 ); 1954 1955 INSERT INTO parent VALUES('key1'); 1956 INSERT INTO parent VALUES('key2'); 1957 INSERT INTO child1 VALUES('key1'); 1958 INSERT INTO child2 VALUES('key2'); 1959 BEGIN; 1960 } 1961 } {} 1962 do_test e_fkey-43.2 { 1963 catchsql { UPDATE parent SET x = 'key one' WHERE x = 'key1' } 1964 } {1 {FOREIGN KEY constraint failed}} 1965 do_test e_fkey-43.3 { 1966 execsql { UPDATE parent SET x = 'key two' WHERE x = 'key2' } 1967 } {} 1968 do_test e_fkey-43.4 { 1969 catchsql COMMIT 1970 } {1 {FOREIGN KEY constraint failed}} 1971 do_test e_fkey-43.5 { 1972 execsql { 1973 UPDATE child2 SET c = 'key two'; 1974 COMMIT; 1975 } 1976 } {} 1977 1978 drop_all_tables 1979 do_test e_fkey-43.6 { 1980 execsql { 1981 CREATE TABLE parent(x PRIMARY KEY); 1982 CREATE TABLE child1(c REFERENCES parent ON DELETE RESTRICT 1983 DEFERRABLE INITIALLY DEFERRED 1984 ); 1985 CREATE TABLE child2(c REFERENCES parent ON DELETE NO ACTION 1986 DEFERRABLE INITIALLY DEFERRED 1987 ); 1988 1989 INSERT INTO parent VALUES('key1'); 1990 INSERT INTO parent VALUES('key2'); 1991 INSERT INTO child1 VALUES('key1'); 1992 INSERT INTO child2 VALUES('key2'); 1993 BEGIN; 1994 } 1995 } {} 1996 do_test e_fkey-43.7 { 1997 catchsql { DELETE FROM parent WHERE x = 'key1' } 1998 } {1 {FOREIGN KEY constraint failed}} 1999 do_test e_fkey-43.8 { 2000 execsql { DELETE FROM parent WHERE x = 'key2' } 2001 } {} 2002 do_test e_fkey-43.9 { 2003 catchsql COMMIT 2004 } {1 {FOREIGN KEY constraint failed}} 2005 do_test e_fkey-43.10 { 2006 execsql { 2007 UPDATE child2 SET c = NULL; 2008 COMMIT; 2009 } 2010 } {} 2011 2012 #------------------------------------------------------------------------- 2013 # Test SET NULL actions. 2014 # 2015 # EVIDENCE-OF: R-03353-05327 If the configured action is "SET NULL", 2016 # then when a parent key is deleted (for ON DELETE SET NULL) or modified 2017 # (for ON UPDATE SET NULL), the child key columns of all rows in the 2018 # child table that mapped to the parent key are set to contain SQL NULL 2019 # values. 2020 # 2021 drop_all_tables 2022 do_test e_fkey-44.1 { 2023 execsql { 2024 CREATE TABLE pA(x PRIMARY KEY); 2025 CREATE TABLE cA(c REFERENCES pA ON DELETE SET NULL); 2026 CREATE TABLE cB(c REFERENCES pA ON UPDATE SET NULL); 2027 2028 INSERT INTO pA VALUES(X'ABCD'); 2029 INSERT INTO pA VALUES(X'1234'); 2030 INSERT INTO cA VALUES(X'ABCD'); 2031 INSERT INTO cB VALUES(X'1234'); 2032 } 2033 } {} 2034 do_test e_fkey-44.2 { 2035 execsql { 2036 DELETE FROM pA WHERE rowid = 1; 2037 SELECT quote(x) FROM pA; 2038 } 2039 } {X'1234'} 2040 do_test e_fkey-44.3 { 2041 execsql { 2042 SELECT quote(c) FROM cA; 2043 } 2044 } {NULL} 2045 do_test e_fkey-44.4 { 2046 execsql { 2047 UPDATE pA SET x = X'8765' WHERE rowid = 2; 2048 SELECT quote(x) FROM pA; 2049 } 2050 } {X'8765'} 2051 do_test e_fkey-44.5 { 2052 execsql { SELECT quote(c) FROM cB } 2053 } {NULL} 2054 2055 #------------------------------------------------------------------------- 2056 # Test SET DEFAULT actions. 2057 # 2058 # EVIDENCE-OF: R-55814-22637 The "SET DEFAULT" actions are similar to 2059 # "SET NULL", except that each of the child key columns is set to 2060 # contain the column's default value instead of NULL. 2061 # 2062 drop_all_tables 2063 do_test e_fkey-45.1 { 2064 execsql { 2065 CREATE TABLE pA(x PRIMARY KEY); 2066 CREATE TABLE cA(c DEFAULT X'0000' REFERENCES pA ON DELETE SET DEFAULT); 2067 CREATE TABLE cB(c DEFAULT X'9999' REFERENCES pA ON UPDATE SET DEFAULT); 2068 2069 INSERT INTO pA(rowid, x) VALUES(1, X'0000'); 2070 INSERT INTO pA(rowid, x) VALUES(2, X'9999'); 2071 INSERT INTO pA(rowid, x) VALUES(3, X'ABCD'); 2072 INSERT INTO pA(rowid, x) VALUES(4, X'1234'); 2073 2074 INSERT INTO cA VALUES(X'ABCD'); 2075 INSERT INTO cB VALUES(X'1234'); 2076 } 2077 } {} 2078 do_test e_fkey-45.2 { 2079 execsql { 2080 DELETE FROM pA WHERE rowid = 3; 2081 SELECT quote(x) FROM pA ORDER BY rowid; 2082 } 2083 } {X'0000' X'9999' X'1234'} 2084 do_test e_fkey-45.3 { 2085 execsql { SELECT quote(c) FROM cA } 2086 } {X'0000'} 2087 do_test e_fkey-45.4 { 2088 execsql { 2089 UPDATE pA SET x = X'8765' WHERE rowid = 4; 2090 SELECT quote(x) FROM pA ORDER BY rowid; 2091 } 2092 } {X'0000' X'9999' X'8765'} 2093 do_test e_fkey-45.5 { 2094 execsql { SELECT quote(c) FROM cB } 2095 } {X'9999'} 2096 2097 #------------------------------------------------------------------------- 2098 # Test ON DELETE CASCADE actions. 2099 # 2100 # EVIDENCE-OF: R-61376-57267 A "CASCADE" action propagates the delete or 2101 # update operation on the parent key to each dependent child key. 2102 # 2103 # EVIDENCE-OF: R-61809-62207 For an "ON DELETE CASCADE" action, this 2104 # means that each row in the child table that was associated with the 2105 # deleted parent row is also deleted. 2106 # 2107 drop_all_tables 2108 do_test e_fkey-46.1 { 2109 execsql { 2110 CREATE TABLE p1(a, b UNIQUE); 2111 CREATE TABLE c1(c REFERENCES p1(b) ON DELETE CASCADE, d); 2112 INSERT INTO p1 VALUES(NULL, NULL); 2113 INSERT INTO p1 VALUES(4, 4); 2114 INSERT INTO p1 VALUES(5, 5); 2115 INSERT INTO c1 VALUES(NULL, NULL); 2116 INSERT INTO c1 VALUES(4, 4); 2117 INSERT INTO c1 VALUES(5, 5); 2118 SELECT count(*) FROM c1; 2119 } 2120 } {3} 2121 do_test e_fkey-46.2 { 2122 execsql { 2123 DELETE FROM p1 WHERE a = 4; 2124 SELECT d, c FROM c1; 2125 } 2126 } {{} {} 5 5} 2127 do_test e_fkey-46.3 { 2128 execsql { 2129 DELETE FROM p1; 2130 SELECT d, c FROM c1; 2131 } 2132 } {{} {}} 2133 do_test e_fkey-46.4 { 2134 execsql { SELECT * FROM p1 } 2135 } {} 2136 2137 2138 #------------------------------------------------------------------------- 2139 # Test ON UPDATE CASCADE actions. 2140 # 2141 # EVIDENCE-OF: R-13877-64542 For an "ON UPDATE CASCADE" action, it means 2142 # that the values stored in each dependent child key are modified to 2143 # match the new parent key values. 2144 # 2145 # EVIDENCE-OF: R-61376-57267 A "CASCADE" action propagates the delete or 2146 # update operation on the parent key to each dependent child key. 2147 # 2148 drop_all_tables 2149 do_test e_fkey-47.1 { 2150 execsql { 2151 CREATE TABLE p1(a, b UNIQUE); 2152 CREATE TABLE c1(c REFERENCES p1(b) ON UPDATE CASCADE, d); 2153 INSERT INTO p1 VALUES(NULL, NULL); 2154 INSERT INTO p1 VALUES(4, 4); 2155 INSERT INTO p1 VALUES(5, 5); 2156 INSERT INTO c1 VALUES(NULL, NULL); 2157 INSERT INTO c1 VALUES(4, 4); 2158 INSERT INTO c1 VALUES(5, 5); 2159 SELECT count(*) FROM c1; 2160 } 2161 } {3} 2162 do_test e_fkey-47.2 { 2163 execsql { 2164 UPDATE p1 SET b = 10 WHERE b = 5; 2165 SELECT d, c FROM c1; 2166 } 2167 } {{} {} 4 4 5 10} 2168 do_test e_fkey-47.3 { 2169 execsql { 2170 UPDATE p1 SET b = 11 WHERE b = 4; 2171 SELECT d, c FROM c1; 2172 } 2173 } {{} {} 4 11 5 10} 2174 do_test e_fkey-47.4 { 2175 execsql { 2176 UPDATE p1 SET b = 6 WHERE b IS NULL; 2177 SELECT d, c FROM c1; 2178 } 2179 } {{} {} 4 11 5 10} 2180 do_test e_fkey-46.5 { 2181 execsql { SELECT * FROM p1 } 2182 } {{} 6 4 11 5 10} 2183 2184 #------------------------------------------------------------------------- 2185 # EVIDENCE-OF: R-65058-57158 2186 # 2187 # Test an example from the "ON DELETE and ON UPDATE Actions" section 2188 # of foreignkeys.html. 2189 # 2190 drop_all_tables 2191 do_test e_fkey-48.1 { 2192 execsql { 2193 CREATE TABLE artist( 2194 artistid INTEGER PRIMARY KEY, 2195 artistname TEXT 2196 ); 2197 CREATE TABLE track( 2198 trackid INTEGER, 2199 trackname TEXT, 2200 trackartist INTEGER REFERENCES artist(artistid) ON UPDATE CASCADE 2201 ); 2202 2203 INSERT INTO artist VALUES(1, 'Dean Martin'); 2204 INSERT INTO artist VALUES(2, 'Frank Sinatra'); 2205 INSERT INTO track VALUES(11, 'That''s Amore', 1); 2206 INSERT INTO track VALUES(12, 'Christmas Blues', 1); 2207 INSERT INTO track VALUES(13, 'My Way', 2); 2208 } 2209 } {} 2210 do_test e_fkey-48.2 { 2211 execsql { 2212 UPDATE artist SET artistid = 100 WHERE artistname = 'Dean Martin'; 2213 } 2214 } {} 2215 do_test e_fkey-48.3 { 2216 execsql { SELECT * FROM artist } 2217 } {2 {Frank Sinatra} 100 {Dean Martin}} 2218 do_test e_fkey-48.4 { 2219 execsql { SELECT * FROM track } 2220 } {11 {That's Amore} 100 12 {Christmas Blues} 100 13 {My Way} 2} 2221 2222 2223 #------------------------------------------------------------------------- 2224 # Verify that adding an FK action does not absolve the user of the 2225 # requirement not to violate the foreign key constraint. 2226 # 2227 # EVIDENCE-OF: R-53968-51642 Configuring an ON UPDATE or ON DELETE 2228 # action does not mean that the foreign key constraint does not need to 2229 # be satisfied. 2230 # 2231 drop_all_tables 2232 do_test e_fkey-49.1 { 2233 execsql { 2234 CREATE TABLE parent(a COLLATE nocase, b, c, PRIMARY KEY(c, a)); 2235 CREATE TABLE child(d DEFAULT 'a', e, f DEFAULT 'c', 2236 FOREIGN KEY(f, d) REFERENCES parent ON UPDATE SET DEFAULT 2237 ); 2238 2239 INSERT INTO parent VALUES('A', 'b', 'c'); 2240 INSERT INTO parent VALUES('ONE', 'two', 'three'); 2241 INSERT INTO child VALUES('one', 'two', 'three'); 2242 } 2243 } {} 2244 do_test e_fkey-49.2 { 2245 execsql { 2246 BEGIN; 2247 UPDATE parent SET a = '' WHERE a = 'oNe'; 2248 SELECT * FROM child; 2249 } 2250 } {a two c} 2251 do_test e_fkey-49.3 { 2252 execsql { 2253 ROLLBACK; 2254 DELETE FROM parent WHERE a = 'A'; 2255 SELECT * FROM parent; 2256 } 2257 } {ONE two three} 2258 do_test e_fkey-49.4 { 2259 catchsql { UPDATE parent SET a = '' WHERE a = 'oNe' } 2260 } {1 {FOREIGN KEY constraint failed}} 2261 2262 2263 #------------------------------------------------------------------------- 2264 # EVIDENCE-OF: R-11856-19836 2265 # 2266 # Test an example from the "ON DELETE and ON UPDATE Actions" section 2267 # of foreignkeys.html. This example shows that adding an "ON DELETE DEFAULT" 2268 # clause does not abrogate the need to satisfy the foreign key constraint 2269 # (R-28220-46694). 2270 # 2271 # EVIDENCE-OF: R-28220-46694 For example, if an "ON DELETE SET DEFAULT" 2272 # action is configured, but there is no row in the parent table that 2273 # corresponds to the default values of the child key columns, deleting a 2274 # parent key while dependent child keys exist still causes a foreign key 2275 # violation. 2276 # 2277 drop_all_tables 2278 do_test e_fkey-50.1 { 2279 execsql { 2280 CREATE TABLE artist( 2281 artistid INTEGER PRIMARY KEY, 2282 artistname TEXT 2283 ); 2284 CREATE TABLE track( 2285 trackid INTEGER, 2286 trackname TEXT, 2287 trackartist INTEGER DEFAULT 0 REFERENCES artist(artistid) ON DELETE SET DEFAULT 2288 ); 2289 INSERT INTO artist VALUES(3, 'Sammy Davis Jr.'); 2290 INSERT INTO track VALUES(14, 'Mr. Bojangles', 3); 2291 } 2292 } {} 2293 do_test e_fkey-50.2 { 2294 catchsql { DELETE FROM artist WHERE artistname = 'Sammy Davis Jr.' } 2295 } {1 {FOREIGN KEY constraint failed}} 2296 do_test e_fkey-50.3 { 2297 execsql { 2298 INSERT INTO artist VALUES(0, 'Unknown Artist'); 2299 DELETE FROM artist WHERE artistname = 'Sammy Davis Jr.'; 2300 } 2301 } {} 2302 do_test e_fkey-50.4 { 2303 execsql { SELECT * FROM artist } 2304 } {0 {Unknown Artist}} 2305 do_test e_fkey-50.5 { 2306 execsql { SELECT * FROM track } 2307 } {14 {Mr. Bojangles} 0} 2308 2309 #------------------------------------------------------------------------- 2310 # EVIDENCE-OF: R-09564-22170 2311 # 2312 # Check that the order of steps in an UPDATE or DELETE on a parent 2313 # table is as follows: 2314 # 2315 # 1. Execute applicable BEFORE trigger programs, 2316 # 2. Check local (non foreign key) constraints, 2317 # 3. Update or delete the row in the parent table, 2318 # 4. Perform any required foreign key actions, 2319 # 5. Execute applicable AFTER trigger programs. 2320 # 2321 drop_all_tables 2322 do_test e_fkey-51.1 { 2323 proc maxparent {args} { db one {SELECT max(x) FROM parent} } 2324 db func maxparent maxparent 2325 2326 execsql { 2327 CREATE TABLE parent(x PRIMARY KEY); 2328 2329 CREATE TRIGGER bu BEFORE UPDATE ON parent BEGIN 2330 INSERT INTO parent VALUES(new.x-old.x); 2331 END; 2332 CREATE TABLE child( 2333 a DEFAULT (maxparent()) REFERENCES parent ON UPDATE SET DEFAULT 2334 ); 2335 CREATE TRIGGER au AFTER UPDATE ON parent BEGIN 2336 INSERT INTO parent VALUES(new.x+old.x); 2337 END; 2338 2339 INSERT INTO parent VALUES(1); 2340 INSERT INTO child VALUES(1); 2341 } 2342 } {} 2343 do_test e_fkey-51.2 { 2344 execsql { 2345 UPDATE parent SET x = 22; 2346 SELECT * FROM parent ORDER BY rowid; SELECT 'xxx' ; SELECT a FROM child; 2347 } 2348 } {22 21 23 xxx 22} 2349 do_test e_fkey-51.3 { 2350 execsql { 2351 DELETE FROM child; 2352 DELETE FROM parent; 2353 INSERT INTO parent VALUES(-1); 2354 INSERT INTO child VALUES(-1); 2355 UPDATE parent SET x = 22; 2356 SELECT * FROM parent ORDER BY rowid; SELECT 'xxx' ; SELECT a FROM child; 2357 } 2358 } {22 23 21 xxx 23} 2359 2360 2361 #------------------------------------------------------------------------- 2362 # Verify that ON UPDATE actions only actually take place if the parent key 2363 # is set to a new value that is distinct from the old value. The default 2364 # collation sequence and affinity are used to determine if the new value 2365 # is 'distinct' from the old or not. 2366 # 2367 # EVIDENCE-OF: R-27383-10246 An ON UPDATE action is only taken if the 2368 # values of the parent key are modified so that the new parent key 2369 # values are not equal to the old. 2370 # 2371 drop_all_tables 2372 do_test e_fkey-52.1 { 2373 execsql { 2374 CREATE TABLE zeus(a INTEGER COLLATE NOCASE, b, PRIMARY KEY(a, b)); 2375 CREATE TABLE apollo(c, d, 2376 FOREIGN KEY(c, d) REFERENCES zeus ON UPDATE CASCADE 2377 ); 2378 INSERT INTO zeus VALUES('abc', 'xyz'); 2379 INSERT INTO apollo VALUES('ABC', 'xyz'); 2380 } 2381 execsql { 2382 UPDATE zeus SET a = 'aBc'; 2383 SELECT * FROM apollo; 2384 } 2385 } {ABC xyz} 2386 do_test e_fkey-52.2 { 2387 execsql { 2388 UPDATE zeus SET a = 1, b = 1; 2389 SELECT * FROM apollo; 2390 } 2391 } {1 1} 2392 do_test e_fkey-52.3 { 2393 execsql { 2394 UPDATE zeus SET a = 1, b = 1; 2395 SELECT typeof(c), c, typeof(d), d FROM apollo; 2396 } 2397 } {integer 1 integer 1} 2398 do_test e_fkey-52.4 { 2399 execsql { 2400 UPDATE zeus SET a = '1'; 2401 SELECT typeof(c), c, typeof(d), d FROM apollo; 2402 } 2403 } {integer 1 integer 1} 2404 do_test e_fkey-52.5 { 2405 execsql { 2406 UPDATE zeus SET b = '1'; 2407 SELECT typeof(c), c, typeof(d), d FROM apollo; 2408 } 2409 } {integer 1 text 1} 2410 do_test e_fkey-52.6 { 2411 execsql { 2412 UPDATE zeus SET b = NULL; 2413 SELECT typeof(c), c, typeof(d), d FROM apollo; 2414 } 2415 } {integer 1 null {}} 2416 2417 #------------------------------------------------------------------------- 2418 # EVIDENCE-OF: R-35129-58141 2419 # 2420 # Test an example from the "ON DELETE and ON UPDATE Actions" section 2421 # of foreignkeys.html. This example demonstrates that ON UPDATE actions 2422 # only take place if at least one parent key column is set to a value 2423 # that is distinct from its previous value. 2424 # 2425 drop_all_tables 2426 do_test e_fkey-53.1 { 2427 execsql { 2428 CREATE TABLE parent(x PRIMARY KEY); 2429 CREATE TABLE child(y REFERENCES parent ON UPDATE SET NULL); 2430 INSERT INTO parent VALUES('key'); 2431 INSERT INTO child VALUES('key'); 2432 } 2433 } {} 2434 do_test e_fkey-53.2 { 2435 execsql { 2436 UPDATE parent SET x = 'key'; 2437 SELECT IFNULL(y, 'null') FROM child; 2438 } 2439 } {key} 2440 do_test e_fkey-53.3 { 2441 execsql { 2442 UPDATE parent SET x = 'key2'; 2443 SELECT IFNULL(y, 'null') FROM child; 2444 } 2445 } {null} 2446 2447 ########################################################################### 2448 ### SECTION 5: CREATE, ALTER and DROP TABLE commands 2449 ########################################################################### 2450 2451 #------------------------------------------------------------------------- 2452 # Test that parent keys are not checked when tables are created. 2453 # 2454 # EVIDENCE-OF: R-36018-21755 The parent key definitions of foreign key 2455 # constraints are not checked when a table is created. 2456 # 2457 # EVIDENCE-OF: R-25384-39337 There is nothing stopping the user from 2458 # creating a foreign key definition that refers to a parent table that 2459 # does not exist, or to parent key columns that do not exist or are not 2460 # collectively bound by a PRIMARY KEY or UNIQUE constraint. 2461 # 2462 # Child keys are checked to ensure all component columns exist. If parent 2463 # key columns are explicitly specified, SQLite checks to make sure there 2464 # are the same number of columns in the child and parent keys. (TODO: This 2465 # is tested but does not correspond to any testable statement.) 2466 # 2467 # Also test that the above statements are true regardless of whether or not 2468 # foreign keys are enabled: "A CREATE TABLE command operates the same whether 2469 # or not foreign key constraints are enabled." 2470 # 2471 # EVIDENCE-OF: R-08908-23439 A CREATE TABLE command operates the same 2472 # whether or not foreign key constraints are enabled. 2473 # 2474 foreach {tn zCreateTbl lRes} { 2475 1 "CREATE TABLE t1(a, b REFERENCES t1)" {0 {}} 2476 2 "CREATE TABLE t1(a, b REFERENCES t2)" {0 {}} 2477 3 "CREATE TABLE t1(a, b, FOREIGN KEY(a,b) REFERENCES t1)" {0 {}} 2478 4 "CREATE TABLE t1(a, b, FOREIGN KEY(a,b) REFERENCES t2)" {0 {}} 2479 5 "CREATE TABLE t1(a, b, FOREIGN KEY(a,b) REFERENCES t2)" {0 {}} 2480 6 "CREATE TABLE t1(a, b, FOREIGN KEY(a,b) REFERENCES t2(n,d))" {0 {}} 2481 7 "CREATE TABLE t1(a, b, FOREIGN KEY(a,b) REFERENCES t1(a,b))" {0 {}} 2482 2483 A "CREATE TABLE t1(a, b, FOREIGN KEY(c,b) REFERENCES t2)" 2484 {1 {unknown column "c" in foreign key definition}} 2485 B "CREATE TABLE t1(a, b, FOREIGN KEY(c,b) REFERENCES t2(d))" 2486 {1 {number of columns in foreign key does not match the number of columns in the referenced table}} 2487 } { 2488 do_test e_fkey-54.$tn.off { 2489 drop_all_tables 2490 execsql {PRAGMA foreign_keys = OFF} 2491 catchsql $zCreateTbl 2492 } $lRes 2493 do_test e_fkey-54.$tn.on { 2494 drop_all_tables 2495 execsql {PRAGMA foreign_keys = ON} 2496 catchsql $zCreateTbl 2497 } $lRes 2498 } 2499 2500 #------------------------------------------------------------------------- 2501 # EVIDENCE-OF: R-47952-62498 It is not possible to use the "ALTER TABLE 2502 # ... ADD COLUMN" syntax to add a column that includes a REFERENCES 2503 # clause, unless the default value of the new column is NULL. Attempting 2504 # to do so returns an error. 2505 # 2506 proc test_efkey_6 {tn zAlter isError} { 2507 drop_all_tables 2508 2509 do_test e_fkey-56.$tn.1 " 2510 execsql { CREATE TABLE tbl(a, b); INSERT INTO tbl VALUES(1, 2); } 2511 [list catchsql $zAlter] 2512 " [lindex {{0 {}} {1 {Cannot add a REFERENCES column with non-NULL default value}}} $isError] 2513 2514 } 2515 2516 test_efkey_6 1 "ALTER TABLE tbl ADD COLUMN c REFERENCES xx" 0 2517 test_efkey_6 2 "ALTER TABLE tbl ADD COLUMN c DEFAULT NULL REFERENCES xx" 0 2518 test_efkey_6 3 "ALTER TABLE tbl ADD COLUMN c DEFAULT 0 REFERENCES xx" 1 2519 2520 #------------------------------------------------------------------------- 2521 # Test that ALTER TABLE adjusts REFERENCES clauses when the parent table 2522 # is RENAMED. 2523 # 2524 # EVIDENCE-OF: R-47080-02069 If an "ALTER TABLE ... RENAME TO" command 2525 # is used to rename a table that is the parent table of one or more 2526 # foreign key constraints, the definitions of the foreign key 2527 # constraints are modified to refer to the parent table by its new name 2528 # 2529 # Test that these adjustments are visible in the sqlite_master table. 2530 # 2531 # EVIDENCE-OF: R-43040-62530 The text of the child CREATE TABLE 2532 # statement or statements stored in the sqlite_schema table are modified 2533 # to reflect the new parent table name. 2534 # 2535 do_test e_fkey-56.1 { 2536 drop_all_tables 2537 execsql { 2538 CREATE TABLE 'p 1 "parent one"'(a REFERENCES 'p 1 "parent one"', b, PRIMARY KEY(b)); 2539 2540 CREATE TABLE c1(c, d REFERENCES 'p 1 "parent one"' ON UPDATE CASCADE); 2541 CREATE TABLE c2(e, f, FOREIGN KEY(f) REFERENCES 'p 1 "parent one"' ON UPDATE CASCADE); 2542 CREATE TABLE c3(e, 'f col 2', FOREIGN KEY('f col 2') REFERENCES 'p 1 "parent one"' ON UPDATE CASCADE); 2543 2544 INSERT INTO 'p 1 "parent one"' VALUES(1, 1); 2545 INSERT INTO c1 VALUES(1, 1); 2546 INSERT INTO c2 VALUES(1, 1); 2547 INSERT INTO c3 VALUES(1, 1); 2548 2549 -- CREATE TABLE q(a, b, PRIMARY KEY(b)); 2550 } 2551 } {} 2552 do_test e_fkey-56.2 { 2553 execsql { ALTER TABLE 'p 1 "parent one"' RENAME TO p } 2554 } {} 2555 do_test e_fkey-56.3 { 2556 execsql { 2557 UPDATE p SET a = 'xxx', b = 'xxx'; 2558 SELECT * FROM p; 2559 SELECT * FROM c1; 2560 SELECT * FROM c2; 2561 SELECT * FROM c3; 2562 } 2563 } {xxx xxx 1 xxx 1 xxx 1 xxx} 2564 do_test e_fkey-56.4 { 2565 execsql { SELECT sql FROM sqlite_master WHERE type = 'table'} 2566 } [list \ 2567 {CREATE TABLE "p"(a REFERENCES "p", b, PRIMARY KEY(b))} \ 2568 {CREATE TABLE c1(c, d REFERENCES "p" ON UPDATE CASCADE)} \ 2569 {CREATE TABLE c2(e, f, FOREIGN KEY(f) REFERENCES "p" ON UPDATE CASCADE)} \ 2570 {CREATE TABLE c3(e, 'f col 2', FOREIGN KEY('f col 2') REFERENCES "p" ON UPDATE CASCADE)} \ 2571 ] 2572 2573 #------------------------------------------------------------------------- 2574 # Check that a DROP TABLE does an implicit DELETE FROM. Which does not 2575 # cause any triggers to fire, but does fire foreign key actions. 2576 # 2577 # EVIDENCE-OF: R-14208-23986 If foreign key constraints are enabled when 2578 # it is prepared, the DROP TABLE command performs an implicit DELETE to 2579 # remove all rows from the table before dropping it. 2580 # 2581 # EVIDENCE-OF: R-11078-03945 The implicit DELETE does not cause any SQL 2582 # triggers to fire, but may invoke foreign key actions or constraint 2583 # violations. 2584 # 2585 do_test e_fkey-57.1 { 2586 drop_all_tables 2587 execsql { 2588 CREATE TABLE p(a, b, PRIMARY KEY(a, b)); 2589 2590 CREATE TABLE c1(c, d, FOREIGN KEY(c, d) REFERENCES p ON DELETE SET NULL); 2591 CREATE TABLE c2(c, d, FOREIGN KEY(c, d) REFERENCES p ON DELETE SET DEFAULT); 2592 CREATE TABLE c3(c, d, FOREIGN KEY(c, d) REFERENCES p ON DELETE CASCADE); 2593 CREATE TABLE c4(c, d, FOREIGN KEY(c, d) REFERENCES p ON DELETE RESTRICT); 2594 CREATE TABLE c5(c, d, FOREIGN KEY(c, d) REFERENCES p ON DELETE NO ACTION); 2595 2596 CREATE TABLE c6(c, d, 2597 FOREIGN KEY(c, d) REFERENCES p ON DELETE RESTRICT 2598 DEFERRABLE INITIALLY DEFERRED 2599 ); 2600 CREATE TABLE c7(c, d, 2601 FOREIGN KEY(c, d) REFERENCES p ON DELETE NO ACTION 2602 DEFERRABLE INITIALLY DEFERRED 2603 ); 2604 2605 CREATE TABLE log(msg); 2606 CREATE TRIGGER tt AFTER DELETE ON p BEGIN 2607 INSERT INTO log VALUES('delete ' || old.rowid); 2608 END; 2609 } 2610 } {} 2611 2612 do_test e_fkey-57.2 { 2613 execsql { 2614 INSERT INTO p VALUES('a', 'b'); 2615 INSERT INTO c1 VALUES('a', 'b'); 2616 INSERT INTO c2 VALUES('a', 'b'); 2617 INSERT INTO c3 VALUES('a', 'b'); 2618 BEGIN; 2619 DROP TABLE p; 2620 SELECT * FROM c1; 2621 } 2622 } {{} {}} 2623 do_test e_fkey-57.3 { 2624 execsql { SELECT * FROM c2 } 2625 } {{} {}} 2626 do_test e_fkey-57.4 { 2627 execsql { SELECT * FROM c3 } 2628 } {} 2629 do_test e_fkey-57.5 { 2630 execsql { SELECT * FROM log } 2631 } {} 2632 do_test e_fkey-57.6 { 2633 execsql ROLLBACK 2634 } {} 2635 do_test e_fkey-57.7 { 2636 execsql { 2637 BEGIN; 2638 DELETE FROM p; 2639 SELECT * FROM log; 2640 ROLLBACK; 2641 } 2642 } {{delete 1}} 2643 2644 #------------------------------------------------------------------------- 2645 # If an IMMEDIATE foreign key fails as a result of a DROP TABLE, the 2646 # DROP TABLE command fails. 2647 # 2648 # EVIDENCE-OF: R-32768-47925 If an immediate foreign key constraint is 2649 # violated, the DROP TABLE statement fails and the table is not dropped. 2650 # 2651 do_test e_fkey-58.1 { 2652 execsql { 2653 DELETE FROM c1; 2654 DELETE FROM c2; 2655 DELETE FROM c3; 2656 } 2657 execsql { INSERT INTO c5 VALUES('a', 'b') } 2658 catchsql { DROP TABLE p } 2659 } {1 {FOREIGN KEY constraint failed}} 2660 do_test e_fkey-58.2 { 2661 execsql { SELECT * FROM p } 2662 } {a b} 2663 do_test e_fkey-58.3 { 2664 catchsql { 2665 BEGIN; 2666 DROP TABLE p; 2667 } 2668 } {1 {FOREIGN KEY constraint failed}} 2669 do_test e_fkey-58.4 { 2670 execsql { 2671 SELECT * FROM p; 2672 SELECT * FROM c5; 2673 ROLLBACK; 2674 } 2675 } {a b a b} 2676 2677 #------------------------------------------------------------------------- 2678 # If a DEFERRED foreign key fails as a result of a DROP TABLE, attempting 2679 # to commit the transaction fails unless the violation is fixed. 2680 # 2681 # EVIDENCE-OF: R-05903-08460 If a deferred foreign key constraint is 2682 # violated, then an error is reported when the user attempts to commit 2683 # the transaction if the foreign key constraint violations still exist 2684 # at that point. 2685 # 2686 do_test e_fkey-59.1 { 2687 execsql { 2688 DELETE FROM c1 ; DELETE FROM c2 ; DELETE FROM c3 ; 2689 DELETE FROM c4 ; DELETE FROM c5 ; DELETE FROM c6 ; 2690 DELETE FROM c7 2691 } 2692 } {} 2693 do_test e_fkey-59.2 { 2694 execsql { INSERT INTO c7 VALUES('a', 'b') } 2695 execsql { 2696 BEGIN; 2697 DROP TABLE p; 2698 } 2699 } {} 2700 do_test e_fkey-59.3 { 2701 catchsql COMMIT 2702 } {1 {FOREIGN KEY constraint failed}} 2703 do_test e_fkey-59.4 { 2704 execsql { CREATE TABLE p(a, b, PRIMARY KEY(a, b)) } 2705 catchsql COMMIT 2706 } {1 {FOREIGN KEY constraint failed}} 2707 do_test e_fkey-59.5 { 2708 execsql { INSERT INTO p VALUES('a', 'b') } 2709 execsql COMMIT 2710 } {} 2711 2712 #------------------------------------------------------------------------- 2713 # Any "foreign key mismatch" errors encountered while running an implicit 2714 # "DELETE FROM tbl" are ignored. 2715 # 2716 # EVIDENCE-OF: R-57242-37005 Any "foreign key mismatch" errors 2717 # encountered as part of an implicit DELETE are ignored. 2718 # 2719 drop_all_tables 2720 do_test e_fkey-60.1 { 2721 execsql { 2722 PRAGMA foreign_keys = OFF; 2723 2724 CREATE TABLE p(a PRIMARY KEY, b REFERENCES nosuchtable); 2725 CREATE TABLE c1(c, d, FOREIGN KEY(c, d) REFERENCES a); 2726 CREATE TABLE c2(c REFERENCES p(b), d); 2727 CREATE TABLE c3(c REFERENCES p ON DELETE SET NULL, d); 2728 2729 INSERT INTO p VALUES(1, 2); 2730 INSERT INTO c1 VALUES(1, 2); 2731 INSERT INTO c2 VALUES(1, 2); 2732 INSERT INTO c3 VALUES(1, 2); 2733 } 2734 } {} 2735 do_test e_fkey-60.2 { 2736 execsql { PRAGMA foreign_keys = ON } 2737 catchsql { DELETE FROM p } 2738 } {1 {no such table: main.nosuchtable}} 2739 do_test e_fkey-60.3 { 2740 execsql { 2741 BEGIN; 2742 DROP TABLE p; 2743 SELECT * FROM c3; 2744 ROLLBACK; 2745 } 2746 } {{} 2} 2747 do_test e_fkey-60.4 { 2748 execsql { CREATE TABLE nosuchtable(x PRIMARY KEY) } 2749 catchsql { DELETE FROM p } 2750 } {1 {foreign key mismatch - "c2" referencing "p"}} 2751 do_test e_fkey-60.5 { 2752 execsql { DROP TABLE c1 } 2753 catchsql { DELETE FROM p } 2754 } {1 {foreign key mismatch - "c2" referencing "p"}} 2755 do_test e_fkey-60.6 { 2756 execsql { DROP TABLE c2 } 2757 execsql { DELETE FROM p } 2758 } {} 2759 2760 #------------------------------------------------------------------------- 2761 # Test that the special behaviors of ALTER and DROP TABLE are only 2762 # activated when foreign keys are enabled. Special behaviors are: 2763 # 2764 # 1. ADD COLUMN not allowing a REFERENCES clause with a non-NULL 2765 # default value. 2766 # 2. Modifying foreign key definitions when a parent table is RENAMEd. 2767 # 3. Running an implicit DELETE FROM command as part of DROP TABLE. 2768 # 2769 # EVIDENCE-OF: R-54142-41346 The properties of the DROP TABLE and ALTER 2770 # TABLE commands described above only apply if foreign keys are enabled. 2771 # 2772 do_test e_fkey-61.1.1 { 2773 drop_all_tables 2774 execsql { CREATE TABLE t1(a, b) ; INSERT INTO t1 VALUES(1, 2) } 2775 catchsql { ALTER TABLE t1 ADD COLUMN c DEFAULT 'xxx' REFERENCES t2 } 2776 } {1 {Cannot add a REFERENCES column with non-NULL default value}} 2777 do_test e_fkey-61.1.2 { 2778 execsql { PRAGMA foreign_keys = OFF } 2779 execsql { ALTER TABLE t1 ADD COLUMN c DEFAULT 'xxx' REFERENCES t2 } 2780 execsql { SELECT sql FROM sqlite_master WHERE name = 't1' } 2781 } {{CREATE TABLE t1(a, b, c DEFAULT 'xxx' REFERENCES t2)}} 2782 do_test e_fkey-61.1.3 { 2783 execsql { PRAGMA foreign_keys = ON } 2784 } {} 2785 2786 do_test e_fkey-61.2.1 { 2787 drop_all_tables 2788 execsql { 2789 CREATE TABLE p(a UNIQUE); 2790 CREATE TABLE c(b REFERENCES p(a)); 2791 BEGIN; 2792 ALTER TABLE p RENAME TO parent; 2793 SELECT sql FROM sqlite_master WHERE name = 'c'; 2794 ROLLBACK; 2795 } 2796 } {{CREATE TABLE c(b REFERENCES "parent"(a))}} 2797 do_test e_fkey-61.2.2 { 2798 execsql { 2799 PRAGMA foreign_keys = OFF; 2800 PRAGMA legacy_alter_table = ON; 2801 ALTER TABLE p RENAME TO parent; 2802 SELECT sql FROM sqlite_master WHERE name = 'c'; 2803 } 2804 } {{CREATE TABLE c(b REFERENCES p(a))}} 2805 do_test e_fkey-61.2.3 { 2806 execsql { PRAGMA foreign_keys = ON } 2807 execsql { PRAGMA legacy_alter_table = OFF } 2808 } {} 2809 2810 do_test e_fkey-61.3.1 { 2811 drop_all_tables 2812 execsql { 2813 CREATE TABLE p(a UNIQUE); 2814 CREATE TABLE c(b REFERENCES p(a) ON DELETE SET NULL); 2815 INSERT INTO p VALUES('x'); 2816 INSERT INTO c VALUES('x'); 2817 BEGIN; 2818 DROP TABLE p; 2819 SELECT * FROM c; 2820 ROLLBACK; 2821 } 2822 } {{}} 2823 do_test e_fkey-61.3.2 { 2824 execsql { 2825 PRAGMA foreign_keys = OFF; 2826 DROP TABLE p; 2827 SELECT * FROM c; 2828 } 2829 } {x} 2830 do_test e_fkey-61.3.3 { 2831 execsql { PRAGMA foreign_keys = ON } 2832 } {} 2833 2834 ########################################################################### 2835 ### SECTION 6: Limits and Unsupported Features 2836 ########################################################################### 2837 2838 #------------------------------------------------------------------------- 2839 # Test that MATCH clauses are parsed, but SQLite treats every foreign key 2840 # constraint as if it were "MATCH SIMPLE". 2841 # 2842 # EVIDENCE-OF: R-24728-13230 SQLite parses MATCH clauses (i.e. does not 2843 # report a syntax error if you specify one), but does not enforce them. 2844 # 2845 # EVIDENCE-OF: R-24450-46174 All foreign key constraints in SQLite are 2846 # handled as if MATCH SIMPLE were specified. 2847 # 2848 foreach zMatch [list SIMPLE PARTIAL FULL Simple parTIAL FuLL ] { 2849 drop_all_tables 2850 do_test e_fkey-62.$zMatch.1 { 2851 execsql " 2852 CREATE TABLE p(a, b, c, PRIMARY KEY(b, c)); 2853 CREATE TABLE c(d, e, f, FOREIGN KEY(e, f) REFERENCES p MATCH $zMatch); 2854 " 2855 } {} 2856 do_test e_fkey-62.$zMatch.2 { 2857 execsql { INSERT INTO p VALUES(1, 2, 3) } 2858 2859 # MATCH SIMPLE behavior: Allow any child key that contains one or more 2860 # NULL value to be inserted. Non-NULL values do not have to map to any 2861 # parent key values, so long as at least one field of the child key is 2862 # NULL. 2863 execsql { INSERT INTO c VALUES('w', 2, 3) } 2864 execsql { INSERT INTO c VALUES('x', 'x', NULL) } 2865 execsql { INSERT INTO c VALUES('y', NULL, 'x') } 2866 execsql { INSERT INTO c VALUES('z', NULL, NULL) } 2867 2868 # Check that the FK is enforced properly if there are no NULL values 2869 # in the child key columns. 2870 catchsql { INSERT INTO c VALUES('a', 2, 4) } 2871 } {1 {FOREIGN KEY constraint failed}} 2872 } 2873 2874 #------------------------------------------------------------------------- 2875 # Test that SQLite does not support the SET CONSTRAINT statement. And 2876 # that it is possible to create both immediate and deferred constraints. 2877 # 2878 # EVIDENCE-OF: R-21599-16038 In SQLite, a foreign key constraint is 2879 # permanently marked as deferred or immediate when it is created. 2880 # 2881 drop_all_tables 2882 do_test e_fkey-62.1 { 2883 catchsql { SET CONSTRAINTS ALL IMMEDIATE } 2884 } {1 {near "SET": syntax error}} 2885 do_test e_fkey-62.2 { 2886 catchsql { SET CONSTRAINTS ALL DEFERRED } 2887 } {1 {near "SET": syntax error}} 2888 2889 do_test e_fkey-62.3 { 2890 execsql { 2891 CREATE TABLE p(a, b, PRIMARY KEY(a, b)); 2892 CREATE TABLE cd(c, d, 2893 FOREIGN KEY(c, d) REFERENCES p DEFERRABLE INITIALLY DEFERRED); 2894 CREATE TABLE ci(c, d, 2895 FOREIGN KEY(c, d) REFERENCES p DEFERRABLE INITIALLY IMMEDIATE); 2896 BEGIN; 2897 } 2898 } {} 2899 do_test e_fkey-62.4 { 2900 catchsql { INSERT INTO ci VALUES('x', 'y') } 2901 } {1 {FOREIGN KEY constraint failed}} 2902 do_test e_fkey-62.5 { 2903 catchsql { INSERT INTO cd VALUES('x', 'y') } 2904 } {0 {}} 2905 do_test e_fkey-62.6 { 2906 catchsql { COMMIT } 2907 } {1 {FOREIGN KEY constraint failed}} 2908 do_test e_fkey-62.7 { 2909 execsql { 2910 DELETE FROM cd; 2911 COMMIT; 2912 } 2913 } {} 2914 2915 #------------------------------------------------------------------------- 2916 # Test that the maximum recursion depth of foreign key action programs is 2917 # governed by the SQLITE_MAX_TRIGGER_DEPTH and SQLITE_LIMIT_TRIGGER_DEPTH 2918 # settings. 2919 # 2920 # EVIDENCE-OF: R-42264-30503 The SQLITE_MAX_TRIGGER_DEPTH and 2921 # SQLITE_LIMIT_TRIGGER_DEPTH settings determine the maximum allowable 2922 # depth of trigger program recursion. For the purposes of these limits, 2923 # foreign key actions are considered trigger programs. 2924 # 2925 proc test_on_delete_recursion {limit} { 2926 drop_all_tables 2927 execsql { 2928 BEGIN; 2929 CREATE TABLE t0(a PRIMARY KEY, b); 2930 INSERT INTO t0 VALUES('x0', NULL); 2931 } 2932 for {set i 1} {$i <= $limit} {incr i} { 2933 execsql " 2934 CREATE TABLE t$i ( 2935 a PRIMARY KEY, b REFERENCES t[expr $i-1] ON DELETE CASCADE 2936 ); 2937 INSERT INTO t$i VALUES('x$i', 'x[expr $i-1]'); 2938 " 2939 } 2940 execsql COMMIT 2941 catchsql " 2942 DELETE FROM t0; 2943 SELECT count(*) FROM t$limit; 2944 " 2945 } 2946 proc test_on_update_recursion {limit} { 2947 drop_all_tables 2948 execsql { 2949 BEGIN; 2950 CREATE TABLE t0(a PRIMARY KEY); 2951 INSERT INTO t0 VALUES('xxx'); 2952 } 2953 for {set i 1} {$i <= $limit} {incr i} { 2954 set j [expr $i-1] 2955 2956 execsql " 2957 CREATE TABLE t$i (a PRIMARY KEY REFERENCES t$j ON UPDATE CASCADE); 2958 INSERT INTO t$i VALUES('xxx'); 2959 " 2960 } 2961 execsql COMMIT 2962 catchsql " 2963 UPDATE t0 SET a = 'yyy'; 2964 SELECT NOT (a='yyy') FROM t$limit; 2965 " 2966 } 2967 2968 # If the current build was created using clang with the -fsanitize=address 2969 # switch, then the library uses considerably more stack space than usual. 2970 # So much more, that some of the following tests cause stack overflows 2971 # if they are run under this configuration. 2972 # 2973 if {[clang_sanitize_address]==0} { 2974 do_test e_fkey-63.1.1 { 2975 test_on_delete_recursion $SQLITE_MAX_TRIGGER_DEPTH 2976 } {0 0} 2977 do_test e_fkey-63.1.2 { 2978 test_on_delete_recursion [expr $SQLITE_MAX_TRIGGER_DEPTH+1] 2979 } {1 {too many levels of trigger recursion}} 2980 do_test e_fkey-63.1.3 { 2981 sqlite3_limit db SQLITE_LIMIT_TRIGGER_DEPTH 5 2982 test_on_delete_recursion 5 2983 } {0 0} 2984 do_test e_fkey-63.1.4 { 2985 test_on_delete_recursion 6 2986 } {1 {too many levels of trigger recursion}} 2987 do_test e_fkey-63.1.5 { 2988 sqlite3_limit db SQLITE_LIMIT_TRIGGER_DEPTH 1000000 2989 } {5} 2990 do_test e_fkey-63.2.1 { 2991 test_on_update_recursion $SQLITE_MAX_TRIGGER_DEPTH 2992 } {0 0} 2993 do_test e_fkey-63.2.2 { 2994 test_on_update_recursion [expr $SQLITE_MAX_TRIGGER_DEPTH+1] 2995 } {1 {too many levels of trigger recursion}} 2996 do_test e_fkey-63.2.3 { 2997 sqlite3_limit db SQLITE_LIMIT_TRIGGER_DEPTH 5 2998 test_on_update_recursion 5 2999 } {0 0} 3000 do_test e_fkey-63.2.4 { 3001 test_on_update_recursion 6 3002 } {1 {too many levels of trigger recursion}} 3003 do_test e_fkey-63.2.5 { 3004 sqlite3_limit db SQLITE_LIMIT_TRIGGER_DEPTH 1000000 3005 } {5} 3006 } 3007 3008 #------------------------------------------------------------------------- 3009 # The setting of the recursive_triggers pragma does not affect foreign 3010 # key actions. 3011 # 3012 # EVIDENCE-OF: R-44355-00270 The PRAGMA recursive_triggers setting does 3013 # not affect the operation of foreign key actions. 3014 # 3015 foreach recursive_triggers_setting [list 0 1 ON OFF] { 3016 drop_all_tables 3017 execsql "PRAGMA recursive_triggers = $recursive_triggers_setting" 3018 3019 do_test e_fkey-64.$recursive_triggers_setting.1 { 3020 execsql { 3021 CREATE TABLE t1(a PRIMARY KEY, b REFERENCES t1 ON DELETE CASCADE); 3022 INSERT INTO t1 VALUES(1, NULL); 3023 INSERT INTO t1 VALUES(2, 1); 3024 INSERT INTO t1 VALUES(3, 2); 3025 INSERT INTO t1 VALUES(4, 3); 3026 INSERT INTO t1 VALUES(5, 4); 3027 SELECT count(*) FROM t1; 3028 } 3029 } {5} 3030 do_test e_fkey-64.$recursive_triggers_setting.2 { 3031 execsql { SELECT count(*) FROM t1 WHERE a = 1 } 3032 } {1} 3033 do_test e_fkey-64.$recursive_triggers_setting.3 { 3034 execsql { 3035 DELETE FROM t1 WHERE a = 1; 3036 SELECT count(*) FROM t1; 3037 } 3038 } {0} 3039 } 3040 3041 finish_test