]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Added test cases for PRAGMA foreign_key_check. Fixed a bug that appears
authordrh <drh@noemail.net>
Mon, 17 Dec 2012 22:32:14 +0000 (22:32 +0000)
committerdrh <drh@noemail.net>
Mon, 17 Dec 2012 22:32:14 +0000 (22:32 +0000)
when the column order of the child and parent differ.

FossilOrigin-Name: 25411f83f99803e39feee368703fd20b4ade8eeb

manifest
manifest.uuid
src/pragma.c
test/fkey5.test [new file with mode: 0644]

index afed8ed5855ba4b4294486aa799a55d1f9b4d789..c6b7e5c563f29540fa96871607680b6ef0d9fad7 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Add\sto\sthe\sforeign_key_check\spragma\san\sextra\soutput\scolumn\s"parent"\sthat\ncontains\sthe\sname\sof\sthe\sparent\stable\sfor\sthe\sconstraint\sthat\sfailed.
-D 2012-12-17T20:57:15.968
+C Added\stest\scases\sfor\sPRAGMA\sforeign_key_check.\s\sFixed\sa\sbug\sthat\sappears\nwhen\sthe\scolumn\sorder\sof\sthe\schild\sand\sparent\sdiffer.
+D 2012-12-17T22:32:14.381
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in 690d441a758cbffd13e814dc2724a721a6ebd400
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -168,7 +168,7 @@ F src/parse.y c2b4a6454ad77299b1443e2c483a560a9f16e724
 F src/pcache.c f8043b433a57aba85384a531e3937a804432a346
 F src/pcache.h 1b5dcc3dc8103d03e625b177023ee67764fa6b7c
 F src/pcache1.c 9fd22671c270b35131ef480bbc00392b8b5f8ab9
-F src/pragma.c c6e9ed9de9a4019cf2a049c78833b58c9a535fae
+F src/pragma.c 312d9ea0d9b98583514f6f8e92cb7e8f526ff4c6
 F src/prepare.c 931ad0d852a0df48f79adcba6ce79ca5f475625c
 F src/printf.c 4a9f882f1c1787a8b494a2987765acf9d97ac21f
 F src/random.c cd4a67b3953b88019f8cd4ccd81394a8ddfaba50
@@ -412,6 +412,7 @@ F test/fkey1.test 01c7de578e11747e720c2d9aeef27f239853c4da
 F test/fkey2.test 5aa44e7153928a1f002803f94aaab4c76a7ceac2
 F test/fkey3.test 5ec899d12b13bcf1e9ef40eff7fb692fdb91392e
 F test/fkey4.test c6c8f9f9be885f95c85c7bceb26f243ad906fd49
+F test/fkey5.test 0bf64f2d19ad80433ca0b24edbf604a18b353d5f
 F test/fkey_malloc.test bb74c9cb8f8fceed03b58f8a7ef2df98520bbd51
 F test/format4.test 1f0cac8ff3895e9359ed87e41aaabee982a812eb
 F test/fts-9fd058691.test 78b887e30ae6816df0e1fed6259de4b5a64ad33c
@@ -1025,7 +1026,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381
 F tool/win/sqlite.vsix 97894c2790eda7b5bce3cc79cb2a8ec2fde9b3ac
-P 0f9963526c299757ff95c153fb05a67cddb6af28
-R 09c7edec1884f69df7657ebe62d33418
+P 97f7f7377259ecf562019f62ebed0897cfae236e
+R e825c339f2d84a956eae42ef385eea53
 U drh
