|
|
|
|
@ -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 |
|
|
|
|
{ |
|
|
|
|
|