From: drh <> Date: Thu, 21 Apr 2022 01:49:45 +0000 (+0000) Subject: Attempting to improve name resolution for parenthesized FROM clauses. X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ae004bb4740a976220c3cc197c9031d5359d3fc8;p=thirdparty%2Fsqlite.git Attempting to improve name resolution for parenthesized FROM clauses. Only partially working. FossilOrigin-Name: 959b7182144664a13e169fa63b79149f4e7048680d1f481a39507aab6b23e17c --- diff --git a/manifest b/manifest index 340ecc4211..42973cfbba 100644 --- 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. diff --git a/manifest.uuid b/manifest.uuid index 76c96970e9..b9b61415d6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -07906e3c4fcefa721a1dfd57590778cf9c278e93b1f86128843c743d6aca7106 \ No newline at end of file +959b7182144664a13e169fa63b79149f4e7048680d1f481a39507aab6b23e17c \ No newline at end of file diff --git a/src/resolve.c b/src/resolve.c index bbd28a5b03..d2e210e44d 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -328,38 +328,46 @@ static int lookupName( assert( pEList!=0 ); assert( pEList->nExpr==pTab->nCol ); for(j=0; jnExpr; 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; } diff --git a/src/select.c b/src/select.c index d8c7a90649..fe393e497e 100644 --- a/src/select.c +++ b/src/select.c @@ -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+1nSrc + && pFrom[1].fg.isUsing + && (selFlags & SF_NestedFrom)!=0 + ){ + int ii; + IdList *pUsing = pFrom[1].u3.pUsing; + for(ii=0; iinId; 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; jnCol; 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);