aboutsummaryrefslogtreecommitdiff
path: root/src/expr.c
diff options
context:
space:
mode:
authordrh <>2023-10-18 22:03:48 +0000
committerdrh <>2023-10-18 22:03:48 +0000
commit20b95f8d3fc34d6fe8a049a3b2abebefce12eea1 (patch)
tree47c33c69ce9333c42eeff43e6af35ff2d5a3957e /src/expr.c
parent49dc1be96f76ce01325cdb2d8b475f25a51f3605 (diff)
downloadsqlite-20b95f8d3fc34d6fe8a049a3b2abebefce12eea1.tar.gz
sqlite-20b95f8d3fc34d6fe8a049a3b2abebefce12eea1.zip
Make sure all terms of the ORDER BY within an aggregate go through aggregate
analysis. Do not attach an aggregate ORDER BY to a window function. FossilOrigin-Name: 16f3805514a741405f70e0ee3b5a6b67720bc75719372e82daa4136fe411ea2b
Diffstat (limited to 'src/expr.c')
-rw-r--r--src/expr.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/expr.c b/src/expr.c
index 26f0b4c5c..72a5fae7d 100644
--- a/src/expr.c
+++ b/src/expr.c
@@ -1182,6 +1182,16 @@ Expr *sqlite3ExprFunction(
}
/*
+** Report an error when attempting to use an ORDER BY clause within
+** the arguments of a non-aggregate function.
+*/
+void sqlite3ExprOrderByAggregateError(Parse *pParse, Expr *p){
+ sqlite3ErrorMsg(pParse,
+ "ORDER BY may not be used with non-aggregate %#T()", p
+ );
+}
+
+/*
** Attach an ORDER BY clause to a function call.
**
** functionname( arguments ORDER BY sortlist )
@@ -1215,6 +1225,12 @@ void sqlite3ExprAddFunctionOrderBy(
sqlite3ExprListDelete(db, pOrderBy);
return;
}
+ if( IsWindowFunc(pExpr) ){
+ sqlite3ExprOrderByAggregateError(pParse, pExpr);
+ sqlite3ExprListDelete(db, pOrderBy);
+ return;
+ }
+
pOB = sqlite3ExprAlloc(db, TK_ORDER, 0, 0);
if( pOB==0 ){
sqlite3ExprListDelete(db, pOrderBy);