]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix ON CONFLICT clause processing for NOT NULL constraints of PRIMARY KEY
authordrh <>
Wed, 18 Aug 2021 22:26:51 +0000 (22:26 +0000)
committerdrh <>
Wed, 18 Aug 2021 22:26:51 +0000 (22:26 +0000)
columns on WITHOUT ROWID tables.
Ticket [f2be158c57aaa8c6]

FossilOrigin-Name: 13abba0941a724eb62455650976b03678e4455b6b3090c84a2ab2f4a7656b4d8

manifest
manifest.uuid
src/build.c
test/without_rowid5.test

index 5fab331f6566c103d762e96cb04e4f0182a6fde5..6e4b8ae466dacdb8fd0ca382a151f2b635604bb6 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Rename\sthe\sColumn.eType\sfield\sto\sColumn.eCType\s-\swith\san\sextra\s"C".
-D 2021-08-18T12:05:22.798
+C Fix\sON\sCONFLICT\sclause\sprocessing\sfor\sNOT\sNULL\sconstraints\sof\sPRIMARY\sKEY\ncolumns\son\sWITHOUT\sROWID\stables.\nTicket\s[f2be158c57aaa8c6]
+D 2021-08-18T22:26:51.356
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -488,7 +488,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6
 F src/btree.c e204a9c8fb4fe5dbb910a863ba487f4af9b5c501254ec4ccbfcdd6b1f65b7fb4
 F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22
 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0
-F src/build.c 0374faa35f0920c51147a20bb3462fae22310f2acaf29721ca99821fc7232548
+F src/build.c 69cddb20437f5608d026409281a3f6b8064d324d009bd22eb6acba4202e38770
 F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c
 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
 F src/ctime.c 8159d5f706551861c18ec6c8f6bdf105e15ea00367f05d9ab65d31a1077facc1
@@ -1807,7 +1807,7 @@ F test/without_rowid1.test 6abc5d497f634520944dac0a89a6c240a48d2ee0f8353356a750e
 F test/without_rowid2.test af260339f79d13cb220288b67cd287fbcf81ad99
 F test/without_rowid3.test 39ab0dd773eaa62e59b17093f875327630f54c4145458f6d2b053d68d4b2f67b
 F test/without_rowid4.test 4e08bcbaee0399f35d58b5581881e7a6243d458a
-F test/without_rowid5.test 89b1c587bd92a0590e440da33e7666bf4891572a
+F test/without_rowid5.test f058a97600c09c7c8754733b9d8adc428e055f815d8926d74b59b872e20d0e2b
 F test/without_rowid6.test efbd7add62c59bf5ca97bf8da674e734e6a70ef979234e816166824b4d258f68
 F test/without_rowid7.test d7c59a93d726b55812d620f8f284e01904a5b85f9ee9eea8f2f68571a5e8c40e
 F test/wordcount.c d721a4b6fae93e6e33449700bce1686bc23257c27425bc3ef1599dc912adec66
@@ -1920,7 +1920,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 7cca80808cef192fe0479477056a028e230a164fd368e72100def065d424ca2c
-R b66c8f57a17fe88d4036ed4eb83a05fb
+P b9b0dcd5af072c22f2ce71cf9584b5b572fbcfbce6410a7d703b586adb8938ba
+R f57d6ed5153ac1a3784cf20c59f627b9
 U drh
