mirror of
https://github.com/postgres/postgres.git
synced 2025-07-14 08:21:07 +03:00
Support window functions a la SQL:2008.
Hitoshi Harada, with some kibitzing from Heikki and Tom.
This commit is contained in:
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/optimizer/path/allpaths.c,v 1.177 2008/11/15 19:43:46 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/optimizer/path/allpaths.c,v 1.178 2008/12/28 18:53:56 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -929,10 +929,13 @@ standard_join_search(PlannerInfo *root, int levels_needed, List *initial_rels)
|
||||
* 1. If the subquery has a LIMIT clause, we must not push down any quals,
|
||||
* since that could change the set of rows returned.
|
||||
*
|
||||
* 2. If the subquery contains EXCEPT or EXCEPT ALL set ops we cannot push
|
||||
* 2. If the subquery contains any window functions, we can't push quals
|
||||
* into it, because that would change the results.
|
||||
*
|
||||
* 3. If the subquery contains EXCEPT or EXCEPT ALL set ops we cannot push
|
||||
* quals into it, because that would change the results.
|
||||
*
|
||||
* 3. For subqueries using UNION/UNION ALL/INTERSECT/INTERSECT ALL, we can
|
||||
* 4. For subqueries using UNION/UNION ALL/INTERSECT/INTERSECT ALL, we can
|
||||
* push quals into each component query, but the quals can only reference
|
||||
* subquery columns that suffer no type coercions in the set operation.
|
||||
* Otherwise there are possible semantic gotchas. So, we check the
|
||||
@ -950,6 +953,10 @@ subquery_is_pushdown_safe(Query *subquery, Query *topquery,
|
||||
if (subquery->limitOffset != NULL || subquery->limitCount != NULL)
|
||||
return false;
|
||||
|
||||
/* Check point 2 */
|
||||
if (subquery->hasWindowFuncs)
|
||||
return false;
|
||||
|
||||
/* Are we at top level, or looking at a setop component? */
|
||||
if (subquery == topquery)
|
||||
{
|
||||
@ -1092,6 +1099,12 @@ qual_is_pushdown_safe(Query *subquery, Index rti, Node *qual,
|
||||
if (contain_subplans(qual))
|
||||
return false;
|
||||
|
||||
/*
|
||||
* It would be unsafe to push down window function calls, but at least
|
||||
* for the moment we could never see any in a qual anyhow.
|
||||
*/
|
||||
Assert(!contain_window_function(qual));
|
||||
|
||||
/*
|
||||
* Examine all Vars used in clause; since it's a restriction clause, all
|
||||
* such Vars must refer to subselect output columns.
|
||||
|
Reference in New Issue
Block a user