Arrange for CASE or UNION with only untyped literal constants as input
authorTom Lane
Thu, 9 Nov 2000 04:14:32 +0000 (04:14 +0000)
committerTom Lane
Thu, 9 Nov 2000 04:14:32 +0000 (04:14 +0000)
to resolve the unknown constants as type TEXT.

src/backend/parser/parse_coerce.c

index ef13d67cf1c63afb864abe2862ea0890a4afac87..f0d3427d17ef5fc99c267bad7febe1bdbb7250f9 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/parser/parse_coerce.c,v 2.47 2000/10/05 19:11:33 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/parser/parse_coerce.c,v 2.48 2000/11/09 04:14:32 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -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;
 }