aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/ruleutils.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2022-12-01 11:38:06 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2022-12-01 11:38:14 -0500
commit1dd6700f44d2e14616d464a5f490552b7036ad3f (patch)
tree827ddbac3ce502ef441e330a37c519a0316a7f00 /src/backend/utils/adt/ruleutils.c
parent4dd00b042fe88bfbf7ce6400c69ee232e9eb6e48 (diff)
downloadpostgresql-1dd6700f44d2e14616d464a5f490552b7036ad3f.tar.gz
postgresql-1dd6700f44d2e14616d464a5f490552b7036ad3f.zip
Fix under-parenthesized display of AT TIME ZONE constructs.
In commit 40c24bfef, I forgot to use get_rule_expr_paren() for the arguments of AT TIME ZONE, resulting in possibly not printing parens for expressions that need it. But get_rule_expr_paren() wouldn't have gotten it right anyway, because isSimpleNode() hadn't been taught that COERCE_SQL_SYNTAX parent nodes don't guarantee sufficient parentheses. Improve all that. Also use this methodology for F_IS_NORMALIZED, so that we don't print useless parens for that. In passing, remove a comment that was obsoleted later. Per report from Duncan Sands. Back-patch to v14 where this code came in. (Before that, we didn't try to print AT TIME ZONE that way, so there was no bug just ugliness.) Discussion: https://postgr.es/m/f41566aa-a057-6628-4b7c-b48770ecb84a@deepbluecap.com
Diffstat (limited to 'src/backend/utils/adt/ruleutils.c')
-rw-r--r--src/backend/utils/adt/ruleutils.c28
1 files changed, 14 insertions, 14 deletions
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index f3ea36a231c..a20a1b069bf 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -8254,11 +8254,12 @@ isSimpleNode(Node *node, Node *parentNode, int prettyFlags)
{
case T_FuncExpr:
{
- /* special handling for casts */
+ /* special handling for casts and COERCE_SQL_SYNTAX */
CoercionForm type = ((FuncExpr *) parentNode)->funcformat;
if (type == COERCE_EXPLICIT_CAST ||
- type == COERCE_IMPLICIT_CAST)
+ type == COERCE_IMPLICIT_CAST ||
+ type == COERCE_SQL_SYNTAX)
return false;
return true; /* own parentheses */
}
@@ -8306,11 +8307,12 @@ isSimpleNode(Node *node, Node *parentNode, int prettyFlags)
return false;
case T_FuncExpr:
{
- /* special handling for casts */
+ /* special handling for casts and COERCE_SQL_SYNTAX */
CoercionForm type = ((FuncExpr *) parentNode)->funcformat;
if (type == COERCE_EXPLICIT_CAST ||
- type == COERCE_IMPLICIT_CAST)
+ type == COERCE_IMPLICIT_CAST ||
+ type == COERCE_SQL_SYNTAX)
return false;
return true; /* own parentheses */
}
@@ -10046,9 +10048,11 @@ get_func_sql_syntax(FuncExpr *expr, deparse_context *context)
case F_TIMEZONE_TEXT_TIMETZ:
/* AT TIME ZONE ... note reversed argument order */
appendStringInfoChar(buf, '(');
- get_rule_expr((Node *) lsecond(expr->args), context, false);
+ get_rule_expr_paren((Node *) lsecond(expr->args), context, false,
+ (Node *) expr);
appendStringInfoString(buf, " AT TIME ZONE ");
- get_rule_expr((Node *) linitial(expr->args), context, false);
+ get_rule_expr_paren((Node *) linitial(expr->args), context, false,
+ (Node *) expr);
appendStringInfoChar(buf, ')');
return true;
@@ -10100,9 +10104,10 @@ get_func_sql_syntax(FuncExpr *expr, deparse_context *context)
case F_IS_NORMALIZED:
/* IS xxx NORMALIZED */
- appendStringInfoString(buf, "((");
- get_rule_expr((Node *) linitial(expr->args), context, false);
- appendStringInfoString(buf, ") IS");
+ appendStringInfoString(buf, "(");
+ get_rule_expr_paren((Node *) linitial(expr->args), context, false,
+ (Node *) expr);
+ appendStringInfoString(buf, " IS");
if (list_length(expr->args) == 2)
{
Const *con = (Const *) lsecond(expr->args);
@@ -10123,11 +10128,6 @@ get_func_sql_syntax(FuncExpr *expr, deparse_context *context)
appendStringInfoChar(buf, ')');
return true;
- /*
- * XXX EXTRACT, a/k/a date_part(), is intentionally not covered
- * yet. Add it after we change the return type to numeric.
- */
-
case F_NORMALIZE:
/* NORMALIZE() */
appendStringInfoString(buf, "NORMALIZE(");