aboutsummaryrefslogtreecommitdiff
path: root/src/backend/parser/parse_target.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2011-10-01 14:01:46 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2011-10-01 14:01:46 -0400
commit5ec6b7f1b87f0fa006b8e08a11cd4e99bcb67358 (patch)
tree3f178e9a5ffd1683278a94614e2b11779116a983 /src/backend/parser/parse_target.c
parent878b74e094a70e660e5ed365a2c4e1b41460515d (diff)
downloadpostgresql-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.c42
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);