pgsql: Suppress unnecessary RelabelType nodes in yet more cases.

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: pgsql-committers(at)lists(dot)postgresql(dot)org
Subject: pgsql: Suppress unnecessary RelabelType nodes in yet more cases.
Date: 2020-08-19 18:08:11
Message-ID: E1k8SVP-0002D7-7v@gemulon.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-committers

Suppress unnecessary RelabelType nodes in yet more cases.

Commit a477bfc1d fixed eval_const_expressions() to ensure that it
didn't generate unnecessary RelabelType nodes, but I failed to notice
that some other places in the planner had the same issue. Really
noplace in the planner should be using plain makeRelabelType(), for
fear of generating expressions that should be equal() to semantically
equivalent trees, but aren't.

An example is that because canonicalize_ec_expression() failed
to be careful about this, we could end up with an equivalence class
containing both a plain Const, and a Const-with-RelabelType
representing exactly the same value. So far as I can tell this led to
no visible misbehavior, but we did waste a bunch of cycles generating
and evaluating "Const = Const-with-RelabelType" to prove such entries
are redundant.

Hence, move the support function added by a477bfc1d to where it can
be more generally useful, and use it in the places where planner code
previously used makeRelabelType.

Back-patch to v12, like the previous patch. While I have no concrete
evidence of any real misbehavior here, it's certainly possible that
I overlooked a case where equivalent expressions that aren't equal()
could cause a user-visible problem. In any case carrying extra
RelabelType nodes through planning to execution isn't very desirable.

Discussion: https://postgr.es/m/1311836.1597781384@sss.pgh.pa.us

Branch
------
REL_13_STABLE

Details
-------
https://git.postgresql.org/pg/commitdiff/69ffc2f838990fb2c802087091ce7c2ff1b735eb

Modified Files
--------------
src/backend/nodes/nodeFuncs.c | 75 +++++++++++++++++++++-----
src/backend/optimizer/path/equivclass.c | 43 ++++++---------
src/backend/optimizer/prep/prepunion.c | 10 ++--
src/backend/optimizer/util/clauses.c | 94 ++++++++-------------------------
src/include/nodes/nodeFuncs.h | 3 ++
5 files changed, 106 insertions(+), 119 deletions(-)

Browse pgsql-committers by date

  From Date Subject
Next Message Alvaro Herrera 2020-08-19 22:37:04 Re: pgsql: snapshot scalability: cache snapshots using a xact completion co
Previous Message Andrew Dunstan 2020-08-19 13:38:55 Re: prepared transaction isolation tests