]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix a problem with foreign keys and generated columns discovered by
authordrh <drh@noemail.net>
Sat, 7 Dec 2019 00:22:18 +0000 (00:22 +0000)
committerdrh <drh@noemail.net>
Sat, 7 Dec 2019 00:22:18 +0000 (00:22 +0000)
Manuel Rigger.

FossilOrigin-Name: 27c0fdab1ba4d4993b164eb4b777c63e82aa247c3fa406121dc8ed94970a0b35

manifest
manifest.uuid
src/build.c
src/expr.c
test/gencol1.test

index ffa53fc918fb9cbe10446f52269dcfa2d1b99f5e..089f9bf88f5ddf8427d48177aa76c0bc5e167770 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Early\sdetection\sand\sreporting\sof\stoo\sfew\scolumns\sin\san\srtree\sCREATE\sVIRTUAL\nTABLE\sstatement.
-D 2019-12-06T19:07:44.980
+C Fix\sa\sproblem\swith\sforeign\skeys\sand\sgenerated\scolumns\sdiscovered\sby\nManuel\sRigger.
+D 2019-12-07T00:22:18.329
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -471,7 +471,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6
 F src/btree.c d22498af716953400e314d2d98d1dac3ea5c3b01e0fd243ef9e9b132c74114ec
 F src/btree.h f27a33c49280209a93385e218306c4ee5f46ba8d7649d2f81a7166b282232484
 F src/btreeInt.h 91806f01fd1145a9a86ba3042f25c38d8faf6002701bf5e780742cf88bcff437
-F src/build.c 66b148378024f568108d0d9b6ef9b447ebcc99e1f7ce837b78f19351e6729bbc
+F src/build.c ed6cc3e7e209d92b0ed2fa780c95b1a3aa7ecdd46a97671cfcca95079789bcc9
 F src/callback.c 88615dfc0a82167b65b452b4b305dbf86be77200b3343c6ffc6d03e92a01d181
 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
 F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251
@@ -479,7 +479,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041
 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7
 F src/dbstat.c 6c407e549406c10fde9ac3987f6d734459205239ad370369bc5fcd683084a4fa
 F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4
-F src/expr.c 208f7345cf977ec3ca4804ecb9b22b24171d8da932ad2a658594052904e98b7c
+F src/expr.c 947911a1826673add2311e8650aeaf9c2809706dfaa45fc2445a5ff32f70693d
 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847
 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12
@@ -1022,7 +1022,7 @@ F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8
 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14
 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536
 F test/gcfault.test dd28c228a38976d6336a3fc42d7e5f1ad060cb8c
-F test/gencol1.test 0efde3919b81a05491ad6f37e59d81901b6fa5723596b21accfe269df9b3cf06
+F test/gencol1.test 037c5c26dddd984ba7ea11bd16996377f72523a4126804b1bbecafc833fccb47
 F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98
 F test/having.test e4098a4b8962f9596035c3b87a8928a10648acc509f1bb8d6f96413bbf79a1b3
 F test/hexlit.test 4a6a5f46e3c65c4bf1fa06f5dd5a9507a5627751
@@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 97fb5a72f91a44d579466e67c33aa862384c4d1c95c2010cf4ae9dbd172bbcfb
-R a5df17bc4bd57a47c10dfaaa183b435c
+P ef73107f475e40e6bdd8b722e96992070f81fd2b7a3cb718ec8f251c89ca3e81
+R aaef2d23c9db8d375ded121b4d30b560
 U drh
