]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Candidate fix for the problem with row-value WHERE clause constraints on
authordrh <>
Wed, 1 Jun 2022 13:32:47 +0000 (13:32 +0000)
committerdrh <>
Wed, 1 Jun 2022 13:32:47 +0000 (13:32 +0000)
a RIGHT JOIN.

FossilOrigin-Name: fdd782a7bb217e2aceda97a588c0d7874ee19885abfcf0658472d6c3387da6ee

manifest
manifest.uuid
src/whereInt.h
src/wherecode.c
src/whereexpr.c

index 3f6551ecc138b2aa56e4d6de8068950c61f12e7b..b76494ad96b052de5d432270232b9d53762acead 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sa\stypo\sin\sa\scomment\sin\sa\stest\scase.\s\sNo\schanges\sto\scode.
-D 2022-06-01T13:01:57.890
+C Candidate\sfix\sfor\sthe\sproblem\swith\srow-value\sWHERE\sclause\sconstraints\son\na\sRIGHT\sJOIN.
+D 2022-06-01T13:32:47.114
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -658,9 +658,9 @@ F src/wal.c b9df133a705093da8977da5eb202eaadb844839f1c7297c08d33471f5491843d
 F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a
 F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b
 F src/where.c c4b64c6fa224e5b89ed547ec0ebdfd243c081509b195e71581164a2fbb8d4a80
-F src/whereInt.h 8da918f392bf202ccc0ee61291455b33ad171d209445f1ff3eaf62e0b6f6b363
-F src/wherecode.c 1d5bed686d60e272e93c04e34fec5b487d086383dd4773a7f2f98f86278e6a94
-F src/whereexpr.c 7c5ee52e1df81d6a43f39e6b6f35d540fd37254e2b6e953a4e2715c3abf26f46
+F src/whereInt.h b48ca529ffe293c18cbfa8326af18a09e39910de66fb3e96ef788c7cbf8ef3a7
+F src/wherecode.c 0b09abfcb88c61c6a6984a3e065786631ff35495e9bdf865e6b74ab0a1299c5b
+F src/whereexpr.c 416d6a847bc0c3d391b65e7748dc04d57d3117c82e072c222888f9eb346760da
 F src/window.c fff1b51757438c664e471d5184634e48dcdf8ea34b640f3b1b0810b1e06de18c
 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627
@@ -1974,8 +1974,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 55cfad74cace74e541b354228e3ad46e17028213a9f639edf2007c6a8f3ba8fc
-R 596d7d7318a29f139f453a88229a9104
+P 570efa45dd4c6848dcbd550f78fcaa00b6d84dcffe0a2d12e65ea8ee4468c0e8
+R c4c882d2757518da9fd92a2905b48a17
 U drh
-Z ee379ce9a8bb1abceb8b02b54a734fea
+Z cf509f41e2e3b8543d2bed8e739d8dea
 # Remove this line to create a well-formed Fossil manifest.
index b906607e8be205f2abdcfe9596397066abd6d167..6974ba143de4dfbce856c3949ee911a13bc9bb02 100644 (file)
@@ -1 +1 @@
-570efa45dd4c6848dcbd550f78fcaa00b6d84dcffe0a2d12e65ea8ee4468c0e8
\ No newline at end of file
+fdd782a7bb217e2aceda97a588c0d7874ee19885abfcf0658472d6c3387da6ee
\ No newline at end of file
index 41417d2e7f56a0157e990ba46f87c8598f341f25..bc96ff7e67e918b67fae9f2fb1217895d4cc745b 100644 (file)
@@ -612,8 +612,9 @@ void sqlite3WhereTabFuncArgs(Parse*, SrcItem*, WhereClause*);
 #define WO_AND    0x0400       /* Two or more AND-connected terms */
 #define WO_EQUIV  0x0800       /* Of the form A==B, both columns */
 #define WO_NOOP   0x1000       /* This term does not restrict search space */
+#define WO_ROWVAL 0x2000       /* A row-value term */
 
-#define WO_ALL    0x1fff       /* Mask of all possible WO_* values */
+#define WO_ALL    0x3fff       /* Mask of all possible WO_* values */
 #define WO_SINGLE 0x01ff       /* Mask of all non-compound WO_* values */
 
 /*
index 66099fb0b7c2026e8f4e40a45ed863abc47d250d..04f1c374d086bfaee66168b4eddfdd4e34af2dba 100644 (file)
@@ -2862,7 +2862,11 @@ SQLITE_NOINLINE void sqlite3WhereRightJoinLoop(
     mAll |= pLoop->maskSelf;
     for(k=0; k<pWC->nTerm; k++){
       WhereTerm *pTerm = &pWC->a[k];
-      if( pTerm->wtFlags & TERM_VIRTUAL ) break;
+      if( (pTerm->wtFlags & (TERM_VIRTUAL|TERM_SLICE))!=0
+       && pTerm->eOperator!=WO_ROWVAL
+      ){
+        break;
+      }
       if( pTerm->prereqAll & ~mAll ) continue;
       if( ExprHasProperty(pTerm->pExpr, EP_OuterON|EP_InnerON) ) continue;
       pSubWhere = sqlite3ExprAnd(pParse, pSubWhere,
index 38e16b16b3dc093ee29f6e0e1d722eaee8a377e1..842300b2cfa387e9b07a4628967d1ae3735785a5 100644 (file)
@@ -1411,7 +1411,7 @@ static void exprAnalyze(
     }
     pTerm = &pWC->a[idxTerm];
     pTerm->wtFlags |= TERM_CODED|TERM_VIRTUAL;  /* Disable the original */
-    pTerm->eOperator = 0;
+    pTerm->eOperator = WO_ROWVAL;
   }
 
   /* If there is a vector IN term - e.g. "(a, b) IN (SELECT ...)" - create
@@ -1612,7 +1612,7 @@ void sqlite3WhereAddLimit(WhereClause *pWC, Select *p){
         /* This term is a vector operation that has been decomposed into
         ** other, subsequent terms.  It can be ignored. See tag-20220128a */
         assert( pWC->a[ii].wtFlags & TERM_VIRTUAL );
-        assert( pWC->a[ii].eOperator==0 );
+        assert( pWC->a[ii].eOperator==WO_ROWVAL );
         continue;
       }
       if( pWC->a[ii].leftCursor!=iCsr ) return;