On Wed, Sep 14, 2011 at 05:26, Kyotaro HORIGUCHI
horiguchi.kyot...@oss.ntt.co.jp wrote:
This is a review for the patch `Generate column names for
subquery expressions'
(https://commitfest.postgresql.org/action/patch_view?id=632)
Thanks for the review. :)
PS: When you send a review, you should add the author's email to the
To: line to make sure they see it. I noticed your email only today
because it was in a new thread and not addressed to me directly.
I think this patch needs no documentation, but it is needed to
edit the changed behaviors quoted in document. Maybe only one
change as far as I have seen.
http://www.postgresql.org/docs/9.0/static/sql-expressions.html
SELECT ARRAY(SELECT oid FROM pg_proc WHERE proname LIKE 'bytea%');
?column?
-
{2011,1954,1948,1952,1951,1244,1950,2005,1949,1953,2006,31}
Good catch, a new patch is attached. Apparently the results of this
query have also changed in recent versions, but I didn't touch that.
Regards,
Marti
From 0defe411697f84d26e6f23970d90c70cd057c298 Mon Sep 17 00:00:00 2001
From: Marti Raudsepp ma...@juffo.org
Date: Tue, 6 Sep 2011 21:17:54 +0300
Subject: [PATCH] Generate column names for subquery expressions instead of
?column?
Previously these select expressions didn't have column names:
select (SELECT colname FROM tab) = colname
select (SELECT 1 AS foo) = foo
select exists(SELECT 1) = exists
select array(SELECT 1) = array
This change makes the subquery column name take precedence over weak
column names. Previously these two would return int4 and case, now
they return foo:
select (select 1 foo)::int
select case when true then 1 else (select 1 as foo) end
---
doc/src/sgml/syntax.sgml |2 +-
src/backend/parser/parse_target.c| 33 ++
src/test/regress/expected/aggregates.out |6 ++--
src/test/regress/expected/subselect.out | 12 +-
src/test/regress/expected/with.out |4 +-
5 files changed, 45 insertions(+), 12 deletions(-)
diff --git a/doc/src/sgml/syntax.sgml b/doc/src/sgml/syntax.sgml
index 9119b60..ab81f78 100644
--- a/doc/src/sgml/syntax.sgml
+++ b/doc/src/sgml/syntax.sgml
@@ -2109,7 +2109,7 @@ SELECT ARRAY[]::integer[];
bracketed) subquery. For example:
programlisting
SELECT ARRAY(SELECT oid FROM pg_proc WHERE proname LIKE 'bytea%');
- ?column?
+array
-
{2011,1954,1948,1952,1951,1244,1950,2005,1949,1953,2006,31}
(1 row)
diff --git a/src/backend/parser/parse_target.c b/src/backend/parser/parse_target.c
index 9d4e580..685233c 100644
--- a/src/backend/parser/parse_target.c
+++ b/src/backend/parser/parse_target.c
@@ -1585,6 +1585,39 @@ FigureColnameInternal(Node *node, char **name)
return FigureColnameInternal(ind-arg, name);
}
break;
+ 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 from the subquery's target list */
+ {
+ SubLink *sublink = (SubLink *) node;
+ Query *query = (Query *) sublink-subselect;
+ /* EXPR_SUBLINK always has a single target */
+ TargetEntry *te = (TargetEntry *) linitial(query-targetList);
+
+ /* Subqueries have already been transformed */
+ if(te-resname)
+ {
+ *name = te-resname;
+ return 2;
+ }
+ }
+ break;
+/* As with other operator-like nodes, these don't really have names */
+case ALL_SUBLINK:
+case ANY_SUBLINK:
+case ROWCOMPARE_SUBLINK:
+case CTE_SUBLINK:
+ break;
+ }
+ break;
case T_FuncCall:
*name = strVal(llast(((FuncCall *) node)-funcname));
return 2;
diff --git a/src/test/regress/expected/aggregates.out b/src/test/regress/expected/aggregates.out
index 4861006..69926f7 100644
--- a/src/test/regress/expected/aggregates.out
+++ b/src/test/regress/expected/aggregates.out
@@ -300,9 +300,9 @@ LINE 4:where sum(distinct a.four + b.four) = b.four)...
select
(select max((select i.unique2 from tenk1 i where i.unique1 = o.unique1)))
from tenk1 o;
- ?column?
---
-
+ max
+--
+
(1 row)
--
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index e638f0a..4ea8211 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -490,20 +490,20 @@ select view_a from view_a;
(1 row)
select (select view_a) from view_a;
- ?column?
---
+ view_a
+
(42)
(1 row)
select (select (select view_a)) from view_a;
- ?column?
---
+ view_a
+
(42)
(1 row)
select (select (a.*)::text) from view_a a;
- ?column?
---
+ a
+--
(42)