1
0
mirror of https://github.com/postgres/postgres.git synced 2025-11-28 11:44:57 +03:00

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.
This commit is contained in:
Tom Lane
2003-01-23 05:10:57 +00:00
parent d73531209c
commit 01376c215c
3 changed files with 42 additions and 26 deletions

View File

@@ -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);

View File

@@ -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);