diff options
author | dan <dan@noemail.net> | 2018-06-23 19:29:56 +0000 |
---|---|---|
committer | dan <dan@noemail.net> | 2018-06-23 19:29:56 +0000 |
commit | c316307315e532a7117183430669f345b75ea402 (patch) | |
tree | b5f4c650631448cb57f87d12a804b8e4627386ef /src/resolve.c | |
parent | efa3a3c9cc0c0530a52feb9085d82347466d8f11 (diff) | |
download | sqlite-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.c | 22 |
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 |