]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Change CREATE TABLE AS / SELECT INTO to create the new table with OIDs,
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 23 Jan 2003 05:10:57 +0000 (05:10 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 23 Jan 2003 05:10:57 +0000 (05:10 +0000)
for backwards compatibility with pre-7.3 behavior.  Per discussion on
pgsql-general and pgsql-hackers.

src/backend/executor/execMain.c
src/backend/executor/execUtils.c
src/include/nodes/execnodes.h

index c94767926d23977cde93cdae8b69a34c258a2a96..c20d1a2517207ed62b82cf64cf40f933f981ebb6 100644 (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);
index 86440d10f9e8f00bc3f88472a90dba92c9c760e7..079ffd15016f0051e51adf3b3fda5bcaa0b86272 100644 (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);
index facef908947b9efa83f18b1af509138dafef21e1..e30bd20ffeb534f6b8f784e51ce04047a3fbc5b5 100644 (file)
@@ -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 */
 
        /*