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:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 */
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user