diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c index e2f177515d..07c93b4737 100644 --- a/src/backend/nodes/outfuncs.c +++ b/src/backend/nodes/outfuncs.c @@ -1954,14 +1954,30 @@ _outProjectSetPath(StringInfo str, const ProjectSetPath *node) WRITE_NODE_FIELD(subpath); } +static void +_outSortPathInfo(StringInfo str, const SortPath *node) +{ + _outPathInfo(str, (const Path *) node); + + WRITE_NODE_FIELD(subpath); +} + static void _outSortPath(StringInfo str, const SortPath *node) { 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 @@ -4058,6 +4074,9 @@ outNode(StringInfo str, const void *obj) case T_SortPath: _outSortPath(str, obj); break; + case T_IncrementalSortPath: + _outIncrementalSortPath(str, obj); + break; case T_GroupPath: _outGroupPath(str, obj); break; diff --git a/src/backend/optimizer/README b/src/backend/optimizer/README index d174b8cb73..efb52858c8 100644 --- a/src/backend/optimizer/README +++ b/src/backend/optimizer/README @@ -387,6 +387,7 @@ RelOptInfo - a relation or joined relations ProjectionPath - a Result plan node with child (used for projection) ProjectSetPath - a ProjectSet 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 UpperUniquePath - a Unique plan node applied to some sub-path AggPath - an Agg plan node applied to some sub-path diff --git a/src/backend/optimizer/util/pathnode.c b/src/backend/optimizer/util/pathnode.c index c1fc866cbf..5778f80c01 100644 --- a/src/backend/optimizer/util/pathnode.c +++ b/src/backend/optimizer/util/pathnode.c @@ -2798,7 +2798,7 @@ create_set_projection_path(PlannerInfo *root, * 'limit_tuples' is the estimated bound on the number of output tuples, * or -1 if no LIMIT or couldn't estimate */ -SortPath * +IncrementalSortPath * create_incremental_sort_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath, @@ -2834,7 +2834,7 @@ create_incremental_sort_path(PlannerInfo *root, sort->nPresortedCols = presorted_keys; - return pathnode; + return sort; } /* diff --git a/src/include/nodes/pathnodes.h b/src/include/nodes/pathnodes.h index 8d1ad3339f..10f0a149e9 100644 --- a/src/include/nodes/pathnodes.h +++ b/src/include/nodes/pathnodes.h @@ -1650,7 +1650,10 @@ typedef struct 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 { diff --git a/src/include/optimizer/pathnode.h b/src/include/optimizer/pathnode.h index 715a24ad29..3bd7072ae8 100644 --- a/src/include/optimizer/pathnode.h +++ b/src/include/optimizer/pathnode.h @@ -184,17 +184,17 @@ extern ProjectSetPath *create_set_projection_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath, PathTarget *target); -extern SortPath *create_incremental_sort_path(PlannerInfo *root, - RelOptInfo *rel, - Path *subpath, - List *pathkeys, - int presorted_keys, - double limit_tuples); extern SortPath *create_sort_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath, List *pathkeys, double limit_tuples); +extern IncrementalSortPath *create_incremental_sort_path(PlannerInfo *root, + RelOptInfo *rel, + Path *subpath, + List *pathkeys, + int presorted_keys, + double limit_tuples); extern GroupPath *create_group_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath,