You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@calcite.apache.org by "liyang (JIRA)" <ji...@apache.org> on 2017/01/09 10:36:58 UTC

[jira] [Created] (CALCITE-1569) Date condition can generates Integer == Integer, which is always false

liyang created CALCITE-1569:
-------------------------------

             Summary: 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)