]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Enhance UPSERT so that the UPDATE uses the same set of cursors as the INSERT.
authordrh <drh@noemail.net>
Fri, 20 Apr 2018 13:18:51 +0000 (13:18 +0000)
committerdrh <drh@noemail.net>
Fri, 20 Apr 2018 13:18:51 +0000 (13:18 +0000)
FossilOrigin-Name: c37f39d18d41ae5ba6c4561d87cbbf71f3b6896b86cc5cff9cdf046b02dc521a

manifest
manifest.uuid
src/insert.c
src/sqliteInt.h
src/update.c
src/upsert.c

index 118a462105c3124a10e3f658c961a425523650d9..be6ca0eb62215c97a257a735d037cf70e46ecdef 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Minor\ssimplification\sof\sthe\scursor\sallocation\slogic\sfor\supdate.
-D 2018-04-20T00:40:19.244
+C Enhance\sUPSERT\sso\sthat\sthe\sUPDATE\suses\sthe\ssame\sset\sof\scursors\sas\sthe\sINSERT.
+D 2018-04-20T13:18:51.643
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F Makefile.in 5ce9343cba9c189046f1afe6d2bcc1f68079439febc05267b98aec6ecc752439
@@ -453,7 +453,7 @@ F src/hash.c a12580e143f10301ed5166ea4964ae2853d3905a511d4e0c44497245c7ce1f7a
 F src/hash.h ab34c5c54a9e9de2e790b24349ba5aab3dbb4fd4
 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da
 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71
-F src/insert.c 87b1854f48145d1db15b97128922348d90fbb2a0bd317e4d0ad6eee1361f4b66
+F src/insert.c 465e927874e602a66d6d20bb9cf73099f25a3c067b87725ed7b4ddb0c3fdb327
 F src/legacy.c 134ab3e3fae00a0f67a5187981d6935b24b337bcf0f4b3e5c9fa5763da95bf4e
 F src/loadext.c f6e4e416a736369f9e80eba609f0acda97148a8b0453784d670c78d3eed2f302
 F src/main.c 10e3897f5d78cef6bcbd1eedc8ccc3fe9e9783d07e052d9d70e57364ded19274
@@ -497,7 +497,7 @@ F src/shell.c.in 8ab4687da814ddc4adf6ea0fcd43ea1eb2784ee6915674dd690759241b7a24b
 F src/sqlite.h.in aa9bd3ae4a077c7002059cb418271abe52214b0227b2a734bc44736b24cbcc40
 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
 F src/sqlite3ext.h 83a3c4ce93d650bedfd1aa558cb85a516bd6d094445ee989740827d0d944368d
-F src/sqliteInt.h a5c534cda7ec61f7180eee99804a63ee2e4a6412a9da6c4e2a77dee7f8caafb5
+F src/sqliteInt.h 6f26888c81854b1cc8c9a285d75411636a7c6444227e1953a39b2c52323441d5
 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b
 F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e
 F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34
@@ -557,8 +557,8 @@ F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c
 F src/tokenize.c 5b0c661a85f783d35b9883830736eeb63be4aefc4f6b7d9cd081d48782c041e2
 F src/treeview.c 14d5d1254702ec96876aa52642cb31548612384134970409fae333b25b39d6bb
 F src/trigger.c 4ace6d1d5ba9a89822deb287317f33c810440526eafe185c2d8a48c31df1e995
-F src/update.c 74ba1a99a5f0c852dff23f4519d7c1623c0b34562343e183ec0fd0656304eb7d
-F src/upsert.c ee5c9e44fac181e86a561c2d315c28f4c0f94e9d3283544bd39aa0e201b0c61c
+F src/update.c 86e6563430a05d9df439cb0253ade0616e3320ef38fa0ed20fb1634e2d9aca0a
+F src/upsert.c 71ebb84f330b0d72675c694303a3801633ff4079af9a40569f7e528219484969
 F src/utf.c 810fbfebe12359f10bc2a011520a6e10879ab2a163bcb26c74768eab82ea62a5
 F src/util.c d9eb0a6c4aae1b00a7369eadd7ca0bbe946cb4c953b6751aa20d357c2f482157
 F src/vacuum.c 762ee9bbf8733d87d8cd06f58d950e881982e416f8c767334a40ffd341b6bff5
@@ -1724,7 +1724,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 c6f71115eb933c2aee295bc31e5139112463c28e15a3b3ea242fd9bac168aed9
-R 07cdec54847d408d1664bb947679d0b8
+P fdf71be65835e7e8915d16dd64114de35c4754ef5b94a2af6cac88a94817fb75
+R 326ed33577c38b92a582a5286c34af37
 U drh
