aboutsummaryrefslogtreecommitdiff
path: root/src/backend/parser/parse_clause.c
diff options
context:
space:
mode:
authorThomas G. Lockhart <lockhart@fourpalms.org>1998-07-14 03:51:42 +0000
committerThomas G. Lockhart <lockhart@fourpalms.org>1998-07-14 03:51:42 +0000
commit9fdbbdc8770c09b8bf1003d206628584889b6ec1 (patch)
treef38d8e2395f0a672ca4ccea45aecf3b8894e491a /src/backend/parser/parse_clause.c
parent3733bd462724e5e79164df05fb64849820220406 (diff)
downloadpostgresql-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.c23
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)
{