diff options
author | drh <> | 2023-10-18 13:58:31 +0000 |
---|---|---|
committer | drh <> | 2023-10-18 13:58:31 +0000 |
commit | db19f48b698bc1327ff4a83309a26d4ebead503e (patch) | |
tree | 0f6600a36698628ada94df02e64cfe4cf8860f86 /src/resolve.c | |
parent | f8202f1ff3ff84908ff1038886f6c6c01eba8dc2 (diff) | |
download | sqlite-db19f48b698bc1327ff4a83309a26d4ebead503e.tar.gz sqlite-db19f48b698bc1327ff4a83309a26d4ebead503e.zip |
Basic error checking. Resolve symbols in the aggregate ORDER BY expressions.
FossilOrigin-Name: c83a53a574d312130d1238c05ffa449d8bed2535d5ef5b5d9cf02f894494cca4
Diffstat (limited to 'src/resolve.c')
-rw-r--r-- | src/resolve.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/src/resolve.c b/src/resolve.c index bd890c9f8..532306e9c 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -1052,6 +1052,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ Window *pWin = (IsWindowFunc(pExpr) ? pExpr->y.pWin : 0); #endif assert( !ExprHasProperty(pExpr, EP_xIsSelect|EP_IntValue) ); + assert( pExpr->pLeft==0 || pExpr->pLeft->op==TK_ORDER ); zId = pExpr->u.zToken; pDef = sqlite3FindFunction(pParse->db, zId, n, enc, 0); if( pDef==0 ){ @@ -1193,6 +1194,13 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ pNC->nNcErr++; } #endif + else if( is_agg==0 && pExpr->pLeft ){ + sqlite3ErrorMsg(pParse, + "ORDER BY may not be used with non-aggregate %#T()", + pExpr + ); + pNC->nNcErr++; + } if( is_agg ){ /* Window functions may not be arguments of aggregate functions. ** Or arguments of other window functions. But aggregate functions @@ -1211,6 +1219,11 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ #endif sqlite3WalkExprList(pWalker, pList); if( is_agg ){ + if( pExpr->pLeft ){ + assert( pExpr->pLeft->op==TK_ORDER ); + assert( ExprUseXList(pExpr->pLeft) ); + sqlite3WalkExprList(pWalker, pExpr->pLeft->x.pList); + } #ifndef SQLITE_OMIT_WINDOWFUNC if( pWin ){ Select *pSel = pNC->pWinSelect; |