mirror of
https://github.com/postgres/postgres.git
synced 2025-07-15 19:21:59 +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/nodes/outfuncs.c,v 1.346 2008/12/01 21:06:12 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/nodes/outfuncs.c,v 1.347 2008/12/28 18:53:56 tgl Exp $
|
||||
*
|
||||
* NOTES
|
||||
* Every node type that can appear in stored rules' parsetrees *must*
|
||||
@ -566,6 +566,36 @@ _outAgg(StringInfo str, Agg *node)
|
||||
WRITE_LONG_FIELD(numGroups);
|
||||
}
|
||||
|
||||
static void
|
||||
_outWindowAgg(StringInfo str, WindowAgg *node)
|
||||
{
|
||||
int i;
|
||||
|
||||
WRITE_NODE_TYPE("WINDOWAGG");
|
||||
|
||||
_outPlanInfo(str, (Plan *) node);
|
||||
|
||||
WRITE_INT_FIELD(partNumCols);
|
||||
|
||||
appendStringInfo(str, " :partColIdx");
|
||||
for (i = 0; i < node->partNumCols; i++)
|
||||
appendStringInfo(str, " %d", node->partColIdx[i]);
|
||||
|
||||
appendStringInfo(str, " :partOperations");
|
||||
for (i = 0; i < node->partNumCols; i++)
|
||||
appendStringInfo(str, " %u", node->partOperators[i]);
|
||||
|
||||
WRITE_INT_FIELD(ordNumCols);
|
||||
|
||||
appendStringInfo(str, " :ordColIdx");
|
||||
for (i = 0; i< node->ordNumCols; i++)
|
||||
appendStringInfo(str, " %d", node->ordColIdx[i]);
|
||||
|
||||
appendStringInfo(str, " :ordOperations");
|
||||
for (i = 0; i < node->ordNumCols; i++)
|
||||
appendStringInfo(str, " %u", node->ordOperators[i]);
|
||||
}
|
||||
|
||||
static void
|
||||
_outGroup(StringInfo str, Group *node)
|
||||
{
|
||||
@ -798,6 +828,20 @@ _outAggref(StringInfo str, Aggref *node)
|
||||
WRITE_LOCATION_FIELD(location);
|
||||
}
|
||||
|
||||
static void
|
||||
_outWindowFunc(StringInfo str, WindowFunc *node)
|
||||
{
|
||||
WRITE_NODE_TYPE("WINDOWFUNC");
|
||||
|
||||
WRITE_OID_FIELD(winfnoid);
|
||||
WRITE_OID_FIELD(wintype);
|
||||
WRITE_NODE_FIELD(args);
|
||||
WRITE_UINT_FIELD(winref);
|
||||
WRITE_BOOL_FIELD(winstar);
|
||||
WRITE_BOOL_FIELD(winagg);
|
||||
WRITE_LOCATION_FIELD(location);
|
||||
}
|
||||
|
||||
static void
|
||||
_outArrayRef(StringInfo str, ArrayRef *node)
|
||||
{
|
||||
@ -1440,6 +1484,7 @@ _outPlannerInfo(StringInfo str, PlannerInfo *node)
|
||||
WRITE_NODE_FIELD(placeholder_list);
|
||||
WRITE_NODE_FIELD(query_pathkeys);
|
||||
WRITE_NODE_FIELD(group_pathkeys);
|
||||
WRITE_NODE_FIELD(window_pathkeys);
|
||||
WRITE_NODE_FIELD(distinct_pathkeys);
|
||||
WRITE_NODE_FIELD(sort_pathkeys);
|
||||
WRITE_FLOAT_FIELD(total_table_pages, "%.0f");
|
||||
@ -1722,6 +1767,7 @@ _outSelectStmt(StringInfo str, SelectStmt *node)
|
||||
WRITE_NODE_FIELD(whereClause);
|
||||
WRITE_NODE_FIELD(groupClause);
|
||||
WRITE_NODE_FIELD(havingClause);
|
||||
WRITE_NODE_FIELD(windowClause);
|
||||
WRITE_NODE_FIELD(withClause);
|
||||
WRITE_NODE_FIELD(valuesLists);
|
||||
WRITE_NODE_FIELD(sortClause);
|
||||
@ -1744,6 +1790,7 @@ _outFuncCall(StringInfo str, FuncCall *node)
|
||||
WRITE_BOOL_FIELD(agg_star);
|
||||
WRITE_BOOL_FIELD(agg_distinct);
|
||||
WRITE_BOOL_FIELD(func_variadic);
|
||||
WRITE_NODE_FIELD(over);
|
||||
WRITE_LOCATION_FIELD(location);
|
||||
}
|
||||
|
||||
@ -1866,6 +1913,7 @@ _outQuery(StringInfo str, Query *node)
|
||||
WRITE_INT_FIELD(resultRelation);
|
||||
WRITE_NODE_FIELD(intoClause);
|
||||
WRITE_BOOL_FIELD(hasAggs);
|
||||
WRITE_BOOL_FIELD(hasWindowFuncs);
|
||||
WRITE_BOOL_FIELD(hasSubLinks);
|
||||
WRITE_BOOL_FIELD(hasDistinctOn);
|
||||
WRITE_BOOL_FIELD(hasRecursive);
|
||||
@ -1876,6 +1924,7 @@ _outQuery(StringInfo str, Query *node)
|
||||
WRITE_NODE_FIELD(returningList);
|
||||
WRITE_NODE_FIELD(groupClause);
|
||||
WRITE_NODE_FIELD(havingQual);
|
||||
WRITE_NODE_FIELD(windowClause);
|
||||
WRITE_NODE_FIELD(distinctClause);
|
||||
WRITE_NODE_FIELD(sortClause);
|
||||
WRITE_NODE_FIELD(limitOffset);
|
||||
@ -1895,6 +1944,19 @@ _outSortGroupClause(StringInfo str, SortGroupClause *node)
|
||||
WRITE_BOOL_FIELD(nulls_first);
|
||||
}
|
||||
|
||||
static void
|
||||
_outWindowClause(StringInfo str, WindowClause *node)
|
||||
{
|
||||
WRITE_NODE_TYPE("WINDOWCLAUSE");
|
||||
|
||||
WRITE_STRING_FIELD(name);
|
||||
WRITE_STRING_FIELD(refname);
|
||||
WRITE_NODE_FIELD(partitionClause);
|
||||
WRITE_NODE_FIELD(orderClause);
|
||||
WRITE_UINT_FIELD(winref);
|
||||
WRITE_BOOL_FIELD(copiedOrder);
|
||||
}
|
||||
|
||||
static void
|
||||
_outRowMarkClause(StringInfo str, RowMarkClause *node)
|
||||
{
|
||||
@ -2171,6 +2233,18 @@ _outSortBy(StringInfo str, SortBy *node)
|
||||
WRITE_LOCATION_FIELD(location);
|
||||
}
|
||||
|
||||
static void
|
||||
_outWindowDef(StringInfo str, WindowDef *node)
|
||||
{
|
||||
WRITE_NODE_TYPE("WINDOWDEF");
|
||||
|
||||
WRITE_STRING_FIELD(name);
|
||||
WRITE_STRING_FIELD(refname);
|
||||
WRITE_NODE_FIELD(partitionClause);
|
||||
WRITE_NODE_FIELD(orderClause);
|
||||
WRITE_LOCATION_FIELD(location);
|
||||
}
|
||||
|
||||
static void
|
||||
_outRangeSubselect(StringInfo str, RangeSubselect *node)
|
||||
{
|
||||
@ -2347,6 +2421,9 @@ _outNode(StringInfo str, void *obj)
|
||||
case T_Agg:
|
||||
_outAgg(str, obj);
|
||||
break;
|
||||
case T_WindowAgg:
|
||||
_outWindowAgg(str, obj);
|
||||
break;
|
||||
case T_Group:
|
||||
_outGroup(str, obj);
|
||||
break;
|
||||
@ -2392,6 +2469,9 @@ _outNode(StringInfo str, void *obj)
|
||||
case T_Aggref:
|
||||
_outAggref(str, obj);
|
||||
break;
|
||||
case T_WindowFunc:
|
||||
_outWindowFunc(str, obj);
|
||||
break;
|
||||
case T_ArrayRef:
|
||||
_outArrayRef(str, obj);
|
||||
break;
|
||||
@ -2616,6 +2696,9 @@ _outNode(StringInfo str, void *obj)
|
||||
case T_SortGroupClause:
|
||||
_outSortGroupClause(str, obj);
|
||||
break;
|
||||
case T_WindowClause:
|
||||
_outWindowClause(str, obj);
|
||||
break;
|
||||
case T_RowMarkClause:
|
||||
_outRowMarkClause(str, obj);
|
||||
break;
|
||||
@ -2661,6 +2744,9 @@ _outNode(StringInfo str, void *obj)
|
||||
case T_SortBy:
|
||||
_outSortBy(str, obj);
|
||||
break;
|
||||
case T_WindowDef:
|
||||
_outWindowDef(str, obj);
|
||||
break;
|
||||
case T_RangeSubselect:
|
||||
_outRangeSubselect(str, obj);
|
||||
break;
|
||||
|
Reference in New Issue
Block a user