aboutsummaryrefslogtreecommitdiff
path: root/src/backend/parser/parse_expr.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2005-01-12 17:32:36 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2005-01-12 17:32:36 +0000
commit2ec1aa4cb8cb053d197480eaa74dac07857585f2 (patch)
treedd775b96ec6089f3a3fe717f2f68307c5df5788a /src/backend/parser/parse_expr.c
parent8251e0b2fb1d8ed86bb48ca1f4353ce09b049604 (diff)
downloadpostgresql-2ec1aa4cb8cb053d197480eaa74dac07857585f2.tar.gz
postgresql-2ec1aa4cb8cb053d197480eaa74dac07857585f2.zip
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.
Diffstat (limited to 'src/backend/parser/parse_expr.c')
-rw-r--r--src/backend/parser/parse_expr.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c
index c00dc72ac3c..6676ae0a4bd 100644
--- a/src/backend/parser/parse_expr.c
+++ b/src/backend/parser/parse_expr.c
@@ -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;