Improve CASE statement support.
authorThomas G. Lockhart
Sun, 13 Dec 1998 23:56:44 +0000 (23:56 +0000)
committerThomas G. Lockhart
Sun, 13 Dec 1998 23:56:44 +0000 (23:56 +0000)
Try to label CASE columns for a SELECT if not specified with an AS clause.

src/backend/parser/parse_expr.c
src/backend/parser/parse_target.c

index 8dcabc48dbbe927908bae551994dbf8094b1876a..acdf2d7d03dba63af12f3216837a1661f017929a 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * 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)
            {
 
                /*
-                * look for a column name or a relation name (the default
-                * behavior)
+                * look for a column name or a relation name (the default behavior)
                 */
                result = transformIdent(pstate, expr, precedence);
                break;
@@ -358,13 +357,6 @@ transformExpr(ParseState *pstate, Node *expr, int precedence)
                        w->expr = (Node *)a;
                    }
                    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)
@@ -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)
@@ -469,8 +461,13 @@ transformExpr(ParseState *pstate, Node *expr, int precedence)
                    elog(ERROR,"WHEN clause must have a boolean result");
 
                /* result is NULL for NULLIF() construct - thomas 1998-11-11 */
-               if (w->result != NULL)
-                   w->result = transformExpr(pstate, (Node *) w->result, precedence);
+               if (w->result == NULL)
+               {
+                   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;
                break;
            }
index e77183387d77a411e380d24105113795ca9cfd2c..35d0db803a2d03e75dded83267449e19e98f2ec1 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * 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 @@
 
 
 static List *ExpandAllTables(ParseState *pstate);
-static char *FigureColname(Node *expr, Node *resval);
+char *FigureColname(Node *expr, Node *resval);
 
 static Node *SizeTargetExpr(ParseState *pstate,
               Node *expr,
@@ -867,7 +867,7 @@ ExpandAllTables(ParseState *pstate)
  *   list, we have to guess.
  *
  */
-static char *
+char *
 FigureColname(Node *expr, Node *resval)
 {
    switch (nodeTag(expr))
@@ -881,6 +881,15 @@ FigureColname(Node *expr, Node *resval)
                    return ((FuncCall *) resval)->funcname;
            }
            break;
+       case T_CaseExpr:
+           {
+               char *name;
+               name = FigureColname(((CaseExpr *) expr)->defresult, resval);
+               if (!strcmp(name, "?column?"))
+                   name = "case";
+               return name;
+           }
+           break;
        default:
            break;
    }