]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Improvement on check-in [a193749730d6cfba] so that the subroutine call to
authordrh <>
Mon, 2 May 2022 14:32:56 +0000 (14:32 +0000)
committerdrh <>
Mon, 2 May 2022 14:32:56 +0000 (14:32 +0000)
the IN operator right-hand side generator from the RIGHT JOIN no-match logic
does not generate unreachable byte code.

FossilOrigin-Name: cc458317bd77046c4328715ae9e3409f3f4cd422a01162cb33405ef3a142b0a3

manifest
manifest.uuid
src/expr.c
src/sqliteInt.h
src/wherecode.c

index 4b3f1993f6e098f1771e399fd499798e6621a4bd..3e37826c15d64c876958beeb9e1225c20845b3ba 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Bring\sthe\scomments\son\ssqlite3FindInIndex()\sinto\scloser\salignment\swith\swhat\nthat\sroutine\sactually\sdoes.
-D 2022-05-02T11:24:21.557
+C Improvement\son\scheck-in\s[a193749730d6cfba]\sso\sthat\sthe\ssubroutine\scall\sto\nthe\sIN\soperator\sright-hand\sside\sgenerator\sfrom\sthe\sRIGHT\sJOIN\sno-match\slogic\ndoes\snot\sgenerate\sunreachable\sbyte\scode.
+D 2022-05-02T14:32:56.242
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -504,7 +504,7 @@ F src/date.c 15082566229d4b1e5f24fdb490bf9bcc68824b911d70e3573ef075a1b9e2d26f
 F src/dbpage.c 90661a87e1db8bfbc8d2ebbdcd3749651ddb287c555c07a28fb17c7c591ffb68
 F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d
 F src/delete.c a8e844af211a48b13b5b358be77a12c860c6a557c21990ad51a548e2536500ce
-F src/expr.c 926dccca86a8d02bf2a8533ba07c9b0c576148915844a1c2217d94c718e9699b
+F src/expr.c 36acab0dde36ab805ed9c793c9a2bb864793999c8b4d4b0e758100eb0339b124
 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
 F src/fkey.c d965ede15d8360c09ed59348940649ee647b192e784466837d7aefa836d1d91e
 F src/func.c a3407a6fbb0d4088d8d502e46f0ace63e0aeae7467ae23a9ca9815bbf9239761
@@ -558,7 +558,7 @@ F src/shell.c.in ae0a6fae983caac6f8c824733f0599dfdf7b3a7e8efdef3cb5e3ab2e457ffc3
 F src/sqlite.h.in 2a35f62185eb5e7ecc64a2f68442b538ce9be74f80f28a00abc24837edcf1c17
 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
 F src/sqlite3ext.h f49e28c25bd941e79794db5415fdf7b202deb3bc072ed6f1ed273d578703684e
-F src/sqliteInt.h 4092f9f2395909ebf7da0a6e9907e92883cf98656bb751e1d919d2a0e475ae70
+F src/sqliteInt.h b076cfab9455b6ef1245667ff73dada79a204c750985f788e52469727f0d1c31
 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657
 F src/status.c 4a3da6d77eeb3531cb0dbdf7047772a2a1b99f98c69e90ce009c75fe6328b2c0
 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
@@ -642,7 +642,7 @@ F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a
 F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b
 F src/where.c 43085b3a4ce2e56315fabb0b240a56e76667d9e03c79f287695bcae7b76152d5
 F src/whereInt.h 4db5a877a9d1f38b5c928c1c84297c07f30b9a3bc1f5f66214cf1a8ef90a0556
-F src/wherecode.c d629ba77a3601a979b2a30d1a21ca7ae283faff797c7cffe79fb9366a075db89
+F src/wherecode.c 9c2af255257287a50a2c884cc13d0cca4292d46ffa235fbfa1f2e9c67b071e7c
 F src/whereexpr.c 174d4ad5be165c610c907abb779ef4a97974d22b84e1ce7898d2d9f6947249e5
 F src/window.c 924e04fd6e0e113d4dba18b78d43fcb8e42b8ebffc8fc728da52cf3ab014cf3c
 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
@@ -1951,8 +1951,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P b250c218b4b6327a1cae3edbc037625ba998f89ee13a9bfbc2cefd1edfc4b768
-R b1223a28f05ca5a28b33b633588aeacf
+P 40f3274745b53bb72933c1052d0e85bc74be56d3a1068e9d54dc28763a2cfef9
+R fa255f48eb3059bbcc1be1195343e4b6
 U drh
-Z 2fc59ad1d223e831e71b6ddeee2728d5
+Z e6ffd1955bb698b867fb285f4218f7e4
 # Remove this line to create a well-formed Fossil manifest.
