aboutsummaryrefslogtreecommitdiff
path: root/src/expr.c
diff options
context:
space:
mode:
authordrh <>2022-07-25 14:05:11 +0000
committerdrh <>2022-07-25 14:05:11 +0000
commit6b6d6c6bd2ca6b1dc19f61216ffe88e5cf734581 (patch)
tree128c6da2324e347e3ba35def02f6203eeeda6b27 /src/expr.c
parent8bd0b250b715802f3bddf46596841d18acffcdb4 (diff)
downloadsqlite-6b6d6c6bd2ca6b1dc19f61216ffe88e5cf734581.tar.gz
sqlite-6b6d6c6bd2ca6b1dc19f61216ffe88e5cf734581.zip
TK_IF_NULL_ROW expressions must be accumulated in the same way as TK_COLUMN
expressions in an aggregate query. Proposed fix for the problem identifyed by dbsqlfuzz 8e17857db2c5a9294c975123ac807156a6559f13. FossilOrigin-Name: 40d08807209638aad728be2cedbc904e342e76c8e486c364bd571b55dd2e1e87
Diffstat (limited to 'src/expr.c')
-rw-r--r--src/expr.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/src/expr.c b/src/expr.c
index 8edab3298..876b453f1 100644
--- a/src/expr.c
+++ b/src/expr.c
@@ -4670,6 +4670,13 @@ expr_code_doover:
case TK_IF_NULL_ROW: {
int addrINR;
u8 okConstFactor = pParse->okConstFactor;
+ if( pExpr->pAggInfo && !pExpr->pAggInfo->directMode ){
+ struct AggInfo_col *pCol;
+ assert( pExpr->iAgg>=0 && pExpr->iAgg<pExpr->pAggInfo->nColumn );
+ pCol = &pExpr->pAggInfo->aCol[pExpr->iAgg];
+ inReg = pCol->iMem;
+ break;
+ }
addrINR = sqlite3VdbeAddOp1(v, OP_IfNullRow, pExpr->iTable);
/* Temporarily disable factoring of constant expressions, since
** even though expressions may appear to be constant, they are not
@@ -6175,6 +6182,7 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){
assert( pNC->ncFlags & NC_UAggInfo );
switch( pExpr->op ){
+ case TK_IF_NULL_ROW:
case TK_AGG_COLUMN:
case TK_COLUMN: {
testcase( pExpr->op==TK_AGG_COLUMN );
@@ -6237,7 +6245,7 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){
*/
ExprSetVVAProperty(pExpr, EP_NoReduce);
pExpr->pAggInfo = pAggInfo;
- pExpr->op = TK_AGG_COLUMN;
+ if( pExpr->op==TK_COLUMN ) pExpr->op = TK_AGG_COLUMN;
pExpr->iAgg = (i16)k;
break;
} /* endif pExpr->iTable==pItem->iCursor */