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 >> >