-Z ddabed43abbf787bd70f75ea21871bd3
+Z c39fcdbaadf5ac0f8b6a71ef409492a9
index fabedbd8b18e272328daaf16ece72f16185ffe63..28cae4e58034d02903550ed2d342aab42e00d01c 100644 (file)
@@ -1 +1 @@
-fdf71be65835e7e8915d16dd64114de35c4754ef5b94a2af6cac88a94817fb75
\ No newline at end of file
+c37f39d18d41ae5ba6c4561d87cbbf71f3b6896b86cc5cff9cdf046b02dc521a
\ No newline at end of file
index b3a313836e6170e1d9efffbbfbf006320b043d5b..782244a1357a3b7a4890cdb533de083539b8212b 100644 (file)
@@ -812,6 +812,8 @@ void sqlite3Insert(
     pTabList->a[0].iCursor = iDataCur;
     pUpsert->pUpsertSrc = pTabList;
     pUpsert->regData = regData;
+    pUpsert->iDataCur = iDataCur;
+    pUpsert->iIdxCur = iIdxCur;
     if( pUpsert->pUpsertTarget ){
       sqlite3UpsertAnalyzeTarget(pParse, pTabList, pUpsert);
     }
index 73cb6299d66af43bbfcbb7cd3355c59997624756..ccbf8467ffa4bc07cca8760dd15afed7f2733244 100644 (file)
@@ -2743,8 +2743,14 @@ struct Upsert {
   Index *pUpsertIdx;        /* Constraint that pUpsertTarget identifies */
   ExprList *pUpsertSet;     /* The SET clause from an ON CONFLICT UPDATE */
   Expr *pUpsertWhere;       /* WHERE clause for the ON CONFLICT UPDATE */
+  /* The fields above comprise the parse tree for the upsert clause.
+  ** The fields below are used to transfer information from the INSERT
+  ** processing down into the UPDATE processing while generating code.
+  ** Upsert owns the memory allocated above, but not the memory below. */
   SrcList *pUpsertSrc;      /* Table to be updated */
   int regData;              /* First register holding array of VALUES */
+  int iDataCur;             /* Index of the data cursor */
+  int iIdxCur;              /* Index of the first index cursor */
 };
 
 /*
index dd08b166878f7fecb5acb985b126c5d94af47426..92164b62669f2d3f004b0209b108c93556821dc5 100644 (file)
@@ -211,6 +211,11 @@ void sqlite3Update(
     }
     pParse->nTab++;
   }
+  if( pUpsert ){
+    iDataCur = pUpsert->iDataCur;
+    iIdxCur = pUpsert->iIdxCur;
+    pParse->nTab = iBaseCur;
+  }
   pTabList->a[0].iCursor = iDataCur;
 
   /* Allocate space for aXRef[], aRegIdx[], and aToOpen[].  
@@ -476,7 +481,7 @@ void sqlite3Update(
   }
 
   labelBreak = sqlite3VdbeMakeLabel(v);
-  if( !isView ){
+  if( !isView && pUpsert==0 ){
     int addrOnce = 0;
 
     /* Open every index that needs updating. */
index 9e23c86bfe20ff5c24b5efd6684f468270c540de..80c0056c0b19df0ce66193d219b55e3dfa05c274 100644 (file)
@@ -222,7 +222,7 @@ void sqlite3UpsertDoUpdate(
     pE1 = sqlite3ExprAlloc(db, TK_COLUMN, 0, 0);
     if( pE1 ){
       pE1->pTab = pTab;
-      pE1->iTable = pParse->nTab;
+      pE1->iTable = pUpsert->iDataCur;
       pE1->iColumn = -1;
     }
     pE2 = sqlite3ExprAlloc(db, TK_REGISTER, 0, 0);
@@ -234,11 +234,6 @@ void sqlite3UpsertDoUpdate(
   }else{
     /* a WITHOUT ROWID table */
     int i, j;
-    int iTab = pParse->nTab+1;
-    Index *pX;
-    for(pX=pTab->pIndex; ALWAYS(pX) && !IsPrimaryKeyIndex(pX); pX=pX->pNext){
-      iTab++;
-    }
     for(i=0; i<pIdx->nKeyCol; i++){
       regKey = ++pParse->nMem;
       sqlite3VdbeAddOp3(v, OP_Column, iCur, i, regKey);
@@ -247,7 +242,7 @@ void sqlite3UpsertDoUpdate(
       pE1 = sqlite3ExprAlloc(db, TK_COLUMN, 0, 0);
       if( pE1 ){
         pE1->pTab = pTab;
-        pE1->iTable = iTab;
+        pE1->iTable = pUpsert->iDataCur;
         pE1->iColumn = j;
       }
       pE2 = sqlite3ExprAlloc(db, TK_REGISTER, 0, 0);