]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
New test cases with corresponding bug fixes.
authordrh <drh@noemail.net>
Sat, 12 Dec 2020 00:28:15 +0000 (00:28 +0000)
committerdrh <drh@noemail.net>
Sat, 12 Dec 2020 00:28:15 +0000 (00:28 +0000)
FossilOrigin-Name: f22c21a94ca4cad0217f91c1a5a275bc348cb6ba0f3a54c927533bc8d8c96a90

manifest
manifest.uuid
src/insert.c
src/sqliteInt.h
src/upsert.c
test/upsert5.test

index 728e0860009836565ff06e3e316f5c1d3f8ca0e4..43fe5d0f2c31f649ee297f6f8adaa7cfc602e8e6 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Begin\sadding\stest\scases.\s\sFix\sone\sbug\sfound\sso\sfar.\s\sMore\sare\spending.
-D 2020-12-11T19:36:19.206
+C New\stest\scases\swith\scorresponding\sbug\sfixes.
+D 2020-12-12T00:28:15.628
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -501,7 +501,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19
 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38
 F src/hwtime.h cb1d7e3e1ed94b7aa6fde95ae2c2daccc3df826be26fc9ed7fd90d1750ae6144
 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71
-F src/insert.c 7bb29b8acdd49917fe12cc14e164b9c49fc98f5f2725e5311a03b30349ca3880
+F src/insert.c ec68f3a8b9af7c6e127735af8f61633bc0a2c9cd24a961fb21331ac95c7df251
 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa
 F src/loadext.c 8c9c8cd2bd8eecdb06d9b6e89de7e9e65bae45cc8fc33609cc74023a5c296067
 F src/main.c 97e9f137354bc1f76dc9bb60a0a24f8c45cf73b33e80d3ee4c64155336fb820d
@@ -545,7 +545,7 @@ F src/shell.c.in e9f674ee4ec6c345679e8a5b16c869c6c59eb1540dd98ac69e4736ecddce009
 F src/sqlite.h.in 0e2b4259e49a0eda54d9118eb18a04fcd60e0727a2fd2c81aade0bf57520e706
 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
 F src/sqlite3ext.h 61b38c073d5e1e96a3d45271b257aef27d0d13da2bea5347692ae579475cd95e
-F src/sqliteInt.h aff99a1938b53530971fcfa7a6a5e6b47f986ddd673660bafb41f1c559747b72
+F src/sqliteInt.h 31492bf5f9d7ccc4835d5e0a88758737812b0ee4c35c0b961840373dbd18bbb0
 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657
 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1
 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
@@ -608,7 +608,7 @@ F src/tokenize.c 01dba3023659dc6f6b1e054c14b35a0074bd35de10466b99454d33278191d97
 F src/treeview.c 4b92992176fb2caefbe06ba5bd06e0e0ebcde3d5564758da672631f17aa51cda
 F src/trigger.c 515e79206d40d1d4149129318582e79a6e9db590a7b74e226fdb5b2a6c7e1b10
 F src/update.c 9f126204a6acb96bbe47391ae48e0fc579105d8e76a6d9c4fab3271367476580
-F src/upsert.c 6471d9e0e5e05547f8a00d7d686714ac08fe89526de133abcf8e1c7a35f2cb82
+F src/upsert.c 5ebb702817ee157badae0548098ea216cc1636e98eda63554e346968565c64c4
 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0
 F src/util.c c0c7977de7ef9b8cb10f6c85f2d0557889a658f817b0455909a49179ba4c8002
 F src/vacuum.c 492422c1463c076473bae1858799c7a0a5fe87a133d1223239447c422cd26286
@@ -1643,7 +1643,7 @@ F test/upsert1.test 88f9e258c6a0eeeb85937b08831e8daad440ba41f125af48439e9d33f266
 F test/upsert2.test 9c3cdbb1a890227f6504ce4b0e3de68f4cdfa16bb21d8641208a9239896c5a09
 F test/upsert3.test 88d7d590a1948a9cb6eac1b54b0642f67a9f35a1fc0f19b200e97d5d39e3179c
 F test/upsert4.test 25d2a1da92f149331ae0c51ca6e3eee78189577585eab92de149900d62994fa5
-F test/upsert5.test 82acbe52e9a7d74b9eeb93dc219558f44dccd07ef5e07e74fec9eca7173e4bfe
+F test/upsert5.test 32ff55ed7e3dcfe62a8e54897c20e074d4629ddf72297092e79997f82ccf06b5
 F test/upsertfault.test f21ca47740841fdb4d61acfa7b17646d773e67724fe8c185b71c018db8a94b35
 F test/uri.test 3481026f00ade6dfe8adb7acb6e1e47b04369568
 F test/uri2.test 9d3ba7a53ee167572d53a298ee4a5d38ec4a8fb7
