aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/expr.c3
-rw-r--r--src/select.c8
2 files changed, 8 insertions, 3 deletions
diff --git a/src/expr.c b/src/expr.c
index 010c8ce6a..e071c9690 100644
--- a/src/expr.c
+++ b/src/expr.c
@@ -6806,16 +6806,17 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){
pItem->iOBTab = pParse->nTab++;
pOBList = pExpr->pLeft->x.pList;
assert( pOBList->nExpr>0 );
+ assert( pItem->bOBUnique==0 );
if( pOBList->nExpr==1
&& nArg==1
&& sqlite3ExprCompare(0,pOBList->a[0].pExpr,
pExpr->x.pList->a[0].pExpr,0)==0
){
pItem->bOBPayload = 0;
+ pItem->bOBUnique = ExprHasProperty(pExpr, EP_Distinct);
}else{
pItem->bOBPayload = 1;
}
- pItem->bOBUnique = ExprHasProperty(pExpr, EP_Distinct);
}else{
pItem->iOBTab = -1;
}
diff --git a/src/select.c b/src/select.c
index 29df3325f..553032174 100644
--- a/src/select.c
+++ b/src/select.c
@@ -6771,6 +6771,7 @@ static void updateAccumulator(
int addrNext = 0;
int regAgg;
int regAggSz = 0;
+ int regDistinct = 0;
ExprList *pList;
assert( ExprUseXList(pF->pFExpr) );
assert( !IsWindowFunc(pF->pFExpr) );
@@ -6820,6 +6821,7 @@ static void updateAccumulator(
}
regAggSz++; /* One extra register to hold result of MakeRecord */
regAgg = sqlite3GetTempRange(pParse, regAggSz);
+ regDistinct = regAgg;
sqlite3ExprCodeExprList(pParse, pOBList, regAgg, 0, SQLITE_ECEL_DUP);
jj = pOBList->nExpr;
if( !pF->bOBUnique ){
@@ -6827,11 +6829,13 @@ static void updateAccumulator(
jj++;
}
if( pF->bOBPayload ){
- sqlite3ExprCodeExprList(pParse, pList, regAgg+jj, 0, SQLITE_ECEL_DUP);
+ regDistinct = regAgg+jj;
+ sqlite3ExprCodeExprList(pParse, pList, regDistinct, 0, SQLITE_ECEL_DUP);
}
}else if( pList ){
nArg = pList->nExpr;
regAgg = sqlite3GetTempRange(pParse, nArg);
+ regDistinct = regAgg;
sqlite3ExprCodeExprList(pParse, pList, regAgg, 0, SQLITE_ECEL_DUP);
}else{
nArg = 0;
@@ -6842,7 +6846,7 @@ static void updateAccumulator(
addrNext = sqlite3VdbeMakeLabel(pParse);
}
pF->iDistinct = codeDistinct(pParse, eDistinctType,
- pF->iDistinct, addrNext, pList, regAgg);
+ pF->iDistinct, addrNext, pList, regDistinct);
}
if( pF->iOBTab>=0 ){
/* Insert a new record into the ORDER BY table */