]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Attempting to improve name resolution for parenthesized FROM clauses.
authordrh <>
Thu, 21 Apr 2022 01:49:45 +0000 (01:49 +0000)
committerdrh <>
Thu, 21 Apr 2022 01:49:45 +0000 (01:49 +0000)
Only partially working.

FossilOrigin-Name: 959b7182144664a13e169fa63b79149f4e7048680d1f481a39507aab6b23e17c

manifest
manifest.uuid
src/resolve.c
src/select.c

index 340ecc42113c51a3348f34996011d625e981a652..42973cfbbacf3faada205c4bfbba15fdb46f6df4 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Try\sto\savoid\smaterializing\sunused\scolumns\swhen\sprocessing\sa\nparenthesized\sFROM\sclause.
-D 2022-04-20T21:58:32.066
+C Attempting\sto\simprove\sname\sresolution\sfor\sparenthesized\sFROM\sclauses.\nOnly\spartially\sworking.
+D 2022-04-21T01:49:45.860
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -550,9 +550,9 @@ F src/pragma.h e690a356c18e98414d2e870ea791c1be1545a714ba623719deb63f7f226d8bb7
 F src/prepare.c fd940149c691684e7c1073c3787a7170e44852b02d1275d2e30a5b58e89cfcaf
 F src/printf.c 05d8dfd2018bc4fc3ddb8b37eb97ccef7abf985643fa1caebdcf2916ca90fa32
 F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c
-F src/resolve.c 05cc45c50c07dcf42c1ef1d699a297e47e3a20d3cd15a720ea1cf8084b92d067
+F src/resolve.c 3cab62f59a2c395bab057382426e7e4dfae3e93e46d46ac4430fd7c543abb5c8
 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92
-F src/select.c 4b10a6b722049aed1c6c484487d8929fb751795032abfd839eeabd868572d24c
+F src/select.c 66f0c568a9af97f42bf98fcdb3d77704f1607faa1750ca45787385f462245b56
 F src/shell.c.in ecff6f4ab0e8e25acd578b3eb27ac0bad4d48643c160259a277151d6e9d412e1
 F src/sqlite.h.in 2a35f62185eb5e7ecc64a2f68442b538ce9be74f80f28a00abc24837edcf1c17
 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
@@ -1950,11 +1950,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 ba04142e09bb1ccc86824760a2e11df47e070285a2d09c2f61b75255886597cd
-R b23b598bef12799a965bda79b8cd53ae
-T *branch * right-join-paren
-T *sym-right-join-paren *
-T -sym-right-join *
+P 07906e3c4fcefa721a1dfd57590778cf9c278e93b1f86128843c743d6aca7106
+R 8ef1dcc2b7747e6f2b70e7e88477d2e3
 U drh
-Z f15a93d7fb29359c0ceb7d324d13be94
+Z 06c32b51457a6173774b273bce3df523
 # Remove this line to create a well-formed Fossil manifest.