index d90599d53d9aedcd8f6969184d71ceec1540805c..15adbbe53c7f90f944875bf990175fd4816d60d2 100644 (file)
@@ -1 +1 @@
-40f3274745b53bb72933c1052d0e85bc74be56d3a1068e9d54dc28763a2cfef9
\ No newline at end of file
+cc458317bd77046c4328715ae9e3409f3f4cd422a01162cb33405ef3a142b0a3
\ No newline at end of file
index f8ee68dc2b146d1a0aafd63898cecc09b6d01d00..8e47578cc817b076ccfac127ea479eed3df0cde5 100644 (file)
@@ -2743,12 +2743,17 @@ int sqlite3FindInIndex(
 ){
   Select *p;                            /* SELECT to the right of IN operator */
   int eType = 0;                        /* Type of RHS table. IN_INDEX_* */
-  int iTab = pParse->nTab++;            /* Cursor of the RHS table */
+  int iTab;                             /* Cursor of the RHS table */
   int mustBeUnique;                     /* True if RHS must be unique */
   Vdbe *v = sqlite3GetVdbe(pParse);     /* Virtual machine being coded */
 
   assert( pX->op==TK_IN );
   mustBeUnique = (inFlags & IN_INDEX_LOOP)!=0;
+  if( pX->iTable && (inFlags & IN_INDEX_REUSE_CUR)!=0 ){
+    iTab = pX->iTable;
+  }else{
+    iTab = pParse->nTab++;
+  }
 
   /* If the RHS of this IN(...) operator is a SELECT, and if it matters 
   ** whether or not the SELECT result contains NULL values, check whether
@@ -3082,7 +3087,9 @@ void sqlite3CodeRhsOfIN(
       assert( ExprUseYSub(pExpr) );
       sqlite3VdbeAddOp2(v, OP_Gosub, pExpr->y.sub.regReturn,
                         pExpr->y.sub.iAddr);
-      sqlite3VdbeAddOp2(v, OP_OpenDup, iTab, pExpr->iTable);
+      if( iTab!=pExpr->iTable ){
+        sqlite3VdbeAddOp2(v, OP_OpenDup, iTab, pExpr->iTable);
+      }
       sqlite3VdbeJumpHere(v, addrOnce);
       return;
     }
index e526a775cbf76dc6ad08f72468daed3fb7252e34..e9f0af544a178ba03f4e705bad78f9c569971114 100644 (file)
@@ -5315,6 +5315,7 @@ const char *sqlite3JournalModename(int);
 #define IN_INDEX_NOOP_OK     0x0001  /* OK to return IN_INDEX_NOOP */
 #define IN_INDEX_MEMBERSHIP  0x0002  /* IN operator used for membership test */
 #define IN_INDEX_LOOP        0x0004  /* IN operator used as a loop */
+#define IN_INDEX_REUSE_CUR   0x0008  /* Reuse prior table cursor */
 int sqlite3FindInIndex(Parse *, Expr *, u32, int*, int*, int*);
 
 int sqlite3JournalOpen(sqlite3_vfs *, const char *, sqlite3_file *, int, int);
index 333295a48b2ff65aef78cf2a3e2b2924f54036da..d4470ac4dfae28214b6041b436ea60060ca17724 100644 (file)
@@ -612,7 +612,7 @@ static int codeEqualityTerm(
       eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, 0, &iTab);
     }else{
       Expr *pExpr = pTerm->pExpr;
-      if(  pExpr->iTable==0 || !ExprHasProperty(pExpr, EP_Subrtn) ){
+      if( pExpr->iTable==0 || !ExprHasProperty(pExpr, EP_Subrtn) ){
         sqlite3 *db = pParse->db;
         pX = removeUnindexableInClauseTerms(pParse, iEq, pLoop, pX);
         if( !db->mallocFailed ){
@@ -622,14 +622,9 @@ static int codeEqualityTerm(
         }
         sqlite3ExprDelete(db, pX);
       }else{
-        int j1;
-        sqlite3VdbeAddOp2(v, OP_Gosub, pExpr->y.sub.regReturn,
-                          pExpr->y.sub.iAddr);
-        j1 = sqlite3VdbeAddOp0(v, OP_Goto);
         aiMap = (int*)sqlite3DbMallocZero(pParse->db, sizeof(int)*nEq);
-        eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, aiMap,&iTab);
+        eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP|IN_INDEX_REUSE_CUR,                                   0, aiMap,&iTab);
         iTab = pExpr->iTable;
-        sqlite3VdbeJumpHere(v, j1);
       }
       pX = pExpr;
     }