From d97c9b366273a49f0469184df9dfb3a312b2f3ff Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 12 May 2003 00:17:03 +0000 Subject: Apply fixes for problems with dropped columns whose types have also been dropped. The simplest fix for INSERT/UPDATE cases turns out to be for preptlist.c to insert NULLs of a known-good type (I used INT4) rather than making them match the deleted column's type. Since the representation of NULL is actually datatype-independent, this should work fine. I also re-reverted the patch to disable the use_physical_tlist optimization in the presence of dropped columns. It still doesn't look worth the trouble to be smarter, if there are no other bugs to fix. Added a regression test to catch future problems in this area. --- src/backend/optimizer/util/plancat.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) (limited to 'src/backend/optimizer/util/plancat.c') diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c index c0c4775da85..9ec638a5a43 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.81 2003/05/11 20:25:50 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/optimizer/util/plancat.c,v 1.82 2003/05/12 00:17:03 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, -- cgit v1.2.3