OSDN Git Service

Simplify and clean up FigureColname; make it work without coredumping
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 17 Sep 2001 01:06:36 +0000 (01:06 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 17 Sep 2001 01:06:36 +0000 (01:06 +0000)
for TypeCast case.

src/backend/parser/parse_target.c

index 3f99e2c..a39e310 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?";
 }