Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 2b189aa

Browse files
author
Thomas G. Lockhart
committed
Improve CASE statement support.
Try to label CASE columns for a SELECT if not specified with an AS clause.
1 parent 44cf948 commit 2b189aa

File tree

2 files changed

+22
-16
lines changed

2 files changed

+22
-16
lines changed

src/backend/parser/parse_expr.c

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
*
99
* IDENTIFICATION
10-
* $Header: /cvsroot/pgsql/src/backend/parser/parse_expr.c,v 1.37 1998/12/04 15:34:30 thomas Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/parser/parse_expr.c,v 1.38 1998/12/13 23:56:43 thomas Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -251,8 +251,7 @@ transformExpr(ParseState *pstate, Node *expr, int precedence)
251251
{
252252

253253
/*
254-
* look for a column name or a relation name (the default
255-
* behavior)
254+
* look for a column name or a relation name (the default behavior)
256255
*/
257256
result = transformIdent(pstate, expr, precedence);
258257
break;
@@ -358,13 +357,6 @@ transformExpr(ParseState *pstate, Node *expr, int precedence)
358357
w->expr = (Node *)a;
359358
}
360359
lfirst(args) = transformExpr(pstate, (Node *) w, precedence);
361-
362-
if (w->result == NULL)
363-
{
364-
A_Const *n = makeNode(A_Const);
365-
n->val.type = T_Null;
366-
w->result = (Node *)n;
367-
}
368360
}
369361

370362
if (c->defresult == NULL)
@@ -413,7 +405,7 @@ transformExpr(ParseState *pstate, Node *expr, int precedence)
413405
}
414406
}
415407

416-
/* Convert default clause, if necessary */
408+
/* Convert default result clause, if necessary */
417409
if (c->casetype != ptype)
418410
{
419411
if (! c->casetype)
@@ -469,8 +461,13 @@ transformExpr(ParseState *pstate, Node *expr, int precedence)
469461
elog(ERROR,"WHEN clause must have a boolean result");
470462

471463
/* result is NULL for NULLIF() construct - thomas 1998-11-11 */
472-
if (w->result != NULL)
473-
w->result = transformExpr(pstate, (Node *) w->result, precedence);
464+
if (w->result == NULL)
465+
{
466+
A_Const *n = makeNode(A_Const);
467+
n->val.type = T_Null;
468+
w->result = (Node *)n;
469+
}
470+
w->result = transformExpr(pstate, (Node *) w->result, precedence);
474471
result = expr;
475472
break;
476473
}

src/backend/parser/parse_target.c

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
*
99
* IDENTIFICATION
10-
* $Header: /cvsroot/pgsql/src/backend/parser/parse_target.c,v 1.31 1998/12/04 15:34:30 thomas Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/parser/parse_target.c,v 1.32 1998/12/13 23:56:44 thomas Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -32,7 +32,7 @@
3232

3333

3434
static List *ExpandAllTables(ParseState *pstate);
35-
static char *FigureColname(Node *expr, Node *resval);
35+
char *FigureColname(Node *expr, Node *resval);
3636

3737
static Node *SizeTargetExpr(ParseState *pstate,
3838
Node *expr,
@@ -867,7 +867,7 @@ ExpandAllTables(ParseState *pstate)
867867
* list, we have to guess.
868868
*
869869
*/
870-
static char *
870+
char *
871871
FigureColname(Node *expr, Node *resval)
872872
{
873873
switch (nodeTag(expr))
@@ -881,6 +881,15 @@ FigureColname(Node *expr, Node *resval)
881881
return ((FuncCall *) resval)->funcname;
882882
}
883883
break;
884+
case T_CaseExpr:
885+
{
886+
char *name;
887+
name = FigureColname(((CaseExpr *) expr)->defresult, resval);
888+
if (!strcmp(name, "?column?"))
889+
name = "case";
890+
return name;
891+
}
892+
break;
884893
default:
885894
break;
886895
}

0 commit comments

Comments
 (0)