diff --git a/src/backend/parser/parse_func.c b/src/backend/parser/parse_func.c index 2e4cc1de50d..6717ddc6881 100644 --- a/src/backend/parser/parse_func.c +++ b/src/backend/parser/parse_func.c @@ -353,6 +353,15 @@ ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs, parser_errposition(pstate, location))); } + /* + * NULL TREATEMENT is only allowed for window functions per spec. + */ + if (fdresult != FUNCDETAIL_WINDOWFUNC && ignore_nulls != NO_NULLTREATMENT) + ereport(ERROR, + errcode(ERRCODE_WRONG_OBJECT_TYPE), + errmsg("Only window functions accept RESPECT/IGNORE NULLS"), + parser_errposition(pstate, location)); + /* * So far so good, so do some fdresult-type-specific processing. */ @@ -519,13 +528,6 @@ ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs, errmsg("%s is not an ordered-set aggregate, so it cannot have WITHIN GROUP", NameListToString(funcname)), parser_errposition(pstate, location))); - - /* It also can't treat nulls as a window function */ - if (ignore_nulls != NO_NULLTREATMENT) - ereport(ERROR, - (errcode(ERRCODE_WRONG_OBJECT_TYPE), - errmsg("aggregate functions do not accept RESPECT/IGNORE NULLS"), - parser_errposition(pstate, location))); } } else if (fdresult == FUNCDETAIL_WINDOWFUNC) diff --git a/src/test/regress/expected/window.out b/src/test/regress/expected/window.out index de0e14a686e..891b0153004 100644 --- a/src/test/regress/expected/window.out +++ b/src/test/regress/expected/window.out @@ -5764,11 +5764,11 @@ SELECT sum(orbit) OVER () FROM planets; -- succeeds (10 rows) SELECT sum(orbit) RESPECT NULLS OVER () FROM planets; -- fails -ERROR: aggregate functions do not accept RESPECT/IGNORE NULLS +ERROR: Only window functions accept RESPECT/IGNORE NULLS LINE 1: SELECT sum(orbit) RESPECT NULLS OVER () FROM planets; ^ SELECT sum(orbit) IGNORE NULLS OVER () FROM planets; -- fails -ERROR: aggregate functions do not accept RESPECT/IGNORE NULLS +ERROR: Only window functions accept RESPECT/IGNORE NULLS LINE 1: SELECT sum(orbit) IGNORE NULLS OVER () FROM planets; ^ SELECT row_number() OVER () FROM planets; -- succeeds