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

Julian Hyde commented on CALCITE-1569:
--------------------------------------

I don't like the direction you're going in that fix. We don't want any Date 
values at run time (and by the way, we should be treating DATE, TIME and 
TIMESTAMP consistently). The right fix would be to treat a nullable DATE column 
the same way we treat a nullable INTEGER column.

> Date condition can generates Integer == Integer, which is always false
> ----------------------------------------------------------------------
>
>                 Key: CALCITE-1569
>                 URL: https://issues.apache.org/jira/browse/CALCITE-1569
>             Project: Calcite
>          Issue Type: Bug
>    Affects Versions: 1.10.0
>            Reporter: liyang
>            Assignee: Julian Hyde
>
> Run the below query on calcite 1.10.
> {code}
> select 
>   l.cal_dt
>   , sum(left_join_gvm) as left_join_sum
>   , sum(inner_join_gvm) as inner_join_sum
> from
>   (
>     select test_kylin_fact.cal_dt, sum(price) as left_join_gvm
>      from test_kylin_fact
>     group by test_kylin_fact.cal_dt
>   ) l
>   ,
>   (
>     select test_kylin_fact.cal_dt, sum(price) as inner_join_gvm
>      from test_kylin_fact
>     group by test_kylin_fact.cal_dt
>   ) i
> where
>   l.cal_dt = i.cal_dt    -- this condition
> group by
>   l.cal_dt
> {code}
> The where condition generates Baz code like below.
> {code}
> /* 284 */   final org.apache.calcite.linq4j.AbstractEnumerable child1 = new 
> org.apache.calcite.linq4j.AbstractEnumerable(){
> /* 285 */     public org.apache.calcite.linq4j.Enumerator enumerator() {
> /* 286 */       return new org.apache.calcite.linq4j.Enumerator(){
> /* 287 */           public final org.apache.calcite.linq4j.Enumerator 
> inputEnumerator = _inputEnumerable1.enumerator();
> /* 288 */           public void reset() {
> /* 289 */             inputEnumerator.reset();
> /* 290 */           }
> /* 291 */ 
> /* 292 */           public boolean moveNext() {
> /* 293 */             while (inputEnumerator.moveNext()) {
> /* 294 */               final Object[] current = (Object[]) 
> inputEnumerator.current();
> /* 295 */               final Integer inp0_ = (Integer) current[0];
> /* 296 */               final Integer inp2_ = (Integer) current[2];
> /* 297 */               if (inp0_ != null && inp2_ != null && inp0_ == inp2_) 
> {
> /* 298 */                 return true;
> /* 299 */               }
> /* 300 */             }
> /* 301 */             return false;
> /* 302 */           }
> /* 303 */ 
> /* 304 */           public void close() {
> /* 305 */             inputEnumerator.close();
> /* 306 */           }
> /* 307 */ 
> /* 308 */           public Object current() {
> /* 309 */             final Object[] current = (Object[]) 
> inputEnumerator.current();
> /* 310 */             return new Object[] {
> /* 311 */                 current[0],
> /* 312 */                 current[1],
> /* 313 */                 current[3]};
> /* 314 */           }
> /* 315 */ 
> /* 316 */         };
> /* 317 */     }
> /* 318 */ 
> /* 319 */   };
> {code}
> The problem is {code} if (inp0_ != null && inp2_ != null && inp0_ == inp2_) 
> {code} is always false, by using == to compare two Integers.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to