3 # The author disclaims copyright to this source code. In place of
4 # a legal notice, here is a blessing:
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.
10 #***********************************************************************
12 # This file implements tests to verify the "testable statements" in the
13 # foreignkeys.in document.
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
24 set testdir [file dirname $argv0]
25 source $testdir/tester.tcl
27 proc eqp {sql {db db}} { uplevel execsql [list "EXPLAIN QUERY PLAN $sql"] $db }
29 ###########################################################################
30 ### SECTION 2: Enabling Foreign Key Support
31 ###########################################################################
33 #-------------------------------------------------------------------------
34 # EVIDENCE-OF: R-33710-56344 In order to use foreign key constraints in
35 # SQLite, the library must be compiled with neither
36 # SQLITE_OMIT_FOREIGN_KEY or SQLITE_OMIT_TRIGGER defined.
38 ifcapable trigger&&foreignkey {
41 PRAGMA foreign_keys = ON;
42 CREATE TABLE p(i PRIMARY KEY);
43 CREATE TABLE c(j REFERENCES p ON UPDATE CASCADE);
44 INSERT INTO p VALUES('hello');
45 INSERT INTO c VALUES('hello');
46 UPDATE p SET i = 'world';
52 #-------------------------------------------------------------------------
53 # Test the effects of defining OMIT_TRIGGER but not OMIT_FOREIGN_KEY.
55 # EVIDENCE-OF: R-44697-61543 If SQLITE_OMIT_TRIGGER is defined but
56 # SQLITE_OMIT_FOREIGN_KEY is not, then SQLite behaves as it did prior to
57 # version 3.6.19 - foreign key definitions are parsed and may be queried
58 # using PRAGMA foreign_key_list, but foreign key constraints are not
61 # Specifically, test that "PRAGMA foreign_keys" is a no-op in this case.
62 # When using the pragma to query the current setting, 0 rows are returned.
64 # EVIDENCE-OF: R-22567-44039 The PRAGMA foreign_keys command is a no-op
65 # in this configuration.
67 # EVIDENCE-OF: R-41784-13339 Tip: If the command "PRAGMA foreign_keys"
68 # returns no data instead of a single row containing "0" or "1", then
69 # the version of SQLite you are using does not support foreign keys
70 # (either because it is older than 3.6.19 or because it was compiled
71 # with SQLITE_OMIT_FOREIGN_KEY or SQLITE_OMIT_TRIGGER defined).
74 ifcapable !trigger&&foreignkey {
77 PRAGMA foreign_keys = ON;
78 CREATE TABLE p(i PRIMARY KEY);
79 CREATE TABLE c(j REFERENCES p ON UPDATE CASCADE);
80 INSERT INTO p VALUES('hello');
81 INSERT INTO c VALUES('hello');
82 UPDATE p SET i = 'world';
87 execsql { PRAGMA foreign_key_list(c) }
88 } {0 0 p j {} CASCADE {NO ACTION} NONE}
90 execsql { PRAGMA foreign_keys }
95 #-------------------------------------------------------------------------
96 # Test the effects of defining OMIT_FOREIGN_KEY.
98 # EVIDENCE-OF: R-58428-36660 If OMIT_FOREIGN_KEY is defined, then
99 # foreign key definitions cannot even be parsed (attempting to specify a
100 # foreign key definition is a syntax error).
102 # Specifically, test that foreign key constraints cannot even be parsed
106 ifcapable !foreignkey {
108 execsql { CREATE TABLE p(i PRIMARY KEY) }
109 catchsql { CREATE TABLE c(j REFERENCES p ON UPDATE CASCADE) }
110 } {1 {near "ON": syntax error}}
112 # This is allowed, as in this build, "REFERENCES" is not a keyword.
113 # The declared datatype of column j is "REFERENCES p".
114 execsql { CREATE TABLE c(j REFERENCES p) }
117 execsql { PRAGMA table_info(c) }
118 } {0 j {REFERENCES p} 0 {} 0}
120 execsql { PRAGMA foreign_key_list(c) }
123 execsql { PRAGMA foreign_keys }
127 ifcapable !foreignkey||!trigger { finish_test ; return }
131 #-------------------------------------------------------------------------
132 # EVIDENCE-OF: R-07280-60510 Assuming the library is compiled with
133 # foreign key constraints enabled, it must still be enabled by the
134 # application at runtime, using the PRAGMA foreign_keys command.
136 # This also tests that foreign key constraints are disabled by default.
138 # EVIDENCE-OF: R-59578-04990 Foreign key constraints are disabled by
139 # default (for backwards compatibility), so must be enabled separately
140 # for each database connection separately.
145 CREATE TABLE p(i PRIMARY KEY);
146 CREATE TABLE c(j REFERENCES p ON UPDATE CASCADE);
147 INSERT INTO p VALUES('hello');
148 INSERT INTO c VALUES('hello');
149 UPDATE p SET i = 'world';
157 PRAGMA foreign_keys = ON;
158 INSERT INTO p VALUES('hello');
159 INSERT INTO c VALUES('hello');
160 UPDATE p SET i = 'world';
165 #-------------------------------------------------------------------------
166 # EVIDENCE-OF: R-15278-54456 The application can can also use a PRAGMA
167 # foreign_keys statement to determine if foreign keys are currently
170 # This also tests the example code in section 2 of foreignkeys.in.
172 # EVIDENCE-OF: R-11255-19907
176 execsql { PRAGMA foreign_keys }
180 PRAGMA foreign_keys = ON;
186 PRAGMA foreign_keys = OFF;
191 #-------------------------------------------------------------------------
192 # Test that it is not possible to enable or disable foreign key support
193 # while not in auto-commit mode.
195 # EVIDENCE-OF: R-46649-58537 It is not possible to enable or disable
196 # foreign key constraints in the middle of a multi-statement transaction
197 # (when SQLite is not in autocommit mode). Attempting to do so does not
198 # return an error; it simply has no effect.
203 PRAGMA foreign_keys = ON;
204 CREATE TABLE t1(a UNIQUE, b);
205 CREATE TABLE t2(c, d REFERENCES t1(a));
206 INSERT INTO t1 VALUES(1, 2);
207 INSERT INTO t2 VALUES(2, 1);
209 PRAGMA foreign_keys = OFF;
214 } {1 {foreign key constraint failed}}
216 execsql { PRAGMA foreign_keys }
221 PRAGMA foreign_keys = OFF;
223 PRAGMA foreign_keys = ON;
232 ###########################################################################
233 ### SECTION 1: Introduction to Foreign Key Constraints
234 ###########################################################################
235 execsql "PRAGMA foreign_keys = ON"
237 #-------------------------------------------------------------------------
238 # Verify that the syntax in the first example in section 1 is valid.
240 # EVIDENCE-OF: R-04042-24825 To do so, a foreign key definition may be
241 # added by modifying the declaration of the track table to the
242 # following: CREATE TABLE track( trackid INTEGER, trackname TEXT,
243 # trackartist INTEGER, FOREIGN KEY(trackartist) REFERENCES
244 # artist(artistid) );
249 artistid INTEGER PRIMARY KEY,
256 FOREIGN KEY(trackartist) REFERENCES artist(artistid)
261 #-------------------------------------------------------------------------
262 # EVIDENCE-OF: R-61362-32087 Attempting to insert a row into the track
263 # table that does not correspond to any row in the artist table will
267 catchsql { INSERT INTO track VALUES(1, 'track 1', 1) }
268 } {1 {foreign key constraint failed}}
270 execsql { INSERT INTO artist VALUES(2, 'artist 1') }
271 catchsql { INSERT INTO track VALUES(1, 'track 1', 1) }
272 } {1 {foreign key constraint failed}}
274 execsql { INSERT INTO track VALUES(1, 'track 1', 2) }
277 #-------------------------------------------------------------------------
278 # Attempting to delete a row from the 'artist' table while there are
279 # dependent rows in the track table also fails.
281 # EVIDENCE-OF: R-24401-52400 as will attempting to delete a row from the
282 # artist table when there exist dependent rows in the track table
285 catchsql { DELETE FROM artist WHERE artistid = 2 }
286 } {1 {foreign key constraint failed}}
289 DELETE FROM track WHERE trackartist = 2;
290 DELETE FROM artist WHERE artistid = 2;
294 #-------------------------------------------------------------------------
295 # If the foreign key column (trackartist) in table 'track' is set to NULL,
296 # there is no requirement for a matching row in the 'artist' table.
298 # EVIDENCE-OF: R-23980-48859 There is one exception: if the foreign key
299 # column in the track table is NULL, then no corresponding entry in the
300 # artist table is required.
302 do_test e_fkey-10.1 {
304 INSERT INTO track VALUES(1, 'track 1', NULL);
305 INSERT INTO track VALUES(2, 'track 2', NULL);
308 do_test e_fkey-10.2 {
309 execsql { SELECT * FROM artist }
311 do_test e_fkey-10.3 {
312 # Setting the trackid to a non-NULL value fails, of course.
313 catchsql { UPDATE track SET trackartist = 5 WHERE trackid = 1 }
314 } {1 {foreign key constraint failed}}
315 do_test e_fkey-10.4 {
317 INSERT INTO artist VALUES(5, 'artist 5');
318 UPDATE track SET trackartist = 5 WHERE trackid = 1;
320 catchsql { DELETE FROM artist WHERE artistid = 5}
321 } {1 {foreign key constraint failed}}
322 do_test e_fkey-10.5 {
324 UPDATE track SET trackartist = NULL WHERE trackid = 1;
325 DELETE FROM artist WHERE artistid = 5;
329 #-------------------------------------------------------------------------
330 # Test that the following is true fo all rows in the track table:
332 # trackartist IS NULL OR
333 # EXISTS(SELECT 1 FROM artist WHERE artistid=trackartist)
335 # EVIDENCE-OF: R-52486-21352 Expressed in SQL, this means that for every
336 # row in the track table, the following expression evaluates to true:
337 # trackartist IS NULL OR EXISTS(SELECT 1 FROM artist WHERE
338 # artistid=trackartist)
340 # This procedure executes a test case to check that statement
341 # R-52486-21352 is true after executing the SQL statement passed.
342 # as the second argument.
343 proc test_r52486_21352 {tn sql} {
344 set res [catchsql $sql]
347 {1 {PRIMARY KEY must be unique}}
348 {1 {foreign key constraint failed}}
350 if {[lsearch $results $res]<0} {
354 do_test e_fkey-11.$tn {
356 SELECT count(*) FROM track WHERE NOT (
357 trackartist IS NULL OR
358 EXISTS(SELECT 1 FROM artist WHERE artistid=trackartist)
364 # Execute a series of random INSERT, UPDATE and DELETE operations
365 # (some of which may fail due to FK or PK constraint violations) on
366 # the two tables in the example schema. Test that R-52486-21352
367 # is true after executing each operation.
370 {INSERT INTO track VALUES($t, 'track $t', $a)}
371 {DELETE FROM track WHERE trackid = $t}
372 {UPDATE track SET trackartist = $a WHERE trackid = $t}
373 {INSERT INTO artist VALUES($a, 'artist $a')}
374 {DELETE FROM artist WHERE artistid = $a}
375 {UPDATE artist SET artistid = $a2 WHERE artistid = $a}
377 for {set i 0} {$i < 500} {incr i} {
378 set a [expr int(rand()*10)]
379 set a2 [expr int(rand()*10)]
380 set t [expr int(rand()*50)]
381 set sql [subst [lindex $Template [expr int(rand()*6)]]]
383 test_r52486_21352 $i $sql
386 #-------------------------------------------------------------------------
387 # Check that a NOT NULL constraint can be added to the example schema
388 # to prohibit NULL child keys from being inserted.
390 # EVIDENCE-OF: R-42412-59321 Tip: If the application requires a stricter
391 # relationship between artist and track, where NULL values are not
392 # permitted in the trackartist column, simply add the appropriate "NOT
393 # NULL" constraint to the schema.
396 do_test e_fkey-12.1 {
399 artistid INTEGER PRIMARY KEY,
405 trackartist INTEGER NOT NULL,
406 FOREIGN KEY(trackartist) REFERENCES artist(artistid)
410 do_test e_fkey-12.2 {
411 catchsql { INSERT INTO track VALUES(14, 'Mr. Bojangles', NULL) }
412 } {1 {track.trackartist may not be NULL}}
414 #-------------------------------------------------------------------------
415 # EVIDENCE-OF: R-16127-35442
417 # Test an example from foreignkeys.html.
420 do_test e_fkey-13.1 {
423 artistid INTEGER PRIMARY KEY,
430 FOREIGN KEY(trackartist) REFERENCES artist(artistid)
432 INSERT INTO artist VALUES(1, 'Dean Martin');
433 INSERT INTO artist VALUES(2, 'Frank Sinatra');
434 INSERT INTO track VALUES(11, 'That''s Amore', 1);
435 INSERT INTO track VALUES(12, 'Christmas Blues', 1);
436 INSERT INTO track VALUES(13, 'My Way', 2);
439 do_test e_fkey-13.2 {
440 catchsql { INSERT INTO track VALUES(14, 'Mr. Bojangles', 3) }
441 } {1 {foreign key constraint failed}}
442 do_test e_fkey-13.3 {
443 execsql { INSERT INTO track VALUES(14, 'Mr. Bojangles', NULL) }
445 do_test e_fkey-13.4 {
447 UPDATE track SET trackartist = 3 WHERE trackname = 'Mr. Bojangles';
449 } {1 {foreign key constraint failed}}
450 do_test e_fkey-13.5 {
452 INSERT INTO artist VALUES(3, 'Sammy Davis Jr.');
453 UPDATE track SET trackartist = 3 WHERE trackname = 'Mr. Bojangles';
454 INSERT INTO track VALUES(15, 'Boogie Woogie', 3);
458 #-------------------------------------------------------------------------
459 # EVIDENCE-OF: R-15958-50233
461 # Test the second example from the first section of foreignkeys.html.
463 do_test e_fkey-14.1 {
465 DELETE FROM artist WHERE artistname = 'Frank Sinatra';
467 } {1 {foreign key constraint failed}}
468 do_test e_fkey-14.2 {
470 DELETE FROM track WHERE trackname = 'My Way';
471 DELETE FROM artist WHERE artistname = 'Frank Sinatra';
474 do_test e_fkey-14.3 {
476 UPDATE artist SET artistid=4 WHERE artistname = 'Dean Martin';
478 } {1 {foreign key constraint failed}}
479 do_test e_fkey-14.4 {
481 DELETE FROM track WHERE trackname IN('That''s Amore', 'Christmas Blues');
482 UPDATE artist SET artistid=4 WHERE artistname = 'Dean Martin';
487 #-------------------------------------------------------------------------
488 # EVIDENCE-OF: R-56032-24923 The foreign key constraint is satisfied if
489 # for each row in the child table either one or more of the child key
490 # columns are NULL, or there exists a row in the parent table for which
491 # each parent key column contains a value equal to the value in its
492 # associated child key column.
494 # Test also that the usual comparison rules are used when testing if there
495 # is a matching row in the parent table of a foreign key constraint.
497 # EVIDENCE-OF: R-57765-12380 In the above paragraph, the term "equal"
498 # means equal when values are compared using the rules specified here.
501 do_test e_fkey-15.1 {
503 CREATE TABLE par(p PRIMARY KEY);
504 CREATE TABLE chi(c REFERENCES par);
506 INSERT INTO par VALUES(1);
507 INSERT INTO par VALUES('1');
508 INSERT INTO par VALUES(X'31');
509 SELECT typeof(p) FROM par;
511 } {integer text blob}
513 proc test_efkey_45 {tn isError sql} {
514 do_test e_fkey-15.$tn.1 "
516 " [lindex {{0 {}} {1 {foreign key constraint failed}}} $isError]
518 do_test e_fkey-15.$tn.2 {
520 SELECT * FROM chi WHERE c IS NOT NULL AND c NOT IN (SELECT p FROM par)
525 test_efkey_45 1 0 "INSERT INTO chi VALUES(1)"
526 test_efkey_45 2 1 "INSERT INTO chi VALUES('1.0')"
527 test_efkey_45 3 0 "INSERT INTO chi VALUES('1')"
528 test_efkey_45 4 1 "DELETE FROM par WHERE p = '1'"
529 test_efkey_45 5 0 "DELETE FROM chi WHERE c = '1'"
530 test_efkey_45 6 0 "DELETE FROM par WHERE p = '1'"
531 test_efkey_45 7 1 "INSERT INTO chi VALUES('1')"
532 test_efkey_45 8 0 "INSERT INTO chi VALUES(X'31')"
533 test_efkey_45 9 1 "INSERT INTO chi VALUES(X'32')"
535 #-------------------------------------------------------------------------
536 # Specifically, test that when comparing child and parent key values the
537 # default collation sequence of the parent key column is used.
539 # EVIDENCE-OF: R-15796-47513 When comparing text values, the collating
540 # sequence associated with the parent key column is always used.
543 do_test e_fkey-16.1 {
545 CREATE TABLE t1(a COLLATE nocase PRIMARY KEY);
546 CREATE TABLE t2(b REFERENCES t1);
549 do_test e_fkey-16.2 {
551 INSERT INTO t1 VALUES('oNe');
552 INSERT INTO t2 VALUES('one');
553 INSERT INTO t2 VALUES('ONE');
554 UPDATE t2 SET b = 'OnE';
555 UPDATE t1 SET a = 'ONE';
558 do_test e_fkey-16.3 {
559 catchsql { UPDATE t2 SET b = 'two' WHERE rowid = 1 }
560 } {1 {foreign key constraint failed}}
561 do_test e_fkey-16.4 {
562 catchsql { DELETE FROM t1 WHERE rowid = 1 }
563 } {1 {foreign key constraint failed}}
565 #-------------------------------------------------------------------------
566 # Specifically, test that when comparing child and parent key values the
567 # affinity of the parent key column is applied to the child key value
568 # before the comparison takes place.
570 # EVIDENCE-OF: R-04240-13860 When comparing values, if the parent key
571 # column has an affinity, then that affinity is applied to the child key
572 # value before the comparison is performed.
575 do_test e_fkey-17.1 {
577 CREATE TABLE t1(a NUMERIC PRIMARY KEY);
578 CREATE TABLE t2(b TEXT REFERENCES t1);
581 do_test e_fkey-17.2 {
583 INSERT INTO t1 VALUES(1);
584 INSERT INTO t1 VALUES(2);
585 INSERT INTO t1 VALUES('three');
586 INSERT INTO t2 VALUES('2.0');
587 SELECT b, typeof(b) FROM t2;
590 do_test e_fkey-17.3 {
591 execsql { SELECT typeof(a) FROM t1 }
592 } {integer integer text}
593 do_test e_fkey-17.4 {
594 catchsql { DELETE FROM t1 WHERE rowid = 2 }
595 } {1 {foreign key constraint failed}}
597 ###########################################################################
598 ### SECTION 3: Required and Suggested Database Indexes
599 ###########################################################################
601 #-------------------------------------------------------------------------
602 # A parent key must be either a PRIMARY KEY, subject to a UNIQUE
603 # constraint, or have a UNIQUE index created on it.
605 # EVIDENCE-OF: R-13435-26311 Usually, the parent key of a foreign key
606 # constraint is the primary key of the parent table. If they are not the
607 # primary key, then the parent key columns must be collectively subject
608 # to a UNIQUE constraint or have a UNIQUE index.
610 # Also test that if a parent key is not subject to a PRIMARY KEY or UNIQUE
611 # constraint, but does have a UNIQUE index created on it, then the UNIQUE index
612 # must use the default collation sequences associated with the parent key
615 # EVIDENCE-OF: R-00376-39212 If the parent key columns have a UNIQUE
616 # index, then that index must use the collation sequences that are
617 # specified in the CREATE TABLE statement for the parent table.
620 do_test e_fkey-18.1 {
622 CREATE TABLE t2(a REFERENCES t1(x));
625 proc test_efkey_57 {tn isError sql} {
626 catchsql { DROP TABLE t1 }
628 do_test e_fkey-18.$tn {
629 catchsql { INSERT INTO t2 VALUES(NULL) }
630 } [lindex {{0 {}} {1 {foreign key mismatch}}} $isError]
632 test_efkey_57 2 0 { CREATE TABLE t1(x PRIMARY KEY) }
633 test_efkey_57 3 0 { CREATE TABLE t1(x UNIQUE) }
634 test_efkey_57 4 0 { CREATE TABLE t1(x); CREATE UNIQUE INDEX t1i ON t1(x) }
637 CREATE UNIQUE INDEX t1i ON t1(x COLLATE nocase);
639 test_efkey_57 6 1 { CREATE TABLE t1(x) }
640 test_efkey_57 7 1 { CREATE TABLE t1(x, y, PRIMARY KEY(x, y)) }
641 test_efkey_57 8 1 { CREATE TABLE t1(x, y, UNIQUE(x, y)) }
643 CREATE TABLE t1(x, y);
644 CREATE UNIQUE INDEX t1i ON t1(x, y);
648 #-------------------------------------------------------------------------
649 # This block tests an example in foreignkeys.html. Several testable
650 # statements refer to this example, as follows
652 # EVIDENCE-OF: R-27484-01467
654 # FK Constraints on child1, child2 and child3 are Ok.
656 # Problem with FK on child4:
658 # EVIDENCE-OF: R-51039-44840 The foreign key declared as part of table
659 # child4 is an error because even though the parent key column is
660 # indexed, the index is not UNIQUE.
662 # Problem with FK on child5:
664 # EVIDENCE-OF: R-01060-48788 The foreign key for table child5 is an
665 # error because even though the parent key column has a unique index,
666 # the index uses a different collating sequence.
668 # Problem with FK on child6 and child7:
670 # EVIDENCE-OF: R-63088-37469 Tables child6 and child7 are incorrect
671 # because while both have UNIQUE indices on their parent keys, the keys
672 # are not an exact match to the columns of a single UNIQUE index.
675 do_test e_fkey-19.1 {
677 CREATE TABLE parent(a PRIMARY KEY, b UNIQUE, c, d, e, f);
678 CREATE UNIQUE INDEX i1 ON parent(c, d);
679 CREATE INDEX i2 ON parent(e);
680 CREATE UNIQUE INDEX i3 ON parent(f COLLATE nocase);
682 CREATE TABLE child1(f, g REFERENCES parent(a)); -- Ok
683 CREATE TABLE child2(h, i REFERENCES parent(b)); -- Ok
684 CREATE TABLE child3(j, k, FOREIGN KEY(j, k) REFERENCES parent(c, d)); -- Ok
685 CREATE TABLE child4(l, m REFERENCES parent(e)); -- Err
686 CREATE TABLE child5(n, o REFERENCES parent(f)); -- Err
687 CREATE TABLE child6(p, q, FOREIGN KEY(p,q) REFERENCES parent(b, c)); -- Err
688 CREATE TABLE child7(r REFERENCES parent(c)); -- Err
691 do_test e_fkey-19.2 {
693 INSERT INTO parent VALUES(1, 2, 3, 4, 5, 6);
694 INSERT INTO child1 VALUES('xxx', 1);
695 INSERT INTO child2 VALUES('xxx', 2);
696 INSERT INTO child3 VALUES(3, 4);
699 do_test e_fkey-19.2 {
700 catchsql { INSERT INTO child4 VALUES('xxx', 5) }
701 } {1 {foreign key mismatch}}
702 do_test e_fkey-19.3 {
703 catchsql { INSERT INTO child5 VALUES('xxx', 6) }
704 } {1 {foreign key mismatch}}
705 do_test e_fkey-19.4 {
706 catchsql { INSERT INTO child6 VALUES(2, 3) }
707 } {1 {foreign key mismatch}}
708 do_test e_fkey-19.5 {
709 catchsql { INSERT INTO child7 VALUES(3) }
710 } {1 {foreign key mismatch}}
712 #-------------------------------------------------------------------------
713 # Test errors in the database schema that are detected while preparing
714 # DML statements. The error text for these messages always matches
715 # either "foreign key mismatch" or "no such table*" (using [string match]).
717 # EVIDENCE-OF: R-45488-08504 If the database schema contains foreign key
718 # errors that require looking at more than one table definition to
719 # identify, then those errors are not detected when the tables are
722 # EVIDENCE-OF: R-48391-38472 Instead, such errors prevent the
723 # application from preparing SQL statements that modify the content of
724 # the child or parent tables in ways that use the foreign keys.
726 # EVIDENCE-OF: R-03108-63659 The English language error message for
727 # foreign key DML errors is usually "foreign key mismatch" but can also
728 # be "no such table" if the parent table does not exist.
730 # EVIDENCE-OF: R-60781-26576 Foreign key DML errors are may be reported
731 # if: The parent table does not exist, or The parent key columns named
732 # in the foreign key constraint do not exist, or The parent key columns
733 # named in the foreign key constraint are not the primary key of the
734 # parent table and are not subject to a unique constraint using
735 # collating sequence specified in the CREATE TABLE, or The child table
736 # references the primary key of the parent without specifying the
737 # primary key columns and the number of primary key columns in the
738 # parent do not match the number of child key columns.
740 do_test e_fkey-20.1 {
742 CREATE TABLE c1(c REFERENCES nosuchtable, d);
744 CREATE TABLE p2(a, b, UNIQUE(a, b));
745 CREATE TABLE c2(c, d, FOREIGN KEY(c, d) REFERENCES p2(a, x));
747 CREATE TABLE p3(a PRIMARY KEY, b);
748 CREATE TABLE c3(c REFERENCES p3(b), d);
750 CREATE TABLE p4(a PRIMARY KEY, b);
751 CREATE UNIQUE INDEX p4i ON p4(b COLLATE nocase);
752 CREATE TABLE c4(c REFERENCES p4(b), d);
754 CREATE TABLE p5(a PRIMARY KEY, b COLLATE nocase);
755 CREATE UNIQUE INDEX p5i ON p5(b COLLATE binary);
756 CREATE TABLE c5(c REFERENCES p5(b), d);
758 CREATE TABLE p6(a PRIMARY KEY, b);
759 CREATE TABLE c6(c, d, FOREIGN KEY(c, d) REFERENCES p6);
761 CREATE TABLE p7(a, b, PRIMARY KEY(a, b));
762 CREATE TABLE c7(c, d REFERENCES p7);
766 foreach {tn tbl ptbl err} {
767 2 c1 {} "no such table: main.nosuchtable"
768 3 c2 p2 "foreign key mismatch"
769 4 c3 p3 "foreign key mismatch"
770 5 c4 p4 "foreign key mismatch"
771 6 c5 p5 "foreign key mismatch"
772 7 c6 p6 "foreign key mismatch"
773 8 c7 p7 "foreign key mismatch"
775 do_test e_fkey-20.$tn.1 {
776 catchsql "INSERT INTO $tbl VALUES('a', 'b')"
778 do_test e_fkey-20.$tn.2 {
779 catchsql "UPDATE $tbl SET c = ?, d = ?"
781 do_test e_fkey-20.$tn.3 {
782 catchsql "INSERT INTO $tbl SELECT ?, ?"
786 do_test e_fkey-20.$tn.4 {
787 catchsql "DELETE FROM $ptbl"
789 do_test e_fkey-20.$tn.5 {
790 catchsql "UPDATE $ptbl SET a = ?, b = ?"
792 do_test e_fkey-20.$tn.6 {
793 catchsql "INSERT INTO $ptbl SELECT ?, ?"
798 #-------------------------------------------------------------------------
799 # EVIDENCE-OF: R-19353-43643
801 # Test the example of foreign key mismatch errors caused by implicitly
802 # mapping a child key to the primary key of the parent table when the
803 # child key consists of a different number of columns to that primary key.
806 do_test e_fkey-21.1 {
808 CREATE TABLE parent2(a, b, PRIMARY KEY(a,b));
810 CREATE TABLE child8(x, y, FOREIGN KEY(x,y) REFERENCES parent2); -- Ok
811 CREATE TABLE child9(x REFERENCES parent2); -- Err
812 CREATE TABLE child10(x,y,z, FOREIGN KEY(x,y,z) REFERENCES parent2); -- Err
815 do_test e_fkey-21.2 {
817 INSERT INTO parent2 VALUES('I', 'II');
818 INSERT INTO child8 VALUES('I', 'II');
821 do_test e_fkey-21.3 {
822 catchsql { INSERT INTO child9 VALUES('I') }
823 } {1 {foreign key mismatch}}
824 do_test e_fkey-21.4 {
825 catchsql { INSERT INTO child9 VALUES('II') }
826 } {1 {foreign key mismatch}}
827 do_test e_fkey-21.5 {
828 catchsql { INSERT INTO child9 VALUES(NULL) }
829 } {1 {foreign key mismatch}}
830 do_test e_fkey-21.6 {
831 catchsql { INSERT INTO child10 VALUES('I', 'II', 'III') }
832 } {1 {foreign key mismatch}}
833 do_test e_fkey-21.7 {
834 catchsql { INSERT INTO child10 VALUES(1, 2, 3) }
835 } {1 {foreign key mismatch}}
836 do_test e_fkey-21.8 {
837 catchsql { INSERT INTO child10 VALUES(NULL, NULL, NULL) }
838 } {1 {foreign key mismatch}}
840 #-------------------------------------------------------------------------
841 # Test errors that are reported when creating the child table.
844 # * different number of child and parent key columns, and
845 # * child columns that do not exist.
847 # EVIDENCE-OF: R-23682-59820 By contrast, if foreign key errors can be
848 # recognized simply by looking at the definition of the child table and
849 # without having to consult the parent table definition, then the CREATE
850 # TABLE statement for the child table fails.
852 # These errors are reported whether or not FK support is enabled.
854 # EVIDENCE-OF: R-33883-28833 Foreign key DDL errors are reported
855 # regardless of whether or not foreign key constraints are enabled when
856 # the table is created.
859 foreach fk [list OFF ON] {
860 execsql "PRAGMA foreign_keys = $fk"
862 foreach {sql error} {
863 "CREATE TABLE child1(a, b, FOREIGN KEY(a, b) REFERENCES p(c))"
864 {number of columns in foreign key does not match the number of columns in the referenced table}
865 "CREATE TABLE child2(a, b, FOREIGN KEY(a, b) REFERENCES p(c, d, e))"
866 {number of columns in foreign key does not match the number of columns in the referenced table}
867 "CREATE TABLE child2(a, b, FOREIGN KEY(a, c) REFERENCES p(c, d))"
868 {unknown column "c" in foreign key definition}
869 "CREATE TABLE child2(a, b, FOREIGN KEY(c, b) REFERENCES p(c, d))"
870 {unknown column "c" in foreign key definition}
872 do_test e_fkey-22.$fk.[incr i] {
878 #-------------------------------------------------------------------------
879 # Test that a REFERENCING clause that does not specify parent key columns
880 # implicitly maps to the primary key of the parent table.
882 # EVIDENCE-OF: R-43879-08025 Attaching a "REFERENCES <parent-table>"
883 # clause to a column definition creates a foreign
884 # key constraint that maps the column to the primary key of
887 do_test e_fkey-23.1 {
889 CREATE TABLE p1(a, b, PRIMARY KEY(a, b));
890 CREATE TABLE p2(a, b PRIMARY KEY);
891 CREATE TABLE c1(c, d, FOREIGN KEY(c, d) REFERENCES p1);
892 CREATE TABLE c2(a, b REFERENCES p2);
895 proc test_efkey_60 {tn isError sql} {
896 do_test e_fkey-23.$tn "
898 " [lindex {{0 {}} {1 {foreign key constraint failed}}} $isError]
901 test_efkey_60 2 1 "INSERT INTO c1 VALUES(239, 231)"
902 test_efkey_60 3 0 "INSERT INTO p1 VALUES(239, 231)"
903 test_efkey_60 4 0 "INSERT INTO c1 VALUES(239, 231)"
904 test_efkey_60 5 1 "INSERT INTO c2 VALUES(239, 231)"
905 test_efkey_60 6 0 "INSERT INTO p2 VALUES(239, 231)"
906 test_efkey_60 7 0 "INSERT INTO c2 VALUES(239, 231)"
908 #-------------------------------------------------------------------------
909 # Test that an index on on the child key columns of an FK constraint
912 # EVIDENCE-OF: R-15417-28014 Indices are not required for child key
915 # Also test that if an index is created on the child key columns, it does
916 # not make a difference whether or not it is a UNIQUE index.
918 # EVIDENCE-OF: R-15741-50893 The child key index does not have to be
919 # (and usually will not be) a UNIQUE index.
922 do_test e_fkey-24.1 {
924 CREATE TABLE parent(x, y, UNIQUE(y, x));
925 CREATE TABLE c1(a, b, FOREIGN KEY(a, b) REFERENCES parent(x, y));
926 CREATE TABLE c2(a, b, FOREIGN KEY(a, b) REFERENCES parent(x, y));
927 CREATE TABLE c3(a, b, FOREIGN KEY(a, b) REFERENCES parent(x, y));
928 CREATE INDEX c2i ON c2(a, b);
929 CREATE UNIQUE INDEX c3i ON c2(b, a);
932 proc test_efkey_61 {tn isError sql} {
933 do_test e_fkey-24.$tn "
935 " [lindex {{0 {}} {1 {foreign key constraint failed}}} $isError]
937 foreach {tn c} [list 2 c1 3 c2 4 c3] {
938 test_efkey_61 $tn.1 1 "INSERT INTO $c VALUES(1, 2)"
939 test_efkey_61 $tn.2 0 "INSERT INTO parent VALUES(1, 2)"
940 test_efkey_61 $tn.3 0 "INSERT INTO $c VALUES(1, 2)"
942 execsql "DELETE FROM $c ; DELETE FROM parent"
945 #-------------------------------------------------------------------------
946 # EVIDENCE-OF: R-00279-52283
948 # Test an example showing that when a row is deleted from the parent
949 # table, the child table is queried for orphaned rows as follows:
951 # SELECT rowid FROM track WHERE trackartist = ?
953 # EVIDENCE-OF: R-23302-30956 If this SELECT returns any rows at all,
954 # then SQLite concludes that deleting the row from the parent table
955 # would violate the foreign key constraint and returns an error.
957 do_test e_fkey-25.1 {
960 artistid INTEGER PRIMARY KEY,
967 FOREIGN KEY(trackartist) REFERENCES artist(artistid)
971 do_execsql_test e_fkey-25.2 {
972 PRAGMA foreign_keys = OFF;
973 EXPLAIN QUERY PLAN DELETE FROM artist WHERE 1;
974 EXPLAIN QUERY PLAN SELECT rowid FROM track WHERE trackartist = ?;
976 0 0 0 {SCAN TABLE artist (~1000000 rows)}
977 0 0 0 {SCAN TABLE track (~100000 rows)}
979 do_execsql_test e_fkey-25.3 {
980 PRAGMA foreign_keys = ON;
981 EXPLAIN QUERY PLAN DELETE FROM artist WHERE 1;
983 0 0 0 {SCAN TABLE artist (~1000000 rows)}
984 0 0 0 {SCAN TABLE track (~100000 rows)}
986 do_test e_fkey-25.4 {
988 INSERT INTO artist VALUES(5, 'artist 5');
989 INSERT INTO artist VALUES(6, 'artist 6');
990 INSERT INTO artist VALUES(7, 'artist 7');
991 INSERT INTO track VALUES(1, 'track 1', 5);
992 INSERT INTO track VALUES(2, 'track 2', 6);
996 do_test e_fkey-25.5 {
998 [execsql { SELECT rowid FROM track WHERE trackartist = 5 }] \
999 [catchsql { DELETE FROM artist WHERE artistid = 5 }]
1000 } {1 1 {foreign key constraint failed}}
1002 do_test e_fkey-25.6 {
1004 [execsql { SELECT rowid FROM track WHERE trackartist = 7 }] \
1005 [catchsql { DELETE FROM artist WHERE artistid = 7 }]
1008 do_test e_fkey-25.7 {
1010 [execsql { SELECT rowid FROM track WHERE trackartist = 6 }] \
1011 [catchsql { DELETE FROM artist WHERE artistid = 6 }]
1012 } {2 1 {foreign key constraint failed}}
1014 #-------------------------------------------------------------------------
1015 # EVIDENCE-OF: R-47936-10044 Or, more generally:
1016 # SELECT rowid FROM <child-table> WHERE <child-key> = :parent_key_value
1018 # Test that when a row is deleted from the parent table of an FK
1019 # constraint, the child table is queried for orphaned rows. The
1020 # query is equivalent to:
1022 # SELECT rowid FROM <child-table> WHERE <child-key> = :parent_key_value
1024 # Also test that when a row is inserted into the parent table, or when the
1025 # parent key values of an existing row are modified, a query equivalent
1026 # to the following is planned. In some cases it is not executed, but it
1027 # is always planned.
1029 # SELECT rowid FROM <child-table> WHERE <child-key> = :parent_key_value
1031 # EVIDENCE-OF: R-61616-46700 Similar queries may be run if the content
1032 # of the parent key is modified or a new row is inserted into the parent
1037 do_test e_fkey-26.1 {
1038 execsql { CREATE TABLE parent(x, y, UNIQUE(y, x)) }
1042 CREATE TABLE child(a, b, FOREIGN KEY(a, b) REFERENCES parent(x, y))
1045 CREATE TABLE child(a, b, FOREIGN KEY(a, b) REFERENCES parent(x, y));
1046 CREATE INDEX childi ON child(a, b);
1049 CREATE TABLE child(a, b, FOREIGN KEY(a, b) REFERENCES parent(x, y));
1050 CREATE UNIQUE INDEX childi ON child(b, a);
1055 execsql {PRAGMA foreign_keys = OFF}
1056 set delete [concat \
1057 [eqp "DELETE FROM parent WHERE 1"] \
1058 [eqp "SELECT rowid FROM child WHERE a = ? AND b = ?"]
1060 set update [concat \
1061 [eqp "UPDATE parent SET x=?, y=?"] \
1062 [eqp "SELECT rowid FROM child WHERE a = ? AND b = ?"] \
1063 [eqp "SELECT rowid FROM child WHERE a = ? AND b = ?"]
1065 execsql {PRAGMA foreign_keys = ON}
1067 do_test e_fkey-26.$tn.1 { eqp "DELETE FROM parent WHERE 1" } $delete
1068 do_test e_fkey-26.$tn.2 { eqp "UPDATE parent set x=?, y=?" } $update
1070 execsql {DROP TABLE child}
1073 #-------------------------------------------------------------------------
1074 # EVIDENCE-OF: R-14553-34013
1076 # Test the example schema at the end of section 3. Also test that is
1077 # is "efficient". In this case "efficient" means that foreign key
1078 # related operations on the parent table do not provoke linear scans.
1081 do_test e_fkey-27.1 {
1083 CREATE TABLE artist(
1084 artistid INTEGER PRIMARY KEY,
1090 trackartist INTEGER REFERENCES artist
1092 CREATE INDEX trackindex ON track(trackartist);
1095 do_test e_fkey-27.2 {
1096 eqp { INSERT INTO artist VALUES(?, ?) }
1098 do_execsql_test e_fkey-27.3 {
1099 EXPLAIN QUERY PLAN UPDATE artist SET artistid = ?, artistname = ?
1101 0 0 0 {SCAN TABLE artist (~1000000 rows)}
1102 0 0 0 {SEARCH TABLE track USING COVERING INDEX trackindex (trackartist=?) (~10 rows)}
1103 0 0 0 {SEARCH TABLE track USING COVERING INDEX trackindex (trackartist=?) (~10 rows)}
1105 do_execsql_test e_fkey-27.4 {
1106 EXPLAIN QUERY PLAN DELETE FROM artist
1108 0 0 0 {SCAN TABLE artist (~1000000 rows)}
1109 0 0 0 {SEARCH TABLE track USING COVERING INDEX trackindex (trackartist=?) (~10 rows)}
1113 ###########################################################################
1114 ### SECTION 4.1: Composite Foreign Key Constraints
1115 ###########################################################################
1117 #-------------------------------------------------------------------------
1118 # Check that parent and child keys must have the same number of columns.
1120 # EVIDENCE-OF: R-41062-34431 Parent and child keys must have the same
1123 foreach {tn sql err} {
1124 1 "CREATE TABLE c(jj REFERENCES p(x, y))"
1125 {foreign key on jj should reference only one column of table p}
1127 2 "CREATE TABLE c(jj REFERENCES p())" {near ")": syntax error}
1129 3 "CREATE TABLE c(jj, FOREIGN KEY(jj) REFERENCES p(x, y))"
1130 {number of columns in foreign key does not match the number of columns in the referenced table}
1132 4 "CREATE TABLE c(jj, FOREIGN KEY(jj) REFERENCES p())"
1133 {near ")": syntax error}
1135 5 "CREATE TABLE c(ii, jj, FOREIGN KEY(jj, ii) REFERENCES p())"
1136 {near ")": syntax error}
1138 6 "CREATE TABLE c(ii, jj, FOREIGN KEY(jj, ii) REFERENCES p(x))"
1139 {number of columns in foreign key does not match the number of columns in the referenced table}
1141 7 "CREATE TABLE c(ii, jj, FOREIGN KEY(jj, ii) REFERENCES p(x,y,z))"
1142 {number of columns in foreign key does not match the number of columns in the referenced table}
1145 do_test e_fkey-28.$tn [list catchsql $sql] [list 1 $err]
1147 do_test e_fkey-28.8 {
1150 CREATE TABLE p(x PRIMARY KEY);
1151 CREATE TABLE c(a, b, FOREIGN KEY(a,b) REFERENCES p);
1153 catchsql {DELETE FROM p}
1154 } {1 {foreign key mismatch}}
1155 do_test e_fkey-28.9 {
1158 CREATE TABLE p(x, y, PRIMARY KEY(x,y));
1159 CREATE TABLE c(a REFERENCES p);
1161 catchsql {DELETE FROM p}
1162 } {1 {foreign key mismatch}}
1165 #-------------------------------------------------------------------------
1166 # EVIDENCE-OF: R-24676-09859
1168 # Test the example schema in the "Composite Foreign Key Constraints"
1171 do_test e_fkey-29.1 {
1177 PRIMARY KEY(albumartist, albumname)
1184 FOREIGN KEY(songartist, songalbum) REFERENCES album(albumartist,albumname)
1189 do_test e_fkey-29.2 {
1191 INSERT INTO album VALUES('Elvis Presley', 'Elvis'' Christmas Album', NULL);
1192 INSERT INTO song VALUES(
1193 1, 'Elvis Presley', 'Elvis'' Christmas Album', 'Here Comes Santa Clause'
1197 do_test e_fkey-29.3 {
1199 INSERT INTO song VALUES(2, 'Elvis Presley', 'Elvis Is Back!', 'Fever');
1201 } {1 {foreign key constraint failed}}
1204 #-------------------------------------------------------------------------
1205 # EVIDENCE-OF: R-33626-48418 In SQLite, if any of the child key columns
1206 # (in this case songartist and songalbum) are NULL, then there is no
1207 # requirement for a corresponding row in the parent table.
1209 do_test e_fkey-30.1 {
1211 INSERT INTO song VALUES(2, 'Elvis Presley', NULL, 'Fever');
1212 INSERT INTO song VALUES(3, NULL, 'Elvis Is Back', 'Soldier Boy');
1216 ###########################################################################
1217 ### SECTION 4.2: Deferred Foreign Key Constraints
1218 ###########################################################################
1220 #-------------------------------------------------------------------------
1221 # Test that if a statement violates an immediate FK constraint, and the
1222 # database does not satisfy the FK constraint once all effects of the
1223 # statement have been applied, an error is reported and the effects of
1224 # the statement rolled back.
1226 # EVIDENCE-OF: R-09323-30470 If a statement modifies the contents of the
1227 # database so that an immediate foreign key constraint is in violation
1228 # at the conclusion the statement, an exception is thrown and the
1229 # effects of the statement are reverted.
1232 do_test e_fkey-31.1 {
1234 CREATE TABLE king(a, b, PRIMARY KEY(a));
1235 CREATE TABLE prince(c REFERENCES king, d);
1239 do_test e_fkey-31.2 {
1240 # Execute a statement that violates the immediate FK constraint.
1241 catchsql { INSERT INTO prince VALUES(1, 2) }
1242 } {1 {foreign key constraint failed}}
1244 do_test e_fkey-31.3 {
1245 # This time, use a trigger to fix the constraint violation before the
1246 # statement has finished executing. Then execute the same statement as
1247 # in the previous test case. This time, no error.
1249 CREATE TRIGGER kt AFTER INSERT ON prince WHEN
1250 NOT EXISTS (SELECT a FROM king WHERE a = new.c)
1252 INSERT INTO king VALUES(new.c, NULL);
1255 execsql { INSERT INTO prince VALUES(1, 2) }
1258 # Test that operating inside a transaction makes no difference to
1259 # immediate constraint violation handling.
1260 do_test e_fkey-31.4 {
1263 INSERT INTO prince VALUES(2, 3);
1266 catchsql { INSERT INTO prince VALUES(3, 4) }
1267 } {1 {foreign key constraint failed}}
1268 do_test e_fkey-31.5 {
1275 #-------------------------------------------------------------------------
1276 # Test that if a deferred constraint is violated within a transaction,
1277 # nothing happens immediately and the database is allowed to persist
1278 # in a state that does not satisfy the FK constraint. However attempts
1279 # to COMMIT the transaction fail until the FK constraint is satisfied.
1281 # EVIDENCE-OF: R-49178-21358 By contrast, if a statement modifies the
1282 # contents of the database such that a deferred foreign key constraint
1283 # is violated, the violation is not reported immediately.
1285 # EVIDENCE-OF: R-39692-12488 Deferred foreign key constraints are not
1286 # checked until the transaction tries to COMMIT.
1288 # EVIDENCE-OF: R-55147-47664 For as long as the user has an open
1289 # transaction, the database is allowed to exist in a state that violates
1290 # any number of deferred foreign key constraints.
1292 # EVIDENCE-OF: R-29604-30395 However, COMMIT will fail as long as
1293 # foreign key constraints remain in violation.
1295 proc test_efkey_34 {tn isError sql} {
1296 do_test e_fkey-32.$tn "
1298 " [lindex {{0 {}} {1 {foreign key constraint failed}}} $isError]
1303 CREATE TABLE ll(k PRIMARY KEY);
1304 CREATE TABLE kk(c REFERENCES ll DEFERRABLE INITIALLY DEFERRED);
1306 test_efkey_34 2 0 "BEGIN"
1307 test_efkey_34 3 0 "INSERT INTO kk VALUES(5)"
1308 test_efkey_34 4 0 "INSERT INTO kk VALUES(10)"
1309 test_efkey_34 5 1 "COMMIT"
1310 test_efkey_34 6 0 "INSERT INTO ll VALUES(10)"
1311 test_efkey_34 7 1 "COMMIT"
1312 test_efkey_34 8 0 "INSERT INTO ll VALUES(5)"
1313 test_efkey_34 9 0 "COMMIT"
1315 #-------------------------------------------------------------------------
1316 # When not running inside a transaction, a deferred constraint is similar
1317 # to an immediate constraint (violations are reported immediately).
1319 # EVIDENCE-OF: R-56844-61705 If the current statement is not inside an
1320 # explicit transaction (a BEGIN/COMMIT/ROLLBACK block), then an implicit
1321 # transaction is committed as soon as the statement has finished
1322 # executing. In this case deferred constraints behave the same as
1323 # immediate constraints.
1326 proc test_efkey_35 {tn isError sql} {
1327 do_test e_fkey-33.$tn "
1329 " [lindex {{0 {}} {1 {foreign key constraint failed}}} $isError]
1331 do_test e_fkey-33.1 {
1333 CREATE TABLE parent(x, y);
1334 CREATE UNIQUE INDEX pi ON parent(x, y);
1335 CREATE TABLE child(a, b,
1336 FOREIGN KEY(a, b) REFERENCES parent(x, y) DEFERRABLE INITIALLY DEFERRED
1340 test_efkey_35 2 1 "INSERT INTO child VALUES('x', 'y')"
1341 test_efkey_35 3 0 "INSERT INTO parent VALUES('x', 'y')"
1342 test_efkey_35 4 0 "INSERT INTO child VALUES('x', 'y')"
1345 #-------------------------------------------------------------------------
1346 # EVIDENCE-OF: R-12782-61841
1348 # Test that an FK constraint is made deferred by adding the following
1349 # to the definition:
1351 # DEFERRABLE INITIALLY DEFERRED
1353 # EVIDENCE-OF: R-09005-28791
1355 # Also test that adding any of the following to a foreign key definition
1356 # makes the constraint IMMEDIATE:
1358 # NOT DEFERRABLE INITIALLY DEFERRED
1359 # NOT DEFERRABLE INITIALLY IMMEDIATE
1361 # DEFERRABLE INITIALLY IMMEDIATE
1364 # Foreign keys are IMMEDIATE by default (if there is no DEFERRABLE or NOT
1365 # DEFERRABLE clause).
1367 # EVIDENCE-OF: R-35290-16460 Foreign key constraints are immediate by
1370 # EVIDENCE-OF: R-30323-21917 Each foreign key constraint in SQLite is
1371 # classified as either immediate or deferred.
1374 do_test e_fkey-34.1 {
1376 CREATE TABLE parent(x, y, z, PRIMARY KEY(x,y,z));
1377 CREATE TABLE c1(a, b, c,
1378 FOREIGN KEY(a, b, c) REFERENCES parent NOT DEFERRABLE INITIALLY DEFERRED
1380 CREATE TABLE c2(a, b, c,
1381 FOREIGN KEY(a, b, c) REFERENCES parent NOT DEFERRABLE INITIALLY IMMEDIATE
1383 CREATE TABLE c3(a, b, c,
1384 FOREIGN KEY(a, b, c) REFERENCES parent NOT DEFERRABLE
1386 CREATE TABLE c4(a, b, c,
1387 FOREIGN KEY(a, b, c) REFERENCES parent DEFERRABLE INITIALLY IMMEDIATE
1389 CREATE TABLE c5(a, b, c,
1390 FOREIGN KEY(a, b, c) REFERENCES parent DEFERRABLE
1392 CREATE TABLE c6(a, b, c, FOREIGN KEY(a, b, c) REFERENCES parent);
1394 -- This FK constraint is the only deferrable one.
1395 CREATE TABLE c7(a, b, c,
1396 FOREIGN KEY(a, b, c) REFERENCES parent DEFERRABLE INITIALLY DEFERRED
1399 INSERT INTO parent VALUES('a', 'b', 'c');
1400 INSERT INTO parent VALUES('d', 'e', 'f');
1401 INSERT INTO parent VALUES('g', 'h', 'i');
1402 INSERT INTO parent VALUES('j', 'k', 'l');
1403 INSERT INTO parent VALUES('m', 'n', 'o');
1404 INSERT INTO parent VALUES('p', 'q', 'r');
1405 INSERT INTO parent VALUES('s', 't', 'u');
1407 INSERT INTO c1 VALUES('a', 'b', 'c');
1408 INSERT INTO c2 VALUES('d', 'e', 'f');
1409 INSERT INTO c3 VALUES('g', 'h', 'i');
1410 INSERT INTO c4 VALUES('j', 'k', 'l');
1411 INSERT INTO c5 VALUES('m', 'n', 'o');
1412 INSERT INTO c6 VALUES('p', 'q', 'r');
1413 INSERT INTO c7 VALUES('s', 't', 'u');
1417 proc test_efkey_29 {tn sql isError} {
1418 do_test e_fkey-34.$tn "catchsql {$sql}" [
1419 lindex {{0 {}} {1 {foreign key constraint failed}}} $isError
1422 test_efkey_29 2 "BEGIN" 0
1423 test_efkey_29 3 "DELETE FROM parent WHERE x = 'a'" 1
1424 test_efkey_29 4 "DELETE FROM parent WHERE x = 'd'" 1
1425 test_efkey_29 5 "DELETE FROM parent WHERE x = 'g'" 1
1426 test_efkey_29 6 "DELETE FROM parent WHERE x = 'j'" 1
1427 test_efkey_29 7 "DELETE FROM parent WHERE x = 'm'" 1
1428 test_efkey_29 8 "DELETE FROM parent WHERE x = 'p'" 1
1429 test_efkey_29 9 "DELETE FROM parent WHERE x = 's'" 0
1430 test_efkey_29 10 "COMMIT" 1
1431 test_efkey_29 11 "ROLLBACK" 0
1433 test_efkey_29 9 "BEGIN" 0
1434 test_efkey_29 10 "UPDATE parent SET z = 'z' WHERE z = 'c'" 1
1435 test_efkey_29 11 "UPDATE parent SET z = 'z' WHERE z = 'f'" 1
1436 test_efkey_29 12 "UPDATE parent SET z = 'z' WHERE z = 'i'" 1
1437 test_efkey_29 13 "UPDATE parent SET z = 'z' WHERE z = 'l'" 1
1438 test_efkey_29 14 "UPDATE parent SET z = 'z' WHERE z = 'o'" 1
1439 test_efkey_29 15 "UPDATE parent SET z = 'z' WHERE z = 'r'" 1
1440 test_efkey_29 16 "UPDATE parent SET z = 'z' WHERE z = 'u'" 0
1441 test_efkey_29 17 "COMMIT" 1
1442 test_efkey_29 18 "ROLLBACK" 0
1444 test_efkey_29 17 "BEGIN" 0
1445 test_efkey_29 18 "INSERT INTO c1 VALUES(1, 2, 3)" 1
1446 test_efkey_29 19 "INSERT INTO c2 VALUES(1, 2, 3)" 1
1447 test_efkey_29 20 "INSERT INTO c3 VALUES(1, 2, 3)" 1
1448 test_efkey_29 21 "INSERT INTO c4 VALUES(1, 2, 3)" 1
1449 test_efkey_29 22 "INSERT INTO c5 VALUES(1, 2, 3)" 1
1450 test_efkey_29 22 "INSERT INTO c6 VALUES(1, 2, 3)" 1
1451 test_efkey_29 22 "INSERT INTO c7 VALUES(1, 2, 3)" 0
1452 test_efkey_29 23 "COMMIT" 1
1453 test_efkey_29 24 "INSERT INTO parent VALUES(1, 2, 3)" 0
1454 test_efkey_29 25 "COMMIT" 0
1456 test_efkey_29 26 "BEGIN" 0
1457 test_efkey_29 27 "UPDATE c1 SET a = 10" 1
1458 test_efkey_29 28 "UPDATE c2 SET a = 10" 1
1459 test_efkey_29 29 "UPDATE c3 SET a = 10" 1
1460 test_efkey_29 30 "UPDATE c4 SET a = 10" 1
1461 test_efkey_29 31 "UPDATE c5 SET a = 10" 1
1462 test_efkey_29 31 "UPDATE c6 SET a = 10" 1
1463 test_efkey_29 31 "UPDATE c7 SET a = 10" 0
1464 test_efkey_29 32 "COMMIT" 1
1465 test_efkey_29 33 "ROLLBACK" 0
1467 #-------------------------------------------------------------------------
1468 # EVIDENCE-OF: R-24499-57071
1470 # Test an example from foreignkeys.html dealing with a deferred foreign
1473 do_test e_fkey-35.1 {
1476 CREATE TABLE artist(
1477 artistid INTEGER PRIMARY KEY,
1483 trackartist INTEGER REFERENCES artist(artistid) DEFERRABLE INITIALLY DEFERRED
1487 do_test e_fkey-35.2 {
1490 INSERT INTO track VALUES(1, 'White Christmas', 5);
1493 } {1 {foreign key constraint failed}}
1494 do_test e_fkey-35.3 {
1496 INSERT INTO artist VALUES(5, 'Bing Crosby');
1501 #-------------------------------------------------------------------------
1502 # Verify that a nested savepoint may be released without satisfying
1503 # deferred foreign key constraints.
1505 # EVIDENCE-OF: R-07223-48323 A nested savepoint transaction may be
1506 # RELEASEd while the database is in a state that does not satisfy a
1507 # deferred foreign key constraint.
1510 do_test e_fkey-36.1 {
1512 CREATE TABLE t1(a PRIMARY KEY,
1513 b REFERENCES t1 DEFERRABLE INITIALLY DEFERRED
1515 INSERT INTO t1 VALUES(1, 1);
1516 INSERT INTO t1 VALUES(2, 2);
1517 INSERT INTO t1 VALUES(3, 3);
1520 do_test e_fkey-36.2 {
1524 INSERT INTO t1 VALUES(4, 5);
1528 do_test e_fkey-36.3 {
1530 } {1 {foreign key constraint failed}}
1531 do_test e_fkey-36.4 {
1533 UPDATE t1 SET a = 5 WHERE a = 4;
1539 #-------------------------------------------------------------------------
1540 # Check that a transaction savepoint (an outermost savepoint opened when
1541 # the database was in auto-commit mode) cannot be released without
1542 # satisfying deferred foreign key constraints. It may be rolled back.
1544 # EVIDENCE-OF: R-44295-13823 A transaction savepoint (a non-nested
1545 # savepoint that was opened while there was not currently an open
1546 # transaction), on the other hand, is subject to the same restrictions
1547 # as a COMMIT - attempting to RELEASE it while the database is in such a
1550 do_test e_fkey-37.1 {
1554 INSERT INTO t1 VALUES(6, 7);
1558 do_test e_fkey-37.2 {
1559 catchsql {RELEASE one}
1560 } {1 {foreign key constraint failed}}
1561 do_test e_fkey-37.3 {
1563 UPDATE t1 SET a = 7 WHERE a = 6;
1567 do_test e_fkey-37.4 {
1571 INSERT INTO t1 VALUES(9, 10);
1575 do_test e_fkey-37.5 {
1576 catchsql {RELEASE one}
1577 } {1 {foreign key constraint failed}}
1578 do_test e_fkey-37.6 {
1579 execsql {ROLLBACK TO one ; RELEASE one}
1582 #-------------------------------------------------------------------------
1583 # Test that if a COMMIT operation fails due to deferred foreign key
1584 # constraints, any nested savepoints remain open.
1586 # EVIDENCE-OF: R-37736-42616 If a COMMIT statement (or the RELEASE of a
1587 # transaction SAVEPOINT) fails because the database is currently in a
1588 # state that violates a deferred foreign key constraint and there are
1589 # currently nested savepoints, the nested savepoints remain open.
1591 do_test e_fkey-38.1 {
1593 DELETE FROM t1 WHERE a>3;
1597 do_test e_fkey-38.2 {
1600 INSERT INTO t1 VALUES(4, 4);
1602 INSERT INTO t1 VALUES(5, 6);
1605 } {1 1 2 2 3 3 4 4 5 6}
1606 do_test e_fkey-38.3 {
1608 } {1 {foreign key constraint failed}}
1609 do_test e_fkey-38.4 {
1617 do_test e_fkey-38.5 {
1620 INSERT INTO t1 VALUES(5, 5);
1622 INSERT INTO t1 VALUES(6, 7);
1624 INSERT INTO t1 VALUES(7, 8);
1627 do_test e_fkey-38.6 {
1628 catchsql {RELEASE a}
1629 } {1 {foreign key constraint failed}}
1630 do_test e_fkey-38.7 {
1631 execsql {ROLLBACK TO c}
1632 catchsql {RELEASE a}
1633 } {1 {foreign key constraint failed}}
1634 do_test e_fkey-38.8 {
1640 } {1 1 2 2 3 3 4 4 5 5}
1642 ###########################################################################
1643 ### SECTION 4.3: ON DELETE and ON UPDATE Actions
1644 ###########################################################################
1646 #-------------------------------------------------------------------------
1647 # Test that configured ON DELETE and ON UPDATE actions take place when
1648 # deleting or modifying rows of the parent table, respectively.
1650 # EVIDENCE-OF: R-48270-44282 Foreign key ON DELETE and ON UPDATE clauses
1651 # are used to configure actions that take place when deleting rows from
1652 # the parent table (ON DELETE), or modifying the parent key values of
1653 # existing rows (ON UPDATE).
1655 # Test that a single FK constraint may have different actions configured
1656 # for ON DELETE and ON UPDATE.
1658 # EVIDENCE-OF: R-48124-63225 A single foreign key constraint may have
1659 # different actions configured for ON DELETE and ON UPDATE.
1661 do_test e_fkey-39.1 {
1663 CREATE TABLE p(a, b PRIMARY KEY, c);
1664 CREATE TABLE c1(d, e, f DEFAULT 'k0' REFERENCES p
1665 ON UPDATE SET DEFAULT
1669 INSERT INTO p VALUES(0, 'k0', '');
1670 INSERT INTO p VALUES(1, 'k1', 'I');
1671 INSERT INTO p VALUES(2, 'k2', 'II');
1672 INSERT INTO p VALUES(3, 'k3', 'III');
1674 INSERT INTO c1 VALUES(1, 'xx', 'k1');
1675 INSERT INTO c1 VALUES(2, 'xx', 'k2');
1676 INSERT INTO c1 VALUES(3, 'xx', 'k3');
1679 do_test e_fkey-39.2 {
1681 UPDATE p SET b = 'k4' WHERE a = 1;
1684 } {1 xx k0 2 xx k2 3 xx k3}
1685 do_test e_fkey-39.3 {
1687 DELETE FROM p WHERE a = 2;
1690 } {1 xx k0 2 xx {} 3 xx k3}
1691 do_test e_fkey-39.4 {
1693 CREATE UNIQUE INDEX pi ON p(c);
1694 REPLACE INTO p VALUES(5, 'k5', 'III');
1697 } {1 xx k0 2 xx {} 3 xx {}}
1699 #-------------------------------------------------------------------------
1700 # Each foreign key in the system has an ON UPDATE and ON DELETE action,
1701 # either "NO ACTION", "RESTRICT", "SET NULL", "SET DEFAULT" or "CASCADE".
1703 # EVIDENCE-OF: R-33326-45252 The ON DELETE and ON UPDATE action
1704 # associated with each foreign key in an SQLite database is one of "NO
1705 # ACTION", "RESTRICT", "SET NULL", "SET DEFAULT" or "CASCADE".
1707 # If none is specified explicitly, "NO ACTION" is the default.
1709 # EVIDENCE-OF: R-19803-45884 If an action is not explicitly specified,
1710 # it defaults to "NO ACTION".
1713 do_test e_fkey-40.1 {
1715 CREATE TABLE parent(x PRIMARY KEY, y);
1716 CREATE TABLE child1(a,
1717 b REFERENCES parent ON UPDATE NO ACTION ON DELETE RESTRICT
1719 CREATE TABLE child2(a,
1720 b REFERENCES parent ON UPDATE RESTRICT ON DELETE SET NULL
1722 CREATE TABLE child3(a,
1723 b REFERENCES parent ON UPDATE SET NULL ON DELETE SET DEFAULT
1725 CREATE TABLE child4(a,
1726 b REFERENCES parent ON UPDATE SET DEFAULT ON DELETE CASCADE
1729 -- Create some foreign keys that use the default action - "NO ACTION"
1730 CREATE TABLE child5(a, b REFERENCES parent ON UPDATE CASCADE);
1731 CREATE TABLE child6(a, b REFERENCES parent ON DELETE RESTRICT);
1732 CREATE TABLE child7(a, b REFERENCES parent ON DELETE NO ACTION);
1733 CREATE TABLE child8(a, b REFERENCES parent ON UPDATE NO ACTION);
1737 foreach {tn zTab lRes} {
1738 2 child1 {0 0 parent b {} {NO ACTION} RESTRICT NONE}
1739 3 child2 {0 0 parent b {} RESTRICT {SET NULL} NONE}
1740 4 child3 {0 0 parent b {} {SET NULL} {SET DEFAULT} NONE}
1741 5 child4 {0 0 parent b {} {SET DEFAULT} CASCADE NONE}
1742 6 child5 {0 0 parent b {} CASCADE {NO ACTION} NONE}
1743 7 child6 {0 0 parent b {} {NO ACTION} RESTRICT NONE}
1744 8 child7 {0 0 parent b {} {NO ACTION} {NO ACTION} NONE}
1745 9 child8 {0 0 parent b {} {NO ACTION} {NO ACTION} NONE}
1747 do_test e_fkey-40.$tn { execsql "PRAGMA foreign_key_list($zTab)" } $lRes
1750 #-------------------------------------------------------------------------
1751 # Test that "NO ACTION" means that nothing happens to a child row when
1752 # it's parent row is updated or deleted.
1754 # EVIDENCE-OF: R-19971-54976 Configuring "NO ACTION" means just that:
1755 # when a parent key is modified or deleted from the database, no special
1759 do_test e_fkey-41.1 {
1761 CREATE TABLE parent(p1, p2, PRIMARY KEY(p1, p2));
1762 CREATE TABLE child(c1, c2,
1763 FOREIGN KEY(c1, c2) REFERENCES parent
1766 DEFERRABLE INITIALLY DEFERRED
1768 INSERT INTO parent VALUES('j', 'k');
1769 INSERT INTO parent VALUES('l', 'm');
1770 INSERT INTO child VALUES('j', 'k');
1771 INSERT INTO child VALUES('l', 'm');
1774 do_test e_fkey-41.2 {
1777 UPDATE parent SET p1='k' WHERE p1='j';
1778 DELETE FROM parent WHERE p1='l';
1779 SELECT * FROM child;
1782 do_test e_fkey-41.3 {
1784 } {1 {foreign key constraint failed}}
1785 do_test e_fkey-41.4 {
1789 #-------------------------------------------------------------------------
1790 # Test that "RESTRICT" means the application is prohibited from deleting
1791 # or updating a parent table row when there exists one or more child keys
1794 # EVIDENCE-OF: R-04272-38653 The "RESTRICT" action means that the
1795 # application is prohibited from deleting (for ON DELETE RESTRICT) or
1796 # modifying (for ON UPDATE RESTRICT) a parent key when there exists one
1797 # or more child keys mapped to it.
1800 do_test e_fkey-41.1 {
1802 CREATE TABLE parent(p1, p2);
1803 CREATE UNIQUE INDEX parent_i ON parent(p1, p2);
1804 CREATE TABLE child1(c1, c2,
1805 FOREIGN KEY(c2, c1) REFERENCES parent(p1, p2) ON DELETE RESTRICT
1807 CREATE TABLE child2(c1, c2,
1808 FOREIGN KEY(c2, c1) REFERENCES parent(p1, p2) ON UPDATE RESTRICT
1812 do_test e_fkey-41.2 {
1814 INSERT INTO parent VALUES('a', 'b');
1815 INSERT INTO parent VALUES('c', 'd');
1816 INSERT INTO child1 VALUES('b', 'a');
1817 INSERT INTO child2 VALUES('d', 'c');
1820 do_test e_fkey-41.3 {
1821 catchsql { DELETE FROM parent WHERE p1 = 'a' }
1822 } {1 {foreign key constraint failed}}
1823 do_test e_fkey-41.4 {
1824 catchsql { UPDATE parent SET p2 = 'e' WHERE p1 = 'c' }
1825 } {1 {foreign key constraint failed}}
1827 #-------------------------------------------------------------------------
1828 # Test that RESTRICT is slightly different from NO ACTION for IMMEDIATE
1829 # constraints, in that it is enforced immediately, not at the end of the
1832 # EVIDENCE-OF: R-37997-42187 The difference between the effect of a
1833 # RESTRICT action and normal foreign key constraint enforcement is that
1834 # the RESTRICT action processing happens as soon as the field is updated
1835 # - not at the end of the current statement as it would with an
1836 # immediate constraint, or at the end of the current transaction as it
1837 # would with a deferred constraint.
1840 do_test e_fkey-42.1 {
1842 CREATE TABLE parent(x PRIMARY KEY);
1843 CREATE TABLE child1(c REFERENCES parent ON UPDATE RESTRICT);
1844 CREATE TABLE child2(c REFERENCES parent ON UPDATE NO ACTION);
1846 INSERT INTO parent VALUES('key1');
1847 INSERT INTO parent VALUES('key2');
1848 INSERT INTO child1 VALUES('key1');
1849 INSERT INTO child2 VALUES('key2');
1851 CREATE TRIGGER parent_t AFTER UPDATE ON parent BEGIN
1852 UPDATE child1 set c = new.x WHERE c = old.x;
1853 UPDATE child2 set c = new.x WHERE c = old.x;
1857 do_test e_fkey-42.2 {
1858 catchsql { UPDATE parent SET x = 'key one' WHERE x = 'key1' }
1859 } {1 {foreign key constraint failed}}
1860 do_test e_fkey-42.3 {
1862 UPDATE parent SET x = 'key two' WHERE x = 'key2';
1863 SELECT * FROM child2;
1868 do_test e_fkey-42.4 {
1870 CREATE TABLE parent(x PRIMARY KEY);
1871 CREATE TABLE child1(c REFERENCES parent ON DELETE RESTRICT);
1872 CREATE TABLE child2(c REFERENCES parent ON DELETE NO ACTION);
1874 INSERT INTO parent VALUES('key1');
1875 INSERT INTO parent VALUES('key2');
1876 INSERT INTO child1 VALUES('key1');
1877 INSERT INTO child2 VALUES('key2');
1879 CREATE TRIGGER parent_t AFTER DELETE ON parent BEGIN
1880 UPDATE child1 SET c = NULL WHERE c = old.x;
1881 UPDATE child2 SET c = NULL WHERE c = old.x;
1885 do_test e_fkey-42.5 {
1886 catchsql { DELETE FROM parent WHERE x = 'key1' }
1887 } {1 {foreign key constraint failed}}
1888 do_test e_fkey-42.6 {
1890 DELETE FROM parent WHERE x = 'key2';
1891 SELECT * FROM child2;
1896 do_test e_fkey-42.7 {
1898 CREATE TABLE parent(x PRIMARY KEY);
1899 CREATE TABLE child1(c REFERENCES parent ON DELETE RESTRICT);
1900 CREATE TABLE child2(c REFERENCES parent ON DELETE NO ACTION);
1902 INSERT INTO parent VALUES('key1');
1903 INSERT INTO parent VALUES('key2');
1904 INSERT INTO child1 VALUES('key1');
1905 INSERT INTO child2 VALUES('key2');
1908 do_test e_fkey-42.8 {
1909 catchsql { REPLACE INTO parent VALUES('key1') }
1910 } {1 {foreign key constraint failed}}
1911 do_test e_fkey-42.9 {
1913 REPLACE INTO parent VALUES('key2');
1914 SELECT * FROM child2;
1918 #-------------------------------------------------------------------------
1919 # Test that RESTRICT is enforced immediately, even for a DEFERRED constraint.
1921 # EVIDENCE-OF: R-24179-60523 Even if the foreign key constraint it is
1922 # attached to is deferred, configuring a RESTRICT action causes SQLite
1923 # to return an error immediately if a parent key with dependent child
1924 # keys is deleted or modified.
1927 do_test e_fkey-43.1 {
1929 CREATE TABLE parent(x PRIMARY KEY);
1930 CREATE TABLE child1(c REFERENCES parent ON UPDATE RESTRICT
1931 DEFERRABLE INITIALLY DEFERRED
1933 CREATE TABLE child2(c REFERENCES parent ON UPDATE NO ACTION
1934 DEFERRABLE INITIALLY DEFERRED
1937 INSERT INTO parent VALUES('key1');
1938 INSERT INTO parent VALUES('key2');
1939 INSERT INTO child1 VALUES('key1');
1940 INSERT INTO child2 VALUES('key2');
1944 do_test e_fkey-43.2 {
1945 catchsql { UPDATE parent SET x = 'key one' WHERE x = 'key1' }
1946 } {1 {foreign key constraint failed}}
1947 do_test e_fkey-43.3 {
1948 execsql { UPDATE parent SET x = 'key two' WHERE x = 'key2' }
1950 do_test e_fkey-43.4 {
1952 } {1 {foreign key constraint failed}}
1953 do_test e_fkey-43.5 {
1955 UPDATE child2 SET c = 'key two';
1961 do_test e_fkey-43.6 {
1963 CREATE TABLE parent(x PRIMARY KEY);
1964 CREATE TABLE child1(c REFERENCES parent ON DELETE RESTRICT
1965 DEFERRABLE INITIALLY DEFERRED
1967 CREATE TABLE child2(c REFERENCES parent ON DELETE NO ACTION
1968 DEFERRABLE INITIALLY DEFERRED
1971 INSERT INTO parent VALUES('key1');
1972 INSERT INTO parent VALUES('key2');
1973 INSERT INTO child1 VALUES('key1');
1974 INSERT INTO child2 VALUES('key2');
1978 do_test e_fkey-43.7 {
1979 catchsql { DELETE FROM parent WHERE x = 'key1' }
1980 } {1 {foreign key constraint failed}}
1981 do_test e_fkey-43.8 {
1982 execsql { DELETE FROM parent WHERE x = 'key2' }
1984 do_test e_fkey-43.9 {
1986 } {1 {foreign key constraint failed}}
1987 do_test e_fkey-43.10 {
1989 UPDATE child2 SET c = NULL;
1994 #-------------------------------------------------------------------------
1995 # Test SET NULL actions.
1997 # EVIDENCE-OF: R-03353-05327 If the configured action is "SET NULL",
1998 # then when a parent key is deleted (for ON DELETE SET NULL) or modified
1999 # (for ON UPDATE SET NULL), the child key columns of all rows in the
2000 # child table that mapped to the parent key are set to contain SQL NULL
2004 do_test e_fkey-44.1 {
2006 CREATE TABLE pA(x PRIMARY KEY);
2007 CREATE TABLE cA(c REFERENCES pA ON DELETE SET NULL);
2008 CREATE TABLE cB(c REFERENCES pA ON UPDATE SET NULL);
2010 INSERT INTO pA VALUES(X'ABCD');
2011 INSERT INTO pA VALUES(X'1234');
2012 INSERT INTO cA VALUES(X'ABCD');
2013 INSERT INTO cB VALUES(X'1234');
2016 do_test e_fkey-44.2 {
2018 DELETE FROM pA WHERE rowid = 1;
2019 SELECT quote(x) FROM pA;
2022 do_test e_fkey-44.3 {
2024 SELECT quote(c) FROM cA;
2027 do_test e_fkey-44.4 {
2029 UPDATE pA SET x = X'8765' WHERE rowid = 2;
2030 SELECT quote(x) FROM pA;
2033 do_test e_fkey-44.5 {
2034 execsql { SELECT quote(c) FROM cB }
2037 #-------------------------------------------------------------------------
2038 # Test SET DEFAULT actions.
2040 # EVIDENCE-OF: R-43054-54832 The "SET DEFAULT" actions are similar to
2041 # "SET NULL", except that each of the child key columns is set to
2042 # contain the columns default value instead of NULL.
2045 do_test e_fkey-45.1 {
2047 CREATE TABLE pA(x PRIMARY KEY);
2048 CREATE TABLE cA(c DEFAULT X'0000' REFERENCES pA ON DELETE SET DEFAULT);
2049 CREATE TABLE cB(c DEFAULT X'9999' REFERENCES pA ON UPDATE SET DEFAULT);
2051 INSERT INTO pA(rowid, x) VALUES(1, X'0000');
2052 INSERT INTO pA(rowid, x) VALUES(2, X'9999');
2053 INSERT INTO pA(rowid, x) VALUES(3, X'ABCD');
2054 INSERT INTO pA(rowid, x) VALUES(4, X'1234');
2056 INSERT INTO cA VALUES(X'ABCD');
2057 INSERT INTO cB VALUES(X'1234');
2060 do_test e_fkey-45.2 {
2062 DELETE FROM pA WHERE rowid = 3;
2063 SELECT quote(x) FROM pA;
2065 } {X'0000' X'9999' X'1234'}
2066 do_test e_fkey-45.3 {
2067 execsql { SELECT quote(c) FROM cA }
2069 do_test e_fkey-45.4 {
2071 UPDATE pA SET x = X'8765' WHERE rowid = 4;
2072 SELECT quote(x) FROM pA;
2074 } {X'0000' X'9999' X'8765'}
2075 do_test e_fkey-45.5 {
2076 execsql { SELECT quote(c) FROM cB }
2079 #-------------------------------------------------------------------------
2080 # Test ON DELETE CASCADE actions.
2082 # EVIDENCE-OF: R-61376-57267 A "CASCADE" action propagates the delete or
2083 # update operation on the parent key to each dependent child key.
2085 # EVIDENCE-OF: R-61809-62207 For an "ON DELETE CASCADE" action, this
2086 # means that each row in the child table that was associated with the
2087 # deleted parent row is also deleted.
2090 do_test e_fkey-46.1 {
2092 CREATE TABLE p1(a, b UNIQUE);
2093 CREATE TABLE c1(c REFERENCES p1(b) ON DELETE CASCADE, d);
2094 INSERT INTO p1 VALUES(NULL, NULL);
2095 INSERT INTO p1 VALUES(4, 4);
2096 INSERT INTO p1 VALUES(5, 5);
2097 INSERT INTO c1 VALUES(NULL, NULL);
2098 INSERT INTO c1 VALUES(4, 4);
2099 INSERT INTO c1 VALUES(5, 5);
2100 SELECT count(*) FROM c1;
2103 do_test e_fkey-46.2 {
2105 DELETE FROM p1 WHERE a = 4;
2106 SELECT d, c FROM c1;
2109 do_test e_fkey-46.3 {
2112 SELECT d, c FROM c1;
2115 do_test e_fkey-46.4 {
2116 execsql { SELECT * FROM p1 }
2120 #-------------------------------------------------------------------------
2121 # Test ON UPDATE CASCADE actions.
2123 # EVIDENCE-OF: R-13877-64542 For an "ON UPDATE CASCADE" action, it means
2124 # that the values stored in each dependent child key are modified to
2125 # match the new parent key values.
2127 # EVIDENCE-OF: R-61376-57267 A "CASCADE" action propagates the delete or
2128 # update operation on the parent key to each dependent child key.
2131 do_test e_fkey-47.1 {
2133 CREATE TABLE p1(a, b UNIQUE);
2134 CREATE TABLE c1(c REFERENCES p1(b) ON UPDATE CASCADE, d);
2135 INSERT INTO p1 VALUES(NULL, NULL);
2136 INSERT INTO p1 VALUES(4, 4);
2137 INSERT INTO p1 VALUES(5, 5);
2138 INSERT INTO c1 VALUES(NULL, NULL);
2139 INSERT INTO c1 VALUES(4, 4);
2140 INSERT INTO c1 VALUES(5, 5);
2141 SELECT count(*) FROM c1;
2144 do_test e_fkey-47.2 {
2146 UPDATE p1 SET b = 10 WHERE b = 5;
2147 SELECT d, c FROM c1;
2150 do_test e_fkey-47.3 {
2152 UPDATE p1 SET b = 11 WHERE b = 4;
2153 SELECT d, c FROM c1;
2156 do_test e_fkey-47.4 {
2158 UPDATE p1 SET b = 6 WHERE b IS NULL;
2159 SELECT d, c FROM c1;
2162 do_test e_fkey-46.5 {
2163 execsql { SELECT * FROM p1 }
2166 #-------------------------------------------------------------------------
2167 # EVIDENCE-OF: R-65058-57158
2169 # Test an example from the "ON DELETE and ON UPDATE Actions" section
2170 # of foreignkeys.html.
2173 do_test e_fkey-48.1 {
2175 CREATE TABLE artist(
2176 artistid INTEGER PRIMARY KEY,
2182 trackartist INTEGER REFERENCES artist(artistid) ON UPDATE CASCADE
2185 INSERT INTO artist VALUES(1, 'Dean Martin');
2186 INSERT INTO artist VALUES(2, 'Frank Sinatra');
2187 INSERT INTO track VALUES(11, 'That''s Amore', 1);
2188 INSERT INTO track VALUES(12, 'Christmas Blues', 1);
2189 INSERT INTO track VALUES(13, 'My Way', 2);
2192 do_test e_fkey-48.2 {
2194 UPDATE artist SET artistid = 100 WHERE artistname = 'Dean Martin';
2197 do_test e_fkey-48.3 {
2198 execsql { SELECT * FROM artist }
2199 } {2 {Frank Sinatra} 100 {Dean Martin}}
2200 do_test e_fkey-48.4 {
2201 execsql { SELECT * FROM track }
2202 } {11 {That's Amore} 100 12 {Christmas Blues} 100 13 {My Way} 2}
2205 #-------------------------------------------------------------------------
2206 # Verify that adding an FK action does not absolve the user of the
2207 # requirement not to violate the foreign key constraint.
2209 # EVIDENCE-OF: R-53968-51642 Configuring an ON UPDATE or ON DELETE
2210 # action does not mean that the foreign key constraint does not need to
2214 do_test e_fkey-49.1 {
2216 CREATE TABLE parent(a COLLATE nocase, b, c, PRIMARY KEY(c, a));
2217 CREATE TABLE child(d DEFAULT 'a', e, f DEFAULT 'c',
2218 FOREIGN KEY(f, d) REFERENCES parent ON UPDATE SET DEFAULT
2221 INSERT INTO parent VALUES('A', 'b', 'c');
2222 INSERT INTO parent VALUES('ONE', 'two', 'three');
2223 INSERT INTO child VALUES('one', 'two', 'three');
2226 do_test e_fkey-49.2 {
2229 UPDATE parent SET a = '' WHERE a = 'oNe';
2230 SELECT * FROM child;
2233 do_test e_fkey-49.3 {
2236 DELETE FROM parent WHERE a = 'A';
2237 SELECT * FROM parent;
2240 do_test e_fkey-49.4 {
2241 catchsql { UPDATE parent SET a = '' WHERE a = 'oNe' }
2242 } {1 {foreign key constraint failed}}
2245 #-------------------------------------------------------------------------
2246 # EVIDENCE-OF: R-11856-19836
2248 # Test an example from the "ON DELETE and ON UPDATE Actions" section
2249 # of foreignkeys.html. This example shows that adding an "ON DELETE DEFAULT"
2250 # clause does not abrogate the need to satisfy the foreign key constraint
2253 # EVIDENCE-OF: R-28220-46694 For example, if an "ON DELETE SET DEFAULT"
2254 # action is configured, but there is no row in the parent table that
2255 # corresponds to the default values of the child key columns, deleting a
2256 # parent key while dependent child keys exist still causes a foreign key
2260 do_test e_fkey-50.1 {
2262 CREATE TABLE artist(
2263 artistid INTEGER PRIMARY KEY,
2269 trackartist INTEGER DEFAULT 0 REFERENCES artist(artistid) ON DELETE SET DEFAULT
2271 INSERT INTO artist VALUES(3, 'Sammy Davis Jr.');
2272 INSERT INTO track VALUES(14, 'Mr. Bojangles', 3);
2275 do_test e_fkey-50.2 {
2276 catchsql { DELETE FROM artist WHERE artistname = 'Sammy Davis Jr.' }
2277 } {1 {foreign key constraint failed}}
2278 do_test e_fkey-50.3 {
2280 INSERT INTO artist VALUES(0, 'Unknown Artist');
2281 DELETE FROM artist WHERE artistname = 'Sammy Davis Jr.';
2284 do_test e_fkey-50.4 {
2285 execsql { SELECT * FROM artist }
2286 } {0 {Unknown Artist}}
2287 do_test e_fkey-50.5 {
2288 execsql { SELECT * FROM track }
2289 } {14 {Mr. Bojangles} 0}
2291 #-------------------------------------------------------------------------
2292 # EVIDENCE-OF: R-09564-22170
2294 # Check that the order of steps in an UPDATE or DELETE on a parent
2295 # table is as follows:
2297 # 1. Execute applicable BEFORE trigger programs,
2298 # 2. Check local (non foreign key) constraints,
2299 # 3. Update or delete the row in the parent table,
2300 # 4. Perform any required foreign key actions,
2301 # 5. Execute applicable AFTER trigger programs.
2304 do_test e_fkey-51.1 {
2305 proc maxparent {args} { db one {SELECT max(x) FROM parent} }
2306 db func maxparent maxparent
2309 CREATE TABLE parent(x PRIMARY KEY);
2311 CREATE TRIGGER bu BEFORE UPDATE ON parent BEGIN
2312 INSERT INTO parent VALUES(new.x-old.x);
2315 a DEFAULT (maxparent()) REFERENCES parent ON UPDATE SET DEFAULT
2317 CREATE TRIGGER au AFTER UPDATE ON parent BEGIN
2318 INSERT INTO parent VALUES(new.x+old.x);
2321 INSERT INTO parent VALUES(1);
2322 INSERT INTO child VALUES(1);
2325 do_test e_fkey-51.2 {
2327 UPDATE parent SET x = 22;
2328 SELECT * FROM parent UNION ALL SELECT 'xxx' UNION ALL SELECT a FROM child;
2331 do_test e_fkey-51.3 {
2335 INSERT INTO parent VALUES(-1);
2336 INSERT INTO child VALUES(-1);
2337 UPDATE parent SET x = 22;
2338 SELECT * FROM parent UNION ALL SELECT 'xxx' UNION ALL SELECT a FROM child;
2343 #-------------------------------------------------------------------------
2344 # Verify that ON UPDATE actions only actually take place if the parent key
2345 # is set to a new value that is distinct from the old value. The default
2346 # collation sequence and affinity are used to determine if the new value
2347 # is 'distinct' from the old or not.
2349 # EVIDENCE-OF: R-27383-10246 An ON UPDATE action is only taken if the
2350 # values of the parent key are modified so that the new parent key
2351 # values are not equal to the old.
2354 do_test e_fkey-52.1 {
2356 CREATE TABLE zeus(a INTEGER COLLATE NOCASE, b, PRIMARY KEY(a, b));
2357 CREATE TABLE apollo(c, d,
2358 FOREIGN KEY(c, d) REFERENCES zeus ON UPDATE CASCADE
2360 INSERT INTO zeus VALUES('abc', 'xyz');
2361 INSERT INTO apollo VALUES('ABC', 'xyz');
2364 UPDATE zeus SET a = 'aBc';
2365 SELECT * FROM apollo;
2368 do_test e_fkey-52.2 {
2370 UPDATE zeus SET a = 1, b = 1;
2371 SELECT * FROM apollo;
2374 do_test e_fkey-52.3 {
2376 UPDATE zeus SET a = 1, b = 1;
2377 SELECT typeof(c), c, typeof(d), d FROM apollo;
2379 } {integer 1 integer 1}
2380 do_test e_fkey-52.4 {
2382 UPDATE zeus SET a = '1';
2383 SELECT typeof(c), c, typeof(d), d FROM apollo;
2385 } {integer 1 integer 1}
2386 do_test e_fkey-52.5 {
2388 UPDATE zeus SET b = '1';
2389 SELECT typeof(c), c, typeof(d), d FROM apollo;
2391 } {integer 1 text 1}
2392 do_test e_fkey-52.6 {
2394 UPDATE zeus SET b = NULL;
2395 SELECT typeof(c), c, typeof(d), d FROM apollo;
2397 } {integer 1 null {}}
2399 #-------------------------------------------------------------------------
2400 # EVIDENCE-OF: R-35129-58141
2402 # Test an example from the "ON DELETE and ON UPDATE Actions" section
2403 # of foreignkeys.html. This example demonstrates that ON UPDATE actions
2404 # only take place if at least one parent key column is set to a value
2405 # that is distinct from its previous value.
2408 do_test e_fkey-53.1 {
2410 CREATE TABLE parent(x PRIMARY KEY);
2411 CREATE TABLE child(y REFERENCES parent ON UPDATE SET NULL);
2412 INSERT INTO parent VALUES('key');
2413 INSERT INTO child VALUES('key');
2416 do_test e_fkey-53.2 {
2418 UPDATE parent SET x = 'key';
2419 SELECT IFNULL(y, 'null') FROM child;
2422 do_test e_fkey-53.3 {
2424 UPDATE parent SET x = 'key2';
2425 SELECT IFNULL(y, 'null') FROM child;
2429 ###########################################################################
2430 ### SECTION 5: CREATE, ALTER and DROP TABLE commands
2431 ###########################################################################
2433 #-------------------------------------------------------------------------
2434 # Test that parent keys are not checked when tables are created.
2436 # EVIDENCE-OF: R-36018-21755 The parent key definitions of foreign key
2437 # constraints are not checked when a table is created.
2439 # EVIDENCE-OF: R-25384-39337 There is nothing stopping the user from
2440 # creating a foreign key definition that refers to a parent table that
2441 # does not exist, or to parent key columns that do not exist or are not
2442 # collectively bound by a PRIMARY KEY or UNIQUE constraint.
2444 # Child keys are checked to ensure all component columns exist. If parent
2445 # key columns are explicitly specified, SQLite checks to make sure there
2446 # are the same number of columns in the child and parent keys. (TODO: This
2447 # is tested but does not correspond to any testable statement.)
2449 # Also test that the above statements are true regardless of whether or not
2450 # foreign keys are enabled: "A CREATE TABLE command operates the same whether
2451 # or not foreign key constraints are enabled."
2453 # EVIDENCE-OF: R-08908-23439 A CREATE TABLE command operates the same
2454 # whether or not foreign key constraints are enabled.
2456 foreach {tn zCreateTbl lRes} {
2457 1 "CREATE TABLE t1(a, b REFERENCES t1)" {0 {}}
2458 2 "CREATE TABLE t1(a, b REFERENCES t2)" {0 {}}
2459 3 "CREATE TABLE t1(a, b, FOREIGN KEY(a,b) REFERENCES t1)" {0 {}}
2460 4 "CREATE TABLE t1(a, b, FOREIGN KEY(a,b) REFERENCES t2)" {0 {}}
2461 5 "CREATE TABLE t1(a, b, FOREIGN KEY(a,b) REFERENCES t2)" {0 {}}
2462 6 "CREATE TABLE t1(a, b, FOREIGN KEY(a,b) REFERENCES t2(n,d))" {0 {}}
2463 7 "CREATE TABLE t1(a, b, FOREIGN KEY(a,b) REFERENCES t1(a,b))" {0 {}}
2465 A "CREATE TABLE t1(a, b, FOREIGN KEY(c,b) REFERENCES t2)"
2466 {1 {unknown column "c" in foreign key definition}}
2467 B "CREATE TABLE t1(a, b, FOREIGN KEY(c,b) REFERENCES t2(d))"
2468 {1 {number of columns in foreign key does not match the number of columns in the referenced table}}
2470 do_test e_fkey-54.$tn.off {
2472 execsql {PRAGMA foreign_keys = OFF}
2473 catchsql $zCreateTbl
2475 do_test e_fkey-54.$tn.on {
2477 execsql {PRAGMA foreign_keys = ON}
2478 catchsql $zCreateTbl
2482 #-------------------------------------------------------------------------
2483 # EVIDENCE-OF: R-47952-62498 It is not possible to use the "ALTER TABLE
2484 # ... ADD COLUMN" syntax to add a column that includes a REFERENCES
2485 # clause, unless the default value of the new column is NULL. Attempting
2486 # to do so returns an error.
2488 proc test_efkey_6 {tn zAlter isError} {
2491 do_test e_fkey-56.$tn.1 "
2492 execsql { CREATE TABLE tbl(a, b) }
2493 [list catchsql $zAlter]
2494 " [lindex {{0 {}} {1 {Cannot add a REFERENCES column with non-NULL default value}}} $isError]
2498 test_efkey_6 1 "ALTER TABLE tbl ADD COLUMN c REFERENCES xx" 0
2499 test_efkey_6 2 "ALTER TABLE tbl ADD COLUMN c DEFAULT NULL REFERENCES xx" 0
2500 test_efkey_6 3 "ALTER TABLE tbl ADD COLUMN c DEFAULT 0 REFERENCES xx" 1
2502 #-------------------------------------------------------------------------
2503 # Test that ALTER TABLE adjusts REFERENCES clauses when the parent table
2506 # EVIDENCE-OF: R-47080-02069 If an "ALTER TABLE ... RENAME TO" command
2507 # is used to rename a table that is the parent table of one or more
2508 # foreign key constraints, the definitions of the foreign key
2509 # constraints are modified to refer to the parent table by its new name
2511 # Test that these adjustments are visible in the sqlite_master table.
2513 # EVIDENCE-OF: R-63827-54774 The text of the child CREATE TABLE
2514 # statement or statements stored in the sqlite_master table are modified
2515 # to reflect the new parent table name.
2517 do_test e_fkey-56.1 {
2520 CREATE TABLE 'p 1 "parent one"'(a REFERENCES 'p 1 "parent one"', b, PRIMARY KEY(b));
2522 CREATE TABLE c1(c, d REFERENCES 'p 1 "parent one"' ON UPDATE CASCADE);
2523 CREATE TABLE c2(e, f, FOREIGN KEY(f) REFERENCES 'p 1 "parent one"' ON UPDATE CASCADE);
2524 CREATE TABLE c3(e, 'f col 2', FOREIGN KEY('f col 2') REFERENCES 'p 1 "parent one"' ON UPDATE CASCADE);
2526 INSERT INTO 'p 1 "parent one"' VALUES(1, 1);
2527 INSERT INTO c1 VALUES(1, 1);
2528 INSERT INTO c2 VALUES(1, 1);
2529 INSERT INTO c3 VALUES(1, 1);
2531 -- CREATE TABLE q(a, b, PRIMARY KEY(b));
2534 do_test e_fkey-56.2 {
2535 execsql { ALTER TABLE 'p 1 "parent one"' RENAME TO p }
2537 do_test e_fkey-56.3 {
2539 UPDATE p SET a = 'xxx', b = 'xxx';
2545 } {xxx xxx 1 xxx 1 xxx 1 xxx}
2546 do_test e_fkey-56.4 {
2547 execsql { SELECT sql FROM sqlite_master WHERE type = 'table'}
2549 {CREATE TABLE "p"(a REFERENCES "p", b, PRIMARY KEY(b))} \
2550 {CREATE TABLE c1(c, d REFERENCES "p" ON UPDATE CASCADE)} \
2551 {CREATE TABLE c2(e, f, FOREIGN KEY(f) REFERENCES "p" ON UPDATE CASCADE)} \
2552 {CREATE TABLE c3(e, 'f col 2', FOREIGN KEY('f col 2') REFERENCES "p" ON UPDATE CASCADE)} \
2555 #-------------------------------------------------------------------------
2556 # Check that a DROP TABLE does an implicit DELETE FROM. Which does not
2557 # cause any triggers to fire, but does fire foreign key actions.
2559 # EVIDENCE-OF: R-14208-23986 If foreign key constraints are enabled when
2560 # it is prepared, the DROP TABLE command performs an implicit DELETE to
2561 # remove all rows from the table before dropping it.
2563 # EVIDENCE-OF: R-11078-03945 The implicit DELETE does not cause any SQL
2564 # triggers to fire, but may invoke foreign key actions or constraint
2567 do_test e_fkey-57.1 {
2570 CREATE TABLE p(a, b, PRIMARY KEY(a, b));
2572 CREATE TABLE c1(c, d, FOREIGN KEY(c, d) REFERENCES p ON DELETE SET NULL);
2573 CREATE TABLE c2(c, d, FOREIGN KEY(c, d) REFERENCES p ON DELETE SET DEFAULT);
2574 CREATE TABLE c3(c, d, FOREIGN KEY(c, d) REFERENCES p ON DELETE CASCADE);
2575 CREATE TABLE c4(c, d, FOREIGN KEY(c, d) REFERENCES p ON DELETE RESTRICT);
2576 CREATE TABLE c5(c, d, FOREIGN KEY(c, d) REFERENCES p ON DELETE NO ACTION);
2578 CREATE TABLE c6(c, d,
2579 FOREIGN KEY(c, d) REFERENCES p ON DELETE RESTRICT
2580 DEFERRABLE INITIALLY DEFERRED
2582 CREATE TABLE c7(c, d,
2583 FOREIGN KEY(c, d) REFERENCES p ON DELETE NO ACTION
2584 DEFERRABLE INITIALLY DEFERRED
2587 CREATE TABLE log(msg);
2588 CREATE TRIGGER tt AFTER DELETE ON p BEGIN
2589 INSERT INTO log VALUES('delete ' || old.rowid);
2594 do_test e_fkey-57.2 {
2596 INSERT INTO p VALUES('a', 'b');
2597 INSERT INTO c1 VALUES('a', 'b');
2598 INSERT INTO c2 VALUES('a', 'b');
2599 INSERT INTO c3 VALUES('a', 'b');
2605 do_test e_fkey-57.3 {
2606 execsql { SELECT * FROM c2 }
2608 do_test e_fkey-57.4 {
2609 execsql { SELECT * FROM c3 }
2611 do_test e_fkey-57.5 {
2612 execsql { SELECT * FROM log }
2614 do_test e_fkey-57.6 {
2617 do_test e_fkey-57.7 {
2626 #-------------------------------------------------------------------------
2627 # If an IMMEDIATE foreign key fails as a result of a DROP TABLE, the
2628 # DROP TABLE command fails.
2630 # EVIDENCE-OF: R-32768-47925 If an immediate foreign key constraint is
2631 # violated, the DROP TABLE statement fails and the table is not dropped.
2633 do_test e_fkey-58.1 {
2639 execsql { INSERT INTO c5 VALUES('a', 'b') }
2640 catchsql { DROP TABLE p }
2641 } {1 {foreign key constraint failed}}
2642 do_test e_fkey-58.2 {
2643 execsql { SELECT * FROM p }
2645 do_test e_fkey-58.3 {
2650 } {1 {foreign key constraint failed}}
2651 do_test e_fkey-58.4 {
2659 #-------------------------------------------------------------------------
2660 # If a DEFERRED foreign key fails as a result of a DROP TABLE, attempting
2661 # to commit the transaction fails unless the violation is fixed.
2663 # EVIDENCE-OF: R-05903-08460 If a deferred foreign key constraint is
2664 # violated, then an error is reported when the user attempts to commit
2665 # the transaction if the foreign key constraint violations still exist
2668 do_test e_fkey-59.1 {
2670 DELETE FROM c1 ; DELETE FROM c2 ; DELETE FROM c3 ;
2671 DELETE FROM c4 ; DELETE FROM c5 ; DELETE FROM c6 ;
2675 do_test e_fkey-59.2 {
2676 execsql { INSERT INTO c7 VALUES('a', 'b') }
2682 do_test e_fkey-59.3 {
2684 } {1 {foreign key constraint failed}}
2685 do_test e_fkey-59.4 {
2686 execsql { CREATE TABLE p(a, b, PRIMARY KEY(a, b)) }
2688 } {1 {foreign key constraint failed}}
2689 do_test e_fkey-59.5 {
2690 execsql { INSERT INTO p VALUES('a', 'b') }
2694 #-------------------------------------------------------------------------
2695 # Any "foreign key mismatch" errors encountered while running an implicit
2696 # "DELETE FROM tbl" are ignored.
2698 # EVIDENCE-OF: R-57242-37005 Any "foreign key mismatch" errors
2699 # encountered as part of an implicit DELETE are ignored.
2702 do_test e_fkey-60.1 {
2704 PRAGMA foreign_keys = OFF;
2706 CREATE TABLE p(a PRIMARY KEY, b REFERENCES nosuchtable);
2707 CREATE TABLE c1(c, d, FOREIGN KEY(c, d) REFERENCES a);
2708 CREATE TABLE c2(c REFERENCES p(b), d);
2709 CREATE TABLE c3(c REFERENCES p ON DELETE SET NULL, d);
2711 INSERT INTO p VALUES(1, 2);
2712 INSERT INTO c1 VALUES(1, 2);
2713 INSERT INTO c2 VALUES(1, 2);
2714 INSERT INTO c3 VALUES(1, 2);
2717 do_test e_fkey-60.2 {
2718 execsql { PRAGMA foreign_keys = ON }
2719 catchsql { DELETE FROM p }
2720 } {1 {no such table: main.nosuchtable}}
2721 do_test e_fkey-60.3 {
2729 do_test e_fkey-60.4 {
2730 execsql { CREATE TABLE nosuchtable(x PRIMARY KEY) }
2731 catchsql { DELETE FROM p }
2732 } {1 {foreign key mismatch}}
2733 do_test e_fkey-60.5 {
2734 execsql { DROP TABLE c1 }
2735 catchsql { DELETE FROM p }
2736 } {1 {foreign key mismatch}}
2737 do_test e_fkey-60.6 {
2738 execsql { DROP TABLE c2 }
2739 execsql { DELETE FROM p }
2742 #-------------------------------------------------------------------------
2743 # Test that the special behaviours of ALTER and DROP TABLE are only
2744 # activated when foreign keys are enabled. Special behaviours are:
2746 # 1. ADD COLUMN not allowing a REFERENCES clause with a non-NULL
2748 # 2. Modifying foreign key definitions when a parent table is RENAMEd.
2749 # 3. Running an implicit DELETE FROM command as part of DROP TABLE.
2751 # EVIDENCE-OF: R-54142-41346 The properties of the DROP TABLE and ALTER
2752 # TABLE commands described above only apply if foreign keys are enabled.
2754 do_test e_fkey-61.1.1 {
2756 execsql { CREATE TABLE t1(a, b) }
2757 catchsql { ALTER TABLE t1 ADD COLUMN c DEFAULT 'xxx' REFERENCES t2 }
2758 } {1 {Cannot add a REFERENCES column with non-NULL default value}}
2759 do_test e_fkey-61.1.2 {
2760 execsql { PRAGMA foreign_keys = OFF }
2761 execsql { ALTER TABLE t1 ADD COLUMN c DEFAULT 'xxx' REFERENCES t2 }
2762 execsql { SELECT sql FROM sqlite_master WHERE name = 't1' }
2763 } {{CREATE TABLE t1(a, b, c DEFAULT 'xxx' REFERENCES t2)}}
2764 do_test e_fkey-61.1.3 {
2765 execsql { PRAGMA foreign_keys = ON }
2768 do_test e_fkey-61.2.1 {
2771 CREATE TABLE p(a UNIQUE);
2772 CREATE TABLE c(b REFERENCES p(a));
2774 ALTER TABLE p RENAME TO parent;
2775 SELECT sql FROM sqlite_master WHERE name = 'c';
2778 } {{CREATE TABLE c(b REFERENCES "parent"(a))}}
2779 do_test e_fkey-61.2.2 {
2781 PRAGMA foreign_keys = OFF;
2782 ALTER TABLE p RENAME TO parent;
2783 SELECT sql FROM sqlite_master WHERE name = 'c';
2785 } {{CREATE TABLE c(b REFERENCES p(a))}}
2786 do_test e_fkey-61.2.3 {
2787 execsql { PRAGMA foreign_keys = ON }
2790 do_test e_fkey-61.3.1 {
2793 CREATE TABLE p(a UNIQUE);
2794 CREATE TABLE c(b REFERENCES p(a) ON DELETE SET NULL);
2795 INSERT INTO p VALUES('x');
2796 INSERT INTO c VALUES('x');
2803 do_test e_fkey-61.3.2 {
2805 PRAGMA foreign_keys = OFF;
2810 do_test e_fkey-61.3.3 {
2811 execsql { PRAGMA foreign_keys = ON }
2814 ###########################################################################
2815 ### SECTION 6: Limits and Unsupported Features
2816 ###########################################################################
2818 #-------------------------------------------------------------------------
2819 # Test that MATCH clauses are parsed, but SQLite treats every foreign key
2820 # constraint as if it were "MATCH SIMPLE".
2822 # EVIDENCE-OF: R-24728-13230 SQLite parses MATCH clauses (i.e. does not
2823 # report a syntax error if you specify one), but does not enforce them.
2825 # EVIDENCE-OF: R-24450-46174 All foreign key constraints in SQLite are
2826 # handled as if MATCH SIMPLE were specified.
2828 foreach zMatch [list SIMPLE PARTIAL FULL Simple parTIAL FuLL ] {
2830 do_test e_fkey-62.$zMatch.1 {
2832 CREATE TABLE p(a, b, c, PRIMARY KEY(b, c));
2833 CREATE TABLE c(d, e, f, FOREIGN KEY(e, f) REFERENCES p MATCH $zMatch);
2836 do_test e_fkey-62.$zMatch.2 {
2837 execsql { INSERT INTO p VALUES(1, 2, 3) }
2839 # MATCH SIMPLE behaviour: Allow any child key that contains one or more
2840 # NULL value to be inserted. Non-NULL values do not have to map to any
2841 # parent key values, so long as at least one field of the child key is
2843 execsql { INSERT INTO c VALUES('w', 2, 3) }
2844 execsql { INSERT INTO c VALUES('x', 'x', NULL) }
2845 execsql { INSERT INTO c VALUES('y', NULL, 'x') }
2846 execsql { INSERT INTO c VALUES('z', NULL, NULL) }
2848 # Check that the FK is enforced properly if there are no NULL values
2849 # in the child key columns.
2850 catchsql { INSERT INTO c VALUES('a', 2, 4) }
2851 } {1 {foreign key constraint failed}}
2854 #-------------------------------------------------------------------------
2855 # Test that SQLite does not support the SET CONSTRAINT statement. And
2856 # that it is possible to create both immediate and deferred constraints.
2858 # EVIDENCE-OF: R-21599-16038 In SQLite, a foreign key constraint is
2859 # permanently marked as deferred or immediate when it is created.
2862 do_test e_fkey-62.1 {
2863 catchsql { SET CONSTRAINTS ALL IMMEDIATE }
2864 } {1 {near "SET": syntax error}}
2865 do_test e_fkey-62.2 {
2866 catchsql { SET CONSTRAINTS ALL DEFERRED }
2867 } {1 {near "SET": syntax error}}
2869 do_test e_fkey-62.3 {
2871 CREATE TABLE p(a, b, PRIMARY KEY(a, b));
2872 CREATE TABLE cd(c, d,
2873 FOREIGN KEY(c, d) REFERENCES p DEFERRABLE INITIALLY DEFERRED);
2874 CREATE TABLE ci(c, d,
2875 FOREIGN KEY(c, d) REFERENCES p DEFERRABLE INITIALLY IMMEDIATE);
2879 do_test e_fkey-62.4 {
2880 catchsql { INSERT INTO ci VALUES('x', 'y') }
2881 } {1 {foreign key constraint failed}}
2882 do_test e_fkey-62.5 {
2883 catchsql { INSERT INTO cd VALUES('x', 'y') }
2885 do_test e_fkey-62.6 {
2887 } {1 {foreign key constraint failed}}
2888 do_test e_fkey-62.7 {
2895 #-------------------------------------------------------------------------
2896 # Test that the maximum recursion depth of foreign key action programs is
2897 # governed by the SQLITE_MAX_TRIGGER_DEPTH and SQLITE_LIMIT_TRIGGER_DEPTH
2900 # EVIDENCE-OF: R-42264-30503 The SQLITE_MAX_TRIGGER_DEPTH and
2901 # SQLITE_LIMIT_TRIGGER_DEPTH settings determine the maximum allowable
2902 # depth of trigger program recursion. For the purposes of these limits,
2903 # foreign key actions are considered trigger programs.
2905 proc test_on_delete_recursion {limit} {
2909 CREATE TABLE t0(a PRIMARY KEY, b);
2910 INSERT INTO t0 VALUES('x0', NULL);
2912 for {set i 1} {$i <= $limit} {incr i} {
2915 a PRIMARY KEY, b REFERENCES t[expr $i-1] ON DELETE CASCADE
2917 INSERT INTO t$i VALUES('x$i', 'x[expr $i-1]');
2923 SELECT count(*) FROM t$limit;
2926 proc test_on_update_recursion {limit} {
2930 CREATE TABLE t0(a PRIMARY KEY);
2931 INSERT INTO t0 VALUES('xxx');
2933 for {set i 1} {$i <= $limit} {incr i} {
2937 CREATE TABLE t$i (a PRIMARY KEY REFERENCES t$j ON UPDATE CASCADE);
2938 INSERT INTO t$i VALUES('xxx');
2943 UPDATE t0 SET a = 'yyy';
2944 SELECT NOT (a='yyy') FROM t$limit;
2948 do_test e_fkey-63.1.1 {
2949 test_on_delete_recursion $SQLITE_MAX_TRIGGER_DEPTH
2951 do_test e_fkey-63.1.2 {
2952 test_on_delete_recursion [expr $SQLITE_MAX_TRIGGER_DEPTH+1]
2953 } {1 {too many levels of trigger recursion}}
2954 do_test e_fkey-63.1.3 {
2955 sqlite3_limit db SQLITE_LIMIT_TRIGGER_DEPTH 5
2956 test_on_delete_recursion 5
2958 do_test e_fkey-63.1.4 {
2959 test_on_delete_recursion 6
2960 } {1 {too many levels of trigger recursion}}
2961 do_test e_fkey-63.1.5 {
2962 sqlite3_limit db SQLITE_LIMIT_TRIGGER_DEPTH 1000000
2964 do_test e_fkey-63.2.1 {
2965 test_on_update_recursion $SQLITE_MAX_TRIGGER_DEPTH
2967 do_test e_fkey-63.2.2 {
2968 test_on_update_recursion [expr $SQLITE_MAX_TRIGGER_DEPTH+1]
2969 } {1 {too many levels of trigger recursion}}
2970 do_test e_fkey-63.2.3 {
2971 sqlite3_limit db SQLITE_LIMIT_TRIGGER_DEPTH 5
2972 test_on_update_recursion 5
2974 do_test e_fkey-63.2.4 {
2975 test_on_update_recursion 6
2976 } {1 {too many levels of trigger recursion}}
2977 do_test e_fkey-63.2.5 {
2978 sqlite3_limit db SQLITE_LIMIT_TRIGGER_DEPTH 1000000
2981 #-------------------------------------------------------------------------
2982 # The setting of the recursive_triggers pragma does not affect foreign
2985 # EVIDENCE-OF: R-51769-32730 The PRAGMA recursive_triggers setting does
2986 # not not affect the operation of foreign key actions.
2988 foreach recursive_triggers_setting [list 0 1 ON OFF] {
2990 execsql "PRAGMA recursive_triggers = $recursive_triggers_setting"
2992 do_test e_fkey-64.$recursive_triggers_setting.1 {
2994 CREATE TABLE t1(a PRIMARY KEY, b REFERENCES t1 ON DELETE CASCADE);
2995 INSERT INTO t1 VALUES(1, NULL);
2996 INSERT INTO t1 VALUES(2, 1);
2997 INSERT INTO t1 VALUES(3, 2);
2998 INSERT INTO t1 VALUES(4, 3);
2999 INSERT INTO t1 VALUES(5, 4);
3000 SELECT count(*) FROM t1;
3003 do_test e_fkey-64.$recursive_triggers_setting.2 {
3004 execsql { SELECT count(*) FROM t1 WHERE a = 1 }
3006 do_test e_fkey-64.$recursive_triggers_setting.3 {
3008 DELETE FROM t1 WHERE a = 1;
3009 SELECT count(*) FROM t1;