mirror of
https://github.com/postgres/postgres.git
synced 2026-06-17 04:29:01 -04:00
Fix to not allow null treatment to non window functions.
The null treatment clause (RESPECT NULLS/IGNORE NULLS) are only allowed to window functions per spec. Previously the check was only applied to aggregates in window clause. Other types of functions were allowed to use the clause, which was plain wrong. To fix this, ParseFuncOrColumn() now checks whether other than window functions are used with the null treatment clause. If so, error out. Also remove the unnecessary test for "aggregate functions do not accept RESPECT/IGNORE NULLS" because it is now checked in the early-stage new check. The window regression test expected file is changed accordingly. Reported-by: jian he <jian.universality@gmail.com> Reviewed-by: jian he <jian.universality@gmail.com> Author: Tatsuo Ishii <ishii@postgresql.org> Discussion: https://postgr.es/m/CACJufxFnm%2BAj2Jyhyd58PtW8e1vTZDKimkZE%2BMashCPSDKw56Q%40mail.gmail.com
This commit is contained in:
parent
9285737ac3
commit
4e5920e6de
2 changed files with 11 additions and 9 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue