diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2022-12-01 11:38:06 -0500 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2022-12-01 11:38:15 -0500 |
commit | de0ff6088e324f5f879c070e3369bc7ad8136b1b (patch) | |
tree | c6316f8022bfd119d99abb9027a9e35786e32cb7 /src/backend | |
parent | cf9bcb0f0421af15d7b9bebe00c8cf649bee399d (diff) | |
download | postgresql-de0ff6088e324f5f879c070e3369bc7ad8136b1b.tar.gz postgresql-de0ff6088e324f5f879c070e3369bc7ad8136b1b.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')
-rw-r--r-- | src/backend/utils/adt/ruleutils.c | 28 |
1 files changed, 14 insertions, 14 deletions
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index c86f825d8b8..8e428e93286 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -8189,11 +8189,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 */ } @@ -8241,11 +8242,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 */ } @@ -10017,9 +10019,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; @@ -10071,9 +10075,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); @@ -10094,11 +10099,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("); |