-Z 2628ebdae9db72c0a61ecc0e228d76e8
+Z 19e6156db8fe8743846e026420e0b856
index e1f9e777164a8796d6df10abde611a83a2fe1d95..e76a74f795aac54d8c5da02126a19f479779a375 100644 (file)
@@ -1 +1 @@
-b9b0dcd5af072c22f2ce71cf9584b5b572fbcfbce6410a7d703b586adb8938ba
\ No newline at end of file
+13abba0941a724eb62455650976b03678e4455b6b3090c84a2ab2f4a7656b4d8
\ No newline at end of file
index 69717edd238c40b93458865eb492595ae1af83b1..93bb3419eda1c2ef5b761098708dc7f6a7901aeb 100644 (file)
@@ -2321,7 +2321,9 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){
   */
   if( !db->init.imposterTable ){
     for(i=0; i<pTab->nCol; i++){
-      if( (pTab->aCol[i].colFlags & COLFLAG_PRIMKEY)!=0 ){
+      if( (pTab->aCol[i].colFlags & COLFLAG_PRIMKEY)!=0
+       && (pTab->aCol[i].notNull==OE_None)
+      ){
         pTab->aCol[i].notNull = OE_Abort;
       }
     }
index 31a440ad87a0e2ee7b8c1a5242a10684dd499df8..29d226a757f677d8bb2c27734a4d5af515974729 100644 (file)
@@ -186,6 +186,87 @@ do_execsql_test without_rowid5-5.9 {
   SELECT count(*) FROM nnw;
 } {1}
 
+# Ticket f2be158c57aaa8c6 (2021-08-18)
+# NOT NULL ON CONFLICT clauses work on WITHOUT ROWID tables now.
+# 
+do_test without_rowid5-5.100 {
+  db eval {
+    DROP TABLE IF EXISTS t5;
+    CREATE TABLE t5(
+      a INT NOT NULL ON CONFLICT ROLLBACK,
+      b TEXT,
+      c TEXT,
+      PRIMARY KEY(a,b)
+    ) WITHOUT ROWID;
+    BEGIN;
+    INSERT INTO t5(a,b,c) VALUES(1,2,3);
+  }
+  catch {db eval {INSERT INTO t5(a,b,c) VALUES(NULL,6,7);}}
+  db eval {
+    SELECT * FROM t5;
+  }
+} {}
+do_test without_rowid5-5.101 {
+  db eval {
+    DROP TABLE IF EXISTS t5;
+    CREATE TABLE t5(
+      a INT NOT NULL ON CONFLICT ABORT,
+      b TEXT,
+      c TEXT,
+      PRIMARY KEY(a,b)
+    ) WITHOUT ROWID;
+    BEGIN;
+    INSERT INTO t5(a,b,c) VALUES(1,2,3);
+  }
+  catch {db eval {INSERT INTO t5(a,b,c) VALUES(NULL,6,7);}}
+  db eval {
+    COMMIT;
+    SELECT * FROM t5;
+  }
+} {1 2 3}
+do_test without_rowid5-5.102 {
+  db eval {
+    DROP TABLE IF EXISTS t5;
+    CREATE TABLE t5(
+      a INT NOT NULL ON CONFLICT FAIL,
+      b TEXT,
+      c TEXT,
+      PRIMARY KEY(a,b)
+    ) WITHOUT ROWID;
+  }
+  catch {db eval {INSERT INTO t5(a,b,c) VALUES(1,2,3),(NULL,4,5),(6,7,8);}}
+  db eval {
+    SELECT * FROM t5;
+  }
+} {1 2 3}
+do_test without_rowid5-5.103 {
+  db eval {
+    DROP TABLE IF EXISTS t5;
+    CREATE TABLE t5(
+      a INT NOT NULL ON CONFLICT IGNORE,
+      b TEXT,
+      c TEXT,
+      PRIMARY KEY(a,b)
+    ) WITHOUT ROWID;
+    INSERT INTO t5(a,b,c) VALUES(1,2,3),(NULL,4,5),(6,7,8);
+    SELECT * FROM t5;
+  }
+} {1 2 3 6 7 8}
+do_test without_rowid5-5.104 {
+  db eval {
+    DROP TABLE IF EXISTS t5;
+    CREATE TABLE t5(
+      a INT NOT NULL ON CONFLICT REPLACE DEFAULT 3,
+      b TEXT,
+      c TEXT,
+      PRIMARY KEY(a,b)
+    ) WITHOUT ROWID;
+    INSERT INTO t5(a,b,c) VALUES(1,2,3),(NULL,4,5),(6,7,8);
+    SELECT * FROM t5;
+  }
+} {1 2 3 3 4 5 6 7 8}
+
+
 # EVIDENCE-OF: R-12643-30541 The incremental blob I/O mechanism does not
 # work for WITHOUT ROWID tables.
 #