Commit 07b4c48b authored by Tom Lane's avatar Tom Lane

Fix broken logic for pretty-printing parenthesis-suppression in UNION

et al.
parent a21bb272
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* back to source text * back to source text
* *
* IDENTIFICATION * 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. * This software is copyrighted by Jan Wieck - Hamburg.
* *
...@@ -2066,6 +2066,7 @@ get_setop_query(Node *setOp, Query *query, deparse_context *context, ...@@ -2066,6 +2066,7 @@ get_setop_query(Node *setOp, Query *query, deparse_context *context,
TupleDesc resultDesc) TupleDesc resultDesc)
{ {
StringInfo buf = context->buf; StringInfo buf = context->buf;
bool need_paren;
if (IsA(setOp, RangeTblRef)) if (IsA(setOp, RangeTblRef))
{ {
...@@ -2074,24 +2075,37 @@ get_setop_query(Node *setOp, Query *query, deparse_context *context, ...@@ -2074,24 +2075,37 @@ get_setop_query(Node *setOp, Query *query, deparse_context *context,
Query *subquery = rte->subquery; Query *subquery = rte->subquery;
Assert(subquery != NULL); 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, get_query_def(subquery, buf, context->namespaces, resultDesc,
context->prettyFlags, context->indentLevel); context->prettyFlags, context->indentLevel);
if (need_paren)
appendStringInfoChar(buf, ')');
} }
else if (IsA(setOp, SetOperationStmt)) else if (IsA(setOp, SetOperationStmt))
{ {
SetOperationStmt *op = (SetOperationStmt *) setOp; 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); get_setop_query(op->larg, query, context, resultDesc);
if (need_paren)
if (!PRETTY_PAREN(context))
appendStringInfoChar(buf, ')'); appendStringInfoChar(buf, ')');
if (!PRETTY_INDENT(context)) if (!PRETTY_INDENT(context))
appendStringInfoChar(buf, ' '); appendStringInfoChar(buf, ' ');
switch (op->op) switch (op->op)
...@@ -2118,27 +2132,13 @@ get_setop_query(Node *setOp, Query *query, deparse_context *context, ...@@ -2118,27 +2132,13 @@ get_setop_query(Node *setOp, Query *query, deparse_context *context,
if (PRETTY_INDENT(context)) if (PRETTY_INDENT(context))
appendStringInfoChar(buf, '\n'); appendStringInfoChar(buf, '\n');
if (PRETTY_PAREN(context)) need_paren = !IsA(op->rarg, RangeTblRef);
{
if (need_paren)
{
appendStringInfoChar(buf, '(');
if (PRETTY_INDENT(context))
appendStringInfoChar(buf, '\n');
}
}
else
appendStringInfoChar(buf, '(');
if (need_paren)
appendStringInfoChar(buf, '(');
get_setop_query(op->rarg, query, context, resultDesc); get_setop_query(op->rarg, query, context, resultDesc);
if (need_paren)
if (PRETTY_PAREN(context)) appendStringInfoChar(buf, ')');
{
if (need_paren)
appendStringInfoChar(buf, ')');
}
else
appendStringInfoString(buf, "))");
} }
else else
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment