Re-allow an untyped literal as the test expression of a CASE, ie
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 12 Jan 2005 17:32:36 +0000 (17:32 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 12 Jan 2005 17:32:36 +0000 (17:32 +0000)
CASE 'a' WHEN 'a' THEN 1 ELSE 2 END.  This worked in 7.4 and before
but had been broken due to premature freezing of the type of the test
expression.  Per gripe from GÄbor SzÃcs.

src/backend/parser/parse_expr.c

index c00dc72ac3c1e9c8360bffac05c792efb47ff524..6676ae0a4bd171e3ab423c4cec3312bbdb3e6152 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/parser/parse_expr.c,v 1.178 2004/12/31 22:00:27 pgsql Exp $
+ *   $PostgreSQL: pgsql/src/backend/parser/parse_expr.c,v 1.179 2005/01/12 17:32:36 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -646,10 +646,21 @@ transformExpr(ParseState *pstate, Node *expr)
 
                /* transform the test expression, if any */
                arg = transformExpr(pstate, (Node *) c->arg);
-               newc->arg = (Expr *) arg;
+
                /* generate placeholder for test expression */
                if (arg)
                {
+                   /*
+                    * If test expression is an untyped literal, force it to
+                    * text.  We have to do something now because we won't be
+                    * able to do this coercion on the placeholder.  This is
+                    * not as flexible as what was done in 7.4 and before,
+                    * but it's good enough to handle the sort of silly
+                    * coding commonly seen.
+                    */
+                   if (exprType(arg) == UNKNOWNOID)
+                       arg = coerce_to_common_type(pstate, arg,
+                                                   TEXTOID, "CASE");
                    placeholder = makeNode(CaseTestExpr);
                    placeholder->typeId = exprType(arg);
                    placeholder->typeMod = exprTypmod(arg);
@@ -657,6 +668,8 @@ transformExpr(ParseState *pstate, Node *expr)
                else
                    placeholder = NULL;
 
+               newc->arg = (Expr *) arg;
+
                /* transform the list of arguments */
                newargs = NIL;
                typeids = NIL;