mirror of
https://github.com/postgres/postgres.git
synced 2025-07-28 23:42:10 +03:00
Suppress unnecessary RelabelType nodes in more cases.
eval_const_expressions sometimes produced RelabelType nodes that were useless because they just relabeled an expression to the same exposed type it already had. This is worth avoiding because it can cause two equivalent expressions to not be equal(), preventing recognition of useful optimizations. In the test case added here, an unpatched planner fails to notice that the "sqli = constant" clause renders a sort step unnecessary, because one code path produces an extra RelabelType and another doesn't. Fix by ensuring that eval_const_expressions_mutator's T_RelabelType case will not add in an unnecessary RelabelType. Also save some code by sharing a subroutine with the effectively-equivalent cases for CollateExpr and CoerceToDomain. (CollateExpr had no bug, and I think that the case couldn't arise with CoerceToDomain, but it seems prudent to do the same check for all three cases.) Back-patch to v12. In principle this has been wrong all along, but I haven't seen a case where it causes visible misbehavior before v12, so refrain from changing stable branches unnecessarily. Per investigation of a report from Eric Gillum. Discussion: https://postgr.es/m/CAMmjdmvAZsUEskHYj=KT9sTukVVCiCSoe_PBKOXsncFeAUDPCQ@mail.gmail.com
This commit is contained in:
@ -439,3 +439,15 @@ explain (costs off)
|
||||
Filter: ((unique1 = unique1) OR (unique2 = unique2))
|
||||
(2 rows)
|
||||
|
||||
-- check that we recognize equivalence with dummy domains in the way
|
||||
create temp table undername (f1 name, f2 int);
|
||||
create temp view overview as
|
||||
select f1::information_schema.sql_identifier as sqli, f2 from undername;
|
||||
explain (costs off) -- this should not require a sort
|
||||
select * from overview where sqli = 'foo' order by sqli;
|
||||
QUERY PLAN
|
||||
------------------------------
|
||||
Seq Scan on undername
|
||||
Filter: (f1 = 'foo'::name)
|
||||
(2 rows)
|
||||
|
||||
|
@ -262,3 +262,10 @@ explain (costs off)
|
||||
-- this could be converted, but isn't at present
|
||||
explain (costs off)
|
||||
select * from tenk1 where unique1 = unique1 or unique2 = unique2;
|
||||
|
||||
-- check that we recognize equivalence with dummy domains in the way
|
||||
create temp table undername (f1 name, f2 int);
|
||||
create temp view overview as
|
||||
select f1::information_schema.sql_identifier as sqli, f2 from undername;
|
||||
explain (costs off) -- this should not require a sort
|
||||
select * from overview where sqli = 'foo' order by sqli;
|
||||
|
Reference in New Issue
Block a user