@@ -1889,7 +1889,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 5321d60c575ef8f888d1b315df02cf9ed96a3ffc61babbc1429aa73b2a61a190
-R 8ec7743a66623a70c1f2fd83cc9cbf09
+P aadd67ddf2a191629b5356395f75e4556aac904a6e2f6b83742fa4f26e4253a4
+R ebc93beb1a5a9905106ef56cc676e95d
 U drh
-Z d9c45c2e1447fdcad46c943d9137f6df
+Z 4e2db7f4f46c9338f10a1365883b3835
index 87fe70a5b085b8080af7be6754005989b7c3187b..73f4c884b4a9900b71ea37953ab43e755d7cd32d 100644 (file)
@@ -1 +1 @@
-aadd67ddf2a191629b5356395f75e4556aac904a6e2f6b83742fa4f26e4253a4
\ No newline at end of file
+f22c21a94ca4cad0217f91c1a5a275bc348cb6ba0f3a54c927533bc8d8c96a90
\ No newline at end of file
index 4fa337a2f28b9951c4526bb5f789f602f2418efd..d0f82dccfe19b71f5ddf2844c7e8d905414e82de 100644 (file)
@@ -1804,7 +1804,7 @@ void sqlite3GenerateConstraintChecks(
     if( pUpsert->pUpsertTarget==0 ){
       /* There is just on ON CONFLICT clause and it has no constraint-target */
       assert( pUpsert->pNextUpsert==0 );
-      if( pUpsert->pUpsertSet==0 ){
+      if( pUpsert->isDoUpdate==0 ){
         /* A single ON CONFLICT DO NOTHING clause, without a constraint-target.
         ** Make all unique constraint resolution be OE_Ignore */
         overrideError = OE_Ignore;
@@ -1918,7 +1918,7 @@ void sqlite3GenerateConstraintChecks(
     if( pUpsert ){
       pUpsertClause = sqlite3UpsertOfIndex(pUpsert,0);
       if( pUpsertClause!=0 ){
-        if( pUpsertClause->pUpsertSet==0 ){
+        if( pUpsertClause->isDoUpdate==0 ){
           onError = OE_Ignore;  /* DO NOTHING is the same as INSERT OR IGNORE */
         }else{
           onError = OE_Update;  /* DO UPDATE */
@@ -2140,7 +2140,7 @@ void sqlite3GenerateConstraintChecks(
 
     /* Figure out if the upsert clause applies to this index */
     if( pUpsertClause ){
-      if( pUpsertClause->pUpsertSet==0 ){
+      if( pUpsertClause->isDoUpdate==0 ){
         onError = OE_Ignore;  /* DO NOTHING is the same as INSERT OR IGNORE */
       }else{
         onError = OE_Update;  /* DO UPDATE */
index 403f31326de117dc4b8c3f17df3b9c015375672b..3c88c0780680b0c38f42fab502620e28e596c01b 100644 (file)
@@ -3078,6 +3078,7 @@ struct Upsert {
   ExprList *pUpsertSet;     /* The SET clause from an ON CONFLICT UPDATE */
   Expr *pUpsertWhere;       /* WHERE clause for the ON CONFLICT UPDATE */
   Upsert *pNextUpsert;      /* Next ON CONFLICT clause in the list */
+  u8 isDoUpdate;            /* True for DO UPDATE.  False for DO NOTHING */
   /* Above this point is the parse tree for the ON CONFLICT clauses.
   ** The next group of fields stores intermediate data. */
   void *pToFree;            /* Free memory when deleting the Upsert object */
@@ -3091,7 +3092,6 @@ struct Upsert {
   int regData;              /* First register holding array of VALUES */
   int iDataCur;             /* Index of the data cursor */
   int iIdxCur;              /* Index of the first index cursor */
-  int addrGenericUpdate;    /* Address of routine for generic DO UPDATE */
 };
 
 /*
index 0a9b67dbdbc3fbba448752865b2393762cd2f474..cb173aa53f0d92e791b340a0556da9cfe036cf4b 100644 (file)
@@ -74,6 +74,7 @@ Upsert *sqlite3UpsertNew(
     pNew->pUpsertTargetWhere = pTargetWhere;
     pNew->pUpsertSet = pSet;
     pNew->pUpsertWhere = pWhere;
+    pNew->isDoUpdate = pSet!=0;
     pNew->pNextUpsert = pNext;
   }
   return pNew;
@@ -267,14 +268,7 @@ void sqlite3UpsertDoUpdate(
   assert( pUpsert!=0 );
   iDataCur = pUpsert->iDataCur;
   pUpsert = sqlite3UpsertOfIndex(pTop, pIdx);
-  if( pUpsert->addrGenericUpdate>0 ){
-    sqlite3VdbeAddOp2(v, OP_Goto, 0, pUpsert->addrGenericUpdate);
-    return;
-  }
   VdbeNoopComment((v, "Begin DO UPDATE of UPSERT"));
-  if( pUpsert->pUpsertTarget==0 ){
-    pUpsert->addrGenericUpdate = sqlite3VdbeCurrentAddr(v);
-  }
   if( pIdx && iCur!=iDataCur ){
     if( HasRowid(pTab) ){
       int regRowid = sqlite3GetTempReg(pParse);
@@ -313,10 +307,8 @@ void sqlite3UpsertDoUpdate(
       sqlite3VdbeAddOp1(v, OP_RealAffinity, pTop->regData+i);
     }
   }
-  sqlite3Update(pParse, pSrc, pUpsert->pUpsertSet,
-      pUpsert->pUpsertWhere, OE_Abort, 0, 0, pUpsert);
-  pUpsert->pUpsertSet = 0;    /* Will have been deleted by sqlite3Update() */
-  pUpsert->pUpsertWhere = 0;  /* Will have been deleted by sqlite3Update() */
+  sqlite3Update(pParse, pSrc, sqlite3ExprListDup(db,pUpsert->pUpsertSet,0),
+      sqlite3ExprDup(db,pUpsert->pUpsertWhere,0), OE_Abort, 0, 0, pUpsert);
   VdbeNoopComment((v, "End DO UPDATE of UPSERT"));
 }
 
index e3840a9b328c123658d908705caba12dd52ae444..fe748f5f00717a90e0335d646c996d12167363ee 100644 (file)
@@ -216,7 +216,6 @@ foreach {tn sql} {
     SELECT a,b,c,d,e FROM t1;
   } {1 e 3 4 5}
 
-if {0} {
   do_execsql_test 1.$tn.400 {
     DELETE FROM t1;
     INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5);
@@ -235,7 +234,42 @@ if {0} {
       ON CONFLICT DO UPDATE set b='x';
     SELECT a,b,c,d,e FROM t1;
   } {1 x 3 4 5}
-}
+  do_execsql_test 1.$tn.402 {
+    DELETE FROM t1;
+    INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5);
+    INSERT INTO t1(a,b,c,d,e) VALUES(1,NULL,93,94,95)
+      ON CONFLICT(c) DO UPDATE SET b='c'
+      ON CONFLICT(d) DO UPDATE SET b='d'
+      ON CONFLICT DO UPDATE set b='x';
+    SELECT a,b,c,d,e FROM t1;
+  } {1 x 3 4 5}
+  do_execsql_test 1.$tn.403 {
+    DELETE FROM t1;
+    INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5);
+    INSERT INTO t1(a,b,c,d,e) VALUES(91,NULL,3,94,95)
+      ON CONFLICT(c) DO UPDATE SET b='c'
+      ON CONFLICT(d) DO UPDATE SET b='d'
+      ON CONFLICT DO UPDATE set b='x';
+    SELECT a,b,c,d,e FROM t1;
+  } {1 c 3 4 5}
+  do_execsql_test 1.$tn.404 {
+    DELETE FROM t1;
+    INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5);
+    INSERT INTO t1(a,b,c,d,e) VALUES(91,NULL,3,4,95)
+      ON CONFLICT(c) DO UPDATE SET b='c'
+      ON CONFLICT(d) DO UPDATE SET b='d'
+      ON CONFLICT DO UPDATE set b='x';
+    SELECT a,b,c,d,e FROM t1;
+  } {1 c 3 4 5}
+  do_execsql_test 1.$tn.405 {
+    DELETE FROM t1;
+    INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5);
+    INSERT INTO t1(a,b,c,d,e) VALUES(1,NULL,93,4,5)
+      ON CONFLICT(c) DO UPDATE SET b='c'
+      ON CONFLICT(d) DO UPDATE SET b='d'
+      ON CONFLICT DO UPDATE set b='x';
+    SELECT a,b,c,d,e FROM t1;
+  } {1 d 3 4 5}
 
 }