You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@calcite.apache.org by "Vladimir Sitnikov (JIRA)" <ji...@apache.org> on 2017/01/09 22:25:58 UTC
[jira] [Commented] (CALCITE-1569) Date condition can generates
Integer == Integer, which is always false
[ https://issues.apache.org/jira/browse/CALCITE-1569?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15813034#comment-15813034 ]
Vladimir Sitnikov commented on CALCITE-1569:
--------------------------------------------
[~liyang.gmt8@gmail.com], can you please provide full debug source?
When I try to join on dates, Calcite creates {{.join}} call, thus it does not generate that {{inp0_ == inp2_}} condition.
On the other hand, the following cases break in different ways (the tests to be placed in {{org.apache.calcite.test.ReflectiveSchemaTest}}):
1)
{code:java}
CalciteAssert.that()
.withSchema("s", CATCHALL)
.query("select a.v from (select \"sqlDate\" v from \"s\".\"everyTypes\" group by \"sqlDate\") a" +
", (select \"sqlDate\" v from \"s\".\"everyTypes\" group by \"sqlDate\") b where a.v = b.v group by a.v")
.returnsUnordered("value=1", "value=3", "value=5");
{code}
Produces "V=1970-01-01\nV=null"
I do not think null row is valid here as "a.v = b.v" should not allow NULL string.
2) greater or equal produces error:
{code:java}
CalciteAssert.that()
.withSchema("s", CATCHALL)
.query("select a.v from (select \"sqlDate\" v from \"s\".\"everyTypes\" group by \"sqlDate\") a" +
", (select \"sqlDate\" v from \"s\".\"everyTypes\" group by \"sqlDate\") b where a.v >= b.v group by a.v")
.returnsUnordered("value=1", "value=3", "value=5");
{code}
{noformat}
/* 112 */ public boolean moveNext() {
/* 113 */ while (inputEnumerator.moveNext()) {
/* 114 */ final Object[] current = (Object[]) inputEnumerator.current();
/* 115 */ if (org.apache.calcite.runtime.SqlFunctions.internalToDate(current[1]) != null && org.apache.calcite.runtime.SqlFunctions.internalToDate(current[0]) != null && (Integer) current[1] >= (Integer) current[0]) {
/* 116 */ return true;
/* 117 */ }
/* 118 */ }
/* 119 */ return false;
/* 120 */ }
Caused by: org.codehaus.commons.compiler.CompileException: Line 115, Column 74: No applicable constructor/method found for actual parameters "java.lang.Object"; candidates are: "public static java.sql.Date org.apache.calcite.runtime.SqlFunctions.internalToDate(int)", "public static java.sql.Date org.apache.calcite.runtime.SqlFunctions.internalToDate(java.lang.Integer)"{noformat}
> 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)