pgsql: In deparsing, parenthesize IS DOCUMENT where it is an operand.

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: pgsql-committers(at)lists(dot)postgresql(dot)org
Subject: pgsql: In deparsing, parenthesize IS DOCUMENT where it is an operand.
Date: 2026-10-20 18:29:22
Message-ID: E1xJEaQ-000000002v8-0jDR@gemulon.postgresql.org
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-committers

In deparsing, parenthesize IS DOCUMENT where it is an operand.

isSimpleNode() and related code treated every XmlExpr as
self-delimiting. Most of them are, because they look like function
calls with some extra decoration. But "x IS DOCUMENT" is not: it is
a postfix test, like IS NULL. Printed as the operand of another
operator, or as the operand of a postfix test, it was therefore not
parenthesized and could not be parsed back, or was parsed as something
unintended. Under-parenthesization occurred even in non-pretty-print
cases, so that this could break dump/restore workflows.

To fix, treat IS DOCUMENT as neither simple nor function-like, and
give it the same treatment as other postfix tests.

Also pass the single argument of IS DOCUMENT, not the argument list,
to get_rule_expr_paren(). This avoids unnecessary parenthesization
of the argument.

Author: Henson Choi <assam258(at)gmail(dot)com>
Reviewed-by: Prashant Chinnam <crprashant(at)hotmail(dot)com>
Reviewed-by: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
Discussion: https://postgr.es/m/CAAAe_zDuPSkc8ihCctV67Lxbqock+S4wqCHHo8xxZ1t4teXo0g@mail.gmail.com
Backpatch-through: 14

Branch
------
REL_16_STABLE

Details
-------
https://git.postgresql.org/pg/commitdiff/715bf03057480fba9dc1905053f78bdc2b9f9cb8

Modified Files
--------------
src/backend/utils/adt/ruleutils.c | 33 ++++++++++++++++++++++++++-----
src/test/regress/expected/create_view.out | 21 +++++++++++++++++++-
src/test/regress/sql/create_view.sql | 10 ++++++++++
3 files changed, 58 insertions(+), 6 deletions(-)

Browse pgsql-committers by date

  From Date Subject
Next Message Tom Lane 2026-10-20 19:13:40 pgsql: contrib/intarray: always parse query_int integers as decimal.
Previous Message Tom Lane 2026-10-20 16:56:24 pgsql: Fix to_char() for number formats ending in a decimal point.