diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2001-10-08 21:48:51 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2001-10-08 21:48:51 +0000 |
commit | 7ecc40c2df27d9fe63f6e149f5daa5d11c06d984 (patch) | |
tree | 735e6cbdada674a5bbd9709a5356183c44e96566 /src/backend/parser/parse_target.c | |
parent | 71f2993c45251b009a59a422cf2c43db06aaf1a0 (diff) | |
download | postgresql-7ecc40c2df27d9fe63f6e149f5daa5d11c06d984.tar.gz postgresql-7ecc40c2df27d9fe63f6e149f5daa5d11c06d984.zip |
Another go-round with FigureColname, to produce less surprising results
for nested typecasts. It now produces a column header of 'timestamptz'
for 'SELECT CURRENT_TIMESTAMP', rather than 'text' as it was doing for
awhile there.
Diffstat (limited to 'src/backend/parser/parse_target.c')
-rw-r--r-- | src/backend/parser/parse_target.c | 67 |
1 files changed, 45 insertions, 22 deletions
diff --git a/src/backend/parser/parse_target.c b/src/backend/parser/parse_target.c index c40792072b1..801dde811c6 100644 --- a/src/backend/parser/parse_target.c +++ b/src/backend/parser/parse_target.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/parser/parse_target.c,v 1.73 2001/09/28 08:09:09 thomas Exp $ + * $Header: /cvsroot/pgsql/src/backend/parser/parse_target.c,v 1.74 2001/10/08 21:48:51 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -27,6 +27,7 @@ static List *ExpandAllTables(ParseState *pstate); static char *FigureColname(Node *node); +static int FigureColnameInternal(Node *node, char **name); /* @@ -460,15 +461,28 @@ ExpandAllTables(ParseState *pstate) static char * FigureColname(Node *node) { + char *name = NULL; + + FigureColnameInternal(node, &name); + if (name != NULL) + return name; + /* default result if we can't guess anything */ + return "?column?"; +} + +static int +FigureColnameInternal(Node *node, char **name) +{ + int strength = 0; + if (node == NULL) - return "?column?"; + return strength; switch (nodeTag(node)) { case T_Ident: - return ((Ident *) node)->name; - case T_A_Const: - return (FigureColname((Node *)((A_Const *) node)->typename)); + *name = ((Ident *) node)->name; + return 2; case T_Attr: { List *attrs = ((Attr *) node)->attrs; @@ -477,36 +491,45 @@ FigureColname(Node *node) { while (lnext(attrs) != NIL) attrs = lnext(attrs); - return strVal(lfirst(attrs)); + *name = strVal(lfirst(attrs)); + return 2; } } break; case T_FuncCall: - return ((FuncCall *) node)->funcname; + *name = ((FuncCall *) node)->funcname; + return 2; + case T_A_Const: + if (((A_Const *) node)->typename != NULL) + { + *name = ((A_Const *) node)->typename->name; + return 1; + } + break; case T_TypeCast: + strength = FigureColnameInternal(((TypeCast *) node)->arg, + name); + if (strength <= 1) { - char *name; - - name = FigureColname(((TypeCast *) node)->arg); - if (strcmp(name, "?column?") == 0) - name = FigureColname((Node *)((TypeCast *) node)->typename); - return name; + if (((TypeCast *) node)->typename != NULL) + { + *name = ((TypeCast *) node)->typename->name; + return 1; + } } break; case T_CaseExpr: + strength = FigureColnameInternal(((CaseExpr *) node)->defresult, + name); + if (strength <= 1) { - char *name; - - name = FigureColname(((CaseExpr *) node)->defresult); - if (strcmp(name, "?column?") == 0) - name = "case"; - return name; + *name = "case"; + return 1; } break; - case T_TypeName: - return ((TypeName *) node)->name; default: break; } - return "?column?"; + + return strength; } |