]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Improve performance of this patch. on-clause-error-fix
authordan <Dan Kennedy>
Fri, 22 Aug 2025 19:14:35 +0000 (19:14 +0000)
committerdan <Dan Kennedy>
Fri, 22 Aug 2025 19:14:35 +0000 (19:14 +0000)
FossilOrigin-Name: 3060b2c447fb0d6b239e5a8277306fabf388f5c01ea521a3cd6c5a44f4236132

manifest
manifest.uuid
src/resolve.c

index 2d9014fd794c6a47353a40065f324847bff6d634..11d27810d5395d2622979f6a88da3ac21619adae 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Attempt\sto\sdetect\serrors\scause\sby\sON\sclauses\sthat\srefer\sto\stables\sto\sthe\sright\sof\sthemselves\swhile\sresolving\snames,\sinstead\sof\slater\son\safter\squery-flattening\sand\sother\soperations\shave\scomplicated\sthings.
-D 2025-08-22T16:25:34.129
+C Improve\sperformance\sof\sthis\spatch.
+D 2025-08-22T19:14:35.864
 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -739,7 +739,7 @@ F src/pragma.c 30b535d0a66348df844ee36f890617b4cf45e9a22dcbc47ec3ca92909c50aaf1
 F src/prepare.c 2af0b5c1ec787c8eebd21baa9d79caf4a4dc3a18e76ce2edbf2027d706bca37a
 F src/printf.c 5f0c957af9699e849d786e8fbaa3baab648ca5612230dc17916434c14bc8698f
 F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
-F src/resolve.c f400b2c1fa22ffe779901fba13deace5e483e2724addebaa9242dd1cedc8a56b
+F src/resolve.c 0d0b8146eb85c7a4cda2f81bc863f29e6ce3fa2d5651f7a5e77f3cdcce0c0f0e
 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
 F src/select.c 78ebf432355e820962a5001277cb43ffe3d82441c6dc9c8f0aeb0b15fbd5dd02
 F src/shell.c.in 0636915df0dbac6c780f04959f5d1055f206fb281b2c8fc8b113fe7bfc7d44ef
@@ -2170,11 +2170,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350
 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7
 F tool/warnings.sh 1ad0169b022b280bcaaf94a7fa231591be96b514230ab5c98fbf15cd7df842dd
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 9ada44eb6d26532e45cdd2ed8d5707f1734d0177a13b493ff9cf070e0a992522
-R 6308fbfdbe1bb96ade6fc59905bcaa05
-T *branch * on-clause-error-fix
-T *sym-on-clause-error-fix *
-T -sym-trunk *
+P 4bb527d3377f9e0e328c5e9901e5e6d45a90958004db5ff7000baa2ecb3ffeb6
+R aa93e87aea2d39245eaaa1ac42e84a48
 U dan
-Z 5f576e89fa32a605a15ca63be19fcc55
+Z 6e9f35e4c1e718286f5d03be03b6a9af
 # Remove this line to create a well-formed Fossil manifest.
index c4296e16451a8e3e293f81237cbc7a1b6642803d..db2de35a5a8f797151d3838b143f0d752adfb87a 100644 (file)
@@ -1 +1 @@
-4bb527d3377f9e0e328c5e9901e5e6d45a90958004db5ff7000baa2ecb3ffeb6
+3060b2c447fb0d6b239e5a8277306fabf388f5c01ea521a3cd6c5a44f4236132
index 0ea125e58d79ddae8007ce978f3c68e8590f4436..9cd6f22242e680879d64182e97e83e823e2e9d5d 100644 (file)
@@ -697,12 +697,7 @@ static int lookupName(
     /* Advance to the next name context.  The loop will exit when either
     ** we have a match (cnt>0) or when we run out of name contexts.
     */
-    if( cnt ){
-      if( pNC->pOn && cnt==1 && pNC->pOn->w.iJoin<pExpr->iTable ){
-        sqlite3ErrorMsg(pParse, "ON clause references tables to its right");
-      }
-      break;
-    }
+    if( cnt ) break;
     pNC = pNC->pNext;
     nSubquery++;
   }while( pNC );
@@ -1501,6 +1496,26 @@ static int resolveOnStep(Walker *pWalker, Expr *pExpr){
     pNC->pOn = 0;
   }else{
     res = resolveExprStep(pWalker, pExpr);
+    if( pExpr->op==TK_COLUMN && pWalker->pParse->nErr==0 ){
+      /* A reference to a table column has just been resolved. Find the
+      ** name-context that it matched against: */
+      int iTab = pExpr->iTable;
+      do {
+        SrcList *p = pNC->pSrcList;
+        if( iTab>=p->a[0].iCursor && iTab<=p->a[p->nSrc-1].iCursor ) break;
+        pNC = pNC->pNext;
+      }while( pNC );
+
+      /* If the name-context that was matched against is currently inside
+      ** an ON expression, check that the specific FROM object within the
+      ** name-context was not to the right of the ON clause. If it was,
+      ** it is an error.  */
+      if( pNC && pNC->pOn && pNC->pOn->w.iJoin<pExpr->iTable ){
+        sqlite3ErrorMsg(
+            pWalker->pParse, "ON clause references tables to its right"
+        );
+      }
+    }
   }
   
   return res;
@@ -1960,7 +1975,12 @@ static int resolveSelectStep(Walker *pWalker, Select *p){
  
     /* Recursively resolve names in all subqueries in the FROM clause
     */
-    if( pOuterNC ) pOuterNC->nNestedSelect++;
+    if( pOuterNC ){
+      pOuterNC->nNestedSelect++;
+      if( pOuterNC->pOn ){
+        sNC.ncFlags |= NC_On;
+      }
+    }
     for(i=0; i<p->pSrc->nSrc; i++){
       SrcItem *pItem = &p->pSrc->a[i];
       assert( pItem->zName!=0
@@ -2204,11 +2224,7 @@ int sqlite3ResolveExprNames(
   savedHasAgg = pNC->ncFlags & (NC_HasAgg|NC_MinMaxAgg|NC_HasWin|NC_OrderAgg);
   pNC->ncFlags &= ~(NC_HasAgg|NC_MinMaxAgg|NC_HasWin|NC_OrderAgg);
   w.pParse = pNC->pParse;
-  if( (pNC->ncFlags & (NC_On|NC_Where))==(NC_On|NC_Where) ){
-    w.xExprCallback = resolveOnStep;
-  }else{
-    w.xExprCallback = resolveExprStep;
-  }
+  w.xExprCallback = (pNC->ncFlags & NC_On) ? resolveOnStep : resolveExprStep;
   w.xSelectCallback = (pNC->ncFlags & NC_NoSelect) ? 0 : resolveSelectStep;
   w.xSelectCallback2 = 0;
   w.u.pNC = pNC;
@@ -2249,7 +2265,7 @@ int sqlite3ResolveExprListNames(
   Walker w;
   if( pList==0 ) return SQLITE_OK;
   w.pParse = pNC->pParse;
-  w.xExprCallback = resolveExprStep;
+  w.xExprCallback = (pNC->ncFlags & NC_On) ? resolveOnStep : resolveExprStep;
   w.xSelectCallback = resolveSelectStep;
   w.xSelectCallback2 = 0;
   w.u.pNC = pNC;
@@ -2304,7 +2320,7 @@ void sqlite3ResolveSelectNames(
   Walker w;
 
   assert( p!=0 );
-  w.xExprCallback = resolveExprStep;
+  w.xExprCallback = 0;
   w.xSelectCallback = resolveSelectStep;
   w.xSelectCallback2 = 0;
   w.pParse = pParse;