88 *
99 *
1010 * IDENTIFICATION
11- * $Header: /cvsroot/pgsql/src/backend/parser/parse_target.c,v 1.73 2001/09/28 08:09:09 thomas Exp $
11+ * $Header: /cvsroot/pgsql/src/backend/parser/parse_target.c,v 1.74 2001/10/08 21:48:51 tgl Exp $
1212 *
1313 *-------------------------------------------------------------------------
1414 */
2727
2828static List * ExpandAllTables (ParseState * pstate );
2929static char * FigureColname (Node * node );
30+ static int FigureColnameInternal (Node * node ,char * * name );
3031
3132
3233/*
@@ -460,15 +461,28 @@ ExpandAllTables(ParseState *pstate)
460461static char *
461462FigureColname (Node * node )
462463{
464+ char * name = NULL ;
465+
466+ FigureColnameInternal (node ,& name );
467+ if (name != NULL )
468+ return name ;
469+ /* default result if we can't guess anything */
470+ return "?column?" ;
471+ }
472+
473+ static int
474+ FigureColnameInternal (Node * node ,char * * name )
475+ {
476+ int strength = 0 ;
477+
463478if (node == NULL )
464- return "?column?" ;
479+ return strength ;
465480
466481switch (nodeTag (node ))
467482{
468483case T_Ident :
469- return ((Ident * )node )-> name ;
470- case T_A_Const :
471- return (FigureColname ((Node * )((A_Const * )node )-> typename ));
484+ * name = ((Ident * )node )-> name ;
485+ return 2 ;
472486case T_Attr :
473487{
474488List * attrs = ((Attr * )node )-> attrs ;
@@ -477,36 +491,45 @@ FigureColname(Node *node)
477491{
478492while (lnext (attrs )!= NIL )
479493attrs = lnext (attrs );
480- return strVal (lfirst (attrs ));
494+ * name = strVal (lfirst (attrs ));
495+ return 2 ;
481496}
482497}
483498break ;
484499case T_FuncCall :
485- return ((FuncCall * )node )-> funcname ;
500+ * name = ((FuncCall * )node )-> funcname ;
501+ return 2 ;
502+ case T_A_Const :
503+ if (((A_Const * )node )-> typename != NULL )
504+ {
505+ * name = ((A_Const * )node )-> typename -> name ;
506+ return 1 ;
507+ }
508+ break ;
486509case T_TypeCast :
510+ strength = FigureColnameInternal (((TypeCast * )node )-> arg ,
511+ name );
512+ if (strength <=1 )
487513{
488- char * name ;
489-
490- name = FigureColname (((TypeCast * )node )-> arg );
491- if (strcmp (name ,"?column?" )== 0 )
492- name = FigureColname ((Node * )((TypeCast * )node )-> typename );
493- return name ;
514+ if (((TypeCast * )node )-> typename != NULL )
515+ {
516+ * name = ((TypeCast * )node )-> typename -> name ;
517+ return 1 ;
518+ }
494519}
495520break ;
496521case T_CaseExpr :
522+ strength = FigureColnameInternal (((CaseExpr * )node )-> defresult ,
523+ name );
524+ if (strength <=1 )
497525{
498- char * name ;
499-
500- name = FigureColname (((CaseExpr * )node )-> defresult );
501- if (strcmp (name ,"?column?" )== 0 )
502- name = "case" ;
503- return name ;
526+ * name = "case" ;
527+ return 1 ;
504528}
505529break ;
506- case T_TypeName :
507- return ((TypeName * )node )-> name ;
508530default :
509531break ;
510532}
511- return "?column?" ;
533+
534+ return strength ;
512535}