OSDN Git Service

Disable the recently-added use_physical_tlist optimization in cases
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 11 May 2003 15:03:52 +0000 (15:03 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 11 May 2003 15:03:52 +0000 (15:03 +0000)
where the table contains dropped columns.  If the columns are dropped,
then their types may be gone as well, which causes ExecTypeFromTL() to
fail if the dropped columns appear in a plan node's tlist.  This could
be worked around but I don't think the optimization is valuable enough
to be worth the trouble.

src/backend/optimizer/plan/createplan.c
src/backend/optimizer/util/plancat.c

index b491065..3445400 100644 (file)
@@ -10,7 +10,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/optimizer/plan/createplan.c,v 1.139 2003/05/06 00:20:32 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/optimizer/plan/createplan.c,v 1.140 2003/05/11 15:03:52 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -296,6 +296,12 @@ use_physical_tlist(RelOptInfo *rel)
        if (rel->reloptkind != RELOPT_BASEREL)
                return false;
        /*
+        * Can't do it if relation contains dropped columns.  This is detected
+        * in plancat.c, see notes there.
+        */
+       if (rel->varlist == NIL)
+               return false;
+       /*
         * Can't do it if any system columns are requested, either.  (This could
         * possibly be fixed but would take some fragile assumptions in setrefs.c,
         * I think.)
index 029ddae..943e575 100644 (file)
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/optimizer/util/plancat.c,v 1.79 2003/02/09 06:56:27 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/optimizer/util/plancat.c,v 1.80 2003/05/11 15:03:52 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -62,8 +62,15 @@ get_relation_info(Oid relationObjectId, RelOptInfo *rel)
        relation = heap_open(relationObjectId, AccessShareLock);
 
        /*
-        * Make list of physical Vars.  Note we do NOT ignore dropped columns;
-        * the intent is to model the physical tuples of the relation.
+        * Make list of physical Vars.  But if there are any dropped columns,
+        * punt and set varlist to NIL.  (XXX Ideally we would like to include
+        * dropped columns so that the varlist models the physical tuples
+        * of the relation.  However this creates problems for ExecTypeFromTL,
+        * which may be asked to build a tupdesc for a tlist that includes vars
+        * of no-longer-existent types.  In theory we could dig out the required
+        * info from the pg_attribute entries of the relation, but that data is
+        * not readily available to ExecTypeFromTL.  For now, punt and don't
+        * apply the physical-tlist optimization when there are dropped cols.)
         */
        numattrs = RelationGetNumberOfAttributes(relation);
 
@@ -71,6 +78,13 @@ get_relation_info(Oid relationObjectId, RelOptInfo *rel)
        {
                Form_pg_attribute att_tup = relation->rd_att->attrs[attrno - 1];
 
+               if (att_tup->attisdropped)
+               {
+                       /* found a dropped col, so punt */
+                       varlist = NIL;
+                       break;
+               }
+
                varlist = lappend(varlist,
                                                  makeVar(varno,
                                                                  attrno,