summaryrefslogtreecommitdiff
path: root/src/backend/optimizer
diff options
context:
space:
mode:
authorMason Sharp2010-12-09 22:15:44 +0000
committerPavan Deolasee2011-05-19 16:45:24 +0000
commitbd81c63c90ba42a5554cf5343bf71c5deb7c7cbf (patch)
treec2278d06ec9ec8501c70ea08e8b057bf6ea02b24 /src/backend/optimizer
parent44f83040767b619bd9e4bf4088c6eb00d994b620 (diff)
Add support for INSERT SELECT.
Also, initial changes for setting execution nodes in general planner. We execute a query normally, directed by the Coordinator, and then use COPY running down on the data nodes to insert the data there. We also check for a special case of INSERT SELECT where the source and destination columns are both the distribution columns of tables, and where the query is a single step query. In such a case, we just execute the query locally on the data nodes without the use of COPY directed by the Coordinator. In testing we uncovered an issue for INSERT SELECT when the query is from a replicated table; it was selecting from all tables because exec_nodes was not set for the RemoteQuery. As a result, this commit also sets the exec_nodes for base RemoteQuery structs as well as join reduced ones. It does not yet, however, take into account WHERE clause equality conditions against the distribution column, as is done in a regular SELECT. This is left as a future optimization, best done as a step for further merging the Postgres-XC planner and the standard planner.
Diffstat (limited to 'src/backend/optimizer')
-rw-r--r--src/backend/optimizer/plan/createplan.c29
1 files changed, 21 insertions, 8 deletions
diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c
index 30084633e4..bebb81a276 100644
--- a/src/backend/optimizer/plan/createplan.c
+++ b/src/backend/optimizer/plan/createplan.c
@@ -630,6 +630,7 @@ static Plan *
create_remotejoin_plan(PlannerInfo *root, JoinPath *best_path, Plan *parent, Plan *outer_plan, Plan *inner_plan)
{
NestLoop *nest_parent;
+ JoinReduceInfo join_info;
if (!enable_remotejoin)
return parent;
@@ -638,10 +639,6 @@ create_remotejoin_plan(PlannerInfo *root, JoinPath *best_path, Plan *parent, Pla
if (root->hasPseudoConstantQuals)
return parent;
- /* Works only for SELECT commands right now */
- if (root->parse->commandType != CMD_SELECT)
- return parent;
-
/* do not optimize CURSOR based select statements */
if (root->parse->rowMarks != NIL)
return parent;
@@ -664,7 +661,6 @@ create_remotejoin_plan(PlannerInfo *root, JoinPath *best_path, Plan *parent, Pla
{
int i;
List *rtable_list = NIL;
- bool partitioned_replicated_join = false;
Material *outer_mat = (Material *)outer_plan;
Material *inner_mat = (Material *)inner_plan;
@@ -692,7 +688,7 @@ create_remotejoin_plan(PlannerInfo *root, JoinPath *best_path, Plan *parent, Pla
}
/* XXX Check if the join optimization is possible */
- if (IsJoinReducible(inner, outer, rtable_list, best_path, &partitioned_replicated_join))
+ if (IsJoinReducible(inner, outer, rtable_list, best_path, &join_info))
{
RemoteQuery *result;
Plan *result_plan;
@@ -829,6 +825,7 @@ create_remotejoin_plan(PlannerInfo *root, JoinPath *best_path, Plan *parent, Pla
result->outer_reduce_level = outer->reduce_level;
result->inner_relids = in_relids;
result->outer_relids = out_relids;
+ result->exec_nodes = copyObject(join_info.exec_nodes);
appendStringInfo(&fromlist, " %s (%s) %s",
pname, inner->sql_statement, quote_identifier(in_alias));
@@ -917,8 +914,7 @@ create_remotejoin_plan(PlannerInfo *root, JoinPath *best_path, Plan *parent, Pla
/* set_plan_refs needs this later */
result->base_tlist = base_tlist;
result->relname = "__FOREIGN_QUERY__";
-
- result->partitioned_replicated = partitioned_replicated_join;
+ result->partitioned_replicated = join_info.partitioned_replicated;
/*
* if there were any local scan clauses stick them up here. They
@@ -2233,6 +2229,8 @@ create_remotequery_plan(PlannerInfo *root, Path *best_path,
TupleDesc tupdesc;
bool first;
StringInfoData sql;
+ RelationLocInfo *rel_loc_info;
+
Assert(scan_relid > 0);
rte = planner_rt_fetch(scan_relid, root);
@@ -2393,6 +2391,21 @@ create_remotequery_plan(PlannerInfo *root, Path *best_path,
scan_plan->sql_statement = sql.data;
+ /*
+ * Populate what nodes we execute on.
+ * This is still basic, and was done to make sure we do not select
+ * a replicated table from all nodes.
+ * It does not take into account conditions on partitioned relations
+ * that could reduce to one node. To do that, we need to move general
+ * planning earlier.
+ */
+ rel_loc_info = GetRelationLocInfo(rte->relid);
+ scan_plan->exec_nodes = makeNode(ExecNodes);
+ scan_plan->exec_nodes->tableusagetype = TABLE_USAGE_TYPE_USER;
+ scan_plan->exec_nodes->baselocatortype = rel_loc_info->locatorType;
+ scan_plan->exec_nodes = GetRelationNodes(rel_loc_info,
+ NULL,
+ RELATION_ACCESS_READ);
copy_path_costsize(&scan_plan->scan.plan, best_path);
/* PGXCTODO - get better estimates */