]> granicus.if.org Git - postgresql/commitdiff
Fix broken logic for pretty-printing parenthesis-suppression in UNION
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 6 Jul 2004 04:50:21 +0000 (04:50 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 6 Jul 2004 04:50:21 +0000 (04:50 +0000)
et al.

src/backend/utils/adt/ruleutils.c

index 208cbf5d31b55990362347217e49a1e5ad1189cf..17ff48400e71c1d6ec8e60e5391976c5ecfa07af 100644 (file)
@@ -3,7 +3,7 @@
  *                             back to source text
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/utils/adt/ruleutils.c,v 1.174 2004/06/25 17:20:24 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/utils/adt/ruleutils.c,v 1.175 2004/07/06 04:50:21 tgl Exp $
  *
  *       This software is copyrighted by Jan Wieck - Hamburg.
  *
@@ -2066,6 +2066,7 @@ get_setop_query(Node *setOp, Query *query, deparse_context *context,
                                TupleDesc resultDesc)
 {
        StringInfo      buf = context->buf;
+       bool            need_paren;
 
        if (IsA(setOp, RangeTblRef))
        {
@@ -2074,24 +2075,37 @@ get_setop_query(Node *setOp, Query *query, deparse_context *context,
                Query      *subquery = rte->subquery;
 
                Assert(subquery != NULL);
+               Assert(subquery->setOperations == NULL);
+               /* Need parens if ORDER BY, FOR UPDATE, or LIMIT; see gram.y */
+               need_paren = (subquery->sortClause ||
+                                         subquery->rowMarks ||
+                                         subquery->limitOffset ||
+                                         subquery->limitCount);
+               if (need_paren)
+                       appendStringInfoChar(buf, '(');
                get_query_def(subquery, buf, context->namespaces, resultDesc,
                                          context->prettyFlags, context->indentLevel);
+               if (need_paren)
+                       appendStringInfoChar(buf, ')');
        }
        else if (IsA(setOp, SetOperationStmt))
        {
                SetOperationStmt *op = (SetOperationStmt *) setOp;
-               bool            need_paren;
-
-               need_paren = (PRETTY_PAREN(context) ?
-                                         !IsA(op->rarg, RangeTblRef) : true);
 
-               if (!PRETTY_PAREN(context))
-                       appendStringInfoString(buf, "((");
+               /*
+                * We force parens whenever nesting two SetOperationStmts.
+                * There are some cases in which parens are needed around a leaf
+                * query too, but those are more easily handled at the next level
+                * down (see code above).
+                */
+               need_paren = !IsA(op->larg, RangeTblRef);
 
+               if (need_paren)
+                       appendStringInfoChar(buf, '(');
                get_setop_query(op->larg, query, context, resultDesc);
-
-               if (!PRETTY_PAREN(context))
+               if (need_paren)
                        appendStringInfoChar(buf, ')');
+
                if (!PRETTY_INDENT(context))
                        appendStringInfoChar(buf, ' ');
                switch (op->op)
@@ -2118,27 +2132,13 @@ get_setop_query(Node *setOp, Query *query, deparse_context *context,
                if (PRETTY_INDENT(context))
                        appendStringInfoChar(buf, '\n');
 
-               if (PRETTY_PAREN(context))
-               {
-                       if (need_paren)
-                       {
-                               appendStringInfoChar(buf, '(');
-                               if (PRETTY_INDENT(context))
-                                       appendStringInfoChar(buf, '\n');
-                       }
-               }
-               else
-                       appendStringInfoChar(buf, '(');
+               need_paren = !IsA(op->rarg, RangeTblRef);
 
+               if (need_paren)
+                       appendStringInfoChar(buf, '(');
                get_setop_query(op->rarg, query, context, resultDesc);
-
-               if (PRETTY_PAREN(context))
-               {
-                       if (need_paren)
-                               appendStringInfoChar(buf, ')');
-               }
-               else
-                       appendStringInfoString(buf, "))");
+               if (need_paren)
+                       appendStringInfoChar(buf, ')');
        }
        else
        {