From 9fdbbdc8770c09b8bf1003d206628584889b6ec1 Mon Sep 17 00:00:00 2001 From: "Thomas G. Lockhart" Date: Tue, 14 Jul 1998 03:51:42 +0000 Subject: [PATCH] Fix for UNION selects with constant NULL expressions; e.g. SELECT 1 UNION SELECT NULL; --- src/backend/parser/parse_clause.c | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/backend/parser/parse_clause.c b/src/backend/parser/parse_clause.c index 732befec24..a701ffca27 100644 --- a/src/backend/parser/parse_clause.c +++ b/src/backend/parser/parse_clause.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/parser/parse_clause.c,v 1.20 1998/07/09 14:34:05 thomas Exp $ + * $Header: /cvsroot/pgsql/src/backend/parser/parse_clause.c,v 1.21 1998/07/14 03:51:42 thomas Exp $ * *------------------------------------------------------------------------- */ @@ -472,7 +472,25 @@ transformUnionClause(List *unionClause, List *targetlist) Oid otype; otype = ((TargetEntry *)lfirst(prev_target))->resdom->restype; itype = ((TargetEntry *)lfirst(next_target))->resdom->restype; - if (itype != otype) + +#ifdef PARSEDEBUG +printf("transformUnionClause: types are %d -> %d\n", itype, otype); +#endif + + /* one or both is a NULL column? then don't convert... */ + if (otype == InvalidOid) + { + /* propagate a known type forward, if available */ + if (itype != InvalidOid) + { + ((TargetEntry *)lfirst(prev_target))->resdom->restype = itype; + } + } + else if (itype == InvalidOid) + { + } + /* they don't match in type? then convert... */ + else if (itype != otype) { Node *expr; @@ -488,6 +506,7 @@ transformUnionClause(List *unionClause, List *targetlist) ((TargetEntry *)lfirst(next_target))->expr = expr; ((TargetEntry *)lfirst(next_target))->resdom->restype = otype; } + /* both are UNKNOWN? then evaluate as text... */ else if (itype == UNKNOWNOID) { -- 2.11.0