Commit 8286223f authored by Tom Lane's avatar Tom Lane

Fix missing outfuncs.c support for IncrementalSortPath.

For debugging purposes, Path nodes are supposed to have outfuncs
support, but this was overlooked in the original incremental sort patch.

While at it, clean up a couple other minor oversights, as well as
bizarre choice of return type for create_incremental_sort_path().
(All the existing callers just cast it to "Path *" immediately, so
they don't care, but some future caller might care.)

outfuncs.c fix by Zhijie Hou, the rest by me

Discussion: https://postgr.es/m/324c4d81d8134117972a5b1f6cdf9560@G08CNEXMBPEKD05.g08.fujitsu.local
parent 58ebe967
...@@ -1954,14 +1954,30 @@ _outProjectSetPath(StringInfo str, const ProjectSetPath *node) ...@@ -1954,14 +1954,30 @@ _outProjectSetPath(StringInfo str, const ProjectSetPath *node)
WRITE_NODE_FIELD(subpath); WRITE_NODE_FIELD(subpath);
} }
static void
_outSortPathInfo(StringInfo str, const SortPath *node)
{
_outPathInfo(str, (const Path *) node);
WRITE_NODE_FIELD(subpath);
}
static void static void
_outSortPath(StringInfo str, const SortPath *node) _outSortPath(StringInfo str, const SortPath *node)
{ {
WRITE_NODE_TYPE("SORTPATH"); WRITE_NODE_TYPE("SORTPATH");
_outPathInfo(str, (const Path *) node); _outSortPathInfo(str, node);
}
WRITE_NODE_FIELD(subpath); static void
_outIncrementalSortPath(StringInfo str, const IncrementalSortPath *node)
{
WRITE_NODE_TYPE("INCREMENTALSORTPATH");
_outSortPathInfo(str, (const SortPath *) node);
WRITE_INT_FIELD(nPresortedCols);
} }
static void static void
...@@ -4055,6 +4071,9 @@ outNode(StringInfo str, const void *obj) ...@@ -4055,6 +4071,9 @@ outNode(StringInfo str, const void *obj)
case T_SortPath: case T_SortPath:
_outSortPath(str, obj); _outSortPath(str, obj);
break; break;
case T_IncrementalSortPath:
_outIncrementalSortPath(str, obj);
break;
case T_GroupPath: case T_GroupPath:
_outGroupPath(str, obj); _outGroupPath(str, obj);
break; break;
......
...@@ -387,6 +387,7 @@ RelOptInfo - a relation or joined relations ...@@ -387,6 +387,7 @@ RelOptInfo - a relation or joined relations
ProjectionPath - a Result plan node with child (used for projection) ProjectionPath - a Result plan node with child (used for projection)
ProjectSetPath - a ProjectSet plan node applied to some sub-path ProjectSetPath - a ProjectSet plan node applied to some sub-path
SortPath - a Sort plan node applied to some sub-path SortPath - a Sort plan node applied to some sub-path
IncrementalSortPath - an IncrementalSort plan node applied to some sub-path
GroupPath - a Group plan node applied to some sub-path GroupPath - a Group plan node applied to some sub-path
UpperUniquePath - a Unique plan node applied to some sub-path UpperUniquePath - a Unique plan node applied to some sub-path
AggPath - an Agg plan node applied to some sub-path AggPath - an Agg plan node applied to some sub-path
......
...@@ -2798,7 +2798,7 @@ create_set_projection_path(PlannerInfo *root, ...@@ -2798,7 +2798,7 @@ create_set_projection_path(PlannerInfo *root,
* 'limit_tuples' is the estimated bound on the number of output tuples, * 'limit_tuples' is the estimated bound on the number of output tuples,
* or -1 if no LIMIT or couldn't estimate * or -1 if no LIMIT or couldn't estimate
*/ */
SortPath * IncrementalSortPath *
create_incremental_sort_path(PlannerInfo *root, create_incremental_sort_path(PlannerInfo *root,
RelOptInfo *rel, RelOptInfo *rel,
Path *subpath, Path *subpath,
...@@ -2834,7 +2834,7 @@ create_incremental_sort_path(PlannerInfo *root, ...@@ -2834,7 +2834,7 @@ create_incremental_sort_path(PlannerInfo *root,
sort->nPresortedCols = presorted_keys; sort->nPresortedCols = presorted_keys;
return pathnode; return sort;
} }
/* /*
......
...@@ -1655,7 +1655,10 @@ typedef struct SortPath ...@@ -1655,7 +1655,10 @@ typedef struct SortPath
} SortPath; } SortPath;
/* /*
* IncrementalSortPath * IncrementalSortPath represents an incremental sort step
*
* This is like a regular sort, except some leading key columns are assumed
* to be ordered already.
*/ */
typedef struct IncrementalSortPath typedef struct IncrementalSortPath
{ {
......
...@@ -184,16 +184,16 @@ extern ProjectSetPath *create_set_projection_path(PlannerInfo *root, ...@@ -184,16 +184,16 @@ extern ProjectSetPath *create_set_projection_path(PlannerInfo *root,
RelOptInfo *rel, RelOptInfo *rel,
Path *subpath, Path *subpath,
PathTarget *target); PathTarget *target);
extern SortPath *create_incremental_sort_path(PlannerInfo *root, extern SortPath *create_sort_path(PlannerInfo *root,
RelOptInfo *rel, RelOptInfo *rel,
Path *subpath, Path *subpath,
List *pathkeys, List *pathkeys,
int presorted_keys,
double limit_tuples); double limit_tuples);
extern SortPath *create_sort_path(PlannerInfo *root, extern IncrementalSortPath *create_incremental_sort_path(PlannerInfo *root,
RelOptInfo *rel, RelOptInfo *rel,
Path *subpath, Path *subpath,
List *pathkeys, List *pathkeys,
int presorted_keys,
double limit_tuples); double limit_tuples);
extern GroupPath *create_group_path(PlannerInfo *root, extern GroupPath *create_group_path(PlannerInfo *root,
RelOptInfo *rel, RelOptInfo *rel,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment