88 *
99 *
1010 * IDENTIFICATION
11- * $Header: /cvsroot/pgsql/src/backend/parser/parse_target.c,v 1.71 2001/09/10 14:53:10 momjian Exp $
11+ * $Header: /cvsroot/pgsql/src/backend/parser/parse_target.c,v 1.72 2001/09/17 01:06:36 tgl Exp $
1212 *
1313 *-------------------------------------------------------------------------
1414 */
2626
2727
2828static List * ExpandAllTables (ParseState * pstate );
29- static char * FigureColname (Node * expr , Node * resval );
29+ static char * FigureColname (Node * node );
3030
3131
3232/*
@@ -64,12 +64,11 @@ transformTargetEntry(ParseState *pstate,
6464
6565if (colname == NULL )
6666{
67-
6867/*
6968 * Generate a suitable column name for a column without any
7069 * explicit 'AS ColumnName' clause.
7170 */
72- colname = FigureColname (expr , node );
71+ colname = FigureColname (node );
7372}
7473
7574resnode = makeResdom ((AttrNumber )pstate -> p_last_resno ++ ,
@@ -455,21 +454,21 @@ ExpandAllTables(ParseState *pstate)
455454 * list, we have to guess a suitable name. The SQL spec provides some
456455 * guidance, but not much...
457456 *
457+ * Note that the argument is the *untransformed* parse tree for the target
458+ * item. This is a shade easier to work with than the transformed tree.
458459 */
459460static char *
460- FigureColname (Node * expr , Node * resval )
461+ FigureColname (Node * node )
461462{
462- /* Some of these are easiest to do with the untransformed node */
463- switch (nodeTag (resval ))
463+ if (node == NULL )
464+ return "?column?" ;
465+ switch (nodeTag (node ))
464466{
465- case T_TypeCast :
466- return ( ( ((Ident * ) ((TypeCast * )resval )-> arg )-> name ));
467-
468467case T_Ident :
469- return ((Ident * )resval )-> name ;
468+ return ((Ident * )node )-> name ;
470469case T_Attr :
471470{
472- List * attrs = ((Attr * )resval )-> attrs ;
471+ List * attrs = ((Attr * )node )-> attrs ;
473472
474473if (attrs )
475474{
@@ -479,23 +478,15 @@ FigureColname(Node *expr, Node *resval)
479478}
480479}
481480break ;
482- default :
483- break ;
484- }
485- /* Otherwise, work with the transformed node */
486- switch (nodeTag (expr ))
487- {
488- case T_Expr :
489- if (((Expr * )expr )-> opType == FUNC_EXPR && IsA (resval ,FuncCall ))
490- return ((FuncCall * )resval )-> funcname ;
491- break ;
492- case T_Aggref :
493- return ((Aggref * )expr )-> aggname ;
481+ case T_FuncCall :
482+ return ((FuncCall * )node )-> funcname ;
483+ case T_TypeCast :
484+ return FigureColname (((TypeCast * )node )-> arg );
494485case T_CaseExpr :
495486{
496487char * name ;
497488
498- name = FigureColname (((CaseExpr * )expr )-> defresult , resval );
489+ name = FigureColname (((CaseExpr * )node )-> defresult );
499490if (strcmp (name ,"?column?" )== 0 )
500491name = "case" ;
501492return name ;
@@ -504,6 +495,5 @@ FigureColname(Node *expr, Node *resval)
504495default :
505496break ;
506497}
507-
508498return "?column?" ;
509499}