Skip to content

Commit 07b4c48

Browse files
committed
Fix broken logic for pretty-printing parenthesis-suppression in UNION
et al.
1 parent a21bb27 commit 07b4c48

File tree

1 file changed

+28
-28
lines changed

1 file changed

+28
-28
lines changed

src/backend/utils/adt/ruleutils.c

+28-28
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* back to source text
44
*
55
* IDENTIFICATION
6-
* $PostgreSQL: pgsql/src/backend/utils/adt/ruleutils.c,v 1.174 2004/06/25 17:20:24 tgl Exp $
6+
* $PostgreSQL: pgsql/src/backend/utils/adt/ruleutils.c,v 1.175 2004/07/06 04:50:21 tgl Exp $
77
*
88
* This software is copyrighted by Jan Wieck - Hamburg.
99
*
@@ -2066,6 +2066,7 @@ get_setop_query(Node *setOp, Query *query, deparse_context *context,
20662066
TupleDesc resultDesc)
20672067
{
20682068
StringInfo buf = context->buf;
2069+
bool need_paren;
20692070

20702071
if (IsA(setOp, RangeTblRef))
20712072
{
@@ -2074,24 +2075,37 @@ get_setop_query(Node *setOp, Query *query, deparse_context *context,
20742075
Query *subquery = rte->subquery;
20752076

20762077
Assert(subquery != NULL);
2078+
Assert(subquery->setOperations == NULL);
2079+
/* Need parens if ORDER BY, FOR UPDATE, or LIMIT; see gram.y */
2080+
need_paren = (subquery->sortClause ||
2081+
subquery->rowMarks ||
2082+
subquery->limitOffset ||
2083+
subquery->limitCount);
2084+
if (need_paren)
2085+
appendStringInfoChar(buf, '(');
20772086
get_query_def(subquery, buf, context->namespaces, resultDesc,
20782087
context->prettyFlags, context->indentLevel);
2088+
if (need_paren)
2089+
appendStringInfoChar(buf, ')');
20792090
}
20802091
else if (IsA(setOp, SetOperationStmt))
20812092
{
20822093
SetOperationStmt *op = (SetOperationStmt *) setOp;
2083-
bool need_paren;
2084-
2085-
need_paren = (PRETTY_PAREN(context) ?
2086-
!IsA(op->rarg, RangeTblRef) : true);
20872094

2088-
if (!PRETTY_PAREN(context))
2089-
appendStringInfoString(buf, "((");
2095+
/*
2096+
* We force parens whenever nesting two SetOperationStmts.
2097+
* There are some cases in which parens are needed around a leaf
2098+
* query too, but those are more easily handled at the next level
2099+
* down (see code above).
2100+
*/
2101+
need_paren = !IsA(op->larg, RangeTblRef);
20902102

2103+
if (need_paren)
2104+
appendStringInfoChar(buf, '(');
20912105
get_setop_query(op->larg, query, context, resultDesc);
2092-
2093-
if (!PRETTY_PAREN(context))
2106+
if (need_paren)
20942107
appendStringInfoChar(buf, ')');
2108+
20952109
if (!PRETTY_INDENT(context))
20962110
appendStringInfoChar(buf, ' ');
20972111
switch (op->op)
@@ -2118,27 +2132,13 @@ get_setop_query(Node *setOp, Query *query, deparse_context *context,
21182132
if (PRETTY_INDENT(context))
21192133
appendStringInfoChar(buf, '\n');
21202134

2121-
if (PRETTY_PAREN(context))
2122-
{
2123-
if (need_paren)
2124-
{
2125-
appendStringInfoChar(buf, '(');
2126-
if (PRETTY_INDENT(context))
2127-
appendStringInfoChar(buf, '\n');
2128-
}
2129-
}
2130-
else
2131-
appendStringInfoChar(buf, '(');
2135+
need_paren = !IsA(op->rarg, RangeTblRef);
21322136

2137+
if (need_paren)
2138+
appendStringInfoChar(buf, '(');
21332139
get_setop_query(op->rarg, query, context, resultDesc);
2134-
2135-
if (PRETTY_PAREN(context))
2136-
{
2137-
if (need_paren)
2138-
appendStringInfoChar(buf, ')');
2139-
}
2140-
else
2141-
appendStringInfoString(buf, "))");
2140+
if (need_paren)
2141+
appendStringInfoChar(buf, ')');
21422142
}
21432143
else
21442144
{

0 commit comments

Comments
 (0)