[ 
https://issues.apache.org/jira/browse/CALCITE-4910?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17477622#comment-17477622
 ] 

Ziwei Liu commented on CALCITE-4910:
------------------------------------

I think, if unknown is false, we don't use pull-up predicate correctly in 
simplifyIsNotNull and simplifyIsNull not.

 
{code:java}
if (predicates.pulledUpPredicates.contains(a)) {
      return rexBuilder.makeLiteral(true);
}
{code}
We only return true when pull up predicate contain the current node. If unknown 
as false and pull up predicate is A > 1, I think A IS NOT NULL also can be 
simplified to true.

 

But if unknown is unknown, this may not be useful. We need to compare the term 
contained in AND and OR.

Only when A equals to A, then A AND B AND (A OR C) can be simplified to A AND B

 

> Enhance simplify to reduce ((A OR D) AND (A OR C) AND A AND B) to (A AND B)
> ---------------------------------------------------------------------------
>
>                 Key: CALCITE-4910
>                 URL: https://issues.apache.org/jira/browse/CALCITE-4910
>             Project: Calcite
>          Issue Type: Improvement
>            Reporter: Ziwei Liu
>            Assignee: Ziwei Liu
>            Priority: Major
>              Labels: pull-request-available
>          Time Spent: 1h 50m
>  Remaining Estimate: 0h
>
> Considering this condition, (a or d) and (a or c) and a and b. This condition 
> can be simplified to a and b, but now simplify can not do this.
> This case is found out by materialized view test:
> {code:java}
> materialized view: 
> select 'a',empid,deptno,salary as s from emps where (replace(name,'e','a') is 
> not null or replace(name,'a','c') is not null) 
> and (replace(name,'c','b') is not null or replace(name,'n','d') is not null)
> sql:  
> select salary +1 as s,deptno from emps where
> replace(name,'c','b')is not null and replace(name,'a','c') is not null and 
> salary>10
> The sql will not be rewritten by materialized view because when splitFilter, 
> $3 > 10 and REPLACE($2, 'a', 'c') is not null and REPLACE($2, 'c', 'b') is 
> not null and  (REPLACE($2, 'a', 'c') is not null or REPLACE($2, 'e', 'a') is 
> not null) 
> and (REPLACE($2, 'c', 'b') is not null or REPLACE($2, 'n', 'd') is not null)
> can not be simplified to  
> $3 > 10 and REPLACE($2, 'a', 'c') is not null and REPLACE($2, 'c', 'b') is 
> not null 
> materialized view:
> select empid,deptno,salary as s from emps where 
> (replace(name,'e','a') ='aaa' or replace(name,'a','c') ='aaa') 
> and 
> (replace(name,'c','b') ='aaa' or replace(name,'n','d') ='aaa')
> sql:
> select salary  as s,deptno from emps where
> replace(name,'c','b') ='aaa' is not null 
> and replace(name,'a','c') ='aaa'
> This case also can not be rewritten.{code}



--
This message was sent by Atlassian Jira
(v8.20.1#820001)

Reply via email to