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
|
* 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,
|
|||||||
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,
|
|||||||
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);
|
* We force parens whenever nesting two SetOperationStmts.
|
||||||
|
* There are some cases in which parens are needed around a leaf
|
||||||
if (!PRETTY_PAREN(context))
|
* query too, but those are more easily handled at the next level
|
||||||
appendStringInfoString(buf, "((");
|
* 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,
|
|||||||
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)
|
if (need_paren)
|
||||||
{
|
|
||||||
appendStringInfoChar(buf, '(');
|
|
||||||
if (PRETTY_INDENT(context))
|
|
||||||
appendStringInfoChar(buf, '\n');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
appendStringInfoChar(buf, '(');
|
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
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user