-Z bca5ca1c6b7b99510bae2f63ea5f8e69
+Z 0751ac95be4abd3e28a98e71458d0c00
index 8fe083b23b4018083f47ad8303114f82a3807b1e..57652e09715796a38a55952c9e21d547d811a15d 100644 (file)
@@ -1 +1 @@
-97f7f7377259ecf562019f62ebed0897cfae236e
\ No newline at end of file
+25411f83f99803e39feee368703fd20b4ade8eeb
\ No newline at end of file
index a34ececddbd264ad065d72d31966df505a78fa8c..9a20607039cf1d74523b2705899fa26e0c2c3580 100644 (file)
@@ -1129,6 +1129,7 @@ void sqlite3Pragma(
     int regRow;            /* Registers to hold a row from pTab */
     int addrTop;           /* Top of a loop checking foreign keys */
     int addrOk;            /* Jump here if the key is OK */
+    int *aiCols;           /* child to parent column mapping */
 
     if( sqlite3ReadSchema(pParse) ) goto pragma_out;
     regResult = pParse->nMem+1;
@@ -1183,7 +1184,8 @@ void sqlite3Pragma(
         pParent = sqlite3LocateTable(pParse, 0, pFK->zTo, zDb);
         assert( pParent!=0 );
         pIdx = 0;
-        x = sqlite3FkLocateIndex(pParse, pParent, pFK, &pIdx, 0);
+        aiCols = 0;
+        x = sqlite3FkLocateIndex(pParse, pParent, pFK, &pIdx, &aiCols);
         assert( x==0 );
         addrOk = sqlite3VdbeMakeLabel(v);
         if( pIdx==0 ){
@@ -1202,8 +1204,8 @@ void sqlite3Pragma(
           sqlite3VdbeJumpHere(v, sqlite3VdbeCurrentAddr(v)-2);
         }else{
           for(j=0; j<pFK->nCol; j++){
-            sqlite3ExprCodeGetColumnOfTable(v, pTab, 0, pFK->aCol[j].iFrom,
-                                            regRow+j);
+            sqlite3ExprCodeGetColumnOfTable(v, pTab, 0,
+                            aiCols ? aiCols[j] : pFK->aCol[0].iFrom, regRow+j);
             sqlite3VdbeAddOp2(v, OP_IsNull, regRow+j, addrOk);
           }
           sqlite3VdbeAddOp3(v, OP_MakeRecord, regRow, pFK->nCol, regKey);
@@ -1217,6 +1219,7 @@ void sqlite3Pragma(
         sqlite3VdbeAddOp2(v, OP_Integer, i-1, regResult+3);
         sqlite3VdbeAddOp2(v, OP_ResultRow, regResult, 4);
         sqlite3VdbeResolveLabel(v, addrOk);
+        sqlite3DbFree(db, aiCols);
       }
       sqlite3VdbeAddOp2(v, OP_Next, 0, addrTop+1);
       sqlite3VdbeJumpHere(v, addrTop);
diff --git a/test/fkey5.test b/test/fkey5.test
new file mode 100644 (file)
index 0000000..40a1a5e
--- /dev/null
@@ -0,0 +1,310 @@
+# 2012 December 17
+#
+# The author disclaims copyright to this source code.  In place of
+# a legal notice, here is a blessing:
+#
+#    May you do good and not evil.
+#    May you find forgiveness for yourself and forgive others.
+#    May you share freely, never taking more than you give.
+#
+#***********************************************************************
+# This file implements regression tests for SQLite library.
+#
+# This file tests the PRAGMA foreign_key_check command.
+#
+
+set testdir [file dirname $argv0]
+source $testdir/tester.tcl
+
+ifcapable {!foreignkey} {
+  finish_test
+  return
+}
+
+do_test fkey5-1.1 {
+  db eval {
+    CREATE TABLE p1(a INTEGER PRIMARY KEY); INSERT INTO p1 VALUES(88),(89);
+    CREATE TABLE p2(a INT PRIMARY KEY); INSERT INTO p2 VALUES(77),(78);
+    CREATE TABLE p3(a TEXT PRIMARY KEY);
+    INSERT INTO p3 VALUES(66),(67),('alpha'),('BRAVO');
+    CREATE TABLE p4(a TEXT PRIMARY KEY COLLATE nocase);
+    INSERT INTO p4 VALUES('alpha'),('BRAVO'),('55'),('Delta'),('ECHO');
+    CREATE TABLE p5(a INTEGER PRIMARY KEY, b, c, UNIQUE(b,c));
+    INSERT INTO p5 VALUES(1,'Alpha','abc'),(2,'beta','def');
+    CREATE TABLE p6(a INTEGER PRIMARY KEY, b TEXT COLLATE nocase,
+                    c TEXT COLLATE rtrim, UNIQUE(b,c));
+    INSERT INTO p6 VALUES(1,'Alpha','abc '),(2,'bETA','def    ');
+
+    CREATE TABLE c1(x INTEGER PRIMARY KEY references p1);
+    CREATE TABLE c2(x INTEGER PRIMARY KEY references p2);
+    CREATE TABLE c3(x INTEGER PRIMARY KEY references p3);
+    CREATE TABLE c4(x INTEGER PRIMARY KEY references p4);
+    CREATE TABLE c5(x INT references p1);
+    CREATE TABLE c6(x INT references p2);
+    CREATE TABLE c7(x INT references p3);
+    CREATE TABLE c8(x INT references p4);
+    CREATE TABLE c9(x TEXT UNIQUE references p1);
+    CREATE TABLE c10(x TEXT UNIQUE references p2);
+    CREATE TABLE c11(x TEXT UNIQUE references p3);
+    CREATE TABLE c12(x TEXT UNIQUE references p4);
+    CREATE TABLE c13(x TEXT COLLATE nocase references p3);
+    CREATE TABLE c14(x TEXT COLLATE nocase references p4);
+    CREATE TABLE c15(x, y, FOREIGN KEY(x,y) REFERENCES p5(b,c));
+    CREATE TABLE c16(x, y, FOREIGN KEY(x,y) REFERENCES p5(c,b));
+    CREATE TABLE c17(x, y, FOREIGN KEY(x,y) REFERENCES p6(b,c));
+    CREATE TABLE c18(x, y, FOREIGN KEY(x,y) REFERENCES p6(c,b));
+    CREATE TABLE c19(x TEXT COLLATE nocase, y TEXT COLLATE rtrim,
+                     FOREIGN KEY(x,y) REFERENCES p5(b,c));
+    CREATE TABLE c20(x TEXT COLLATE nocase, y TEXT COLLATE rtrim,
+                     FOREIGN KEY(x,y) REFERENCES p5(c,b));
+    CREATE TABLE c21(x TEXT COLLATE nocase, y TEXT COLLATE rtrim,
+                     FOREIGN KEY(x,y) REFERENCES p6(b,c));
+    CREATE TABLE c22(x TEXT COLLATE nocase, y TEXT COLLATE rtrim,
+                     FOREIGN KEY(x,y) REFERENCES p6(c,b));
+
+    PRAGMA foreign_key_check;
+  }
+} {}    
+do_test fkey5-1.2 {
+  db eval {
+    INSERT INTO c1 VALUES(90),(87),(88);
+    PRAGMA foreign_key_check;
+  }
+} {c1 87 p1 0 c1 90 p1 0}
+do_test fkey5-1.3 {
+  db eval {
+    PRAGMA foreign_key_check(c1);
+  }
+} {c1 87 p1 0 c1 90 p1 0}
+do_test fkey5-1.4 {
+  db eval {
+    PRAGMA foreign_key_check(c2);
+  }
+} {}
+
+do_test fkey5-2.0 {
+  db eval {
+    INSERT INTO c5 SELECT x FROM c1;
+    DELETE FROM c1;
+    PRAGMA foreign_key_check;
+  }
+} {c5 1 p1 0 c5 3 p1 0}
+do_test fkey5-2.1 {
+  db eval {
+    PRAGMA foreign_key_check(c5);
+  }
+} {c5 1 p1 0 c5 3 p1 0}
+do_test fkey5-2.2 {
+  db eval {
+    PRAGMA foreign_key_check(c1);
+  }
+} {}
+
+do_test fkey5-3.0 {
+  db eval {
+    INSERT INTO c9 SELECT x FROM c5;
+    DELETE FROM c5;
+    PRAGMA foreign_key_check;
+  }
+} {c9 1 p1 0 c9 3 p1 0}
+do_test fkey5-3.1 {
+  db eval {
+    PRAGMA foreign_key_check(c9);
+  }
+} {c9 1 p1 0 c9 3 p1 0}
+do_test fkey5-3.2 {
+  db eval {
+    PRAGMA foreign_key_check(c5);
+  }
+} {}
+
+do_test fkey5-4.0 {
+  db eval {
+    DELETE FROM c9;
+    INSERT INTO c2 VALUES(79),(77),(76);
+    PRAGMA foreign_key_check;
+  }
+} {c2 76 p2 0 c2 79 p2 0}
+do_test fkey5-4.1 {
+  db eval {
+    PRAGMA foreign_key_check(c2);
+  }
+} {c2 76 p2 0 c2 79 p2 0}
+do_test fkey5-4.2 {
+  db eval {
+    INSERT INTO c6 SELECT x FROM c2;
+    DELETE FROM c2;
+    PRAGMA foreign_key_check;
+  }
+} {c6 1 p2 0 c6 3 p2 0}
+do_test fkey5-4.3 {
+  db eval {
+    PRAGMA foreign_key_check(c6);
+  }
+} {c6 1 p2 0 c6 3 p2 0}
+do_test fkey5-4.4 {
+  db eval {
+    INSERT INTO c10 SELECT x FROM c6;
+    DELETE FROM c6;
+    PRAGMA foreign_key_check;
+  }
+} {c10 1 p2 0 c10 3 p2 0}
+do_test fkey5-4.5 {
+  db eval {
+    PRAGMA foreign_key_check(c10);
+  }
+} {c10 1 p2 0 c10 3 p2 0}
+
+do_test fkey5-5.0 {
+  db eval {
+    DELETE FROM c10;
+    INSERT INTO c3 VALUES(68),(67),(65);
+    PRAGMA foreign_key_check;
+  }
+} {c3 65 p3 0 c3 68 p3 0}
+do_test fkey5-5.1 {
+  db eval {
+    PRAGMA foreign_key_check(c3);
+  }
+} {c3 65 p3 0 c3 68 p3 0}
+do_test fkey5-5.2 {
+  db eval {
+    INSERT INTO c7 SELECT x FROM c3;
+    INSERT INTO c7 VALUES('Alpha'),('alpha'),('foxtrot');
+    DELETE FROM c3;
+    PRAGMA foreign_key_check;
+  }
+} {c7 1 p3 0 c7 3 p3 0 c7 4 p3 0 c7 6 p3 0}
+do_test fkey5-5.3 {
+  db eval {
+    PRAGMA foreign_key_check(c7);
+  }
+} {c7 1 p3 0 c7 3 p3 0 c7 4 p3 0 c7 6 p3 0}
+do_test fkey5-5.4 {
+  db eval {
+    INSERT INTO c11 SELECT x FROM c7;
+    DELETE FROM c7;
+    PRAGMA foreign_key_check;
+  }
+} {c11 1 p3 0 c11 3 p3 0 c11 4 p3 0 c11 6 p3 0}
+do_test fkey5-5.5 {
+  db eval {
+    PRAGMA foreign_key_check(c11);
+  }
+} {c11 1 p3 0 c11 3 p3 0 c11 4 p3 0 c11 6 p3 0}
+
+do_test fkey5-6.0 {
+  db eval {
+    DELETE FROM c11;
+    INSERT INTO c4 VALUES(54),(55),(56);
+    PRAGMA foreign_key_check;
+  }
+} {c4 54 p4 0 c4 56 p4 0}
+do_test fkey5-6.1 {
+  db eval {
+    PRAGMA foreign_key_check(c4);
+  }
+} {c4 54 p4 0 c4 56 p4 0}
+do_test fkey5-6.2 {
+  db eval {
+    INSERT INTO c8 SELECT x FROM c4;
+    INSERT INTO c8 VALUES('Alpha'),('ALPHA'),('foxtrot');
+    DELETE FROM c4;
+    PRAGMA foreign_key_check;
+  }
+} {c8 1 p4 0 c8 3 p4 0 c8 6 p4 0}
+do_test fkey5-6.3 {
+  db eval {
+    PRAGMA foreign_key_check(c8);
+  }
+} {c8 1 p4 0 c8 3 p4 0 c8 6 p4 0}
+do_test fkey5-6.4 {
+  db eval {
+    INSERT INTO c12 SELECT x FROM c8;
+    DELETE FROM c8;
+    PRAGMA foreign_key_check;
+  }
+} {c12 1 p4 0 c12 3 p4 0 c12 6 p4 0}
+do_test fkey5-6.5 {
+  db eval {
+    PRAGMA foreign_key_check(c12);
+  }
+} {c12 1 p4 0 c12 3 p4 0 c12 6 p4 0}
+
+do_test fkey5-7.1 {
+  db eval {
+    INSERT OR IGNORE INTO c13 SELECT * FROM c12;
+    INSERT OR IGNORE INTO C14 SELECT * FROM c12;
+    DELETE FROM c12;
+    PRAGMA foreign_key_check;
+  }
+} {c14 1 p4 0 c14 3 p4 0 c14 6 p4 0 c13 1 p3 0 c13 2 p3 0 c13 3 p3 0 c13 4 p3 0 c13 5 p3 0 c13 6 p3 0}
+do_test fkey5-7.2 {
+  db eval {
+    PRAGMA foreign_key_check(c14);
+  }
+} {c14 1 p4 0 c14 3 p4 0 c14 6 p4 0}
+do_test fkey5-7.3 {
+  db eval {
+    PRAGMA foreign_key_check(c13);
+  }
+} {c13 1 p3 0 c13 2 p3 0 c13 3 p3 0 c13 4 p3 0 c13 5 p3 0 c13 6 p3 0}
+
+do_test fkey5-8.0 {
+  db eval {
+    DELETE FROM c13;
+    DELETE FROM c14;
+    INSERT INTO c19 VALUES('alpha','abc');
+    PRAGMA foreign_key_check(c19);
+  }
+} {c19 1 p5 0}
+do_test fkey5-8.1 {
+  db eval {
+    DELETE FROM c19;
+    INSERT INTO c19 VALUES('Alpha','abc');
+    PRAGMA foreign_key_check(c19);
+  }
+} {}
+do_test fkey5-8.2 {
+  db eval {
+    INSERT INTO c20 VALUES('Alpha','abc');
+    PRAGMA foreign_key_check(c20);
+  }
+} {c20 1 p5 0}
+do_test fkey5-8.3 {
+  db eval {
+    DELETE FROM c20;
+    INSERT INTO c20 VALUES('abc','Alpha');
+    PRAGMA foreign_key_check(c20);
+  }
+} {}
+do_test fkey5-8.4 {
+  db eval {
+    INSERT INTO c21 VALUES('alpha','abc    ');
+    PRAGMA foreign_key_check(c21);
+  }
+} {}
+do_test fkey5-8.5 {
+  db eval {
+    DELETE FROM c21;
+    INSERT INTO c19 VALUES('Alpha','abc');
+    PRAGMA foreign_key_check(c21);
+  }
+} {}
+do_test fkey5-8.6 {
+  db eval {
+    INSERT INTO c22 VALUES('Alpha','abc');
+    PRAGMA foreign_key_check(c22);
+  }
+} {c22 1 p6 0}
+do_test fkey5-8.7 {
+  db eval {
+    DELETE FROM c22;
+    INSERT INTO c22 VALUES('abc  ','ALPHA');
+    PRAGMA foreign_key_check(c22);
+  }
+} {}
+
+
+
+finish_test