Simplify and clean up FigureColname; make it work without coredumping
authorTom Lane
Mon, 17 Sep 2001 01:06:36 +0000 (01:06 +0000)
committerTom Lane
Mon, 17 Sep 2001 01:06:36 +0000 (01:06 +0000)
for TypeCast case.

src/backend/parser/parse_target.c

index 3f99e2c66d67e4370f4146aacd4c7e9e6303212f..a39e3108804286ab3d44e6cc3b15e73906014aa1 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/parser/parse_target.c,v 1.71 2001/09/10 14:53:10 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/parser/parse_target.c,v 1.72 2001/09/17 01:06:36 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -26,7 +26,7 @@
 
 
 static List *ExpandAllTables(ParseState *pstate);
-static char *FigureColname(Node *expr, Node *resval);
+static char *FigureColname(Node *node);
 
 
 /*
@@ -64,12 +64,11 @@ transformTargetEntry(ParseState *pstate,
 
    if (colname == NULL)
    {
-
        /*
         * Generate a suitable column name for a column without any
         * explicit 'AS ColumnName' clause.
         */
-       colname = FigureColname(expr, node);
+       colname = FigureColname(node);
    }
 
    resnode = makeResdom((AttrNumber) pstate->p_last_resno++,
@@ -455,21 +454,21 @@ ExpandAllTables(ParseState *pstate)
  *   list, we have to guess a suitable name.  The SQL spec provides some
  *   guidance, but not much...
  *
+ * Note that the argument is the *untransformed* parse tree for the target
+ * item.  This is a shade easier to work with than the transformed tree.
  */
 static char *
-FigureColname(Node *expr, Node *resval)
+FigureColname(Node *node)
 {
-   /* Some of these are easiest to do with the untransformed node */
-   switch (nodeTag(resval))
+   if (node == NULL)
+       return "?column?";
+   switch (nodeTag(node))
    {
-       case T_TypeCast: 
-           return( ( ((Ident *) ((TypeCast *) resval)->arg)->name));
-           
        case T_Ident:
-           return ((Ident *) resval)->name;
+           return ((Ident *) node)->name;
        case T_Attr:
            {
-               List       *attrs = ((Attr *) resval)->attrs;
+               List       *attrs = ((Attr *) node)->attrs;
 
                if (attrs)
                {
@@ -479,23 +478,15 @@ FigureColname(Node *expr, Node *resval)
                }
            }
            break;
-       default:
-           break;
-   }
-   /* Otherwise, work with the transformed node */
-   switch (nodeTag(expr))
-   {
-       case T_Expr:
-           if (((Expr *) expr)->opType == FUNC_EXPR && IsA(resval, FuncCall))
-               return ((FuncCall *) resval)->funcname;
-           break;
-       case T_Aggref:
-           return ((Aggref *) expr)->aggname;
+       case T_FuncCall:
+           return ((FuncCall *) node)->funcname;
+       case T_TypeCast: 
+           return FigureColname(((TypeCast *) node)->arg);
        case T_CaseExpr:
            {
                char       *name;
 
-               name = FigureColname(((CaseExpr *) expr)->defresult, resval);
+               name = FigureColname(((CaseExpr *) node)->defresult);
                if (strcmp(name, "?column?") == 0)
                    name = "case";
                return name;
@@ -504,6 +495,5 @@ FigureColname(Node *expr, Node *resval)
        default:
            break;
    }
-
    return "?column?";
 }