Skip to content

Commit 7ecc40c

Browse files
committed
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.
1 parent 71f2993 commit 7ecc40c

File tree

1 file changed

+45
-22
lines changed

1 file changed

+45
-22
lines changed

src/backend/parser/parse_target.c

Lines changed: 45 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
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
*/
@@ -27,6 +27,7 @@
2727

2828
static List *ExpandAllTables(ParseState *pstate);
2929
static char *FigureColname(Node *node);
30+
static int FigureColnameInternal(Node *node, char **name);
3031

3132

3233
/*
@@ -460,15 +461,28 @@ ExpandAllTables(ParseState *pstate)
460461
static char *
461462
FigureColname(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+
463478
if (node == NULL)
464-
return "?column?";
479+
return strength;
465480

466481
switch (nodeTag(node))
467482
{
468483
case 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;
472486
case T_Attr:
473487
{
474488
List *attrs = ((Attr *) node)->attrs;
@@ -477,36 +491,45 @@ FigureColname(Node *node)
477491
{
478492
while (lnext(attrs) != NIL)
479493
attrs = lnext(attrs);
480-
return strVal(lfirst(attrs));
494+
*name = strVal(lfirst(attrs));
495+
return 2;
481496
}
482497
}
483498
break;
484499
case 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;
486509
case 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
}
495520
break;
496521
case 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
}
505529
break;
506-
case T_TypeName:
507-
return ((TypeName *) node)->name;
508530
default:
509531
break;
510532
}
511-
return "?column?";
533+
534+
return strength;
512535
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy