diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c index b491065f03d..3445400988a 100644 --- a/src/backend/optimizer/plan/createplan.c +++ b/src/backend/optimizer/plan/createplan.c @@ -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 $ * *------------------------------------------------------------------------- */ @@ -295,6 +295,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, diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c index 029ddae189c..943e5752faa 100644 --- a/src/backend/optimizer/util/plancat.c +++ b/src/backend/optimizer/util/plancat.c @@ -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,