Commit d244df95 authored by Bruce Momjian's avatar Bruce Momjian

More optimizer speedups.

parent 129543e2
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.66 1999/02/10 03:52:34 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.67 1999/02/11 14:58:48 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -1093,26 +1093,26 @@ CopyPathFields(Path *from, Path *newnode) ...@@ -1093,26 +1093,26 @@ CopyPathFields(Path *from, Path *newnode)
newnode->path_cost = from->path_cost; newnode->path_cost = from->path_cost;
newnode->path_order = makeNode(PathOrder); newnode->pathorder = makeNode(PathOrder);
newnode->path_order->ordtype = from->path_order->ordtype; newnode->pathorder->ordtype = from->pathorder->ordtype;
if (from->path_order->ordtype == SORTOP_ORDER) if (from->pathorder->ordtype == SORTOP_ORDER)
{ {
int len, int len,
i; i;
Oid *ordering = from->path_order->ord.sortop; Oid *ordering = from->pathorder->ord.sortop;
if (ordering) if (ordering)
{ {
for (len = 0; ordering[len] != 0; len++) for (len = 0; ordering[len] != 0; len++)
; ;
newnode->path_order->ord.sortop = (Oid *) palloc(sizeof(Oid) * (len + 1)); newnode->pathorder->ord.sortop = (Oid *) palloc(sizeof(Oid) * (len + 1));
for (i = 0; i < len; i++) for (i = 0; i < len; i++)
newnode->path_order->ord.sortop[i] = ordering[i]; newnode->pathorder->ord.sortop[i] = ordering[i];
newnode->path_order->ord.sortop[len] = 0; newnode->pathorder->ord.sortop[len] = 0;
} }
} }
else else
Node_Copy(from, newnode, path_order->ord.merge); Node_Copy(from, newnode, pathorder->ord.merge);
Node_Copy(from, newnode, pathkeys); Node_Copy(from, newnode, pathkeys);
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.29 1999/02/10 21:02:33 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.30 1999/02/11 14:58:48 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -337,33 +337,33 @@ _equalPath(Path *a, Path *b) ...@@ -337,33 +337,33 @@ _equalPath(Path *a, Path *b)
/* /*
* if (a->path_cost != b->path_cost) return(false); * if (a->path_cost != b->path_cost) return(false);
*/ */
if (a->path_order->ordtype == SORTOP_ORDER) if (a->pathorder->ordtype == SORTOP_ORDER)
{ {
int i = 0; int i = 0;
if (a->path_order->ord.sortop == NULL || if (a->pathorder->ord.sortop == NULL ||
b->path_order->ord.sortop == NULL) b->pathorder->ord.sortop == NULL)
{ {
if (a->path_order->ord.sortop != b->path_order->ord.sortop) if (a->pathorder->ord.sortop != b->pathorder->ord.sortop)
return false; return false;
} }
else else
{ {
while (a->path_order->ord.sortop[i] != 0 && while (a->pathorder->ord.sortop[i] != 0 &&
b->path_order->ord.sortop[i] != 0) b->pathorder->ord.sortop[i] != 0)
{ {
if (a->path_order->ord.sortop[i] != b->path_order->ord.sortop[i]) if (a->pathorder->ord.sortop[i] != b->pathorder->ord.sortop[i])
return false; return false;
i++; i++;
} }
if (a->path_order->ord.sortop[i] != 0 || if (a->pathorder->ord.sortop[i] != 0 ||
b->path_order->ord.sortop[i] != 0) b->pathorder->ord.sortop[i] != 0)
return false; return false;
} }
} }
else else
{ {
if (!equal(a->path_order->ord.merge, b->path_order->ord.merge)) if (!equal(a->pathorder->ord.merge, b->pathorder->ord.merge))
return false; return false;
} }
if (!equal(a->pathkeys, b->pathkeys)) if (!equal(a->pathkeys, b->pathkeys))
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/nodes/Attic/freefuncs.c,v 1.6 1999/02/10 21:02:33 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/nodes/Attic/freefuncs.c,v 1.7 1999/02/11 14:58:49 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -756,15 +756,15 @@ _freeRelOptInfo(RelOptInfo *node) ...@@ -756,15 +756,15 @@ _freeRelOptInfo(RelOptInfo *node)
static void static void
FreePathFields(Path *node) FreePathFields(Path *node)
{ {
if (node->path_order->ordtype == SORTOP_ORDER) if (node->pathorder->ordtype == SORTOP_ORDER)
{ {
if (node->path_order->ord.sortop) if (node->pathorder->ord.sortop)
pfree(node->path_order->ord.sortop); pfree(node->pathorder->ord.sortop);
} }
else else
freeObject(node->path_order->ord.merge); freeObject(node->pathorder->ord.merge);
pfree(node->path_order); /* is it an object, but we don't have pfree(node->pathorder); /* is it an object, but we don't have
separate free for it */ separate free for it */
freeObject(node->pathkeys); freeObject(node->pathkeys);
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
* *
* Copyright (c) 1994, Regents of the University of California * Copyright (c) 1994, Regents of the University of California
* *
* $Id: outfuncs.c,v 1.68 1999/02/10 03:52:35 momjian Exp $ * $Id: outfuncs.c,v 1.69 1999/02/11 14:58:49 momjian Exp $
* *
* NOTES * NOTES
* Every (plan) node in POSTGRES has an associated "out" routine which * Every (plan) node in POSTGRES has an associated "out" routine which
...@@ -964,8 +964,8 @@ _outPath(StringInfo str, Path *node) ...@@ -964,8 +964,8 @@ _outPath(StringInfo str, Path *node)
node->path_cost); node->path_cost);
_outNode(str, node->pathkeys); _outNode(str, node->pathkeys);
appendStringInfo(str, " :path_order "); appendStringInfo(str, " :pathorder ");
_outNode(str, node->path_order); _outNode(str, node->pathorder);
} }
/* /*
...@@ -980,8 +980,8 @@ _outIndexPath(StringInfo str, IndexPath *node) ...@@ -980,8 +980,8 @@ _outIndexPath(StringInfo str, IndexPath *node)
node->path.path_cost); node->path.path_cost);
_outNode(str, node->path.pathkeys); _outNode(str, node->path.pathkeys);
appendStringInfo(str, " :path_order "); appendStringInfo(str, " :pathorder ");
_outNode(str, node->path.path_order); _outNode(str, node->path.pathorder);
appendStringInfo(str, " :indexid "); appendStringInfo(str, " :indexid ");
_outIntList(str, node->indexid); _outIntList(str, node->indexid);
...@@ -1002,8 +1002,8 @@ _outJoinPath(StringInfo str, JoinPath *node) ...@@ -1002,8 +1002,8 @@ _outJoinPath(StringInfo str, JoinPath *node)
node->path.path_cost); node->path.path_cost);
_outNode(str, node->path.pathkeys); _outNode(str, node->path.pathkeys);
appendStringInfo(str, " :path_order "); appendStringInfo(str, " :pathorder ");
_outNode(str, node->path.path_order); _outNode(str, node->path.pathorder);
appendStringInfo(str, " :pathinfo "); appendStringInfo(str, " :pathinfo ");
_outNode(str, node->pathinfo); _outNode(str, node->pathinfo);
...@@ -1033,8 +1033,8 @@ _outMergePath(StringInfo str, MergePath *node) ...@@ -1033,8 +1033,8 @@ _outMergePath(StringInfo str, MergePath *node)
node->jpath.path.path_cost); node->jpath.path.path_cost);
_outNode(str, node->jpath.path.pathkeys); _outNode(str, node->jpath.path.pathkeys);
appendStringInfo(str, " :path_order "); appendStringInfo(str, " :pathorder ");
_outNode(str, node->jpath.path.path_order); _outNode(str, node->jpath.path.pathorder);
appendStringInfo(str, " :pathinfo "); appendStringInfo(str, " :pathinfo ");
_outNode(str, node->jpath.pathinfo); _outNode(str, node->jpath.pathinfo);
...@@ -1073,8 +1073,8 @@ _outHashPath(StringInfo str, HashPath *node) ...@@ -1073,8 +1073,8 @@ _outHashPath(StringInfo str, HashPath *node)
node->jpath.path.path_cost); node->jpath.path.path_cost);
_outNode(str, node->jpath.path.pathkeys); _outNode(str, node->jpath.path.pathkeys);
appendStringInfo(str, " :path_order "); appendStringInfo(str, " :pathorder ");
_outNode(str, node->jpath.path.path_order); _outNode(str, node->jpath.path.pathorder);
appendStringInfo(str, " :pathinfo "); appendStringInfo(str, " :pathinfo ");
_outNode(str, node->jpath.pathinfo); _outNode(str, node->jpath.pathinfo);
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/nodes/readfuncs.c,v 1.53 1999/02/10 03:52:36 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/nodes/readfuncs.c,v 1.54 1999/02/11 14:58:49 momjian Exp $
* *
* NOTES * NOTES
* Most of the read functions for plan nodes are tested. (In fact, they * Most of the read functions for plan nodes are tested. (In fact, they
...@@ -1522,8 +1522,8 @@ _readPath() ...@@ -1522,8 +1522,8 @@ _readPath()
token = lsptok(NULL, &length); /* now read it */ token = lsptok(NULL, &length); /* now read it */
local_node->path_cost = (Cost) atof(token); local_node->path_cost = (Cost) atof(token);
token = lsptok(NULL, &length); /* get :path_order */ token = lsptok(NULL, &length); /* get :pathorder */
local_node->path_order = nodeRead(true); /* now read it */ local_node->pathorder = nodeRead(true); /* now read it */
token = lsptok(NULL, &length); /* get :pathkeys */ token = lsptok(NULL, &length); /* get :pathkeys */
local_node->pathkeys = nodeRead(true); /* now read it */ local_node->pathkeys = nodeRead(true); /* now read it */
...@@ -1554,8 +1554,8 @@ _readIndexPath() ...@@ -1554,8 +1554,8 @@ _readIndexPath()
token = lsptok(NULL, &length); /* now read it */ token = lsptok(NULL, &length); /* now read it */
local_node->path.path_cost = (Cost) atof(token); local_node->path.path_cost = (Cost) atof(token);
token = lsptok(NULL, &length); /* get :path_order */ token = lsptok(NULL, &length); /* get :pathorder */
local_node->path.path_order = nodeRead(true); /* now read it */ local_node->path.pathorder = nodeRead(true); /* now read it */
token = lsptok(NULL, &length); /* get :pathkeys */ token = lsptok(NULL, &length); /* get :pathkeys */
local_node->path.pathkeys = nodeRead(true); /* now read it */ local_node->path.pathkeys = nodeRead(true); /* now read it */
...@@ -1593,8 +1593,8 @@ _readJoinPath() ...@@ -1593,8 +1593,8 @@ _readJoinPath()
token = lsptok(NULL, &length); /* now read it */ token = lsptok(NULL, &length); /* now read it */
local_node->path.path_cost = (Cost) atof(token); local_node->path.path_cost = (Cost) atof(token);
token = lsptok(NULL, &length); /* get :path_order */ token = lsptok(NULL, &length); /* get :pathorder */
local_node->path.path_order = nodeRead(true); /* now read it */ local_node->path.pathorder = nodeRead(true); /* now read it */
token = lsptok(NULL, &length); /* get :pathkeys */ token = lsptok(NULL, &length); /* get :pathkeys */
local_node->path.pathkeys = nodeRead(true); /* now read it */ local_node->path.pathkeys = nodeRead(true); /* now read it */
...@@ -1658,8 +1658,8 @@ _readMergePath() ...@@ -1658,8 +1658,8 @@ _readMergePath()
local_node->jpath.path.path_cost = (Cost) atof(token); local_node->jpath.path.path_cost = (Cost) atof(token);
token = lsptok(NULL, &length); /* get :path_order */ token = lsptok(NULL, &length); /* get :pathorder */
local_node->jpath.path.path_order = nodeRead(true); /* now read it */ local_node->jpath.path.pathorder = nodeRead(true); /* now read it */
token = lsptok(NULL, &length); /* get :pathkeys */ token = lsptok(NULL, &length); /* get :pathkeys */
local_node->jpath.path.pathkeys = nodeRead(true); /* now read it */ local_node->jpath.path.pathkeys = nodeRead(true); /* now read it */
...@@ -1732,8 +1732,8 @@ _readHashPath() ...@@ -1732,8 +1732,8 @@ _readHashPath()
local_node->jpath.path.path_cost = (Cost) atof(token); local_node->jpath.path.path_cost = (Cost) atof(token);
token = lsptok(NULL, &length); /* get :path_order */ token = lsptok(NULL, &length); /* get :pathorder */
local_node->jpath.path.path_order = nodeRead(true); /* now read it */ local_node->jpath.path.pathorder = nodeRead(true); /* now read it */
token = lsptok(NULL, &length); /* get :pathkeys */ token = lsptok(NULL, &length); /* get :pathkeys */
local_node->jpath.path.pathkeys = nodeRead(true); /* now read it */ local_node->jpath.path.pathkeys = nodeRead(true); /* now read it */
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
* *
* Copyright (c) 1994, Regents of the University of California * Copyright (c) 1994, Regents of the University of California
* *
* $Id: geqo_paths.c,v 1.15 1999/02/10 21:02:35 momjian Exp $ * $Id: geqo_paths.c,v 1.16 1999/02/11 14:58:50 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -113,7 +113,7 @@ geqo_rel_paths(RelOptInfo *rel) ...@@ -113,7 +113,7 @@ geqo_rel_paths(RelOptInfo *rel)
{ {
path = (Path *) lfirst(y); path = (Path *) lfirst(y);
if (!path->path_order->ord.sortop) if (!path->pathorder->ord.sortop)
break; break;
} }
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/indxpath.c,v 1.42 1999/02/10 21:02:38 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/optimizer/path/indxpath.c,v 1.43 1999/02/11 14:58:50 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -1290,9 +1290,9 @@ index_innerjoin(Query *root, RelOptInfo *rel, List *clausegroup_list, ...@@ -1290,9 +1290,9 @@ index_innerjoin(Query *root, RelOptInfo *rel, List *clausegroup_list,
pathnode->path.pathtype = T_IndexScan; pathnode->path.pathtype = T_IndexScan;
pathnode->path.parent = rel; pathnode->path.parent = rel;
pathnode->path.path_order = makeNode(PathOrder); pathnode->path.pathorder = makeNode(PathOrder);
pathnode->path.path_order->ordtype = SORTOP_ORDER; pathnode->path.pathorder->ordtype = SORTOP_ORDER;
pathnode->path.path_order->ord.sortop = index->ordering; pathnode->path.pathorder->ord.sortop = index->ordering;
pathnode->path.pathkeys = NIL; pathnode->path.pathkeys = NIL;
pathnode->indexid = index->relids; pathnode->indexid = index->relids;
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/joinpath.c,v 1.19 1999/02/10 21:02:38 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/optimizer/path/joinpath.c,v 1.20 1999/02/11 14:58:52 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -327,7 +327,7 @@ match_unsorted_outer(RelOptInfo *joinrel, ...@@ -327,7 +327,7 @@ match_unsorted_outer(RelOptInfo *joinrel,
outerpath = (Path *) lfirst(i); outerpath = (Path *) lfirst(i);
outerpath_ordering = outerpath->path_order; outerpath_ordering = outerpath->pathorder;
if (outerpath_ordering) if (outerpath_ordering)
{ {
...@@ -470,7 +470,7 @@ match_unsorted_inner(RelOptInfo *joinrel, ...@@ -470,7 +470,7 @@ match_unsorted_inner(RelOptInfo *joinrel,
innerpath = (Path *) lfirst(i); innerpath = (Path *) lfirst(i);
innerpath_ordering = innerpath->path_order; innerpath_ordering = innerpath->pathorder;
if (innerpath_ordering) if (innerpath_ordering)
{ {
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/Attic/joinutils.c,v 1.17 1999/02/11 05:29:07 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/optimizer/path/Attic/joinutils.c,v 1.18 1999/02/11 14:58:53 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -214,10 +214,12 @@ match_paths_joinkeys(List *joinkeys, ...@@ -214,10 +214,12 @@ match_paths_joinkeys(List *joinkeys,
foreach(i, paths) foreach(i, paths)
{ {
Path *path = (Path *) lfirst(i); Path *path = (Path *) lfirst(i);
int more_sort;
key_match = every_func(joinkeys, path->pathkeys, which_subkey); key_match = every_func(joinkeys, path->pathkeys, which_subkey);
if (equal_path_ordering(ordering, path->path_order) && if (pathorder_match(ordering, path->pathorder, &more_sort) &&
more_sort == 0 &&
length(joinkeys) == length(path->pathkeys) && key_match) length(joinkeys) == length(path->pathkeys) && key_match)
{ {
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/Attic/mergeutils.c,v 1.16 1999/02/10 03:52:41 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/optimizer/path/Attic/mergeutils.c,v 1.17 1999/02/11 14:58:53 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -52,17 +52,17 @@ group_clauses_by_order(List *restrictinfo_list, ...@@ -52,17 +52,17 @@ group_clauses_by_order(List *restrictinfo_list,
* Create a new mergeinfo node and add it to 'mergeinfo-list' * Create a new mergeinfo node and add it to 'mergeinfo-list'
* if one does not yet exist for this merge ordering. * if one does not yet exist for this merge ordering.
*/ */
PathOrder *path_order; PathOrder *pathorder;
MergeInfo *xmergeinfo; MergeInfo *xmergeinfo;
Expr *clause = restrictinfo->clause; Expr *clause = restrictinfo->clause;
Var *leftop = get_leftop(clause); Var *leftop = get_leftop(clause);
Var *rightop = get_rightop(clause); Var *rightop = get_rightop(clause);
JoinKey *jmkeys; JoinKey *jmkeys;
path_order = makeNode(PathOrder); pathorder = makeNode(PathOrder);
path_order->ordtype = MERGE_ORDER; pathorder->ordtype = MERGE_ORDER;
path_order->ord.merge = merge_ordering; pathorder->ord.merge = merge_ordering;
xmergeinfo = match_order_mergeinfo(path_order, mergeinfo_list); xmergeinfo = match_order_mergeinfo(pathorder, mergeinfo_list);
if (inner_relid == leftop->varno) if (inner_relid == leftop->varno)
{ {
jmkeys = makeNode(JoinKey); jmkeys = makeNode(JoinKey);
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/orindxpath.c,v 1.18 1999/02/10 21:02:39 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/optimizer/path/orindxpath.c,v 1.19 1999/02/11 14:58:53 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -104,14 +104,14 @@ create_or_index_paths(Query *root, ...@@ -104,14 +104,14 @@ create_or_index_paths(Query *root,
pathnode->path.pathtype = T_IndexScan; pathnode->path.pathtype = T_IndexScan;
pathnode->path.parent = rel; pathnode->path.parent = rel;
pathnode->path.path_order = makeNode(PathOrder); pathnode->path.pathorder = makeNode(PathOrder);
pathnode->path.path_order->ordtype = SORTOP_ORDER; pathnode->path.pathorder->ordtype = SORTOP_ORDER;
/* /*
* This is an IndexScan, but it does index lookups based * This is an IndexScan, but it does index lookups based
* on the order of the fields specified in the WHERE clause, * on the order of the fields specified in the WHERE clause,
* not in any order, so the sortop is NULL. * not in any order, so the sortop is NULL.
*/ */
pathnode->path.path_order->ord.sortop = NULL; pathnode->path.pathorder->ord.sortop = NULL;
pathnode->path.pathkeys = NIL; pathnode->path.pathkeys = NIL;
pathnode->indexqual = lcons(clausenode, NIL); pathnode->indexqual = lcons(clausenode, NIL);
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/Attic/prune.c,v 1.26 1999/02/10 21:02:40 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/optimizer/path/Attic/prune.c,v 1.27 1999/02/11 14:58:54 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -109,7 +109,7 @@ prune_rel_paths(List *rel_list) ...@@ -109,7 +109,7 @@ prune_rel_paths(List *rel_list)
{ {
path = (Path *) lfirst(y); path = (Path *) lfirst(y);
if (!path->path_order->ord.sortop) if (!path->pathorder->ord.sortop)
break; break;
} }
cheapest = (JoinPath *) prune_rel_path(rel, path); cheapest = (JoinPath *) prune_rel_path(rel, path);
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/plan/createplan.c,v 1.42 1999/02/10 17:14:30 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/createplan.c,v 1.43 1999/02/11 14:58:54 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -529,14 +529,14 @@ create_mergejoin_node(MergePath *best_path, ...@@ -529,14 +529,14 @@ create_mergejoin_node(MergePath *best_path,
outer_tlist, outer_tlist,
inner_tlist)); inner_tlist));
opcode = get_opcode((best_path->jpath.path.path_order->ord.merge)->join_operator); opcode = get_opcode((best_path->jpath.path.pathorder->ord.merge)->join_operator);
outer_order = (Oid *) palloc(sizeof(Oid) * 2); outer_order = (Oid *) palloc(sizeof(Oid) * 2);
outer_order[0] = (best_path->jpath.path.path_order->ord.merge)->left_operator; outer_order[0] = (best_path->jpath.path.pathorder->ord.merge)->left_operator;
outer_order[1] = 0; outer_order[1] = 0;
inner_order = (Oid *) palloc(sizeof(Oid) * 2); inner_order = (Oid *) palloc(sizeof(Oid) * 2);
inner_order[0] = (best_path->jpath.path.path_order->ord.merge)->right_operator; inner_order[0] = (best_path->jpath.path.pathorder->ord.merge)->right_operator;
inner_order[1] = 0; inner_order[1] = 0;
/* /*
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/util/Attic/ordering.c,v 1.11 1999/02/06 17:29:27 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/optimizer/util/Attic/ordering.c,v 1.12 1999/02/11 14:58:58 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
#include "optimizer/internal.h" #include "optimizer/internal.h"
#include "optimizer/ordering.h" #include "optimizer/ordering.h"
static bool equal_sortops_order(Oid *ordering1, Oid *ordering2); static bool equal_sortops_order(Oid *ordering1, Oid *ordering2, int *more_sort);
/* /*
* equal-path-ordering-- * equal-path-ordering--
...@@ -26,14 +26,27 @@ static bool equal_sortops_order(Oid *ordering1, Oid *ordering2); ...@@ -26,14 +26,27 @@ static bool equal_sortops_order(Oid *ordering1, Oid *ordering2);
* *
*/ */
bool bool
equal_path_ordering(PathOrder *path_ordering1, pathorder_match(PathOrder *path_ordering1,
PathOrder *path_ordering2) PathOrder *path_ordering2,
int *more_sort)
{ {
*more_sort = 0;
if (path_ordering1 == path_ordering2) if (path_ordering1 == path_ordering2)
return true; return true;
if (!path_ordering2)
{
*more_sort = 1;
return true;
}
if (!path_ordering1 || !path_ordering2) if (!path_ordering1)
return false; {
*more_sort = 2;
return true;
}
if (path_ordering1->ordtype == MERGE_ORDER && if (path_ordering1->ordtype == MERGE_ORDER &&
path_ordering2->ordtype == MERGE_ORDER) path_ordering2->ordtype == MERGE_ORDER)
...@@ -43,19 +56,28 @@ equal_path_ordering(PathOrder *path_ordering1, ...@@ -43,19 +56,28 @@ equal_path_ordering(PathOrder *path_ordering1,
else if (path_ordering1->ordtype == SORTOP_ORDER && else if (path_ordering1->ordtype == SORTOP_ORDER &&
path_ordering2->ordtype == SORTOP_ORDER) path_ordering2->ordtype == SORTOP_ORDER)
{ {
return (equal_sortops_order(path_ordering1->ord.sortop, return equal_sortops_order(path_ordering1->ord.sortop,
path_ordering2->ord.sortop)); path_ordering2->ord.sortop,
more_sort);
} }
else if (path_ordering1->ordtype == MERGE_ORDER && else if (path_ordering1->ordtype == MERGE_ORDER &&
path_ordering2->ordtype == SORTOP_ORDER) path_ordering2->ordtype == SORTOP_ORDER)
{ {
return (path_ordering2->ord.sortop && if (!path_ordering2->ord.sortop)
(path_ordering1->ord.merge->left_operator == path_ordering2->ord.sortop[0])); {
*more_sort = 1;
return true;
}
return path_ordering1->ord.merge->left_operator == path_ordering2->ord.sortop[0];
} }
else else
{ {
return (path_ordering1->ord.sortop && if (!path_ordering1->ord.sortop)
(path_ordering1->ord.sortop[0] == path_ordering2->ord.merge->left_operator)); {
*more_sort = 2;
return true;
}
return path_ordering1->ord.sortop[0] == path_ordering2->ord.merge->left_operator;
} }
} }
...@@ -105,13 +127,27 @@ equal_merge_ordering(MergeOrder *merge_ordering1, ...@@ -105,13 +127,27 @@ equal_merge_ordering(MergeOrder *merge_ordering1,
* Returns true iff the sort operators are in the same order. * Returns true iff the sort operators are in the same order.
*/ */
static bool static bool
equal_sortops_order(Oid *ordering1, Oid *ordering2) equal_sortops_order(Oid *ordering1, Oid *ordering2, int *more_sort)
{ {
int i = 0; int i = 0;
if (ordering1 == NULL || ordering2 == NULL) *more_sort = 0;
return ordering1 == ordering2;
if (ordering1 == ordering2)
return true;
if (!ordering2)
{
*more_sort = 1;
return true;
}
if (!ordering1)
{
*more_sort = 2;
return true;
}
while (ordering1[i] != 0 && ordering2[i] != 0) while (ordering1[i] != 0 && ordering2[i] != 0)
{ {
if (ordering1[i] != ordering2[i]) if (ordering1[i] != ordering2[i])
...@@ -119,5 +155,17 @@ equal_sortops_order(Oid *ordering1, Oid *ordering2) ...@@ -119,5 +155,17 @@ equal_sortops_order(Oid *ordering1, Oid *ordering2)
i++; i++;
} }
if (ordering1[i] != 0 && ordering2[i] == 0)
{
*more_sort = 1;
return true;
}
if (ordering1[i] == 0 && ordering2[i] != 0)
{
*more_sort = 2;
return true;
}
return ordering1[i] == 0 && ordering2[i] == 0; return ordering1[i] == 0 && ordering2[i] == 0;
} }
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/util/pathnode.c,v 1.25 1999/02/11 05:29:08 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/optimizer/util/pathnode.c,v 1.26 1999/02/11 14:59:02 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -158,7 +158,8 @@ better_path(Path *new_path, List *unique_paths, bool *is_new) ...@@ -158,7 +158,8 @@ better_path(Path *new_path, List *unique_paths, bool *is_new)
Path *path = (Path *) NULL; Path *path = (Path *) NULL;
List *temp = NIL; List *temp = NIL;
int longer_key; int longer_key;
int more_sort;
foreach(temp, unique_paths) foreach(temp, unique_paths)
{ {
path = (Path *) lfirst(temp); path = (Path *) lfirst(temp);
...@@ -176,18 +177,18 @@ better_path(Path *new_path, List *unique_paths, bool *is_new) ...@@ -176,18 +177,18 @@ better_path(Path *new_path, List *unique_paths, bool *is_new)
length(lfirst(path->pathkeys)) < length(lfirst(new_path->pathkeys))) length(lfirst(path->pathkeys)) < length(lfirst(new_path->pathkeys)))
sleep(0); /* set breakpoint here */ sleep(0); /* set breakpoint here */
} }
if (!equal_path_ordering(new_path->path_order, path->path_order)) if (!pathorder_match(new_path->pathorder, path->pathorder, &more_sort))
{ {
printf("oldord\n"); printf("oldord\n");
pprint(path->path_order); pprint(path->pathorder);
printf("neword\n"); printf("neword\n");
pprint(new_path->path_order); pprint(new_path->pathorder);
} }
#endif #endif
if (pathkeys_match(new_path->pathkeys, path->pathkeys, &longer_key)) if (pathkeys_match(new_path->pathkeys, path->pathkeys, &longer_key))
{ {
if (equal_path_ordering(new_path->path_order, path->path_order)) if (pathorder_match(new_path->pathorder, path->pathorder, &more_sort))
{ {
/* /*
* Replace pathkeys that match exactly, (1,2), (1,2). * Replace pathkeys that match exactly, (1,2), (1,2).
...@@ -196,18 +197,28 @@ better_path(Path *new_path, List *unique_paths, bool *is_new) ...@@ -196,18 +197,28 @@ better_path(Path *new_path, List *unique_paths, bool *is_new)
* path if it is not more expensive. * path if it is not more expensive.
*/ */
/* same keys, and new is cheaper, use it */ /* same keys, and new is cheaper, use it */
if ((longer_key == 0 && new_path->path_cost < path->path_cost) || if ((longer_key == 0 && more_sort == 0 &&
/* new is longer, and cheaper, use it */ new_path->path_cost < path->path_cost) ||
(longer_key == 1 && new_path->path_cost <= path->path_cost))
/* new is better, and cheaper, use it */
((longer_key == 1 && more_sort != 2) ||
(longer_key != 2 && more_sort == 1)) &&
new_path->path_cost <= path->path_cost)
{ {
*is_new = false; *is_new = false;
return new_path; return new_path;
} }
/* same keys, new is more expensive, stop */
else if ((longer_key == 0 && new_path->path_cost >= path->path_cost) || /* same keys, new is more expensive, stop */
/* old is longer, and less expensive, stop */ else if
(longer_key == 2 && new_path->path_cost >= path->path_cost)) ((longer_key == 0 && more_sort == 0 &&
new_path->path_cost >= path->path_cost) ||
/* old is better, and less expensive, stop */
((longer_key == 2 && more_sort != 1) ||
(longer_key != 1 && more_sort == 2)) &&
new_path->path_cost >= path->path_cost)
{ {
*is_new = false; *is_new = false;
return NULL; return NULL;
...@@ -242,9 +253,9 @@ create_seqscan_path(RelOptInfo *rel) ...@@ -242,9 +253,9 @@ create_seqscan_path(RelOptInfo *rel)
pathnode->pathtype = T_SeqScan; pathnode->pathtype = T_SeqScan;
pathnode->parent = rel; pathnode->parent = rel;
pathnode->path_cost = 0.0; pathnode->path_cost = 0.0;
pathnode->path_order = makeNode(PathOrder); pathnode->pathorder = makeNode(PathOrder);
pathnode->path_order->ordtype = SORTOP_ORDER; pathnode->pathorder->ordtype = SORTOP_ORDER;
pathnode->path_order->ord.sortop = NULL; pathnode->pathorder->ord.sortop = NULL;
pathnode->pathkeys = NIL; pathnode->pathkeys = NIL;
/* /*
...@@ -292,9 +303,9 @@ create_index_path(Query *root, ...@@ -292,9 +303,9 @@ create_index_path(Query *root,
pathnode->path.pathtype = T_IndexScan; pathnode->path.pathtype = T_IndexScan;
pathnode->path.parent = rel; pathnode->path.parent = rel;
pathnode->path.path_order = makeNode(PathOrder); pathnode->path.pathorder = makeNode(PathOrder);
pathnode->path.path_order->ordtype = SORTOP_ORDER; pathnode->path.pathorder->ordtype = SORTOP_ORDER;
pathnode->path.path_order->ord.sortop = index->ordering; pathnode->path.pathorder->ord.sortop = index->ordering;
pathnode->indexid = index->relids; pathnode->indexid = index->relids;
pathnode->indexkeys = index->indexkeys; pathnode->indexkeys = index->indexkeys;
...@@ -311,7 +322,7 @@ create_index_path(Query *root, ...@@ -311,7 +322,7 @@ create_index_path(Query *root,
* The index must have an ordering for the path to have (ordering) * The index must have an ordering for the path to have (ordering)
* keys, and vice versa. * keys, and vice versa.
*/ */
if (pathnode->path.path_order->ord.sortop) if (pathnode->path.pathorder->ord.sortop)
{ {
pathnode->path.pathkeys = collect_index_pathkeys(index->indexkeys, pathnode->path.pathkeys = collect_index_pathkeys(index->indexkeys,
rel->targetlist); rel->targetlist);
...@@ -323,7 +334,7 @@ create_index_path(Query *root, ...@@ -323,7 +334,7 @@ create_index_path(Query *root,
* if no index keys were found, we can't order the path). * if no index keys were found, we can't order the path).
*/ */
if (pathnode->path.pathkeys == NULL) if (pathnode->path.pathkeys == NULL)
pathnode->path.path_order->ord.sortop = NULL; pathnode->path.pathorder->ord.sortop = NULL;
} }
else else
pathnode->path.pathkeys = NULL; pathnode->path.pathkeys = NULL;
...@@ -449,20 +460,20 @@ create_nestloop_path(RelOptInfo *joinrel, ...@@ -449,20 +460,20 @@ create_nestloop_path(RelOptInfo *joinrel,
pathnode->path.joinid = NIL; pathnode->path.joinid = NIL;
pathnode->path.outerjoincost = (Cost) 0.0; pathnode->path.outerjoincost = (Cost) 0.0;
pathnode->path.loc_restrictinfo = NIL; pathnode->path.loc_restrictinfo = NIL;
pathnode->path.path_order = makeNode(PathOrder); pathnode->path.pathorder = makeNode(PathOrder);
if (pathkeys) if (pathkeys)
{ {
pathnode->path.path_order->ordtype = outer_path->path_order->ordtype; pathnode->path.pathorder->ordtype = outer_path->pathorder->ordtype;
if (outer_path->path_order->ordtype == SORTOP_ORDER) if (outer_path->pathorder->ordtype == SORTOP_ORDER)
pathnode->path.path_order->ord.sortop = outer_path->path_order->ord.sortop; pathnode->path.pathorder->ord.sortop = outer_path->pathorder->ord.sortop;
else else
pathnode->path.path_order->ord.merge = outer_path->path_order->ord.merge; pathnode->path.pathorder->ord.merge = outer_path->pathorder->ord.merge;
} }
else else
{ {
pathnode->path.path_order->ordtype = SORTOP_ORDER; pathnode->path.pathorder->ordtype = SORTOP_ORDER;
pathnode->path.path_order->ord.sortop = NULL; pathnode->path.pathorder->ord.sortop = NULL;
} }
pathnode->path.path_cost = cost_nestloop(outer_path->path_cost, pathnode->path.path_cost = cost_nestloop(outer_path->path_cost,
...@@ -521,9 +532,9 @@ create_mergejoin_path(RelOptInfo *joinrel, ...@@ -521,9 +532,9 @@ create_mergejoin_path(RelOptInfo *joinrel,
pathnode->jpath.innerjoinpath = inner_path; pathnode->jpath.innerjoinpath = inner_path;
pathnode->jpath.pathinfo = joinrel->restrictinfo; pathnode->jpath.pathinfo = joinrel->restrictinfo;
pathnode->jpath.path.pathkeys = pathkeys; pathnode->jpath.path.pathkeys = pathkeys;
pathnode->jpath.path.path_order = makeNode(PathOrder); pathnode->jpath.path.pathorder = makeNode(PathOrder);
pathnode->jpath.path.path_order->ordtype = MERGE_ORDER; pathnode->jpath.path.pathorder->ordtype = MERGE_ORDER;
pathnode->jpath.path.path_order->ord.merge = order; pathnode->jpath.path.pathorder->ord.merge = order;
pathnode->path_mergeclauses = mergeclauses; pathnode->path_mergeclauses = mergeclauses;
pathnode->jpath.path.loc_restrictinfo = NIL; pathnode->jpath.path.loc_restrictinfo = NIL;
pathnode->outersortkeys = outersortkeys; pathnode->outersortkeys = outersortkeys;
...@@ -587,9 +598,9 @@ create_hashjoin_path(RelOptInfo *joinrel, ...@@ -587,9 +598,9 @@ create_hashjoin_path(RelOptInfo *joinrel,
pathnode->jpath.pathinfo = joinrel->restrictinfo; pathnode->jpath.pathinfo = joinrel->restrictinfo;
pathnode->jpath.path.loc_restrictinfo = NIL; pathnode->jpath.path.loc_restrictinfo = NIL;
pathnode->jpath.path.pathkeys = pathkeys; pathnode->jpath.path.pathkeys = pathkeys;
pathnode->jpath.path.path_order = makeNode(PathOrder); pathnode->jpath.path.pathorder = makeNode(PathOrder);
pathnode->jpath.path.path_order->ordtype = SORTOP_ORDER; pathnode->jpath.path.pathorder->ordtype = SORTOP_ORDER;
pathnode->jpath.path.path_order->ord.sortop = NULL; pathnode->jpath.path.pathorder->ord.sortop = NULL;
pathnode->jpath.path.outerjoincost = (Cost) 0.0; pathnode->jpath.path.outerjoincost = (Cost) 0.0;
pathnode->jpath.path.joinid = (Relid) NULL; pathnode->jpath.path.joinid = (Relid) NULL;
/* pathnode->hashjoinoperator = operator; */ /* pathnode->hashjoinoperator = operator; */
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* *
* Copyright (c) 1994, Regents of the University of California * Copyright (c) 1994, Regents of the University of California
* *
* $Id: relation.h,v 1.18 1999/02/10 03:52:50 momjian Exp $ * $Id: relation.h,v 1.19 1999/02/11 14:59:03 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -146,7 +146,7 @@ typedef struct Path ...@@ -146,7 +146,7 @@ typedef struct Path
NodeTag pathtype; NodeTag pathtype;
PathOrder *path_order; PathOrder *pathorder;
List *pathkeys; /* This is a List of List of Var nodes. List *pathkeys; /* This is a List of List of Var nodes.
* It is a List of Lists because of multi-key * It is a List of Lists because of multi-key
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* *
* Copyright (c) 1994, Regents of the University of California * Copyright (c) 1994, Regents of the University of California
* *
* $Id: ordering.h,v 1.10 1999/02/06 17:29:30 momjian Exp $ * $Id: ordering.h,v 1.11 1999/02/11 14:59:09 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -15,8 +15,8 @@ ...@@ -15,8 +15,8 @@
#include <nodes/relation.h> #include <nodes/relation.h>
extern bool equal_path_ordering(PathOrder *path_ordering1, extern bool pathorder_match(PathOrder *path_ordering1,
PathOrder *path_ordering2); PathOrder *path_ordering2, int *more_sort);
extern bool equal_path_merge_ordering(Oid *path_ordering, extern bool equal_path_merge_ordering(Oid *path_ordering,
MergeOrder *merge_ordering); MergeOrder *merge_ordering);
extern bool equal_merge_ordering(MergeOrder *merge_ordering1, extern bool equal_merge_ordering(MergeOrder *merge_ordering1,
......
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