From 9d6c0f57b3511b011dac327f74a6d30496f22e6f Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 9 Nov 2000 04:14:32 +0000 Subject: [PATCH] Arrange for CASE or UNION with only untyped literal constants as input to resolve the unknown constants as type TEXT. --- src/backend/parser/parse_coerce.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/backend/parser/parse_coerce.c b/src/backend/parser/parse_coerce.c index 025a1d4319..fb515432f0 100644 --- a/src/backend/parser/parse_coerce.c +++ b/src/backend/parser/parse_coerce.c @@ -374,6 +374,22 @@ select_common_type(List *typeids, const char *context) } } } + + /* + * If all the inputs were UNKNOWN type --- ie, unknown-type literals --- + * then resolve as type TEXT. This situation comes up with constructs + * like + * SELECT (CASE WHEN foo THEN 'bar' ELSE 'baz' END); + * SELECT 'foo' UNION SELECT 'bar'; + * It might seem desirable to leave the construct's output type as + * UNKNOWN, but that really doesn't work, because we'd probably end up + * needing a runtime coercion from UNKNOWN to something else, and we + * usually won't have it. We need to coerce the unknown literals while + * they are still literals, so a decision has to be made now. + */ + if (ptype == UNKNOWNOID) + ptype = TEXTOID; + return ptype; } -- 2.39.5