Did you try setting InSubQueryThreshold [1]?

It's not particularly easy to set[2], but AFAIK it works if you set it.

Julian

[1] 
http://calcite.hydromatic.net/apidocs/org/apache/calcite/sql2rel/SqlToRelConverter.Config.html#getInSubQueryThreshold()

[2] https://issues.apache.org/jira/browse/CALCITE-2696

On Sat, Jun 6, 2020 at 5:46 PM Maytas Monsereenusorn <[email protected]> wrote:
>
> Thanks for the inputs. I have filed
> https://issues.apache.org/jira/browse/CALCITE-4048 with the summary from
> this email thread.
>
> Thanks,
> Maytas
>
> Thanks Maytas ~
> >
> > You requests are reasonable, i think line [1] can be promoted, we can move 
> > the null literals
> > comparison to the last of composition predicates (OR/AND) instead of 
> > forbidden all the IN
> > to OR(AND) conversion if the IN value list contains nulls.
> > Can you log an issue there so the one that are interested in it would 
> > contribute ~
> >
> > Thanks again ~
> >
> > [1] 
> > https://github.com/apache/calcite/blob/feae6fbc328e3a7c87693951d1623f8b47ccea59/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java#L1102
> >
> > Best,
> > Danny Chan
> > 在 2020年6月6日 +0800 AM5:38,Rui Wang <[email protected]>,写道:
> > > I see. I was confused on when dim is null, how will null be equal to null.
> > > Did a quick check and Calcite seems to return Unknown for both "null =
> > > null" and "null = false". I am not sure it means for OR, Unknown is
> > > treated as false thus your example can be simplified.
> > >
> > >
> > > -Rui
> > >
> > > On Fri, Jun 5, 2020 at 2:27 PM Rui Wang <[email protected]> wrote:
> > >
> > > > Per the commit history I think you can find something in
> > > > https://issues.apache.org/jira/browse/CALCITE-373.
> > > >
> > > > Meanwhile, "dim='a' OR dim=null" can be simplified to dim='a'?
> > > >
> > > >
> > > >
> > > > -Rui
> > > >
> > > > On Fri, Jun 5, 2020 at 2:13 PM Maytas Monsereenusorn 
> > > > <[email protected]>
> > > > wrote:
> > > >
> > > > > Hi Calcite,
> > > > >
> > > > > I am wondering why we convert a value list with NULL into an inline 
> > > > > table.
> > > > > The code is in SqlToRelConverter, where we call
> > > > > !containsNullLiteral(valueList). For example, if I have a SQL select *
> > > > > from
> > > > > druid.foo where dim in ('a', null) then why do we not convert this to
> > > > > dim='a' OR dim=null.
> > > > > Furthermore, this then can be simply to just dim='a' since dim=null is
> > > > > always null.
> > > > >
> > > > > The plan I got after converting SqlNode to RelNode:
> > > > > LogicalProject(__time=[$0], cnt=[$1], dim1=[$2], dim2=[$3], dim3=[$4],
> > > > > m1=[$5], m2=[$6], unique_dim1=[$7])
> > > > > LogicalJoin(condition=[=($3, $8)], joinType=[inner])
> > > > > LogicalTableScan(table=[[druid, foo]])
> > > > > LogicalAggregate(group=[{0}])
> > > > > LogicalValues(tuples=[[{ 'a' }, { null }]])
> > > > > however, i expect:
> > > > > LogicalProject(__time=[$0], cnt=[$1], dim1=[$2], dim2=[$3], dim3=[$4],
> > > > > m1=[$5], m2=[$6], unique_dim1=[$7])
> > > > > LogicalFilter(condition=[OR(=($3, 'a'), =($3, null))])
> > > > > LogicalTableScan(table=[[druid, foo]])
> > > > >
> > > > > or something like:
> > > > > LogicalProject(__time=[$0], cnt=[$1], dim1=[$2], dim2=[$3], dim3=[$4],
> > > > > m1=[$5], m2=[$6], unique_dim1=[$7])
> > > > > LogicalFilter(condition=[=($3, 'a')])
> > > > > LogicalTableScan(table=[[druid, foo]])
> > > > >
> > > > > Thanks!
> > > > > -Maytas
> > > > >
> > > >
> >
> >

Reply via email to