aboutsummaryrefslogtreecommitdiff
path: root/src/resolve.c
diff options
context:
space:
mode:
authordrh <>2023-10-18 13:58:31 +0000
committerdrh <>2023-10-18 13:58:31 +0000
commitdb19f48b698bc1327ff4a83309a26d4ebead503e (patch)
tree0f6600a36698628ada94df02e64cfe4cf8860f86 /src/resolve.c
parentf8202f1ff3ff84908ff1038886f6c6c01eba8dc2 (diff)
downloadsqlite-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.c13
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;