-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
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
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.
-07906e3c4fcefa721a1dfd57590778cf9c278e93b1f86128843c743d6aca7106
\ No newline at end of file
+959b7182144664a13e169fa63b79149f4e7048680d1f481a39507aab6b23e17c
\ No newline at end of file
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;
}
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 */
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
){
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);