]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
In "PRAGMA foreign_key_check", treat missing parent tables as empty (instead of as... fkc-missing-parent-tables
authordan <dan@noemail.net>
Sat, 12 Oct 2013 19:06:48 +0000 (19:06 +0000)
committerdan <dan@noemail.net>
Sat, 12 Oct 2013 19:06:48 +0000 (19:06 +0000)
FossilOrigin-Name: 8c13a7fd738e5441af370537649b0bfa97679cda

manifest
manifest.uuid
src/pragma.c
test/fkey5.test

index 10577d4ef527ed6f49951f2d08345db489db3f40..c7e0df684422822c905ef41aa853268ee3355b5d 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\shandling\sof\s"DROP\sTABLE"\scommands\swhen\s"PRAGMA\sdefer_foreign_keys=1"\sis\sset.
-D 2013-10-12T15:12:43.761
+C In\s"PRAGMA\sforeign_key_check",\streat\smissing\sparent\stables\sas\sempty\s(instead\sof\sas\serrors).
+D 2013-10-12T19:06:48.154
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in e2d28ec95bd17ab4f3b6ee40b7102e9d7a0857b9
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -211,7 +211,7 @@ F src/parse.y a97566d6da75075589a7c716d1bda14b586cf8da
 F src/pcache.c f8043b433a57aba85384a531e3937a804432a346
 F src/pcache.h a5e4f5d9f5d592051d91212c5949517971ae6222
 F src/pcache1.c a467393909a4ed7ca9de066d85ba5c5b04a5be63
-F src/pragma.c f4ff6e29c316d06bf7dffca0c8cee7c229cae42e
+F src/pragma.c 24fb88e294ff7cd5bd1859f88503349ce92aa187
 F src/prepare.c fa6988589f39af8504a61731614cd4f6ae71554f
 F src/printf.c da9119eb31a187a4b99f60aa4a225141c0ebb74b
 F src/random.c 0b2dbc37fdfbfa6bd455b091dfcef5bdb32dba68
@@ -462,7 +462,7 @@ F test/fkey1.test e1d1fa84cde579185ea01358436839703e415a5b
 F test/fkey2.test 06e0b4cc9e1b3271ae2ae6feeb19755468432111
 F test/fkey3.test 5ec899d12b13bcf1e9ef40eff7fb692fdb91392e
 F test/fkey4.test 86446017011273aad8f9a99c1a65019e7bd9ca9d
-F test/fkey5.test 2b8c761ad23bb6a95b9cf8366c9a982a80a439c2
+F test/fkey5.test 8a1fde4e7721ae00b05b3178888833726ca2df8d
 F test/fkey6.test 18e8c024d39f68f8d4bb1177c992bcffdc273464
 F test/fkey7.test e31d0e71a41c1d29349a16448d6c420e2c53a8fc
 F test/fkey_malloc.test bb74c9cb8f8fceed03b58f8a7ef2df98520bbd51
@@ -1123,7 +1123,10 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01
 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff
-P 67e28a11de97e97889f0c0f41c05605721c605c1
-R dc1f4dd0df343cdf7a68b757db650d93
+P 27001356ed8201529b3f31d4313f2010f1b4e1b1
+R d979b0883c0e5512213e1d7af1d7ac15
+T *branch * fkc-missing-parent-tables
+T *sym-fkc-missing-parent-tables *
+T -sym-trunk *
 U dan
-Z abee286031badbf2a2b4e2d1bb40e0a3
+Z 1f7e86e642b676f584ebb1b861caf588
index 2f25de0eb8ac20b4ce72c394d6a36c5c2a9d3c4b..bf1535ba3cdb6760cc87bbce72fe2da0901e8f6e 100644 (file)
@@ -1 +1 @@
-27001356ed8201529b3f31d4313f2010f1b4e1b1
\ No newline at end of file
+8c13a7fd738e5441af370537649b0bfa97679cda
\ No newline at end of file
index 969af6af343cd46c4070f9bbc897ac39cd033fc6..60f9d8d92457d0caa8484534dbb0504aa5181ffa 100644 (file)
@@ -1610,8 +1610,8 @@ void sqlite3Pragma(
       sqlite3VdbeAddOp4(v, OP_String8, 0, regResult, 0, pTab->zName,
                         P4_TRANSIENT);
       for(i=1, pFK=pTab->pFKey; pFK; i++, pFK=pFK->pNextFrom){
-        pParent = sqlite3LocateTable(pParse, 0, pFK->zTo, zDb);
-        if( pParent==0 ) break;
+        pParent = sqlite3FindTable(db, pFK->zTo, zDb);
+        if( pParent==0 ) continue;
         pIdx = 0;
         sqlite3TableLock(pParse, iDb, pParent->tnum, 0, pParent->zName);
         x = sqlite3FkLocateIndex(pParse, pParent, pFK, &pIdx, 0);
@@ -1628,18 +1628,20 @@ void sqlite3Pragma(
           break;
         }
       }
+      assert( pParse->nErr>0 || pFK==0 );
       if( pFK ) break;
       if( pParse->nTab<i ) pParse->nTab = i;
       addrTop = sqlite3VdbeAddOp1(v, OP_Rewind, 0);
       for(i=1, pFK=pTab->pFKey; pFK; i++, pFK=pFK->pNextFrom){
-        pParent = sqlite3LocateTable(pParse, 0, pFK->zTo, zDb);
-        assert( pParent!=0 );
+        pParent = sqlite3FindTable(db, pFK->zTo, zDb);
         pIdx = 0;
         aiCols = 0;
-        x = sqlite3FkLocateIndex(pParse, pParent, pFK, &pIdx, &aiCols);
-        assert( x==0 );
+        if( pParent ){
+          x = sqlite3FkLocateIndex(pParse, pParent, pFK, &pIdx, &aiCols);
+          assert( x==0 );
+        }
         addrOk = sqlite3VdbeMakeLabel(v);
-        if( pIdx==0 ){
+        if( pParent && pIdx==0 ){
           int iKey = pFK->aCol[0].iFrom;
           assert( iKey>=0 && iKey<pTab->nCol );
           if( iKey!=pTab->iPKey ){
@@ -1657,13 +1659,15 @@ void sqlite3Pragma(
         }else{
           for(j=0; j<pFK->nCol; j++){
             sqlite3ExprCodeGetColumnOfTable(v, pTab, 0,
-                            aiCols ? aiCols[j] : pFK->aCol[0].iFrom, regRow+j);
+                            aiCols ? aiCols[j] : pFK->aCol[j].iFrom, regRow+j);
             sqlite3VdbeAddOp2(v, OP_IsNull, regRow+j, addrOk);
           }
-          sqlite3VdbeAddOp3(v, OP_MakeRecord, regRow, pFK->nCol, regKey);
-          sqlite3VdbeChangeP4(v, -1,
-                   sqlite3IndexAffinityStr(v,pIdx), P4_TRANSIENT);
-          sqlite3VdbeAddOp4Int(v, OP_Found, i, addrOk, regKey, 0);
+          if( pParent ){
+            sqlite3VdbeAddOp3(v, OP_MakeRecord, regRow, pFK->nCol, regKey);
+            sqlite3VdbeChangeP4(v, -1,
+                     sqlite3IndexAffinityStr(v,pIdx), P4_TRANSIENT);
+            sqlite3VdbeAddOp4Int(v, OP_Found, i, addrOk, regKey, 0);
+          }
         }
         sqlite3VdbeAddOp2(v, OP_Rowid, 0, regResult+1);
         sqlite3VdbeAddOp4(v, OP_String8, 0, regResult+2, 0, 
index 16efc266859c73c3b7451c5b13e11993cd9010a0..5aa8b1d4b7aa7ecfa1023be9e317ea0ab63e250c 100644 (file)
@@ -17,6 +17,7 @@
 
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
+set testprefix fkey5
 
 ifcapable {!foreignkey} {
   finish_test
@@ -325,5 +326,38 @@ do_test fkey5-8.7 {
 } {}
 
 
+#-------------------------------------------------------------------------
+# Tests 9.* verify that missing parent tables are handled correctly.
+#
+do_execsql_test 9.1.1 {
+  CREATE TABLE k1(x REFERENCES s1);
+  PRAGMA foreign_key_check(k1);
+} {}
+do_execsql_test 9.1.2 {
+  INSERT INTO k1 VALUES(NULL);
+  PRAGMA foreign_key_check(k1);
+} {}
+do_execsql_test 9.1.3 {
+  INSERT INTO k1 VALUES(1);
+  PRAGMA foreign_key_check(k1);
+} {k1 2 s1 0}
+
+do_execsql_test 9.2.1 {
+  CREATE TABLE k2(x, y, FOREIGN KEY(x, y) REFERENCES s1(a, b));
+  PRAGMA foreign_key_check(k2);
+} {}
+do_execsql_test 9.2 {
+  INSERT INTO k2 VALUES(NULL, 'five');
+  PRAGMA foreign_key_check(k2);
+} {}
+do_execsql_test 9.3 {
+  INSERT INTO k2 VALUES('one', NULL);
+  PRAGMA foreign_key_check(k2);
+} {}
+do_execsql_test 9.4 {
+  INSERT INTO k2 VALUES('six', 'seven');
+  PRAGMA foreign_key_check(k2);
+} {k2 3 s1 0}
+
 
 finish_test