aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/resolve.c42
-rw-r--r--src/select.c7
-rw-r--r--src/sqliteInt.h1
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*);