diff options
Diffstat (limited to 'src/backend/optimizer/util/pathnode.c')
-rw-r--r-- | src/backend/optimizer/util/pathnode.c | 71 |
1 files changed, 47 insertions, 24 deletions
diff --git a/src/backend/optimizer/util/pathnode.c b/src/backend/optimizer/util/pathnode.c index cf48ecc6819..82dc20f5455 100644 --- a/src/backend/optimizer/util/pathnode.c +++ b/src/backend/optimizer/util/pathnode.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/optimizer/util/pathnode.c,v 1.20 1999/02/08 04:29:21 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/optimizer/util/pathnode.c,v 1.21 1999/02/09 03:51:27 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -164,9 +164,31 @@ better_path(Path *new_path, List *unique_paths, bool *noOther) { path = (Path *) lfirst(temp); +#ifdef OPTDUP_DEBUG + if (!samekeys(path->keys, new_path->keys)) + { + printf("oldpath\n"); + pprint(path->keys); + printf("newpath\n"); + pprint(new_path->keys); + if (path->keys && new_path->keys && + length(lfirst(path->keys)) >= 2 && + length(lfirst(path->keys)) < length(lfirst(new_path->keys))) + sleep(0); /* set breakpoint here */ + } + if (!equal_path_ordering(path->path_order, + new_path->path_order)) + { + printf("oldord\n"); + pprint(path->path_order); + printf("neword\n"); + pprint(new_path->path_order); + } +#endif + if (samekeys(path->keys, new_path->keys) && - equal_path_ordering(&path->path_order, - &new_path->path_order)) + equal_path_ordering(path->path_order, + new_path->path_order)) { old_path = path; break; @@ -207,8 +229,9 @@ create_seqscan_path(RelOptInfo * rel) pathnode->pathtype = T_SeqScan; pathnode->parent = rel; pathnode->path_cost = 0.0; - pathnode->path_order.ordtype = SORTOP_ORDER; - pathnode->path_order.ord.sortop = NULL; + pathnode->path_order = makeNode(PathOrder); + pathnode->path_order->ordtype = SORTOP_ORDER; + pathnode->path_order->ord.sortop = NULL; pathnode->keys = NIL; /* @@ -256,8 +279,9 @@ create_index_path(Query *root, pathnode->path.pathtype = T_IndexScan; pathnode->path.parent = rel; - pathnode->path.path_order.ordtype = SORTOP_ORDER; - pathnode->path.path_order.ord.sortop = index->ordering; + pathnode->path.path_order = makeNode(PathOrder); + pathnode->path.path_order->ordtype = SORTOP_ORDER; + pathnode->path.path_order->ord.sortop = index->ordering; pathnode->indexid = index->relids; pathnode->indexkeys = index->indexkeys; @@ -274,7 +298,7 @@ create_index_path(Query *root, * The index must have an ordering for the path to have (ordering) * keys, and vice versa. */ - if (pathnode->path.path_order.ord.sortop) + if (pathnode->path.path_order->ord.sortop) { pathnode->path.keys = collect_index_pathkeys(index->indexkeys, rel->targetlist); @@ -286,7 +310,7 @@ create_index_path(Query *root, * if no index keys were found, we can't order the path). */ if (pathnode->path.keys == NULL) - pathnode->path.path_order.ord.sortop = NULL; + pathnode->path.path_order->ord.sortop = NULL; } else pathnode->path.keys = NULL; @@ -412,23 +436,20 @@ create_nestloop_path(RelOptInfo * joinrel, pathnode->path.joinid = NIL; pathnode->path.outerjoincost = (Cost) 0.0; pathnode->path.loc_restrictinfo = NIL; - + pathnode->path.path_order = makeNode(PathOrder); + if (keys) { - pathnode->path.path_order.ordtype = outer_path->path_order.ordtype; - if (outer_path->path_order.ordtype == SORTOP_ORDER) - { - pathnode->path.path_order.ord.sortop = outer_path->path_order.ord.sortop; - } + pathnode->path.path_order->ordtype = outer_path->path_order->ordtype; + if (outer_path->path_order->ordtype == SORTOP_ORDER) + pathnode->path.path_order->ord.sortop = outer_path->path_order->ord.sortop; else - { - pathnode->path.path_order.ord.merge = outer_path->path_order.ord.merge; - } + pathnode->path.path_order->ord.merge = outer_path->path_order->ord.merge; } else { - pathnode->path.path_order.ordtype = SORTOP_ORDER; - pathnode->path.path_order.ord.sortop = NULL; + pathnode->path.path_order->ordtype = SORTOP_ORDER; + pathnode->path.path_order->ord.sortop = NULL; } pathnode->path.path_cost = cost_nestloop(outer_path->path_cost, @@ -487,8 +508,9 @@ create_mergejoin_path(RelOptInfo * joinrel, pathnode->jpath.innerjoinpath = inner_path; pathnode->jpath.pathinfo = joinrel->restrictinfo; pathnode->jpath.path.keys = keys; - pathnode->jpath.path.path_order.ordtype = MERGE_ORDER; - pathnode->jpath.path.path_order.ord.merge = order; + pathnode->jpath.path.path_order = makeNode(PathOrder); + pathnode->jpath.path.path_order->ordtype = MERGE_ORDER; + pathnode->jpath.path.path_order->ord.merge = order; pathnode->path_mergeclauses = mergeclauses; pathnode->jpath.path.loc_restrictinfo = NIL; pathnode->outersortkeys = outersortkeys; @@ -552,8 +574,9 @@ create_hashjoin_path(RelOptInfo * joinrel, pathnode->jpath.pathinfo = joinrel->restrictinfo; pathnode->jpath.path.loc_restrictinfo = NIL; pathnode->jpath.path.keys = keys; - pathnode->jpath.path.path_order.ordtype = SORTOP_ORDER; - pathnode->jpath.path.path_order.ord.sortop = NULL; + pathnode->jpath.path.path_order = makeNode(PathOrder); + pathnode->jpath.path.path_order->ordtype = SORTOP_ORDER; + pathnode->jpath.path.path_order->ord.sortop = NULL; pathnode->jpath.path.outerjoincost = (Cost) 0.0; pathnode->jpath.path.joinid = (Relid) NULL; /* pathnode->hashjoinoperator = operator; */ |