aboutsummaryrefslogtreecommitdiff
path: root/src/backend/parser/parse_target.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2001-10-08 21:48:51 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2001-10-08 21:48:51 +0000
commit7ecc40c2df27d9fe63f6e149f5daa5d11c06d984 (patch)
tree735e6cbdada674a5bbd9709a5356183c44e96566 /src/backend/parser/parse_target.c
parent71f2993c45251b009a59a422cf2c43db06aaf1a0 (diff)
downloadpostgresql-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.c67
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;
}