diff options
Diffstat (limited to 'src/backend/optimizer/util/pathnode.c')
-rw-r--r-- | src/backend/optimizer/util/pathnode.c | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/src/backend/optimizer/util/pathnode.c b/src/backend/optimizer/util/pathnode.c index 6aa34412def..1e7aac95ef4 100644 --- a/src/backend/optimizer/util/pathnode.c +++ b/src/backend/optimizer/util/pathnode.c @@ -1021,8 +1021,8 @@ create_unique_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath, pathnode->path.parent = rel; /* - * Treat the output as always unsorted, since we don't necessarily have - * pathkeys to represent it. + * Assume the output is unsorted, since we don't necessarily have pathkeys + * to represent it. (This might get overridden below.) */ pathnode->path.pathkeys = NIL; @@ -1031,6 +1031,29 @@ create_unique_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath, pathnode->uniq_exprs = uniq_exprs; /* + * If the input is a relation and it has a unique index that proves the + * uniq_exprs are unique, then we don't need to do anything. Note that + * relation_has_unique_index_for automatically considers restriction + * clauses for the rel, as well. + */ + if (rel->rtekind == RTE_RELATION && all_btree && + relation_has_unique_index_for(root, rel, NIL, + uniq_exprs, in_operators)) + { + pathnode->umethod = UNIQUE_PATH_NOOP; + pathnode->rows = rel->rows; + pathnode->path.startup_cost = subpath->startup_cost; + pathnode->path.total_cost = subpath->total_cost; + pathnode->path.pathkeys = subpath->pathkeys; + + rel->cheapest_unique_path = (Path *) pathnode; + + MemoryContextSwitchTo(oldcontext); + + return pathnode; + } + + /* * If the input is a subquery whose output must be unique already, then we * don't need to do anything. The test for uniqueness has to consider * exactly which columns we are extracting; for example "SELECT DISTINCT |