From cb7c84fae8a6780d836687aa2c9655eb936ebd25 Mon Sep 17 00:00:00 2001 From: Tom Lane <tgl@sss.pgh.pa.us> Date: Wed, 8 Feb 2012 13:15:02 -0500 Subject: [PATCH] Check misplaced window functions before checking aggregate/group by sanity. If somebody puts a window function in WHERE, we should complain about that in so many words. The previous coding tended to complain about the window function's arguments instead, which is likely to be misleading to users who are unclear on the semantics of window functions; as seen for example in bug #6440 from Matyas Novak. Just another example of how "add new code at the end" is frequently a bad heuristic. --- src/backend/parser/analyze.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c index be6e93e2612..b187b03666a 100644 --- a/src/backend/parser/analyze.c +++ b/src/backend/parser/analyze.c @@ -316,12 +316,12 @@ transformDeleteStmt(ParseState *pstate, DeleteStmt *stmt) qry->jointree = makeFromExpr(pstate->p_joinlist, qual); qry->hasSubLinks = pstate->p_hasSubLinks; - qry->hasAggs = pstate->p_hasAggs; - if (pstate->p_hasAggs) - parseCheckAggregates(pstate, qry); qry->hasWindowFuncs = pstate->p_hasWindowFuncs; if (pstate->p_hasWindowFuncs) parseCheckWindowFuncs(pstate, qry); + qry->hasAggs = pstate->p_hasAggs; + if (pstate->p_hasAggs) + parseCheckAggregates(pstate, qry); assign_query_collations(pstate, qry); @@ -970,12 +970,12 @@ transformSelectStmt(ParseState *pstate, SelectStmt *stmt) qry->jointree = makeFromExpr(pstate->p_joinlist, qual); qry->hasSubLinks = pstate->p_hasSubLinks; - qry->hasAggs = pstate->p_hasAggs; - if (pstate->p_hasAggs || qry->groupClause || qry->havingQual) - parseCheckAggregates(pstate, qry); qry->hasWindowFuncs = pstate->p_hasWindowFuncs; if (pstate->p_hasWindowFuncs) parseCheckWindowFuncs(pstate, qry); + qry->hasAggs = pstate->p_hasAggs; + if (pstate->p_hasAggs || qry->groupClause || qry->havingQual) + parseCheckAggregates(pstate, qry); foreach(l, stmt->lockingClause) { @@ -1448,12 +1448,12 @@ transformSetOperationStmt(ParseState *pstate, SelectStmt *stmt) qry->jointree = makeFromExpr(pstate->p_joinlist, NULL); qry->hasSubLinks = pstate->p_hasSubLinks; - qry->hasAggs = pstate->p_hasAggs; - if (pstate->p_hasAggs || qry->groupClause || qry->havingQual) - parseCheckAggregates(pstate, qry); qry->hasWindowFuncs = pstate->p_hasWindowFuncs; if (pstate->p_hasWindowFuncs) parseCheckWindowFuncs(pstate, qry); + qry->hasAggs = pstate->p_hasAggs; + if (pstate->p_hasAggs || qry->groupClause || qry->havingQual) + parseCheckAggregates(pstate, qry); foreach(l, lockingClause) { -- GitLab