mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-11-27 07:21:09 +08:00
Fix broken logic for pretty-printing parenthesis-suppression in UNION
et al.
This commit is contained in:
parent
a21bb2722a
commit
07b4c48b6a
@ -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
|
||||
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
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user