aboutsummaryrefslogtreecommitdiff
path: root/src/resolve.c
diff options
context:
space:
mode:
authordan <dan@noemail.net>2018-06-23 19:29:56 +0000
committerdan <dan@noemail.net>2018-06-23 19:29:56 +0000
commitc316307315e532a7117183430669f345b75ea402 (patch)
treeb5f4c650631448cb57f87d12a804b8e4627386ef /src/resolve.c
parentefa3a3c9cc0c0530a52feb9085d82347466d8f11 (diff)
downloadsqlite-c316307315e532a7117183430669f345b75ea402.tar.gz
sqlite-c316307315e532a7117183430669f345b75ea402.zip
Fix problems with using window-functions in correlated sub-queries.
FossilOrigin-Name: 3e23cfc8133342a4de6813afdc33d726f06d625424b16d0999fb22be51bf8913
Diffstat (limited to 'src/resolve.c')
-rw-r--r--src/resolve.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/src/resolve.c b/src/resolve.c
index 84ec6598e..60453c17a 100644
--- a/src/resolve.c
+++ b/src/resolve.c
@@ -774,14 +774,18 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
}else{
zType = "aggregate";
}
+ sqlite3ErrorMsg(pParse, "misuse of %s function %.*s()", zType, nId,zId);
+ pNC->nErr++;
+ is_agg = 0;
+ }
#else
if( (is_agg && (pNC->ncFlags & NC_AllowAgg)==0) ){
- const char *zType = "aggregate";
-#endif
- sqlite3ErrorMsg(pParse, "misuse of %s function %.*s()", zType, nId,zId);
+ sqlite3ErrorMsg(pParse, "misuse of aggregate function %.*s()", nId,zId);
pNC->nErr++;
is_agg = 0;
- }else if( no_such_func && pParse->db->init.busy==0
+ }
+#endif
+ else if( no_such_func && pParse->db->init.busy==0
#ifdef SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION
&& pParse->explain==0
#endif
@@ -793,12 +797,17 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
nId, zId);
pNC->nErr++;
}
- if( is_agg ) pNC->ncFlags &= ~NC_AllowAgg;
+ if( is_agg ){
+ pNC->ncFlags &= ~(pExpr->pWin ? NC_AllowWin : NC_AllowAgg);
+ }
sqlite3WalkExprList(pWalker, pList);
if( is_agg ){
#ifndef SQLITE_OMIT_WINDOWFUNC
if( pExpr->pWin ){
Select *pSel = pNC->pWinSelect;
+ sqlite3WalkExprList(pWalker, pExpr->pWin->pPartition);
+ sqlite3WalkExprList(pWalker, pExpr->pWin->pOrderBy);
+ sqlite3WalkExpr(pWalker, pExpr->pWin->pFilter);
sqlite3WindowUpdate(pParse, pSel->pWinDefn, pExpr->pWin, pDef);
if( 0==pSel->pWin
|| 0==sqlite3WindowCompare(pParse, pSel->pWin, pExpr->pWin)
@@ -806,6 +815,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
pExpr->pWin->pNextWin = pSel->pWin;
pSel->pWin = pExpr->pWin;
}
+ pNC->ncFlags |= NC_AllowWin;
}else
#endif /* SQLITE_OMIT_WINDOWFUNC */
{
@@ -823,8 +833,8 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
pNC2->ncFlags |= NC_HasAgg | (pDef->funcFlags & SQLITE_FUNC_MINMAX);
}
+ pNC->ncFlags |= NC_AllowAgg;
}
- pNC->ncFlags |= NC_AllowAgg;
}
/* FIX ME: Compute pExpr->affinity based on the expected return
** type of the function