diff options
author | drh <drh@noemail.net> | 2019-12-09 17:14:48 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2019-12-09 17:14:48 +0000 |
commit | 926f796e8feec15f3836aa0a060ed906f8ae04d3 (patch) | |
tree | 350dcc2ad8852d1fa62dab11c4997e9477941735 /src/resolve.c | |
parent | ebd70eedd5d6e6a890a670b5ee874a5eae86b4dd (diff) | |
download | sqlite-926f796e8feec15f3836aa0a060ed906f8ae04d3.tar.gz sqlite-926f796e8feec15f3836aa0a060ed906f8ae04d3.zip |
Ensure that the SrcList_item.colUsed field is set correctly (set to have a
1 for all columns of the table) when a generated column appears in the USING
clause of a join.
FossilOrigin-Name: 1923efb283e8840fa7436eb20b9d2174ef7cace1690d3b97b572a0db2048b8e3
Diffstat (limited to 'src/resolve.c')
-rw-r--r-- | src/resolve.c | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/src/resolve.c b/src/resolve.c index fdf4bf0f0..5c01df4f8 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -624,15 +624,28 @@ Expr *sqlite3CreateColumnExpr(sqlite3 *db, SrcList *pSrc, int iSrc, int iCol){ Expr *p = sqlite3ExprAlloc(db, TK_COLUMN, 0, 0); if( p ){ struct SrcList_item *pItem = &pSrc->a[iSrc]; - p->y.pTab = pItem->pTab; + Table *pTab = p->y.pTab = pItem->pTab; p->iTable = pItem->iCursor; if( p->y.pTab->iPKey==iCol ){ p->iColumn = -1; }else{ p->iColumn = (ynVar)iCol; - testcase( iCol==BMS ); - testcase( iCol==BMS-1 ); - pItem->colUsed |= ((Bitmask)1)<<(iCol>=BMS ? BMS-1 : iCol); + if( pTab->tabFlags & TF_HasGenerated ){ + Column *pColumn = pTab->aCol + iCol; + if( pColumn->colFlags & COLFLAG_GENERATED ){ + testcase( pTab->nCol==63 ); + testcase( pTab->nCol==64 ); + if( pTab->nCol>=64 ){ + pItem->colUsed = ALLBITS; + }else{ + pItem->colUsed = MASKBIT(pTab->nCol)-1; + } + } + }else{ + testcase( iCol==BMS ); + testcase( iCol==BMS-1 ); + pItem->colUsed |= ((Bitmask)1)<<(iCol>=BMS ? BMS-1 : iCol); + } } } return p; |