diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2002-06-15 18:38:10 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2002-06-15 18:38:10 +0000 |
commit | 7e49585cadc2c4624ad4261016047cd14c9d3364 (patch) | |
tree | 9da2e92ae3bd7bfe4cba6829d17f3716a2ccb50d | |
parent | a67387b6b4f5061129d721cbc3eabfc8c65cc46d (diff) | |
download | postgresql-7e49585cadc2c4624ad4261016047cd14c9d3364.tar.gz postgresql-7e49585cadc2c4624ad4261016047cd14c9d3364.zip |
Back-patch 7.3 fix to fully parenthesize UNION/EXCEPT/INTERSECT queries
in ruleutils output. The previous partial parenthesization was a hack
to get around grammar restrictions that have since been fixed; and as
Sam O'Connor pointed out, there were cases where it didn't work.
-rw-r--r-- | src/backend/utils/adt/ruleutils.c | 33 |
1 files changed, 14 insertions, 19 deletions
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index 27abf6ace50..873137ea66d 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -3,7 +3,7 @@ * back to source text * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/ruleutils.c,v 1.89 2001/11/26 21:15:14 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/ruleutils.c,v 1.89.2.1 2002/06/15 18:38:10 tgl Exp $ * * This software is copyrighted by Jan Wieck - Hamburg. * @@ -116,7 +116,7 @@ static void get_delete_query_def(Query *query, deparse_context *context); static void get_utility_query_def(Query *query, deparse_context *context); static void get_basic_select_query(Query *query, deparse_context *context); static void get_setop_query(Node *setOp, Query *query, - deparse_context *context, bool toplevel); + deparse_context *context); static void get_rule_sortgroupclause(SortClause *srt, List *tlist, bool force_colno, deparse_context *context); @@ -966,7 +966,7 @@ get_select_query_def(Query *query, deparse_context *context) */ if (query->setOperations) { - get_setop_query(query->setOperations, query, context, true); + get_setop_query(query->setOperations, query, context); /* ORDER BY clauses must be simple in this case */ force_colno = true; } @@ -1123,8 +1123,7 @@ get_basic_select_query(Query *query, deparse_context *context) } static void -get_setop_query(Node *setOp, Query *query, deparse_context *context, - bool toplevel) +get_setop_query(Node *setOp, Query *query, deparse_context *context) { StringInfo buf = context->buf; @@ -1141,33 +1140,29 @@ get_setop_query(Node *setOp, Query *query, deparse_context *context, { SetOperationStmt *op = (SetOperationStmt *) setOp; - /* - * Must suppress parens at top level of a setop tree because of - * grammar limitations... - */ - if (!toplevel) - appendStringInfo(buf, "("); - get_setop_query(op->larg, query, context, false); + appendStringInfo(buf, "(("); + get_setop_query(op->larg, query, context); switch (op->op) { case SETOP_UNION: - appendStringInfo(buf, " UNION "); + appendStringInfo(buf, ") UNION "); break; case SETOP_INTERSECT: - appendStringInfo(buf, " INTERSECT "); + appendStringInfo(buf, ") INTERSECT "); break; case SETOP_EXCEPT: - appendStringInfo(buf, " EXCEPT "); + appendStringInfo(buf, ") EXCEPT "); break; default: elog(ERROR, "get_setop_query: unexpected set op %d", (int) op->op); } if (op->all) - appendStringInfo(buf, "ALL "); - get_setop_query(op->rarg, query, context, false); - if (!toplevel) - appendStringInfo(buf, ")"); + appendStringInfo(buf, "ALL ("); + else + appendStringInfo(buf, "("); + get_setop_query(op->rarg, query, context); + appendStringInfo(buf, "))"); } else { |