You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@drill.apache.org by "Volodymyr Vysotskyi (JIRA)" <ji...@apache.org> on 2017/06/27 15:58:00 UTC

[jira] [Comment Edited] (DRILL-4722) Fix EqualityVisitor for interval day expressions with millis

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

Volodymyr Vysotskyi edited comment on DRILL-4722 at 6/27/17 3:57 PM:
---------------------------------------------------------------------

According to the common subexpression elimination logic (see DRILL-3912) Drill reuses the results from previously evaluated expression trees for redundant evaluations.

Drill uses [IntervalDayExpression|https://github.com/apache/drill/blob/0dc237e3161cf284212cc63f740b229d4fee8fdf/logical/src/main/java/org/apache/drill/common/expression/ValueExpressions.java#L608] to store days and millis. Hours, minutes and seconds are converted to the milliseconds to be stored in this field.

The [visitIntervalDayConstant() method|https://github.com/apache/drill/blob/3e8b01d5b0d3013e3811913f0fd6028b22c1ac3f/exec/java-exec/src/main/java/org/apache/drill/exec/expr/EqualityVisitor.java#L168] should check the equality of IntervalDayExpression instances. But it checks only equality of the values of IntervalDayExpression.days field and does not check the IntervalDayExpression.millis field. 
Therefore Drill assumes that the second expression from the query may be replaced by the result of the first during the code generation [stage|https://github.com/apache/drill/blob/416ec70a616e8d12b5c7fca809763b977d2f7aad/exec/java-exec/src/main/java/org/apache/drill/exec/expr/EvaluationVisitor.java#L151].


was (Author: vvysotskyi):
According to the common subexpression elimination logic (see DRILL-3912) Drill reuses the results from previously evaluated expression trees for redundant evaluations.

Drill uses [IntervalDayExpression|https://github.com/apache/drill/blob/0dc237e3161cf284212cc63f740b229d4fee8fdf/logical/src/main/java/org/apache/drill/common/expression/ValueExpressions.java#L608] to store days and millis. Hours, minutes and seconds are converted to the milliseconds to be stored in this field.

The [visitIntervalDayConstant() method|https://github.com/apache/drill/blob/3e8b01d5b0d3013e3811913f0fd6028b22c1ac3f/exec/java-exec/src/main/java/org/apache/drill/exec/expr/EqualityVisitor.java#L168] does not check the equality of  values in the IntervalDayExpression.millis field. 
Therefore Drill assumes that the second expression from the query may be replaced by the result of the first during the code generation [stage|https://github.com/apache/drill/blob/416ec70a616e8d12b5c7fca809763b977d2f7aad/exec/java-exec/src/main/java/org/apache/drill/exec/expr/EvaluationVisitor.java#L151].

> Fix EqualityVisitor for interval day expressions with millis
> ------------------------------------------------------------
>
>                 Key: DRILL-4722
>                 URL: https://issues.apache.org/jira/browse/DRILL-4722
>             Project: Apache Drill
>          Issue Type: Bug
>          Components: Functions - Drill
>            Reporter: Krystal
>            Assignee: Volodymyr Vysotskyi
>             Fix For: 1.11.0
>
>
> *Issue*
> The following query returns the same data for the second column as the first:
> {code:sql}
> select date_add(cast('2015-01-24 07:27:05.0' as timestamp), interval '3' HOUR), date_add(cast('2015-01-24 07:27:05.0' as timestamp), interval '5' HOUR) from (values(1));
> +------------------------+------------------------+
> |         EXPR$0         |         EXPR$1         |
> +------------------------+------------------------+
> | 2015-01-24 10:27:05.0  | 2015-01-24 10:27:05.0  |
> +------------------------+------------------------+
> {code}
> If each column is run separately, then it produces correct result:
> {code:sql}
> select date_add(cast('2015-01-24 07:27:05.0' as timestamp), interval '3' HOUR) from (values(1));
> +------------------------+
> |         EXPR$0         |
> +------------------------+
> | 2015-01-24 10:27:05.0  |
> +------------------------+
> {code}
> {code:sql}
> select date_add(cast('2015-01-24 07:27:05.0' as timestamp), interval '5' HOUR) from (values(1));
> +------------------------+
> |         EXPR$0         |
> +------------------------+
> | 2015-01-24 12:27:05.0  |
> +------------------------+
> {code}
> Same problem is seen for interval of minute and second:
> {code:sql}
> select date_add(cast('2015-01-24 07:27:05.0' as timestamp), interval '50' MINUTE), date_add(cast('2015-01-24 07:27:05.0' as timestamp), interval '40' MINUTE) from (values(1));
> +------------------------+------------------------+
> |         EXPR$0         |         EXPR$1         |
> +------------------------+------------------------+
> | 2015-01-24 08:17:05.0  | 2015-01-24 08:17:05.0  |
> +------------------------+------------------------+
> {code}
> {code:sql}
> select date_add(cast('2015-01-24 07:27:05.0' as timestamp), interval '50' second), date_add(cast('2015-01-24 07:27:05.0' as timestamp), interval '40' second) from (values(1));
> +------------------------+------------------------+
> |         EXPR$0         |         EXPR$1         |
> +------------------------+------------------------+
> | 2015-01-24 07:27:55.0  | 2015-01-24 07:27:55.0  |
> +------------------------+------------------------+
> {code}
> {code:sql}
> select date_add(cast('2015-01-24 07:27:05.0' as timestamp), interval '3' HOUR), date_add(cast('2015-01-24 07:27:05.0' as timestamp), interval '50' MINUTE), date_add(cast('2015-01-24 07:27:05.0' as timestamp), interval '50' second) from (values(1));
> +------------------------+------------------------+------------------------+
> |         EXPR$0         |         EXPR$1         |         EXPR$2         |
> +------------------------+------------------------+------------------------+
> | 2015-01-24 10:27:05.0  | 2015-01-24 10:27:05.0  | 2015-01-24 10:27:05.0  |
> +------------------------+------------------------+------------------------+
> {code}



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)