aboutsummaryrefslogtreecommitdiff
path: root/src/backend/optimizer/path/mergeutils.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>1999-08-16 02:17:58 +0000
committerTom Lane <tgl@sss.pgh.pa.us>1999-08-16 02:17:58 +0000
commite6381966c1886badbc19c94ac1f1ffbc104125ab (patch)
tree9da3d5d073dcb4cff68bdb69f6118409b5315512 /src/backend/optimizer/path/mergeutils.c
parent08320bfb22b3ef006885de91f5163ef5fe831889 (diff)
downloadpostgresql-e6381966c1886badbc19c94ac1f1ffbc104125ab.tar.gz
postgresql-e6381966c1886badbc19c94ac1f1ffbc104125ab.zip
Major planner/optimizer revision: get rid of PathOrder node type,
store all ordering information in pathkeys lists (which are now lists of lists of PathKeyItem nodes, not just lists of lists of vars). This was a big win --- the code is smaller and IMHO more understandable than it was, even though it handles more cases. I believe the node changes will not force an initdb for anyone; planner nodes don't show up in stored rules.
Diffstat (limited to 'src/backend/optimizer/path/mergeutils.c')
-rw-r--r--src/backend/optimizer/path/mergeutils.c131
1 files changed, 0 insertions, 131 deletions
diff --git a/src/backend/optimizer/path/mergeutils.c b/src/backend/optimizer/path/mergeutils.c
deleted file mode 100644
index 1cc19693f8d..00000000000
--- a/src/backend/optimizer/path/mergeutils.c
+++ /dev/null
@@ -1,131 +0,0 @@
-/*-------------------------------------------------------------------------
- *
- * mergeutils.c
- * Utilities for finding applicable merge clauses and pathkeys
- *
- * Copyright (c) 1994, Regents of the University of California
- *
- *
- * IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/optimizer/path/Attic/mergeutils.c,v 1.24 1999/07/16 04:59:15 momjian Exp $
- *
- *-------------------------------------------------------------------------
- */
-#include "postgres.h"
-
-
-#include "optimizer/clauses.h"
-#include "optimizer/ordering.h"
-#include "optimizer/paths.h"
-
-/*
- * group_clauses_by_order
- * If a join clause node in 'restrictinfo_list' is mergejoinable, store
- * it within a mergeinfo node containing other clause nodes with the same
- * mergejoin ordering.
- *
- * XXX This is completely braindead: there is no reason anymore to segregate
- * mergejoin clauses by join operator, since the executor can handle mergejoin
- * clause sets with different operators in them. Instead, we ought to be
- * building a MergeInfo for each potentially useful ordering of the input
- * relations. But right now the optimizer's internal data structures do not
- * support that (MergeInfo can only store one MergeOrder for a set of clauses).
- * Something to fix next time...
- *
- * 'restrictinfo_list' is the list of restrictinfo nodes
- * 'inner_relids' is the list of relids in the inner join relation
- * (used to determine whether a join var is inner or outer)
- *
- * Returns the new list of mergeinfo nodes.
- *
- */
-List *
-group_clauses_by_order(List *restrictinfo_list,
- Relids inner_relids)
-{
- List *mergeinfo_list = NIL;
- List *xrestrictinfo;
-
- foreach(xrestrictinfo, restrictinfo_list)
- {
- RestrictInfo *restrictinfo = (RestrictInfo *) lfirst(xrestrictinfo);
- MergeOrder *merge_ordering = restrictinfo->mergejoinorder;
-
- if (merge_ordering)
- {
-
- /*
- * Create a new mergeinfo node and add it to 'mergeinfo_list'
- * if one does not yet exist for this merge ordering.
- */
- Expr *clause = restrictinfo->clause;
- Var *leftop = get_leftop(clause);
- Var *rightop = get_rightop(clause);
- PathOrder *pathorder;
- MergeInfo *xmergeinfo;
- JoinKey *jmkeys;
-
- pathorder = makeNode(PathOrder);
- pathorder->ordtype = MERGE_ORDER;
- pathorder->ord.merge = merge_ordering;
- xmergeinfo = match_order_mergeinfo(pathorder, mergeinfo_list);
- jmkeys = makeNode(JoinKey);
- if (intMember(leftop->varno, inner_relids))
- {
- jmkeys->outer = rightop;
- jmkeys->inner = leftop;
- }
- else
- {
- jmkeys->outer = leftop;
- jmkeys->inner = rightop;
- }
-
- if (xmergeinfo == NULL)
- {
- xmergeinfo = makeNode(MergeInfo);
- xmergeinfo->m_ordering = merge_ordering;
- mergeinfo_list = lcons(xmergeinfo, mergeinfo_list);
- }
-
- xmergeinfo->jmethod.clauses = lcons(clause,
- xmergeinfo->jmethod.clauses);
- xmergeinfo->jmethod.jmkeys = lcons(jmkeys,
- xmergeinfo->jmethod.jmkeys);
- }
- }
- return mergeinfo_list;
-}
-
-
-/*
- * match_order_mergeinfo
- * Searches the list 'mergeinfo_list' for a mergeinfo node whose order
- * field equals 'ordering'.
- *
- * Returns the node if it exists.
- *
- */
-MergeInfo *
-match_order_mergeinfo(PathOrder *ordering, List *mergeinfo_list)
-{
- MergeOrder *xmergeorder;
- List *xmergeinfo = NIL;
-
- foreach(xmergeinfo, mergeinfo_list)
- {
- MergeInfo *mergeinfo = (MergeInfo *) lfirst(xmergeinfo);
-
- xmergeorder = mergeinfo->m_ordering;
-
- if ((ordering->ordtype == MERGE_ORDER &&
- equal_merge_ordering(ordering->ord.merge, xmergeorder)) ||
- (ordering->ordtype == SORTOP_ORDER &&
- equal_path_merge_ordering(ordering->ord.sortop, xmergeorder)))
- {
-
- return mergeinfo;
- }
- }
- return (MergeInfo *) NIL;
-}