It looks like you’ve defined it right. It should fire once for each LogicalTableScan in the plan.
Make sure that you have registered a rule instance in the planner. > On Feb 11, 2021, at 11:19 PM, Michael Thomson <[email protected]> wrote: > > Hi, > > I suspect I am doing something wrong but it's not obvious to me and hoping > someone can spot what my issue is. > > I am trying to add a simple filter after detection of LogicalTableScans on > particular tables > > I have a rule that looks like this > > public interface Config extends RelRule.Config { > Config DEFAULT = > EMPTY.withOperandSupplier(b0 -> > b0.operand(LogicalTableScan.class).anyInputs()) > .as(Config.class); > > @Override > default InjectFilterRule toRule() { > return new InjectFilterRule(this, null); > } > } > > Everything works as expected with most sql > > but when using a subqueries like this > > select * from t6 where t6.t1 in (select t1 from t6); > > The result I see is > > LogicalProject(t1=[$0], i1=[$1]) > LogicalFilter(condition=[IN($0, { > LogicalProject(t1=[$0]) > LogicalTableScan(table=[[database, t6]]) > })]) > LogicalFilter(condition=[OR(=($0, 'a'), =($0, 'b'), =($0, 'c'))]) > LogicalTableScan(table=[[database, t6]]) > > You will note the bogus FILTER added to the first LogicalTableScan > > LogicalFilter(condition=[OR(=($0, 'a'), =($0, 'b'), =($0, 'c'))]) > > but nothing was added to the one in the IN subquery > > When I look in the debug it seems the onMatch code never receives an > invocation for the subquery Scan. > > The rules are run as part of the planner.rel() call. > > Any ideas of what I am overlooking or misunderstanding would be much > appreciated > > thanks > Michael.
