Fix oversight in new code for printing rangetable aliases.
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 12 Oct 2012 20:14:11 +0000 (16:14 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 12 Oct 2012 20:14:43 +0000 (16:14 -0400)
In commit 11e131854f8231a21613f834c40fe9d046926387, I missed the case of
a CTE RTE that doesn't have a user-defined alias, but does have an
alias assigned by set_rtable_names().  Per report from Peter Eisentraut.

While at it, refactor slightly to reduce code duplication.

src/backend/utils/adt/ruleutils.c
src/test/regress/expected/with.out
src/test/regress/sql/with.sql

index c8d7d9c21b3a4398008160da844e83e8330e8ad4..c3ede233bcdb6043db5df2502c871cf030e0fc5f 100644 (file)
@@ -6739,11 +6739,12 @@ get_from_clause_item(Node *jtnode, Query *query, deparse_context *context)
        int         varno = ((RangeTblRef *) jtnode)->rtindex;
        RangeTblEntry *rte = rt_fetch(varno, query->rtable);
        char       *refname = get_rtable_name(varno, context);
-       bool        gavealias = false;
+       bool        printalias;
 
        if (rte->lateral)
            appendStringInfoString(buf, "LATERAL ");
 
+       /* Print the FROM item proper */
        switch (rte->rtekind)
        {
            case RTE_RELATION:
@@ -6776,11 +6777,12 @@ get_from_clause_item(Node *jtnode, Query *query, deparse_context *context)
                break;
        }
 
+       /* Print the relation alias, if needed */
+       printalias = false;
        if (rte->alias != NULL)
        {
            /* Always print alias if user provided one */
-           appendStringInfo(buf, " %s", quote_identifier(refname));
-           gavealias = true;
+           printalias = true;
        }
        else if (rte->rtekind == RTE_RELATION)
        {
@@ -6790,10 +6792,7 @@ get_from_clause_item(Node *jtnode, Query *query, deparse_context *context)
             * resolve a conflict).
             */
            if (strcmp(refname, get_relation_name(rte->relid)) != 0)
-           {
-               appendStringInfo(buf, " %s", quote_identifier(refname));
-               gavealias = true;
-           }
+               printalias = true;
        }
        else if (rte->rtekind == RTE_FUNCTION)
        {
@@ -6802,16 +6801,28 @@ get_from_clause_item(Node *jtnode, Query *query, deparse_context *context)
             * renaming of the function and/or instability of the
             * FigureColname rules for things that aren't simple functions.
             */
-           appendStringInfo(buf, " %s", quote_identifier(refname));
-           gavealias = true;
+           printalias = true;
+       }
+       else if (rte->rtekind == RTE_CTE)
+       {
+           /*
+            * No need to print alias if it's same as CTE name (this would
+            * normally be the case, but not if set_rtable_names had to
+            * resolve a conflict).
+            */
+           if (strcmp(refname, rte->ctename) != 0)
+               printalias = true;
        }
+       if (printalias)
+           appendStringInfo(buf, " %s", quote_identifier(refname));
 
+       /* Print the column definitions or aliases, if needed */
        if (rte->rtekind == RTE_FUNCTION)
        {
            if (rte->funccoltypes != NIL)
            {
                /* Function returning RECORD, reconstruct the columndefs */
-               if (!gavealias)
+               if (!printalias)
                    appendStringInfo(buf, " AS ");
                get_from_clause_coldeflist(rte->eref->colnames,
                                           rte->funccoltypes,
index 671f293b68de95617b6f953573a31fda3fde176f..b98ca630ee9ec0acf63dfa9e07f2568af9bab3d7 100644 (file)
@@ -292,6 +292,30 @@ SELECT pg_get_viewdef('vsubdepartment'::regclass, true);
     FROM subdepartment;
 (1 row)
 
+-- Another reverse-listing example
+CREATE VIEW sums_1_100 AS
+WITH RECURSIVE t(n) AS (
+    VALUES (1)
+UNION ALL
+    SELECT n+1 FROM t WHERE n < 100
+)
+SELECT sum(n) FROM t;
+\d+ sums_1_100
+              View "public.sums_1_100"
+ Column |  Type  | Modifiers | Storage | Description 
+--------+--------+-----------+---------+-------------
+ sum    | bigint |           | plain   | 
+View definition:
+ WITH RECURSIVE t(n) AS (
+                 VALUES (1)
+        UNION ALL 
+                 SELECT t_1.n + 1
+                   FROM t t_1
+                  WHERE t_1.n < 100
+        )
+ SELECT sum(t.n) AS sum
+   FROM t;
+
 -- corner case in which sub-WITH gets initialized first
 with recursive q as (
       select * from department
index 609f51b0c95a43dd9b485a1534f35c666807d646..4ff852736bcf6b3af3828c70f64dfb53815b920c 100644 (file)
@@ -178,6 +178,17 @@ SELECT * FROM vsubdepartment ORDER BY name;
 SELECT pg_get_viewdef('vsubdepartment'::regclass);
 SELECT pg_get_viewdef('vsubdepartment'::regclass, true);
 
+-- Another reverse-listing example
+CREATE VIEW sums_1_100 AS
+WITH RECURSIVE t(n) AS (
+    VALUES (1)
+UNION ALL
+    SELECT n+1 FROM t WHERE n < 100
+)
+SELECT sum(n) FROM t;
+
+\d+ sums_1_100
+
 -- corner case in which sub-WITH gets initialized first
 with recursive q as (
       select * from department