index 76c96970e9e4671444eb172f93e71e58a7b0f67a..b9b61415d67db45dd0f07af91fa1afeef8f1d76f 100644 (file)
@@ -1 +1 @@
-07906e3c4fcefa721a1dfd57590778cf9c278e93b1f86128843c743d6aca7106
\ No newline at end of file
+959b7182144664a13e169fa63b79149f4e7048680d1f481a39507aab6b23e17c
\ No newline at end of file
index bbd28a5b0355041ea3716ca53902630c8a361eff..d2e210e44db169569c42b5af52599a627f2b1d35 100644 (file)
@@ -328,38 +328,46 @@ static int lookupName(
           assert( pEList!=0 );
           assert( pEList->nExpr==pTab->nCol );
           for(j=0; j<pEList->nExpr; j++){
-            if( sqlite3MatchEName(&pEList->a[j], zCol, zTab, zDb) ){
-              if( cnt>0 ){
-                if( pItem->fg.isUsing==0
-                 || sqlite3IdListIndex(pItem->u3.pUsing, zCol)<0
-                ){
-                  /* Two or more tables have the same column name which is
-                  ** not joined by USING.  This is an error.  Signal as much
-                  ** by clearing pFJMatch and letting cnt go above 1. */
-                  sqlite3ExprListDelete(db, pFJMatch);
-                  pFJMatch = 0;
-                }else
-                if( (pItem->fg.jointype & JT_RIGHT)==0 ){
-                  /* An INNER or LEFT JOIN.  Use the left-most table */
-                  continue;
-                }else
-                if( (pItem->fg.jointype & JT_LEFT)==0 ){
-                  /* A RIGHT JOIN.  Use the right-most table */
-                  cnt = 0;
-                  sqlite3ExprListDelete(db, pFJMatch);
-                  pFJMatch = 0;
-                }else{
-                  /* For a FULL JOIN, we must construct a coalesce() func */
-                  extendFJMatch(pParse, &pFJMatch, pMatch, pExpr->iColumn);
-                }
-              }
-              cnt++;
-              cntTab = 2;
-              pMatch = pItem;
-              pExpr->iColumn = j;
+            const char *zEName;
+            assert( pEList->a[j].eEName==ENAME_TAB );
+            zEName = pEList->a[j].zEName;
+            if( zEName[0]=='.' && zEName[1]=='.' && zTab==0 ){
+              if( sqlite3StrICmp(&zEName[2],zCol)!=0 ) continue;
               hit = 1;
-              pEList->a[j].bUsed = 1;
+            }else if( !sqlite3MatchEName(&pEList->a[j], zCol, zTab, zDb) ){
+              continue;
             }
+            if( cnt>0 ){
+              if( pItem->fg.isUsing==0
+               || sqlite3IdListIndex(pItem->u3.pUsing, zCol)<0
+              ){
+                /* Two or more tables have the same column name which is
+                ** not joined by USING.  This is an error.  Signal as much
+                ** by clearing pFJMatch and letting cnt go above 1. */
+                sqlite3ExprListDelete(db, pFJMatch);
+                pFJMatch = 0;
+              }else
+              if( (pItem->fg.jointype & JT_RIGHT)==0 ){
+                /* An INNER or LEFT JOIN.  Use the left-most table */
+                continue;
+              }else
+              if( (pItem->fg.jointype & JT_LEFT)==0 ){
+                /* A RIGHT JOIN.  Use the right-most table */
+                cnt = 0;
+                sqlite3ExprListDelete(db, pFJMatch);
+                pFJMatch = 0;
+              }else{
+                /* For a FULL JOIN, we must construct a coalesce() func */
+                extendFJMatch(pParse, &pFJMatch, pMatch, pExpr->iColumn);
+              }
+            }
+            cnt++;
+            cntTab = 2;
+            pMatch = pItem;
+            pExpr->iColumn = j;
+            pEList->a[j].bUsed = 1;
+            if( hit ) break;
+            hit = 1;
           }
           if( hit || zTab==0 ) continue;
         }
index d8c7a906498381762cbc86f510f833fa0f8e028a..fe393e497eb9c498644c0518cf71d14170c3cf23 100644 (file)
@@ -5825,6 +5825,24 @@ static int selectExpander(Walker *pWalker, Select *p){
             iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
             zSchemaName = iDb>=0 ? db->aDb[iDb].zDbSName : "*";
           }
+          if( i+1<pTabList->nSrc
+           && pFrom[1].fg.isUsing
+           && (selFlags & SF_NestedFrom)!=0
+          ){
+            int ii;
+            IdList *pUsing = pFrom[1].u3.pUsing;
+            for(ii=0; ii<pUsing->nId; ii++){
+              const char *zUName = pUsing->a[ii].zName;
+              pRight = sqlite3Expr(db, TK_ID, zUName);
+              pNew = sqlite3ExprListAppend(pParse, pNew, pRight);
+              if( pNew ){
+                struct ExprList_item *pX = &pNew->a[pNew->nExpr-1];
+                assert( pX->zEName==0 );
+                pX->zEName = sqlite3MPrintf(db,"..%s", zUName);
+                pX->eEName = ENAME_TAB;
+              }
+            }
+          }
           for(j=0; j<pTab->nCol; j++){
             char *zName = pTab->aCol[j].zCnName;
             char *zColname;  /* The computed column name */
@@ -5848,8 +5866,7 @@ static int selectExpander(Walker *pWalker, Select *p){
               continue;
             }
             tableSeen = 1;
-
-            if( i>0 && zTName==0 ){
+            if( i>0 && zTName==0 && (selFlags & SF_NestedFrom)==0 ){
               if( pFrom->fg.isUsing
                && sqlite3IdListIndex(pFrom->u3.pUsing, zName)>=0
               ){
@@ -5866,12 +5883,13 @@ static int selectExpander(Walker *pWalker, Select *p){
               zColname = zName;
               zToFree = 0;
             }
-            if( (pTabList->nSrc>1
+            if( (selFlags && SF_NestedFrom)!=0
+             || IN_RENAME_OBJECT
+             || (pTabList->nSrc>1
                  && (  (pFrom->fg.jointype & JT_LTORJ)==0
                      || !inAnyUsingClause(zName,pFrom,pTabList->nSrc-i-1)
                     )
                 )
-             || IN_RENAME_OBJECT
             ){
               Expr *pLeft;
               pLeft = sqlite3Expr(db, TK_ID, zTabName);