From: Tom Lane Date: Wed, 8 Feb 2012 18:15:02 +0000 (-0500) Subject: Check misplaced window functions before checking aggregate/group by sanity. X-Git-Tag: REL9_2_BETA1~448 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=cb7c84fae8a6780d836687aa2c9655eb936ebd25;p=postgresql 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. --- diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c index be6e93e261..b187b03666 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) {