summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2003-01-23 05:10:57 +0000
committerTom Lane2003-01-23 05:10:57 +0000
commit01376c215c4ec02e05fe0b8f543b178666f57535 (patch)
tree940f4c6540eae33c735e445c368197188a8684ad
parentd73531209cdb7d066b9e5b0fd7a380605e20ffbf (diff)
Change CREATE TABLE AS / SELECT INTO to create the new table with OIDs,
for backwards compatibility with pre-7.3 behavior. Per discussion on pgsql-general and pgsql-hackers.
-rw-r--r--src/backend/executor/execMain.c43
-rw-r--r--src/backend/executor/execUtils.c21
-rw-r--r--src/include/nodes/execnodes.h4
3 files changed, 42 insertions, 26 deletions
diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c
index c94767926d2..c20d1a25172 100644
--- a/src/backend/executor/execMain.c
+++ b/src/backend/executor/execMain.c
@@ -27,7 +27,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.180 2002/10/14 16:51:30 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.180.2.1 2003/01/23 05:10:56 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -450,6 +450,7 @@ InitPlan(CmdType operation, Query *parseTree, Plan *plan, EState *estate)
{
List *rangeTable;
Relation intoRelationDesc;
+ bool do_select_into;
TupleDesc tupType;
/*
@@ -528,6 +529,26 @@ InitPlan(CmdType operation, Query *parseTree, Plan *plan, EState *estate)
}
/*
+ * Detect whether we're doing SELECT INTO. If so, set the force_oids
+ * flag appropriately so that the plan tree will be initialized with
+ * the correct tuple descriptors.
+ */
+ do_select_into = false;
+
+ if (operation == CMD_SELECT &&
+ !parseTree->isPortal &&
+ parseTree->into != NULL)
+ {
+ do_select_into = true;
+ /*
+ * For now, always create OIDs in SELECT INTO; this is for backwards
+ * compatibility with pre-7.3 behavior. Eventually we might want
+ * to allow the user to choose.
+ */
+ estate->es_force_oids = true;
+ }
+
+ /*
* Have to lock relations selected for update
*/
estate->es_rowMark = NIL;
@@ -686,15 +707,8 @@ InitPlan(CmdType operation, Query *parseTree, Plan *plan, EState *estate)
*/
intoRelationDesc = (Relation) NULL;
- if (operation == CMD_SELECT)
+ if (do_select_into)
{
- if (!parseTree->isPortal)
- {
- /*
- * a select into table --- need to create the "into" table
- */
- if (parseTree->into != NULL)
- {
char *intoName;
Oid namespaceId;
AclResult aclresult;
@@ -718,14 +732,6 @@ InitPlan(CmdType operation, Query *parseTree, Plan *plan, EState *estate)
*/
tupdesc = CreateTupleDescCopy(tupType);
- /*
- * Formerly we forced the output table to have OIDs, but
- * as of 7.3 it will not have OIDs, because it's too late
- * here to change the tupdescs of the already-initialized
- * plan tree. (Perhaps we could recurse and change them
- * all, but it's not really worth the trouble IMHO...)
- */
-
intoRelationId =
heap_create_with_catalog(intoName,
namespaceId,
@@ -752,8 +758,6 @@ InitPlan(CmdType operation, Query *parseTree, Plan *plan, EState *estate)
intoRelationDesc = heap_open(intoRelationId,
AccessExclusiveLock);
- }
- }
}
estate->es_into_relation_descriptor = intoRelationDesc;
@@ -1852,6 +1856,7 @@ EvalPlanQual(EState *estate, Index rti, ItemPointer tid)
if (estate->es_origPlan->nParamExec > 0)
memset(epqstate->es_param_exec_vals, 0,
estate->es_origPlan->nParamExec * sizeof(ParamExecData));
+ epqstate->es_force_oids = estate->es_force_oids;
memset(epqstate->es_evTupleNull, false, rtsize * sizeof(bool));
epqstate->es_useEvalPlan = false;
Assert(epqstate->es_tupleTable == NULL);
diff --git a/src/backend/executor/execUtils.c b/src/backend/executor/execUtils.c
index 86440d10f9e..079ffd15016 100644
--- a/src/backend/executor/execUtils.c
+++ b/src/backend/executor/execUtils.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/executor/execUtils.c,v 1.90 2002/09/04 20:31:18 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/executor/execUtils.c,v 1.90.2.1 2003/01/23 05:10:56 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -310,14 +310,23 @@ ExecAssignResultTypeFromTL(Plan *node, CommonState *commonstate)
* have to make the decision on a per-relation basis as we initialize
* each of the child plans of the topmost Append plan. So, this is
* ugly but it works, for now ...
+ *
+ * SELECT INTO is also pretty grotty, because we don't yet have the
+ * INTO relation's descriptor at this point; we have to look aside
+ * at a flag set by InitPlan().
*/
- ri = node->state->es_result_relation_info;
- if (ri != NULL)
+ if (node->state->es_force_oids)
+ hasoid = true;
+ else
{
- Relation rel = ri->ri_RelationDesc;
+ ri = node->state->es_result_relation_info;
+ if (ri != NULL)
+ {
+ Relation rel = ri->ri_RelationDesc;
- if (rel != NULL)
- hasoid = rel->rd_rel->relhasoids;
+ if (rel != NULL)
+ hasoid = rel->rd_rel->relhasoids;
+ }
}
tupDesc = ExecTypeFromTL(node->targetlist, hasoid);
diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h
index facef908947..e30bd20ffeb 100644
--- a/src/include/nodes/execnodes.h
+++ b/src/include/nodes/execnodes.h
@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $Id: execnodes.h,v 1.75 2002/09/04 20:31:42 momjian Exp $
+ * $Id: execnodes.h,v 1.75.2.1 2003/01/23 05:10:57 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -306,6 +306,8 @@ typedef struct EState
uint32 es_processed; /* # of tuples processed */
Oid es_lastoid; /* last oid processed (by INSERT) */
List *es_rowMark; /* not good place, but there is no other */
+ bool es_force_oids; /* true forces result tuples to have (space
+ * for) OIDs --- used for SELECT INTO */
MemoryContext es_query_cxt; /* per-query context in which EState lives */
/*