diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2011-10-01 14:01:46 -0400 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2011-10-01 14:01:46 -0400 |
commit | 5ec6b7f1b87f0fa006b8e08a11cd4e99bcb67358 (patch) | |
tree | 3f178e9a5ffd1683278a94614e2b11779116a983 /src/backend/parser/parse_target.c | |
parent | 878b74e094a70e660e5ed365a2c4e1b41460515d (diff) | |
download | postgresql-5ec6b7f1b87f0fa006b8e08a11cd4e99bcb67358.tar.gz postgresql-5ec6b7f1b87f0fa006b8e08a11cd4e99bcb67358.zip |
Improve generated column names for cases involving sub-SELECTs.
We'll now use "exists" for EXISTS(SELECT ...), "array" for ARRAY(SELECT
...), or the sub-select's own result column name for a simple expression
sub-select. Previously, you usually got "?column?" in such cases.
Marti Raudsepp, reviewed by Kyotaro Horiugchi
Diffstat (limited to 'src/backend/parser/parse_target.c')
-rw-r--r-- | src/backend/parser/parse_target.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/src/backend/parser/parse_target.c b/src/backend/parser/parse_target.c index 9d4e580e476..2f2e87fd698 100644 --- a/src/backend/parser/parse_target.c +++ b/src/backend/parser/parse_target.c @@ -1610,6 +1610,48 @@ FigureColnameInternal(Node *node, char **name) break; case T_CollateClause: return FigureColnameInternal(((CollateClause *) node)->arg, name); + case T_SubLink: + switch (((SubLink *) node)->subLinkType) + { + case EXISTS_SUBLINK: + *name = "exists"; + return 2; + case ARRAY_SUBLINK: + *name = "array"; + return 2; + case EXPR_SUBLINK: + { + /* Get column name of the subquery's single target */ + SubLink *sublink = (SubLink *) node; + Query *query = (Query *) sublink->subselect; + + /* + * The subquery has probably already been transformed, + * but let's be careful and check that. (The reason + * we can see a transformed subquery here is that + * transformSubLink is lazy and modifies the SubLink + * node in-place.) + */ + if (IsA(query, Query)) + { + TargetEntry *te = (TargetEntry *) linitial(query->targetList); + + if (te->resname) + { + *name = te->resname; + return 2; + } + } + } + break; + /* As with other operator-like nodes, these have no names */ + case ALL_SUBLINK: + case ANY_SUBLINK: + case ROWCOMPARE_SUBLINK: + case CTE_SUBLINK: + break; + } + break; case T_CaseExpr: strength = FigureColnameInternal((Node *) ((CaseExpr *) node)->defresult, name); |