Re-allow an untyped literal as the test expression of a CASE, ie

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.
This commit is contained in:
Tom Lane 2005-01-12 17:32:36 +00:00
parent 8251e0b2fb
commit 2ec1aa4cb8
1 changed files with 15 additions and 2 deletions

View 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;