DRILL-944: Fix overflow while adding Time + Interval data type
Project: http://git-wip-us.apache.org/repos/asf/incubator-drill/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-drill/commit/72084e32 Tree: http://git-wip-us.apache.org/repos/asf/incubator-drill/tree/72084e32 Diff: http://git-wip-us.apache.org/repos/asf/incubator-drill/diff/72084e32 Branch: refs/heads/master Commit: 72084e32c08d3136de4d6940c0965c0c8ed6b04a Parents: 564f969 Author: Mehant Baid <[email protected]> Authored: Tue Jun 10 17:40:42 2014 -0700 Committer: Jacques Nadeau <[email protected]> Committed: Wed Jun 11 09:03:24 2014 -0700 ---------------------------------------------------------------------- .../DateIntervalArithmeticFunctions.java | 23 +++++++------------- .../apache/drill/jdbc/test/TestJdbcQuery.java | 14 ++++++++++-- 2 files changed, 20 insertions(+), 17 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/72084e32/exec/java-exec/src/main/codegen/templates/DateIntervalFunctionTemplates/DateIntervalArithmeticFunctions.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/codegen/templates/DateIntervalFunctionTemplates/DateIntervalArithmeticFunctions.java b/exec/java-exec/src/main/codegen/templates/DateIntervalFunctionTemplates/DateIntervalArithmeticFunctions.java index 4fbfdf9..634e41a 100644 --- a/exec/java-exec/src/main/codegen/templates/DateIntervalFunctionTemplates/DateIntervalArithmeticFunctions.java +++ b/exec/java-exec/src/main/codegen/templates/DateIntervalFunctionTemplates/DateIntervalArithmeticFunctions.java @@ -176,24 +176,17 @@ import org.apache.drill.exec.expr.fn.impl.DateUtility; public class ${datetype}${intervaltype}Functions { <#macro timeIntervalArithmeticBlock left right temp op output intervaltype> - <#if intervaltype == "Interval"> - if (${right}.months != 0 || ${right}.days != 0) { - throw new UnsupportedOperationException("Cannot add interval type with months or days to TIME"); - } - ${output} = ${left}.value ${op} ${right}.milliSeconds; - <#elseif intervaltype == "IntervalYear"> - if (1 == 1) { - throw new UnsupportedOperationException("Cannot add IntervalYear to TIME"); - } - <#elseif intervaltype == "IntervalDay"> - if (${right}.days != 0) { - throw new UnsupportedOperationException("Cannot add days to TIME"); - } - ${output} = ${left}.value ${op} ${right}.milliSeconds; - <#elseif intervaltype == "Int" || intervaltype == "BigInt"> + <#if intervaltype == "Int" || intervaltype == "BigInt"> if (1 == 1) { throw new UnsupportedOperationException("Cannot add integer to TIME, cast it to specific interval"); } + <#elseif intervaltype == "IntervalYear"> + // Needn't add anything to time from interval year data type. Output is same as input + ${output} = ${left}.value; + <#else> + ${output} = ${left}.value ${op} ${right}.milliSeconds; + // Wrap around 24 hour clock if we exceeded it while adding the time component + ${output} = ${output} % org.apache.drill.exec.expr.fn.impl.DateUtility.daysToStandardMillis; </#if> </#macro> http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/72084e32/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestJdbcQuery.java ---------------------------------------------------------------------- diff --git a/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestJdbcQuery.java b/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestJdbcQuery.java index 0412f00..2a69469 100644 --- a/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestJdbcQuery.java +++ b/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestJdbcQuery.java @@ -409,8 +409,8 @@ public class TestJdbcQuery extends JdbcTest{ "from cp.`employee.json` limit 1") .returns( "LEFT_STR=ab; " + - "RIGHT_STR=ef; " + - "REPLACE_STR=zzcdef\n" + "RIGHT_STR=ef; " + + "REPLACE_STR=zzcdef\n" ); } @@ -421,6 +421,16 @@ public class TestJdbcQuery extends JdbcTest{ "from cp.`employee.json` where employee_id = 1") .returns( "L_UTF8=5\n" + ); + } + + @Test + public void testTimeIntervalAddOverflow() throws Exception { + JdbcAssert.withNoDefaultSchema() + .sql("select extract(hour from (interval '10 20' day to hour + time '10:00:00')) as TIME_INT_ADD " + + "from cp.`employee.json` where employee_id = 1") + .returns( + "TIME_INT_ADD=6\n" ); } }
