diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/resolve.c | 42 | ||||
-rw-r--r-- | src/select.c | 7 | ||||
-rw-r--r-- | src/sqliteInt.h | 1 |
3 files changed, 29 insertions, 21 deletions
diff --git a/src/resolve.c b/src/resolve.c index 0364407d4..e90e8a768 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -176,6 +176,31 @@ static int areDoubleQuotedStringsEnabled(sqlite3 *db, NameContext *pTopNC){ } /* +** The argument is guaranteed to be a non-NULL Expr node of type TK_COLUMN. +** return the appropriate colUsed mask. +*/ +Bitmask sqlite3ExprColUsed(Expr *pExpr){ + int n; + Table *pExTab; + + n = pExpr->iColumn; + pExTab = pExpr->y.pTab; + assert( pExTab!=0 ); + if( (pExTab->tabFlags & TF_HasGenerated)!=0 + && (pExTab->aCol[n].colFlags & COLFLAG_GENERATED)!=0 + ){ + testcase( pExTab->nCol==BMS-1 ); + testcase( pExTab->nCol==BMS ); + return pExTab->nCol>=BMS ? ALLBITS : MASKBIT(pExTab->nCol)-1; + }else{ + testcase( n==BMS-1 ); + testcase( n==BMS ); + if( n>=BMS ) n = BMS-1; + return ((Bitmask)1)<<n; + } +} + +/* ** Given the name of a column of the form X.Y.Z or Y.Z or just Z, look up ** that name in the set of source tables in pSrcList and make the pExpr ** expression node refer back to that source column. The following changes @@ -577,22 +602,7 @@ static int lookupName( ** of the table. */ if( pExpr->iColumn>=0 && pMatch!=0 ){ - int n = pExpr->iColumn; - Table *pExTab = pExpr->y.pTab; - assert( pExTab!=0 ); - assert( pMatch->iCursor==pExpr->iTable ); - if( (pExTab->tabFlags & TF_HasGenerated)!=0 - && (pExTab->aCol[n].colFlags & COLFLAG_GENERATED)!=0 - ){ - testcase( pExTab->nCol==BMS-1 ); - testcase( pExTab->nCol==BMS ); - pMatch->colUsed = pExTab->nCol>=BMS ? ALLBITS : MASKBIT(pExTab->nCol)-1; - }else{ - testcase( n==BMS-1 ); - testcase( n==BMS ); - if( n>=BMS ) n = BMS-1; - pMatch->colUsed |= ((Bitmask)1)<<n; - } + pMatch->colUsed |= sqlite3ExprColUsed(pExpr); } /* Clean up and return diff --git a/src/select.c b/src/select.c index 52586d8ca..b2dd5f149 100644 --- a/src/select.c +++ b/src/select.c @@ -3590,14 +3590,11 @@ static void substSelect( */ static int recomputeColumnsUsedExpr(Walker *pWalker, Expr *pExpr){ struct SrcList_item *pItem; - ynVar iCol; if( pExpr->op!=TK_COLUMN ) return WRC_Continue; pItem = pWalker->u.pSrcItem; if( pItem->iCursor!=pExpr->iTable ) return WRC_Continue; - iCol = pExpr->iColumn; - if( iCol<0 ) return WRC_Continue; - if( iCol>=BMS ) iCol = BMS-1; - pItem->colUsed |= ((Bitmask)1)<<iCol; + if( pExpr->iColumn<0 ) return WRC_Continue; + pItem->colUsed |= sqlite3ExprColUsed(pExpr); return WRC_Continue; } static void recomputeColumnsUsed( diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 02ad6bfce..489768bbc 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -4551,6 +4551,7 @@ int sqlite3MatchEName( const char*, const char* ); +Bitmask sqlite3ExprColUsed(Expr*); int sqlite3ResolveExprNames(NameContext*, Expr*); int sqlite3ResolveExprListNames(NameContext*, ExprList*); void sqlite3ResolveSelectNames(Parse*, Select*, NameContext*); |