I’m not entirely sure why RelFieldTrimmer doesn’t touch the “*” case. Perhaps 
because its main job is to trim fields, and so if there’s no field trimming to 
be done, it tries to do no harm. 

The main code responsible for pruning empty relational operators is 
PruneEmptyRules. I think you should apply these.

Julian

> On Aug 11, 2020, at 6:13 AM, Vladimir Ozerov <ppoze...@gmail.com> wrote:
> 
> Hi colleagues,
> 
> Consider the following query. If the RelFieldTrimmer is applied to this,
> then the expression is reduced to an empty LogicalValues:
> SELECT field FROM table WHERE TRUE IS FALSE
> 
> However, the following query will not be simplified, leaving a table scan
> with "always false" filter:
> SELECT * FROM table WHERE TRUE IS FALSE
> 
> After some debugging I found that the problem is in the following piece of
> code in the RelFieldTrimmer:
> 
> // If the input is unchanged, and we need to project all columns,
> // there's nothing we can do.
> if (newInput == input
>    && fieldsUsed.cardinality() == fieldCount) {
>  return result(filter, Mappings.createIdentity(fieldCount));
> }
> 
> My question - is it a known issue? Looks like this early return from the
> method misses an important optimization opportunity.  Can this check be
> removed completely?
> 
> Regards,
> Vladimir

Reply via email to