]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Use the EXCLUDE clause when expanding "*".
authordrh <>
Fri, 3 Jul 2026 01:27:57 +0000 (01:27 +0000)
committerdrh <>
Fri, 3 Jul 2026 01:27:57 +0000 (01:27 +0000)
FossilOrigin-Name: faa3a3fc27039635c10f8e5baa25944bff360f3e1a400e50f226a111ef140fe4

manifest
manifest.uuid
src/select.c

index 7aef81fa28aa7dda47f19eeb22399f025e9fde95..aef2ff8201c1a40d535d430951c1fb47dc528fbf 100644 (file)
--- 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.
index a5975479e844c6d64a9a6dae071d0f12dc568b2e..58be82ed927e17669b5ef47501142dbdb8159350 100644 (file)
@@ -1 +1 @@
-f38fc2c7d72a5f9eb99314ec3e6e399faf035066e27991fa4f73b07bb807b594
+faa3a3fc27039635c10f8e5baa25944bff360f3e1a400e50f226a111ef140fe4
index e29ad6e436207c9d0dd487e50bf7c91b364fa948..89b64e19c442fd596f6c714cab25a88eab461bda 100644 (file)
@@ -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; i<pTabList->nSrc; 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; j<nAdd; j++){
-            const char *zName; 
-            struct ExprList_item *pX; /* Newly added ExprList term */
+            const char *zName;
+            struct ExprList_item *pEx; /* Matching pExclude term */
+            struct ExprList_item *pX;  /* Newly added ExprList term */
 
             if( j==pTab->nCol ){
               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; kk<pExclude->nExpr; 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;