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