diff options
author | Thomas G. Lockhart <lockhart@fourpalms.org> | 1998-07-14 03:51:42 +0000 |
---|---|---|
committer | Thomas G. Lockhart <lockhart@fourpalms.org> | 1998-07-14 03:51:42 +0000 |
commit | 9fdbbdc8770c09b8bf1003d206628584889b6ec1 (patch) | |
tree | f38d8e2395f0a672ca4ccea45aecf3b8894e491a /src/backend/parser/parse_clause.c | |
parent | 3733bd462724e5e79164df05fb64849820220406 (diff) | |
download | postgresql-9fdbbdc8770c09b8bf1003d206628584889b6ec1.tar.gz postgresql-9fdbbdc8770c09b8bf1003d206628584889b6ec1.zip |
Fix for UNION selects with constant NULL expressions; e.g.
SELECT 1 UNION SELECT NULL;
Diffstat (limited to 'src/backend/parser/parse_clause.c')
-rw-r--r-- | src/backend/parser/parse_clause.c | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/src/backend/parser/parse_clause.c b/src/backend/parser/parse_clause.c index 732befec240..a701ffca279 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) { |