xref: /sqlite-3.40.0/test/fkey5.test (revision 47d38e24)
17d22a4d7Sdrh# 2012 December 17
27d22a4d7Sdrh#
37d22a4d7Sdrh# The author disclaims copyright to this source code.  In place of
47d22a4d7Sdrh# a legal notice, here is a blessing:
57d22a4d7Sdrh#
67d22a4d7Sdrh#    May you do good and not evil.
77d22a4d7Sdrh#    May you find forgiveness for yourself and forgive others.
87d22a4d7Sdrh#    May you share freely, never taking more than you give.
97d22a4d7Sdrh#
107d22a4d7Sdrh#***********************************************************************
117d22a4d7Sdrh# This file implements regression tests for SQLite library.
127d22a4d7Sdrh#
137d22a4d7Sdrh# This file tests the PRAGMA foreign_key_check command.
147d22a4d7Sdrh#
15b3366b99Sdrh# EVIDENCE-OF: R-15402-03103 PRAGMA schema.foreign_key_check; PRAGMA
16b3366b99Sdrh# schema.foreign_key_check(table-name);
179d356fbeSdrh#
18d43c0cbeSdrh# EVIDENCE-OF: R-41653-15278 The foreign_key_check pragma checks the
199d356fbeSdrh# database, or the table called "table-name", for foreign key
20d43c0cbeSdrh# constraints that are violated. The foreign_key_check pragma returns
21d43c0cbeSdrh# one row output for each foreign key violation.
227d22a4d7Sdrh
237d22a4d7Sdrhset testdir [file dirname $argv0]
247d22a4d7Sdrhsource $testdir/tester.tcl
255e87830fSdanset testprefix fkey5
267d22a4d7Sdrh
277d22a4d7Sdrhifcapable {!foreignkey} {
287d22a4d7Sdrh  finish_test
297d22a4d7Sdrh  return
307d22a4d7Sdrh}
317d22a4d7Sdrh
327d22a4d7Sdrhdo_test fkey5-1.1 {
337d22a4d7Sdrh  db eval {
347d22a4d7Sdrh    CREATE TABLE p1(a INTEGER PRIMARY KEY); INSERT INTO p1 VALUES(88),(89);
357d22a4d7Sdrh    CREATE TABLE p2(a INT PRIMARY KEY); INSERT INTO p2 VALUES(77),(78);
367d22a4d7Sdrh    CREATE TABLE p3(a TEXT PRIMARY KEY);
377d22a4d7Sdrh    INSERT INTO p3 VALUES(66),(67),('alpha'),('BRAVO');
387d22a4d7Sdrh    CREATE TABLE p4(a TEXT PRIMARY KEY COLLATE nocase);
397d22a4d7Sdrh    INSERT INTO p4 VALUES('alpha'),('BRAVO'),('55'),('Delta'),('ECHO');
407d22a4d7Sdrh    CREATE TABLE p5(a INTEGER PRIMARY KEY, b, c, UNIQUE(b,c));
417d22a4d7Sdrh    INSERT INTO p5 VALUES(1,'Alpha','abc'),(2,'beta','def');
427d22a4d7Sdrh    CREATE TABLE p6(a INTEGER PRIMARY KEY, b TEXT COLLATE nocase,
437d22a4d7Sdrh                    c TEXT COLLATE rtrim, UNIQUE(b,c));
447d22a4d7Sdrh    INSERT INTO p6 VALUES(1,'Alpha','abc '),(2,'bETA','def    ');
457d22a4d7Sdrh
467d22a4d7Sdrh    CREATE TABLE c1(x INTEGER PRIMARY KEY references p1);
477d22a4d7Sdrh    CREATE TABLE c2(x INTEGER PRIMARY KEY references p2);
487d22a4d7Sdrh    CREATE TABLE c3(x INTEGER PRIMARY KEY references p3);
497d22a4d7Sdrh    CREATE TABLE c4(x INTEGER PRIMARY KEY references p4);
507d22a4d7Sdrh    CREATE TABLE c5(x INT references p1);
517d22a4d7Sdrh    CREATE TABLE c6(x INT references p2);
527d22a4d7Sdrh    CREATE TABLE c7(x INT references p3);
537d22a4d7Sdrh    CREATE TABLE c8(x INT references p4);
547d22a4d7Sdrh    CREATE TABLE c9(x TEXT UNIQUE references p1);
557d22a4d7Sdrh    CREATE TABLE c10(x TEXT UNIQUE references p2);
567d22a4d7Sdrh    CREATE TABLE c11(x TEXT UNIQUE references p3);
577d22a4d7Sdrh    CREATE TABLE c12(x TEXT UNIQUE references p4);
587d22a4d7Sdrh    CREATE TABLE c13(x TEXT COLLATE nocase references p3);
597d22a4d7Sdrh    CREATE TABLE c14(x TEXT COLLATE nocase references p4);
607d22a4d7Sdrh    CREATE TABLE c15(x, y, FOREIGN KEY(x,y) REFERENCES p5(b,c));
617d22a4d7Sdrh    CREATE TABLE c16(x, y, FOREIGN KEY(x,y) REFERENCES p5(c,b));
627d22a4d7Sdrh    CREATE TABLE c17(x, y, FOREIGN KEY(x,y) REFERENCES p6(b,c));
637d22a4d7Sdrh    CREATE TABLE c18(x, y, FOREIGN KEY(x,y) REFERENCES p6(c,b));
647d22a4d7Sdrh    CREATE TABLE c19(x TEXT COLLATE nocase, y TEXT COLLATE rtrim,
657d22a4d7Sdrh                     FOREIGN KEY(x,y) REFERENCES p5(b,c));
667d22a4d7Sdrh    CREATE TABLE c20(x TEXT COLLATE nocase, y TEXT COLLATE rtrim,
677d22a4d7Sdrh                     FOREIGN KEY(x,y) REFERENCES p5(c,b));
687d22a4d7Sdrh    CREATE TABLE c21(x TEXT COLLATE nocase, y TEXT COLLATE rtrim,
697d22a4d7Sdrh                     FOREIGN KEY(x,y) REFERENCES p6(b,c));
707d22a4d7Sdrh    CREATE TABLE c22(x TEXT COLLATE nocase, y TEXT COLLATE rtrim,
717d22a4d7Sdrh                     FOREIGN KEY(x,y) REFERENCES p6(c,b));
727d22a4d7Sdrh
737d22a4d7Sdrh    PRAGMA foreign_key_check;
747d22a4d7Sdrh  }
757d22a4d7Sdrh} {}
767d22a4d7Sdrhdo_test fkey5-1.2 {
777d22a4d7Sdrh  db eval {
787d22a4d7Sdrh    INSERT INTO c1 VALUES(90),(87),(88);
797d22a4d7Sdrh    PRAGMA foreign_key_check;
807d22a4d7Sdrh  }
817d22a4d7Sdrh} {c1 87 p1 0 c1 90 p1 0}
829d356fbeSdrhdo_test fkey5-1.2b {
839d356fbeSdrh  db eval {
849d356fbeSdrh    PRAGMA main.foreign_key_check;
859d356fbeSdrh  }
869d356fbeSdrh} {c1 87 p1 0 c1 90 p1 0}
879d356fbeSdrhdo_test fkey5-1.2c {
889d356fbeSdrh  db eval {
899d356fbeSdrh    PRAGMA temp.foreign_key_check;
909d356fbeSdrh  }
919d356fbeSdrh} {}
927d22a4d7Sdrhdo_test fkey5-1.3 {
937d22a4d7Sdrh  db eval {
947d22a4d7Sdrh    PRAGMA foreign_key_check(c1);
957d22a4d7Sdrh  }
967d22a4d7Sdrh} {c1 87 p1 0 c1 90 p1 0}
977d22a4d7Sdrhdo_test fkey5-1.4 {
987d22a4d7Sdrh  db eval {
997d22a4d7Sdrh    PRAGMA foreign_key_check(c2);
1007d22a4d7Sdrh  }
1017d22a4d7Sdrh} {}
1029d356fbeSdrhdo_test fkey5-1.5 {
1039d356fbeSdrh  db eval {
1049d356fbeSdrh    PRAGMA main.foreign_key_check(c2);
1059d356fbeSdrh  }
1069d356fbeSdrh} {}
1079d356fbeSdrhdo_test fkey5-1.6 {
1089d356fbeSdrh  catchsql {
1099d356fbeSdrh    PRAGMA temp.foreign_key_check(c2);
1109d356fbeSdrh  }
1119d356fbeSdrh} {1 {no such table: temp.c2}}
1127d22a4d7Sdrh
113e4bf4f08Sdrh# EVIDENCE-OF: R-45728-08709 There are four columns in each result row.
114e4bf4f08Sdrh#
115e4bf4f08Sdrh# EVIDENCE-OF: R-55672-01620 The first column is the name of the table
116e4bf4f08Sdrh# that contains the REFERENCES clause.
117e4bf4f08Sdrh#
118f8a2e8c2Sdrh# EVIDENCE-OF: R-00471-55166 The second column is the rowid of the row
119f8a2e8c2Sdrh# that contains the invalid REFERENCES clause, or NULL if the child
120f8a2e8c2Sdrh# table is a WITHOUT ROWID table.
121f8a2e8c2Sdrh#
122f8a2e8c2Sdrh# The second clause in the previous is tested by fkey5-10.3.
123e4bf4f08Sdrh#
124e4bf4f08Sdrh# EVIDENCE-OF: R-40482-20265 The third column is the name of the table
125e4bf4f08Sdrh# that is referred to.
126e4bf4f08Sdrh#
127e4bf4f08Sdrh# EVIDENCE-OF: R-62839-07969 The fourth column is the index of the
128e4bf4f08Sdrh# specific foreign key constraint that failed.
129e4bf4f08Sdrh#
1307d22a4d7Sdrhdo_test fkey5-2.0 {
1317d22a4d7Sdrh  db eval {
1327d22a4d7Sdrh    INSERT INTO c5 SELECT x FROM c1;
1337d22a4d7Sdrh    DELETE FROM c1;
1347d22a4d7Sdrh    PRAGMA foreign_key_check;
1357d22a4d7Sdrh  }
1367d22a4d7Sdrh} {c5 1 p1 0 c5 3 p1 0}
1377d22a4d7Sdrhdo_test fkey5-2.1 {
1387d22a4d7Sdrh  db eval {
1397d22a4d7Sdrh    PRAGMA foreign_key_check(c5);
1407d22a4d7Sdrh  }
1417d22a4d7Sdrh} {c5 1 p1 0 c5 3 p1 0}
1427d22a4d7Sdrhdo_test fkey5-2.2 {
1437d22a4d7Sdrh  db eval {
1447d22a4d7Sdrh    PRAGMA foreign_key_check(c1);
1457d22a4d7Sdrh  }
1467d22a4d7Sdrh} {}
147e4bf4f08Sdrhdo_execsql_test fkey5-2.3 {
148e4bf4f08Sdrh  PRAGMA foreign_key_list(c5);
149e4bf4f08Sdrh} {0 0 p1 x {} {NO ACTION} {NO ACTION} NONE}
1507d22a4d7Sdrh
1517d22a4d7Sdrhdo_test fkey5-3.0 {
1527d22a4d7Sdrh  db eval {
1537d22a4d7Sdrh    INSERT INTO c9 SELECT x FROM c5;
1547d22a4d7Sdrh    DELETE FROM c5;
1557d22a4d7Sdrh    PRAGMA foreign_key_check;
1567d22a4d7Sdrh  }
1577d22a4d7Sdrh} {c9 1 p1 0 c9 3 p1 0}
1587d22a4d7Sdrhdo_test fkey5-3.1 {
1597d22a4d7Sdrh  db eval {
1607d22a4d7Sdrh    PRAGMA foreign_key_check(c9);
1617d22a4d7Sdrh  }
1627d22a4d7Sdrh} {c9 1 p1 0 c9 3 p1 0}
1637d22a4d7Sdrhdo_test fkey5-3.2 {
1647d22a4d7Sdrh  db eval {
1657d22a4d7Sdrh    PRAGMA foreign_key_check(c5);
1667d22a4d7Sdrh  }
1677d22a4d7Sdrh} {}
1687d22a4d7Sdrh
1697d22a4d7Sdrhdo_test fkey5-4.0 {
1707d22a4d7Sdrh  db eval {
1717d22a4d7Sdrh    DELETE FROM c9;
1727d22a4d7Sdrh    INSERT INTO c2 VALUES(79),(77),(76);
1737d22a4d7Sdrh    PRAGMA foreign_key_check;
1747d22a4d7Sdrh  }
1757d22a4d7Sdrh} {c2 76 p2 0 c2 79 p2 0}
1767d22a4d7Sdrhdo_test fkey5-4.1 {
1777d22a4d7Sdrh  db eval {
1787d22a4d7Sdrh    PRAGMA foreign_key_check(c2);
1797d22a4d7Sdrh  }
1807d22a4d7Sdrh} {c2 76 p2 0 c2 79 p2 0}
1817d22a4d7Sdrhdo_test fkey5-4.2 {
1827d22a4d7Sdrh  db eval {
1837d22a4d7Sdrh    INSERT INTO c6 SELECT x FROM c2;
1847d22a4d7Sdrh    DELETE FROM c2;
1857d22a4d7Sdrh    PRAGMA foreign_key_check;
1867d22a4d7Sdrh  }
1877d22a4d7Sdrh} {c6 1 p2 0 c6 3 p2 0}
1887d22a4d7Sdrhdo_test fkey5-4.3 {
1897d22a4d7Sdrh  db eval {
1907d22a4d7Sdrh    PRAGMA foreign_key_check(c6);
1917d22a4d7Sdrh  }
1927d22a4d7Sdrh} {c6 1 p2 0 c6 3 p2 0}
1937d22a4d7Sdrhdo_test fkey5-4.4 {
1947d22a4d7Sdrh  db eval {
1957d22a4d7Sdrh    INSERT INTO c10 SELECT x FROM c6;
1967d22a4d7Sdrh    DELETE FROM c6;
1977d22a4d7Sdrh    PRAGMA foreign_key_check;
1987d22a4d7Sdrh  }
1997d22a4d7Sdrh} {c10 1 p2 0 c10 3 p2 0}
2007d22a4d7Sdrhdo_test fkey5-4.5 {
2017d22a4d7Sdrh  db eval {
2027d22a4d7Sdrh    PRAGMA foreign_key_check(c10);
2037d22a4d7Sdrh  }
2047d22a4d7Sdrh} {c10 1 p2 0 c10 3 p2 0}
2057d22a4d7Sdrh
2067d22a4d7Sdrhdo_test fkey5-5.0 {
2077d22a4d7Sdrh  db eval {
2087d22a4d7Sdrh    DELETE FROM c10;
2097d22a4d7Sdrh    INSERT INTO c3 VALUES(68),(67),(65);
2107d22a4d7Sdrh    PRAGMA foreign_key_check;
2117d22a4d7Sdrh  }
2127d22a4d7Sdrh} {c3 65 p3 0 c3 68 p3 0}
2137d22a4d7Sdrhdo_test fkey5-5.1 {
2147d22a4d7Sdrh  db eval {
2157d22a4d7Sdrh    PRAGMA foreign_key_check(c3);
2167d22a4d7Sdrh  }
2177d22a4d7Sdrh} {c3 65 p3 0 c3 68 p3 0}
2187d22a4d7Sdrhdo_test fkey5-5.2 {
2197d22a4d7Sdrh  db eval {
2207d22a4d7Sdrh    INSERT INTO c7 SELECT x FROM c3;
2217d22a4d7Sdrh    INSERT INTO c7 VALUES('Alpha'),('alpha'),('foxtrot');
2227d22a4d7Sdrh    DELETE FROM c3;
2237d22a4d7Sdrh    PRAGMA foreign_key_check;
2247d22a4d7Sdrh  }
2257d22a4d7Sdrh} {c7 1 p3 0 c7 3 p3 0 c7 4 p3 0 c7 6 p3 0}
2267d22a4d7Sdrhdo_test fkey5-5.3 {
2277d22a4d7Sdrh  db eval {
2287d22a4d7Sdrh    PRAGMA foreign_key_check(c7);
2297d22a4d7Sdrh  }
2307d22a4d7Sdrh} {c7 1 p3 0 c7 3 p3 0 c7 4 p3 0 c7 6 p3 0}
2317d22a4d7Sdrhdo_test fkey5-5.4 {
2327d22a4d7Sdrh  db eval {
2337d22a4d7Sdrh    INSERT INTO c11 SELECT x FROM c7;
2347d22a4d7Sdrh    DELETE FROM c7;
2357d22a4d7Sdrh    PRAGMA foreign_key_check;
2367d22a4d7Sdrh  }
2377d22a4d7Sdrh} {c11 1 p3 0 c11 3 p3 0 c11 4 p3 0 c11 6 p3 0}
2387d22a4d7Sdrhdo_test fkey5-5.5 {
2397d22a4d7Sdrh  db eval {
2407d22a4d7Sdrh    PRAGMA foreign_key_check(c11);
2417d22a4d7Sdrh  }
2427d22a4d7Sdrh} {c11 1 p3 0 c11 3 p3 0 c11 4 p3 0 c11 6 p3 0}
2437d22a4d7Sdrh
2447d22a4d7Sdrhdo_test fkey5-6.0 {
2457d22a4d7Sdrh  db eval {
2467d22a4d7Sdrh    DELETE FROM c11;
2477d22a4d7Sdrh    INSERT INTO c4 VALUES(54),(55),(56);
2487d22a4d7Sdrh    PRAGMA foreign_key_check;
2497d22a4d7Sdrh  }
2507d22a4d7Sdrh} {c4 54 p4 0 c4 56 p4 0}
2517d22a4d7Sdrhdo_test fkey5-6.1 {
2527d22a4d7Sdrh  db eval {
2537d22a4d7Sdrh    PRAGMA foreign_key_check(c4);
2547d22a4d7Sdrh  }
2557d22a4d7Sdrh} {c4 54 p4 0 c4 56 p4 0}
2567d22a4d7Sdrhdo_test fkey5-6.2 {
2577d22a4d7Sdrh  db eval {
2587d22a4d7Sdrh    INSERT INTO c8 SELECT x FROM c4;
2597d22a4d7Sdrh    INSERT INTO c8 VALUES('Alpha'),('ALPHA'),('foxtrot');
2607d22a4d7Sdrh    DELETE FROM c4;
2617d22a4d7Sdrh    PRAGMA foreign_key_check;
2627d22a4d7Sdrh  }
2637d22a4d7Sdrh} {c8 1 p4 0 c8 3 p4 0 c8 6 p4 0}
2647d22a4d7Sdrhdo_test fkey5-6.3 {
2657d22a4d7Sdrh  db eval {
2667d22a4d7Sdrh    PRAGMA foreign_key_check(c8);
2677d22a4d7Sdrh  }
2687d22a4d7Sdrh} {c8 1 p4 0 c8 3 p4 0 c8 6 p4 0}
2697d22a4d7Sdrhdo_test fkey5-6.4 {
2707d22a4d7Sdrh  db eval {
2717d22a4d7Sdrh    INSERT INTO c12 SELECT x FROM c8;
2727d22a4d7Sdrh    DELETE FROM c8;
2737d22a4d7Sdrh    PRAGMA foreign_key_check;
2747d22a4d7Sdrh  }
2757d22a4d7Sdrh} {c12 1 p4 0 c12 3 p4 0 c12 6 p4 0}
2767d22a4d7Sdrhdo_test fkey5-6.5 {
2777d22a4d7Sdrh  db eval {
2787d22a4d7Sdrh    PRAGMA foreign_key_check(c12);
2797d22a4d7Sdrh  }
2807d22a4d7Sdrh} {c12 1 p4 0 c12 3 p4 0 c12 6 p4 0}
2817d22a4d7Sdrh
2827d22a4d7Sdrhdo_test fkey5-7.1 {
283fddfacc3Sdrh  set res {}
2847d22a4d7Sdrh  db eval {
2857d22a4d7Sdrh    INSERT OR IGNORE INTO c13 SELECT * FROM c12;
2867d22a4d7Sdrh    INSERT OR IGNORE INTO C14 SELECT * FROM c12;
2877d22a4d7Sdrh    DELETE FROM c12;
2887d22a4d7Sdrh    PRAGMA foreign_key_check;
289fddfacc3Sdrh  } {
290fddfacc3Sdrh    lappend res [list $table $rowid $fkid $parent]
2917d22a4d7Sdrh  }
292fddfacc3Sdrh  lsort $res
293fddfacc3Sdrh} {{c13 1 0 p3} {c13 2 0 p3} {c13 3 0 p3} {c13 4 0 p3} {c13 5 0 p3} {c13 6 0 p3} {c14 1 0 p4} {c14 3 0 p4} {c14 6 0 p4}}
2947d22a4d7Sdrhdo_test fkey5-7.2 {
2957d22a4d7Sdrh  db eval {
2967d22a4d7Sdrh    PRAGMA foreign_key_check(c14);
2977d22a4d7Sdrh  }
2987d22a4d7Sdrh} {c14 1 p4 0 c14 3 p4 0 c14 6 p4 0}
2997d22a4d7Sdrhdo_test fkey5-7.3 {
3007d22a4d7Sdrh  db eval {
3017d22a4d7Sdrh    PRAGMA foreign_key_check(c13);
3027d22a4d7Sdrh  }
3037d22a4d7Sdrh} {c13 1 p3 0 c13 2 p3 0 c13 3 p3 0 c13 4 p3 0 c13 5 p3 0 c13 6 p3 0}
3047d22a4d7Sdrh
3057d22a4d7Sdrhdo_test fkey5-8.0 {
3067d22a4d7Sdrh  db eval {
3077d22a4d7Sdrh    DELETE FROM c13;
3087d22a4d7Sdrh    DELETE FROM c14;
3097d22a4d7Sdrh    INSERT INTO c19 VALUES('alpha','abc');
3107d22a4d7Sdrh    PRAGMA foreign_key_check(c19);
3117d22a4d7Sdrh  }
3127d22a4d7Sdrh} {c19 1 p5 0}
3137d22a4d7Sdrhdo_test fkey5-8.1 {
3147d22a4d7Sdrh  db eval {
3157d22a4d7Sdrh    DELETE FROM c19;
3167d22a4d7Sdrh    INSERT INTO c19 VALUES('Alpha','abc');
3177d22a4d7Sdrh    PRAGMA foreign_key_check(c19);
3187d22a4d7Sdrh  }
3197d22a4d7Sdrh} {}
3207d22a4d7Sdrhdo_test fkey5-8.2 {
3217d22a4d7Sdrh  db eval {
3227d22a4d7Sdrh    INSERT INTO c20 VALUES('Alpha','abc');
3237d22a4d7Sdrh    PRAGMA foreign_key_check(c20);
3247d22a4d7Sdrh  }
3257d22a4d7Sdrh} {c20 1 p5 0}
3267d22a4d7Sdrhdo_test fkey5-8.3 {
3277d22a4d7Sdrh  db eval {
3287d22a4d7Sdrh    DELETE FROM c20;
3297d22a4d7Sdrh    INSERT INTO c20 VALUES('abc','Alpha');
3307d22a4d7Sdrh    PRAGMA foreign_key_check(c20);
3317d22a4d7Sdrh  }
3327d22a4d7Sdrh} {}
3337d22a4d7Sdrhdo_test fkey5-8.4 {
3347d22a4d7Sdrh  db eval {
3357d22a4d7Sdrh    INSERT INTO c21 VALUES('alpha','abc    ');
3367d22a4d7Sdrh    PRAGMA foreign_key_check(c21);
3377d22a4d7Sdrh  }
3387d22a4d7Sdrh} {}
3397d22a4d7Sdrhdo_test fkey5-8.5 {
3407d22a4d7Sdrh  db eval {
3417d22a4d7Sdrh    DELETE FROM c21;
3427d22a4d7Sdrh    INSERT INTO c19 VALUES('Alpha','abc');
3437d22a4d7Sdrh    PRAGMA foreign_key_check(c21);
3447d22a4d7Sdrh  }
3457d22a4d7Sdrh} {}
3467d22a4d7Sdrhdo_test fkey5-8.6 {
3477d22a4d7Sdrh  db eval {
3487d22a4d7Sdrh    INSERT INTO c22 VALUES('Alpha','abc');
3497d22a4d7Sdrh    PRAGMA foreign_key_check(c22);
3507d22a4d7Sdrh  }
3517d22a4d7Sdrh} {c22 1 p6 0}
3527d22a4d7Sdrhdo_test fkey5-8.7 {
3537d22a4d7Sdrh  db eval {
3547d22a4d7Sdrh    DELETE FROM c22;
3557d22a4d7Sdrh    INSERT INTO c22 VALUES('abc  ','ALPHA');
3567d22a4d7Sdrh    PRAGMA foreign_key_check(c22);
3577d22a4d7Sdrh  }
3587d22a4d7Sdrh} {}
3597d22a4d7Sdrh
3607d22a4d7Sdrh
3615e87830fSdan#-------------------------------------------------------------------------
3625e87830fSdan# Tests 9.* verify that missing parent tables are handled correctly.
3635e87830fSdan#
3645e87830fSdando_execsql_test 9.1.1 {
3655e87830fSdan  CREATE TABLE k1(x REFERENCES s1);
3665e87830fSdan  PRAGMA foreign_key_check(k1);
3675e87830fSdan} {}
3685e87830fSdando_execsql_test 9.1.2 {
3695e87830fSdan  INSERT INTO k1 VALUES(NULL);
3705e87830fSdan  PRAGMA foreign_key_check(k1);
3715e87830fSdan} {}
3725e87830fSdando_execsql_test 9.1.3 {
3735e87830fSdan  INSERT INTO k1 VALUES(1);
3745e87830fSdan  PRAGMA foreign_key_check(k1);
3755e87830fSdan} {k1 2 s1 0}
3765e87830fSdan
3775e87830fSdando_execsql_test 9.2.1 {
3785e87830fSdan  CREATE TABLE k2(x, y, FOREIGN KEY(x, y) REFERENCES s1(a, b));
3795e87830fSdan  PRAGMA foreign_key_check(k2);
3805e87830fSdan} {}
3815e87830fSdando_execsql_test 9.2 {
3825e87830fSdan  INSERT INTO k2 VALUES(NULL, 'five');
3835e87830fSdan  PRAGMA foreign_key_check(k2);
3845e87830fSdan} {}
3855e87830fSdando_execsql_test 9.3 {
3865e87830fSdan  INSERT INTO k2 VALUES('one', NULL);
3875e87830fSdan  PRAGMA foreign_key_check(k2);
3885e87830fSdan} {}
3895e87830fSdando_execsql_test 9.4 {
3905e87830fSdan  INSERT INTO k2 VALUES('six', 'seven');
3915e87830fSdan  PRAGMA foreign_key_check(k2);
3925e87830fSdan} {k2 3 s1 0}
3935e87830fSdan
394940464b1Sdan#-------------------------------------------------------------------------
395940464b1Sdan# Test using a WITHOUT ROWID table as the child table with an INTEGER
396940464b1Sdan# PRIMARY KEY as the parent key.
397940464b1Sdan#
398940464b1Sdanreset_db
399940464b1Sdando_execsql_test 10.1 {
400940464b1Sdan  CREATE TABLE p30 (id INTEGER PRIMARY KEY);
401940464b1Sdan  CREATE TABLE IF NOT EXISTS c30 (
402940464b1Sdan      line INTEGER,
403940464b1Sdan      master REFERENCES p30(id),
404940464b1Sdan      PRIMARY KEY(master)
405940464b1Sdan  ) WITHOUT ROWID;
406940464b1Sdan
407940464b1Sdan  INSERT INTO p30 (id) VALUES (1);
408940464b1Sdan  INSERT INTO c30 (master, line)  VALUES (1, 999);
409940464b1Sdan}
410940464b1Sdando_execsql_test 10.2 {
411940464b1Sdan  PRAGMA foreign_key_check;
412940464b1Sdan}
413f8a2e8c2Sdrh# EVIDENCE-OF: R-00471-55166 The second column is the rowid of the row
414f8a2e8c2Sdrh# that contains the invalid REFERENCES clause, or NULL if the child
415f8a2e8c2Sdrh# table is a WITHOUT ROWID table.
416940464b1Sdando_execsql_test 10.3 {
417940464b1Sdan  INSERT INTO c30 VALUES(45, 45);
418940464b1Sdan  PRAGMA foreign_key_check;
419940464b1Sdan} {c30 {} p30 0}
4207d22a4d7Sdrh
4214bee5599Sdan#-------------------------------------------------------------------------
4224bee5599Sdan# Test "foreign key mismatch" errors.
4234bee5599Sdan#
4244bee5599Sdanreset_db
4254bee5599Sdando_execsql_test 11.0 {
4264bee5599Sdan  CREATE TABLE tt(y);
4274bee5599Sdan  CREATE TABLE c11(x REFERENCES tt(y));
4284bee5599Sdan}
4294bee5599Sdando_catchsql_test 11.1 {
4304bee5599Sdan  PRAGMA foreign_key_check;
4314bee5599Sdan} {1 {foreign key mismatch - "c11" referencing "tt"}}
4324bee5599Sdan
433ec1650a2Sdrh# 2020-07-03 Bug in foreign_key_check discovered while working on the
434ec1650a2Sdrh# forum reports that pragma_foreign_key_check does not accept an argument:
435ec1650a2Sdrh# If two separate schemas seem to reference one another, that causes
436ec1650a2Sdrh# problems for foreign_key_check.
437ec1650a2Sdrh#
438ec1650a2Sdrhreset_db
439ec1650a2Sdrhdo_execsql_test 12.0 {
440ec1650a2Sdrh  ATTACH ':memory:' as aux;
441ec1650a2Sdrh  CREATE TABLE aux.t1(a INTEGER PRIMARY KEY, b TEXT REFERENCES t2);
442ec1650a2Sdrh  CREATE TABLE main.t2(x TEXT PRIMARY KEY, y INT);
443ec1650a2Sdrh  INSERT INTO main.t2 VALUES('abc',11),('def',22),('xyz',99);
444ec1650a2Sdrh  INSERT INTO aux.t1 VALUES(5,'abc'),(7,'xyz'),(9,'oops');
445ec1650a2Sdrh  PRAGMA foreign_key_check=t1;
446ec1650a2Sdrh} {t1 5 t2 0 t1 7 t2 0 t1 9 t2 0}
447ec1650a2Sdrhdo_execsql_test 12.1 {
448ec1650a2Sdrh  CREATE TABLE aux.t2(x TEXT PRIMARY KEY, y INT);
449ec1650a2Sdrh  INSERT INTO aux.t2 VALUES('abc',11),('def',22),('xyz',99);
450ec1650a2Sdrh  PRAGMA foreign_key_check=t1;
451ec1650a2Sdrh} {t1 9 t2 0}
452ec1650a2Sdrh
4534b849b0bSdrh# 2020-07-03: the pragma_foreign_key_check virtual table should
4544b849b0bSdrh# accept arguments for the table name and/or schema name.
4554b849b0bSdrh#
456*47d38e24Sdanifcapable vtab {
4574b849b0bSdrh  do_execsql_test 13.0 {
4584b849b0bSdrh    SELECT *, 'x' FROM pragma_foreign_key_check('t1');
4594b849b0bSdrh  } {t1 9 t2 0 x}
4604b849b0bSdrh  do_catchsql_test 13.1 {
4614b849b0bSdrh    SELECT *, 'x' FROM pragma_foreign_key_check('t1','main');
4624b849b0bSdrh  } {1 {no such table: main.t1}}
4634b849b0bSdrh  do_execsql_test 13.2 {
4644b849b0bSdrh    SELECT *, 'x' FROM pragma_foreign_key_check('t1','aux');
4654b849b0bSdrh  } {t1 9 t2 0 x}
466*47d38e24Sdan}
4674b849b0bSdrh
468*47d38e24Sdanifcapable vtab {
4694b849b0bSdrh  reset_db
4704b849b0bSdrh    do_execsql_test 13.10 {
4714b849b0bSdrh      PRAGMA foreign_keys=OFF;
4724b849b0bSdrh      CREATE TABLE t1(a INTEGER PRIMARY KEY, b TEXT REFERENCES t2);
4734b849b0bSdrh      CREATE TABLE t2(x TEXT PRIMARY KEY, y INT);
4744b849b0bSdrh      CREATE TABLE t3(w TEXT, z INT REFERENCES t1);
4754b849b0bSdrh      INSERT INTO t2 VALUES('abc',11),('def',22),('xyz',99);
4764b849b0bSdrh      INSERT INTO t1 VALUES(5,'abc'),(7,'xyz'),(9,'oops');
4774b849b0bSdrh      INSERT INTO t3 VALUES(11,7),(22,19);
4784b849b0bSdrh    } {}
4794b849b0bSdrh  do_execsql_test 13.11 {
4804b849b0bSdrh    SELECT x.*, '|'
4814b849b0bSdrh      FROM sqlite_schema, pragma_foreign_key_check(name) AS x
4824b849b0bSdrh      WHERE type='table'
4834b849b0bSdrh      ORDER BY x."table";
4844b849b0bSdrh  } {t1 9 t2 0 | t3 2 t1 0 |}
4854b849b0bSdrh  do_execsql_test 13.12 {
4864b849b0bSdrh    SELECT *, '|'
4874b849b0bSdrh      FROM pragma_foreign_key_check AS x
4884b849b0bSdrh      ORDER BY x."table";
4894b849b0bSdrh  } {t1 9 t2 0 | t3 2 t1 0 |}
490*47d38e24Sdan}
491ec1650a2Sdrh
4927d22a4d7Sdrhfinish_test
493