*
*
* 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 $
*
*-------------------------------------------------------------------------
*/
{
List *rangeTable;
Relation intoRelationDesc;
+ bool do_select_into;
TupleDesc tupType;
/*
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
*/
*/
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;
*/
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,
intoRelationDesc = heap_open(intoRelationId,
AccessExclusiveLock);
- }
- }
}
estate->es_into_relation_descriptor = intoRelationDesc;
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);
*
*
* 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 $
*
*-------------------------------------------------------------------------
*/
* 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);
* 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 $
*
*-------------------------------------------------------------------------
*/
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 */
/*