]> granicus.if.org Git - postgresql/commitdiff
Check misplaced window functions before checking aggregate/group by sanity.
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 8 Feb 2012 18:15:02 +0000 (13:15 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 8 Feb 2012 18:15:02 +0000 (13:15 -0500)
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

index be6e93e261208c5819bd58c06a83466e3c25fd07..b187b03666a30ff40825a34c240a08a13f7789c2 100644 (file)
@@ -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)
        {