Commit 2b189aa9 authored by Thomas G. Lockhart's avatar Thomas G. Lockhart

Improve CASE statement support.

Try to label CASE columns for a SELECT if not specified with an AS clause.
parent 44cf9484
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/parser/parse_expr.c,v 1.37 1998/12/04 15:34:30 thomas Exp $ * $Header: /cvsroot/pgsql/src/backend/parser/parse_expr.c,v 1.38 1998/12/13 23:56:43 thomas Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -251,8 +251,7 @@ transformExpr(ParseState *pstate, Node *expr, int precedence) ...@@ -251,8 +251,7 @@ transformExpr(ParseState *pstate, Node *expr, int precedence)
{ {
/* /*
* look for a column name or a relation name (the default * look for a column name or a relation name (the default behavior)
* behavior)
*/ */
result = transformIdent(pstate, expr, precedence); result = transformIdent(pstate, expr, precedence);
break; break;
...@@ -358,13 +357,6 @@ transformExpr(ParseState *pstate, Node *expr, int precedence) ...@@ -358,13 +357,6 @@ transformExpr(ParseState *pstate, Node *expr, int precedence)
w->expr = (Node *)a; w->expr = (Node *)a;
} }
lfirst(args) = transformExpr(pstate, (Node *) w, precedence); lfirst(args) = transformExpr(pstate, (Node *) w, precedence);
if (w->result == NULL)
{
A_Const *n = makeNode(A_Const);
n->val.type = T_Null;
w->result = (Node *)n;
}
} }
if (c->defresult == NULL) if (c->defresult == NULL)
...@@ -413,7 +405,7 @@ transformExpr(ParseState *pstate, Node *expr, int precedence) ...@@ -413,7 +405,7 @@ transformExpr(ParseState *pstate, Node *expr, int precedence)
} }
} }
/* Convert default clause, if necessary */ /* Convert default result clause, if necessary */
if (c->casetype != ptype) if (c->casetype != ptype)
{ {
if (! c->casetype) if (! c->casetype)
...@@ -469,8 +461,13 @@ transformExpr(ParseState *pstate, Node *expr, int precedence) ...@@ -469,8 +461,13 @@ transformExpr(ParseState *pstate, Node *expr, int precedence)
elog(ERROR,"WHEN clause must have a boolean result"); elog(ERROR,"WHEN clause must have a boolean result");
/* result is NULL for NULLIF() construct - thomas 1998-11-11 */ /* result is NULL for NULLIF() construct - thomas 1998-11-11 */
if (w->result != NULL) if (w->result == NULL)
w->result = transformExpr(pstate, (Node *) w->result, precedence); {
A_Const *n = makeNode(A_Const);
n->val.type = T_Null;
w->result = (Node *)n;
}
w->result = transformExpr(pstate, (Node *) w->result, precedence);
result = expr; result = expr;
break; break;
} }
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/parser/parse_target.c,v 1.31 1998/12/04 15:34:30 thomas Exp $ * $Header: /cvsroot/pgsql/src/backend/parser/parse_target.c,v 1.32 1998/12/13 23:56:44 thomas Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -32,7 +32,7 @@ ...@@ -32,7 +32,7 @@
static List *ExpandAllTables(ParseState *pstate); static List *ExpandAllTables(ParseState *pstate);
static char *FigureColname(Node *expr, Node *resval); char *FigureColname(Node *expr, Node *resval);
static Node *SizeTargetExpr(ParseState *pstate, static Node *SizeTargetExpr(ParseState *pstate,
Node *expr, Node *expr,
...@@ -867,7 +867,7 @@ ExpandAllTables(ParseState *pstate) ...@@ -867,7 +867,7 @@ ExpandAllTables(ParseState *pstate)
* list, we have to guess. * list, we have to guess.
* *
*/ */
static char * char *
FigureColname(Node *expr, Node *resval) FigureColname(Node *expr, Node *resval)
{ {
switch (nodeTag(expr)) switch (nodeTag(expr))
...@@ -881,6 +881,15 @@ FigureColname(Node *expr, Node *resval) ...@@ -881,6 +881,15 @@ FigureColname(Node *expr, Node *resval)
return ((FuncCall *) resval)->funcname; return ((FuncCall *) resval)->funcname;
} }
break; break;
case T_CaseExpr:
{
char *name;
name = FigureColname(((CaseExpr *) expr)->defresult, resval);
if (!strcmp(name, "?column?"))
name = "case";
return name;
}
break;
default: default:
break; break;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment