summaryrefslogtreecommitdiff
path: root/src/backend/optimizer/prep/prepunion.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/optimizer/prep/prepunion.c')
-rw-r--r--src/backend/optimizer/prep/prepunion.c70
1 files changed, 46 insertions, 24 deletions
diff --git a/src/backend/optimizer/prep/prepunion.c b/src/backend/optimizer/prep/prepunion.c
index 807364fac8..97e4d56a9f 100644
--- a/src/backend/optimizer/prep/prepunion.c
+++ b/src/backend/optimizer/prep/prepunion.c
@@ -14,7 +14,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/optimizer/prep/prepunion.c,v 1.87 2003/01/17 02:01:16 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/optimizer/prep/prepunion.c,v 1.88 2003/01/20 18:54:54 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -62,6 +62,7 @@ static List *generate_append_tlist(List *colTypes, bool flag,
List *refnames_tlist);
static Node *adjust_inherited_attrs_mutator(Node *node,
adjust_inherited_attrs_context *context);
+static List *adjust_rtindex_list(List *relids, Index oldrelid, Index newrelid);
static List *adjust_inherited_tlist(List *tlist, Oid new_relid);
@@ -239,8 +240,9 @@ generate_union_plan(SetOperationStmt *op, Query *parse,
tlist = new_unsorted_tlist(tlist);
sortList = addAllTargetsToSortList(NIL, tlist);
- plan = make_sortplan(parse, tlist, plan, sortList);
- plan = (Plan *) make_unique(tlist, plan, copyObject(sortList));
+ plan = (Plan *) make_sort_from_sortclauses(parse, tlist,
+ plan, sortList);
+ plan = (Plan *) make_unique(tlist, plan, sortList);
}
return plan;
}
@@ -292,7 +294,7 @@ generate_nonunion_plan(SetOperationStmt *op, Query *parse,
*/
tlist = new_unsorted_tlist(tlist);
sortList = addAllTargetsToSortList(NIL, tlist);
- plan = make_sortplan(parse, tlist, plan, sortList);
+ plan = (Plan *) make_sort_from_sortclauses(parse, tlist, plan, sortList);
switch (op->op)
{
case SETOP_INTERSECT:
@@ -830,6 +832,23 @@ adjust_inherited_attrs_mutator(Node *node,
j->rtindex = context->new_rt_index;
return (Node *) j;
}
+ if (IsA(node, InClauseInfo))
+ {
+ /* Copy the InClauseInfo node with correct mutation of subnodes */
+ InClauseInfo *ininfo;
+
+ ininfo = (InClauseInfo *) expression_tree_mutator(node,
+ adjust_inherited_attrs_mutator,
+ (void *) context);
+ /* now fix InClauseInfo's rtindex lists */
+ ininfo->lefthand = adjust_rtindex_list(ininfo->lefthand,
+ context->old_rt_index,
+ context->new_rt_index);
+ ininfo->righthand = adjust_rtindex_list(ininfo->righthand,
+ context->old_rt_index,
+ context->new_rt_index);
+ return (Node *) ininfo;
+ }
/*
* We have to process RestrictInfo nodes specially.
@@ -856,26 +875,12 @@ adjust_inherited_attrs_mutator(Node *node,
/*
* Adjust left/right relids lists too.
*/
- if (intMember(context->old_rt_index, oldinfo->left_relids))
- {
- newinfo->left_relids = listCopy(oldinfo->left_relids);
- newinfo->left_relids = lremovei(context->old_rt_index,
- newinfo->left_relids);
- newinfo->left_relids = lconsi(context->new_rt_index,
- newinfo->left_relids);
- }
- else
- newinfo->left_relids = oldinfo->left_relids;
- if (intMember(context->old_rt_index, oldinfo->right_relids))
- {
- newinfo->right_relids = listCopy(oldinfo->right_relids);
- newinfo->right_relids = lremovei(context->old_rt_index,
- newinfo->right_relids);
- newinfo->right_relids = lconsi(context->new_rt_index,
- newinfo->right_relids);
- }
- else
- newinfo->right_relids = oldinfo->right_relids;
+ newinfo->left_relids = adjust_rtindex_list(oldinfo->left_relids,
+ context->old_rt_index,
+ context->new_rt_index);
+ newinfo->right_relids = adjust_rtindex_list(oldinfo->right_relids,
+ context->old_rt_index,
+ context->new_rt_index);
newinfo->eval_cost.startup = -1; /* reset these too */
newinfo->this_selec = -1;
@@ -923,6 +928,23 @@ adjust_inherited_attrs_mutator(Node *node,
}
/*
+ * Substitute newrelid for oldrelid in a list of RT indexes
+ */
+static List *
+adjust_rtindex_list(List *relids, Index oldrelid, Index newrelid)
+{
+ if (intMember(oldrelid, relids))
+ {
+ /* Ensure we have a modifiable copy */
+ relids = listCopy(relids);
+ /* Remove old, add new */
+ relids = lremovei(oldrelid, relids);
+ relids = lconsi(newrelid, relids);
+ }
+ return relids;
+}
+
+/*
* Adjust the targetlist entries of an inherited UPDATE operation
*
* The expressions have already been fixed, but we have to make sure that