From: drh <> Date: Fri, 3 Jul 2026 01:27:57 +0000 (+0000) Subject: Use the EXCLUDE clause when expanding "*". X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=6967c4c08a4daa2588fcb963542a12c23ac7efb4;p=thirdparty%2Fsqlite.git Use the EXCLUDE clause when expanding "*". FossilOrigin-Name: faa3a3fc27039635c10f8e5baa25944bff360f3e1a400e50f226a111ef140fe4 --- diff --git a/manifest b/manifest index 7aef81fa28..aef2ff8201 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Experimental\swork\son\simplementing\san\sEXCLUDE\sclause\sfollowing\s"*"\nwildcards\sin\sa\sSELECT\sstatement.\s\sParsing\sonly\sat\sthis\spoint. -D 2026-07-03T00:56:05.259 +C Use\sthe\sEXCLUDE\sclause\swhen\sexpanding\s"*". +D 2026-07-03T01:27:57.796 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/printf.c b480176bd0aaed9d64e804cfa3ca27fc585f65a73e7c7ca2fe9b9016db2cf6d5 F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c F src/resolve.c d0724113da9f5c0430d2052808ce59519f51ae7c4fbb1f5ef21fe3a832956086 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97 -F src/select.c f553420eaf5c72a49cef786621eea79dd8c4411671839fb05250bb49ca74a0a0 +F src/select.c 485421e23a9ee3c46252a3b5c76273a134540be4c40f0ca6c141dcc3ecdc1be9 F src/shell.c.in a4e83895cfa336065ad7f7a7dea8fc2a19d050f7ce7466621c67208acaac9e44 F src/sqlite.h.in d9ec41feb4cd804e68b174328b43beb3f1f71bba13e1c7a439efb826d301cccc F src/sqlite3.rc 015537e6ac1eec6c7050e17b616c2ffe6f70fca241835a84a4f0d5937383c479 @@ -2210,11 +2210,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c -P 0d70a15c3b35e9af3052042cd5332db1b38a66416f1c3c8a50d342395bf22c01 -R fbfb38b4a2d1f59e008a86ce344506fc -T *branch * exclude-clause -T *sym-exclude-clause * -T -sym-trunk * +P f38fc2c7d72a5f9eb99314ec3e6e399faf035066e27991fa4f73b07bb807b594 +R 384ba18da0aa70fab024ce5c96b0311d U drh -Z 085c7684bdb90daee11e1c534e7f72a6 +Z 3ca97555c3e8c92027f91660e1b345f5 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index a5975479e8..58be82ed92 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f38fc2c7d72a5f9eb99314ec3e6e399faf035066e27991fa4f73b07bb807b594 +faa3a3fc27039635c10f8e5baa25944bff360f3e1a400e50f226a111ef140fe4 diff --git a/src/select.c b/src/select.c index e29ad6e436..89b64e19c4 100644 --- a/src/select.c +++ b/src/select.c @@ -6150,6 +6150,7 @@ static int selectExpander(Walker *pWalker, Select *p){ int tableSeen = 0; /* Set to 1 when TABLE matches */ char *zTName = 0; /* text of name of TABLE */ int iErrOfst; + ExprList *pExclude; /* The EXCLUDE clause, or NULL */ if( pE->op==TK_DOT ){ assert( (selFlags & SF_NestedFrom)==0 ); assert( pE->pLeft!=0 ); @@ -6157,9 +6158,13 @@ static int selectExpander(Walker *pWalker, Select *p){ zTName = pE->pLeft->u.zToken; assert( ExprUseWOfst(pE->pLeft) ); iErrOfst = pE->pRight->w.iOfst; + assert( ExprUseXList(pE->pRight) ); + pExclude = pE->pRight->x.pList; }else{ assert( ExprUseWOfst(pE) ); iErrOfst = pE->w.iOfst; + assert( ExprUseXList(pE) ); + pExclude = pE->x.pList; } for(i=0, pFrom=pTabList->a; inSrc; i++, pFrom++){ int nAdd; /* Number of cols including rowid */ @@ -6216,8 +6221,9 @@ static int selectExpander(Walker *pWalker, Select *p){ nAdd = pTab->nCol; if( VisibleRowid(pTab) && (selFlags & SF_NestedFrom)!=0 ) nAdd++; for(j=0; jnCol ){ zName = sqlite3RowidAlias(pTab); @@ -6253,6 +6259,19 @@ static int selectExpander(Walker *pWalker, Select *p){ ){ continue; } + + /* Check for EXCLUDE columns */ + pEx = 0; + if( pExclude ){ + int kk; + for(kk=0; kknExpr; kk++){ + if( sqlite3_stricmp(pExclude->a[kk].zEName,zName)==0 ){ + pEx = &pExclude->a[kk]; + break; + } + } + if( pEx && pEx->fg.eEName==ENAME_EXCLUDE ) continue; + } } assert( zName ); tableSeen = 1; @@ -6266,27 +6285,31 @@ static int selectExpander(Walker *pWalker, Select *p){ continue; } } - pRight = sqlite3Expr(db, TK_ID, zName); - if( (pTabList->nSrc>1 - && ( (pFrom->fg.jointype & JT_LTORJ)==0 - || (selFlags & SF_NestedFrom)!=0 - || !inAnyUsingClause(zName,pFrom,pTabList->nSrc-i-1) - ) - ) - || IN_RENAME_OBJECT - ){ - Expr *pLeft; - pLeft = sqlite3Expr(db, TK_ID, zTabName); - pExpr = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight); - if( IN_RENAME_OBJECT && pE->pLeft ){ - sqlite3RenameTokenRemap(pParse, pLeft, pE->pLeft); - } - if( zSchemaName ){ - pLeft = sqlite3Expr(db, TK_ID, zSchemaName); - pExpr = sqlite3PExpr(pParse, TK_DOT, pLeft, pExpr); - } + if( pEx && pEx->fg.eEName==ENAME_REPLACE ){ + pExpr = sqlite3ExprDup(db, pEx->pExpr, 0); }else{ - pExpr = pRight; + pRight = sqlite3Expr(db, TK_ID, zName); + if( (pTabList->nSrc>1 + && ( (pFrom->fg.jointype & JT_LTORJ)==0 + || (selFlags & SF_NestedFrom)!=0 + || !inAnyUsingClause(zName,pFrom,pTabList->nSrc-i-1) + ) + ) + || IN_RENAME_OBJECT + ){ + Expr *pLeft; + pLeft = sqlite3Expr(db, TK_ID, zTabName); + pExpr = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight); + if( IN_RENAME_OBJECT && pE->pLeft ){ + sqlite3RenameTokenRemap(pParse, pLeft, pE->pLeft); + } + if( zSchemaName ){ + pLeft = sqlite3Expr(db, TK_ID, zSchemaName); + pExpr = sqlite3PExpr(pParse, TK_DOT, pLeft, pExpr); + } + }else{ + pExpr = pRight; + } } sqlite3ExprSetErrorOffset(pExpr, iErrOfst); pNew = sqlite3ExprListAppend(pParse, pNew, pExpr); @@ -6313,6 +6336,8 @@ static int selectExpander(Walker *pWalker, Select *p){ ){ pX->fg.bNoExpand = 1; } + }else if( pEx && pEx->fg.eEName==ENAME_RENAME ){ + pX->zEName = sqlite3DbStrDup(db, pEx->pExpr->u.zToken); }else if( longNames ){ pX->zEName = sqlite3MPrintf(db, "%s.%s", zTabName, zName); pX->fg.eEName = ENAME_NAME;