From: Tom Lane Date: Thu, 23 Jan 2003 05:10:57 +0000 (+0000) Subject: Change CREATE TABLE AS / SELECT INTO to create the new table with OIDs, X-Git-Tag: REL7_3_2~24 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=01376c215c4ec02e05fe0b8f543b178666f57535;p=thirdparty%2Fpostgresql.git 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. --- 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; /* @@ -527,6 +528,26 @@ InitPlan(CmdType operation, Query *parseTree, Plan *plan, EState *estate) estate->es_result_relation_info = NULL; } + /* + * 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 */ @@ -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 */ /*