1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-11-12 13:01:09 +03:00

Improved assert()s on the sqlite3ExprListDup() logic for TK_SELECT_COLUMN.

FossilOrigin-Name: 14da99d41f7968bf816203b4ae11c1f0d1ee0b5d
This commit is contained in:
drh
2017-01-03 00:27:16 +00:00
parent 90a7eae84c
commit b163748e88
3 changed files with 15 additions and 11 deletions

View File

@@ -1295,6 +1295,7 @@ ExprList *sqlite3ExprListDup(sqlite3 *db, ExprList *p, int flags){
ExprList *pNew;
struct ExprList_item *pItem, *pOldItem;
int i;
Expr *pPriorSelectCol = 0;
assert( db!=0 );
if( p==0 ) return 0;
pNew = sqlite3DbMallocRawNN(db, sizeof(*pNew) );
@@ -1311,7 +1312,6 @@ ExprList *sqlite3ExprListDup(sqlite3 *db, ExprList *p, int flags){
Expr *pOldExpr = pOldItem->pExpr;
Expr *pNewExpr;
pItem->pExpr = sqlite3ExprDup(db, pOldExpr, flags);
assert( pItem->pExpr==0 || db->mallocFailed==0 );
if( pOldExpr
&& pOldExpr->op==TK_SELECT_COLUMN
&& (pNewExpr = pItem->pExpr)!=0
@@ -1319,9 +1319,13 @@ ExprList *sqlite3ExprListDup(sqlite3 *db, ExprList *p, int flags){
assert( pNewExpr->iColumn==0 || i>0 );
if( pNewExpr->iColumn==0 ){
assert( pOldExpr->pLeft==pOldExpr->pRight );
pNewExpr->pLeft = pNewExpr->pRight;
}else if( ALWAYS(pItem[-1].pExpr!=0) ){
pNewExpr->pLeft = pItem[-1].pExpr->pLeft;
pPriorSelectCol = pNewExpr->pLeft = pNewExpr->pRight;
}else{
assert( i>0 );
assert( pItem[-1].pExpr!=0 );
assert( pNewExpr->iColumn==pItem[-1].pExpr->iColumn+1 );
assert( pPriorSelectCol==pItem[-1].pExpr->pLeft );
pNewExpr->pLeft = pPriorSelectCol;
}
}
pItem->zName = sqlite3DbStrDup(db, pOldItem->zName);