Redundant filter in index scan with a bool column - Mailing list pgsql-hackers

From Alexander Kuzmenkov
Subject Redundant filter in index scan with a bool column
Date
Msg-id 4f17bffb-3561-6460-aad8-e39d974cd01a@postgrespro.ru
Whole thread Raw
Responses Re: Redundant filter in index scan with a bool column
List pgsql-hackers
Hi hackers,

Consider this query plan:

create table t (i int, b bool);
create index on t(i, b);
set enable_bitmapscan to off;
explain select * from t where i = 300 and b;

                                QUERY PLAN
-------------------------------------------------------------------------
  Index Only Scan using t_i_b_idx on t  (cost=0.15..24.27 rows=6 width=5)
    Index Cond: ((i = 300) AND (b = true))
    Filter: b


The filter is not needed, why is it there? Turns out we can't recognize 
that the restriction clause 'b' and the index clause 'b = true' are 
equivalent. My first reaction was to patch operator_predicate_proof to 
handle this case, but there is a more straightforward way: mark the 
expanded index clause as potentially redundant when it is generated in 
expand_indexqual_conditions. There is already RestrictInfo.parent_ec 
that is used to mark redundant EC-derived join clauses. The patch 
renames it to rinfo_parent and uses it to mark the expanded index 
clauses. Namely, for both the expanded and the original clause, 
rinfo_parent points to the original clause or its generating EC, if set. 
The name is no good -- the original clause is not a parent of itself, 
after all. I considered something like redundancy_tag, but some places 
actually use the fact that it points to the generating EC, so I don't 
like this name either.

What do you think?

-- 
Alexander Kuzmenkov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company


Attachment

pgsql-hackers by date:

Previous
From: Etsuro Fujita
Date:
Subject: Re: de-deduplicate code in DML execution hooks in postgres_fdw
Next
From: Arthur Zakirov
Date:
Subject: Re: [PROPOSAL] Shared Ispell dictionaries