-Z 9d3d6a264e3c59291c05378e70901570
+Z 7e4775d6900f8a2f69645687a14dafa0
index 05dc70ffe8b67c691be7cd25170c7d039ae9770e..dbd5ce31c786d7cd549350ea8aded8eefe6502c6 100644 (file)
@@ -1 +1 @@
-ef73107f475e40e6bdd8b722e96992070f81fd2b7a3cb718ec8f251c89ca3e81
\ No newline at end of file
+27c0fdab1ba4d4993b164eb4b777c63e82aa247c3fa406121dc8ed94970a0b35
\ No newline at end of file
index 5026b89e47f63d8320193a1ff58b3f33c71509e8..46bf3677e1da6e87df6d8555e6e21b40d9621fc3 100644 (file)
@@ -947,13 +947,15 @@ i16 sqlite3StorageColumnToTable(Table *pTab, i16 iCol){
 ** the end.
 **
 ** If SQLITE_OMIT_GENERATED_COLUMNS then there are no virtual columns and
-** this routine is a no-op macro.
+** this routine is a no-op macro.  If the pTab does not have any virtual
+** columns, then this routine is no-op that always return iCol.  If iCol
+** is negative (indicating the ROWID column) then this routine return iCol.
 */
 i16 sqlite3TableColumnToStorage(Table *pTab, i16 iCol){
   int i;
   i16 n;
   assert( iCol<pTab->nCol );
-  if( (pTab->tabFlags & TF_HasVirtual)==0 ) return iCol;
+  if( (pTab->tabFlags & TF_HasVirtual)==0 || iCol<0 ) return iCol;
   for(i=0, n=0; i<iCol; i++){
     if( (pTab->aCol[i].colFlags & COLFLAG_VIRTUAL)==0 ) n++;
   }
index 52b68b7c75181de0380a107e1c9f42c8be99c5b3..3b2b513b6d3fca20a1f3b051acb8546acc1f90f5 100644 (file)
@@ -4136,7 +4136,7 @@ expr_code_doover:
       Table *pTab = pExpr->y.pTab;
       int iCol = pExpr->iColumn;
       int p1 = pExpr->iTable * (pTab->nCol+1) + 1 
-                     + (iCol>=0 ? sqlite3TableColumnToStorage(pTab, iCol) : -1);
+                     + sqlite3TableColumnToStorage(pTab, iCol);
 
       assert( pExpr->iTable==0 || pExpr->iTable==1 );
       assert( iCol>=-1 && iCol<pTab->nCol );
index 4bb499f8e490f763048f7586c4644401c4a5a242..75016d590a85229cf93a8f566a277a393a5d7719 100644 (file)
@@ -272,4 +272,60 @@ do_execsql_test gencol1-10.10 {
   PRAGMA integrity_check;
 } {ok}
 
+# 2019-12-06 Found by mrigger
+#
+sqlite3 db :memory:
+do_execsql_test gencol1-11.10 {
+  PRAGMA foreign_keys = true;
+  CREATE TABLE t0(
+    c0,
+    c1 INTEGER PRIMARY KEY,
+    c2 BLOB UNIQUE DEFAULT x'00',
+    c3 BLOB GENERATED ALWAYS AS (1), 
+    FOREIGN KEY(c1) REFERENCES t0(c2)
+  );
+}
+do_catchsql_test gencol1-11.20 {
+  INSERT OR REPLACE INTO t0(c0, c1) VALUES (2, 1), (1, 0)
+} {1 {FOREIGN KEY constraint failed}}
+do_execsql_test gencol1-11.30 {
+  DROP TABLE t0;
+  CREATE TABLE t0(
+    c0,
+    c1 INTEGER PRIMARY KEY,
+    c3 BLOB GENERATED ALWAYS AS (1), 
+    c2 BLOB UNIQUE DEFAULT x'00',
+    FOREIGN KEY(c1) REFERENCES t0(c2)
+  );
+}
+do_catchsql_test gencol1-11.40 {
+  INSERT OR REPLACE INTO t0(c0, c1) VALUES (2, 1), (1, 0)
+} {1 {FOREIGN KEY constraint failed}}
+do_execsql_test gencol1-11.50 {
+  DROP TABLE t0;
+  CREATE TABLE t0(
+    c0,
+    c3 BLOB GENERATED ALWAYS AS (1), 
+    c1 INTEGER PRIMARY KEY,
+    c2 BLOB UNIQUE DEFAULT x'00',
+    FOREIGN KEY(c1) REFERENCES t0(c2)
+  );
+}
+do_catchsql_test gencol1-11.60 {
+  INSERT OR REPLACE INTO t0(c0, c1) VALUES (2, 1), (1, 0)
+} {1 {FOREIGN KEY constraint failed}}
+do_execsql_test gencol1-11.70 {
+  DROP TABLE t0;
+  CREATE TABLE t0(
+    c3 BLOB GENERATED ALWAYS AS (1), 
+    c0,
+    c1 INTEGER PRIMARY KEY,
+    c2 BLOB UNIQUE DEFAULT x'00',
+    FOREIGN KEY(c1) REFERENCES t0(c2)
+  );
+}
+do_catchsql_test gencol1-11.80 {
+  INSERT OR REPLACE INTO t0(c0, c1) VALUES (2, 1), (1, 0)
+} {1 {FOREIGN KEY constraint failed}}
+
 finish_test