You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by jh...@apache.org on 2015/10/24 04:36:41 UTC
incubator-calcite git commit: [CALCITE-922] Extract value of an
INTERVAL literal (Hsuan-Yi Chu)
Repository: incubator-calcite
Updated Branches:
refs/heads/master 9d0fef317 -> c5f2599f4
[CALCITE-922] Extract value of an INTERVAL literal (Hsuan-Yi Chu)
Add test case (Julian Hyde)
Close apache/incubator-calcite#155
Project: http://git-wip-us.apache.org/repos/asf/incubator-calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-calcite/commit/c5f2599f
Tree: http://git-wip-us.apache.org/repos/asf/incubator-calcite/tree/c5f2599f
Diff: http://git-wip-us.apache.org/repos/asf/incubator-calcite/diff/c5f2599f
Branch: refs/heads/master
Commit: c5f2599f493ecdd12494e6cb0bb36ee0f09fe857
Parents: 9d0fef3
Author: Hsuan-Yi Chu <hs...@usc.edu>
Authored: Thu Oct 15 23:50:35 2015 -0700
Committer: Julian Hyde <jh...@apache.org>
Committed: Fri Oct 23 16:44:05 2015 -0700
----------------------------------------------------------------------
.../java/org/apache/calcite/sql/SqlLiteral.java | 15 +++++++++++
.../sql2rel/SqlNodeToRexConverterImpl.java | 15 +++--------
.../calcite/test/SqlToRelConverterTest.java | 10 ++++++++
.../calcite/test/SqlToRelConverterTest.xml | 26 ++++++++++++++++++++
core/src/test/resources/sql/misc.oq | 19 ++++++++++++++
5 files changed, 74 insertions(+), 11 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/c5f2599f/core/src/main/java/org/apache/calcite/sql/SqlLiteral.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql/SqlLiteral.java b/core/src/main/java/org/apache/calcite/sql/SqlLiteral.java
index b7aa493..3295fb5 100644
--- a/core/src/main/java/org/apache/calcite/sql/SqlLiteral.java
+++ b/core/src/main/java/org/apache/calcite/sql/SqlLiteral.java
@@ -23,6 +23,7 @@ import org.apache.calcite.sql.fun.SqlLiteralChainOperator;
import org.apache.calcite.sql.fun.SqlStdOperatorTable;
import org.apache.calcite.sql.parser.SqlParserPos;
import org.apache.calcite.sql.parser.SqlParserUtil;
+import org.apache.calcite.sql.type.SqlTypeFamily;
import org.apache.calcite.sql.type.SqlTypeName;
import org.apache.calcite.sql.type.SqlTypeUtil;
import org.apache.calcite.sql.util.SqlVisitor;
@@ -273,6 +274,12 @@ public class SqlLiteral extends SqlNode {
* <li>If the node is a {@link SqlIntervalQualifier},
* returns its {@link TimeUnitRange}.
*
+ * <li>If the node is INTERVAL_DAY_TIME in {@link SqlTypeFamily},
+ * returns its sign multiplied by its millisecond equivalent value
+ *
+ * <li>If the node is INTERVAL_YEAR_MONTH in {@link SqlTypeFamily},
+ * returns its sign multiplied by its months equivalent value
+ *
* <li>Otherwise the behavior is not specified.
* </ul>
*/
@@ -284,6 +291,14 @@ public class SqlLiteral extends SqlNode {
return (NlsString) literal.value;
case NUMERIC:
return (BigDecimal) literal.value;
+ case INTERVAL_YEAR_MONTH:
+ final SqlIntervalLiteral.IntervalValue valMonth =
+ (SqlIntervalLiteral.IntervalValue) literal.value;
+ return valMonth.getSign() * SqlParserUtil.intervalToMonths(valMonth);
+ case INTERVAL_DAY_TIME:
+ final SqlIntervalLiteral.IntervalValue valTime =
+ (SqlIntervalLiteral.IntervalValue) literal.value;
+ return valTime.getSign() * SqlParserUtil.intervalToMillis(valTime);
}
}
if (SqlUtil.isLiteralChain(node)) {
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/c5f2599f/core/src/main/java/org/apache/calcite/sql2rel/SqlNodeToRexConverterImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql2rel/SqlNodeToRexConverterImpl.java b/core/src/main/java/org/apache/calcite/sql2rel/SqlNodeToRexConverterImpl.java
index 07e0fce..bf7fdd0 100644
--- a/core/src/main/java/org/apache/calcite/sql2rel/SqlNodeToRexConverterImpl.java
+++ b/core/src/main/java/org/apache/calcite/sql2rel/SqlNodeToRexConverterImpl.java
@@ -28,7 +28,6 @@ import org.apache.calcite.sql.SqlIntervalQualifier;
import org.apache.calcite.sql.SqlLiteral;
import org.apache.calcite.sql.SqlTimeLiteral;
import org.apache.calcite.sql.SqlTimestampLiteral;
-import org.apache.calcite.sql.parser.SqlParserUtil;
import org.apache.calcite.sql.type.SqlTypeName;
import org.apache.calcite.sql.validate.SqlValidator;
import org.apache.calcite.util.BitString;
@@ -140,19 +139,13 @@ public class SqlNodeToRexConverterImpl implements SqlNodeToRexConverter {
return rexBuilder.makeDateLiteral((Calendar) value);
case INTERVAL_YEAR_MONTH:
- intervalValue =
- (SqlIntervalLiteral.IntervalValue) value;
- l = SqlParserUtil.intervalToMonths(intervalValue);
- return rexBuilder.makeIntervalLiteral(
- BigDecimal.valueOf(l),
- intervalValue.getIntervalQualifier());
case INTERVAL_DAY_TIME:
- intervalValue =
- (SqlIntervalLiteral.IntervalValue) value;
- l = SqlParserUtil.intervalToMillis(intervalValue);
+ SqlIntervalQualifier sqlIntervalQualifier =
+ ((SqlIntervalLiteral.IntervalValue) value).getIntervalQualifier();
+ l = (long) SqlLiteral.value(literal);
return rexBuilder.makeIntervalLiteral(
BigDecimal.valueOf(l),
- intervalValue.getIntervalQualifier());
+ sqlIntervalQualifier);
default:
throw Util.unexpected(literal.getTypeName());
}
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/c5f2599f/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java b/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
index 1494a78..dbd8a63 100644
--- a/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
+++ b/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
@@ -59,6 +59,16 @@ public class SqlToRelConverterTest extends SqlToRelTestBase {
check("select 1 from emp", "${plan}");
}
+ @Test public void testIntervalLiteralYearToMonth() {
+ check("select cast(empno as Integer) * (INTERVAL '1-1' YEAR TO MONTH)\n"
+ + "from emp", "${plan}");
+ }
+
+ @Test public void testIntervalLiteralHourToMinute() {
+ check("select cast(empno as Integer) * (INTERVAL '1:1' HOUR TO MINUTE)\n"
+ + "from emp", "${plan}");
+ }
+
@Test public void testAliasList() {
check(
"select a + b from (\n"
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/c5f2599f/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
----------------------------------------------------------------------
diff --git a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
index 5912ed6..e145812 100644
--- a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
@@ -478,6 +478,32 @@ LogicalProject(EXPR$0=[1])
]]>
</Resource>
</TestCase>
+ <TestCase name="testIntervalLiteralYearToMonth">
+ <Resource name="sql">
+ <![CDATA[select cast(empno as Integer) * (INTERVAL '1-1' YEAR TO MONTH)
+from emp
+]]>
+ </Resource>
+ <Resource name="plan">
+ <![CDATA[
+LogicalProject(EXPR$0=[*(CAST($0):INTEGER NOT NULL, 13)])
+ LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+]]>
+ </Resource>
+ </TestCase>
+ <TestCase name="testIntervalLiteralHourToMinute">
+ <Resource name="sql">
+ <![CDATA[select cast(empno as Integer) * (INTERVAL '1:1' HOUR TO MINUTE)
+from emp
+]]>
+ </Resource>
+ <Resource name="plan">
+ <![CDATA[
+LogicalProject(EXPR$0=[*(CAST($0):INTEGER NOT NULL, 3660000)])
+ LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+]]>
+ </Resource>
+ </TestCase>
<TestCase name="testSelectDistinct">
<Resource name="sql">
<![CDATA[select distinct sal + 5 from emp]]>
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/c5f2599f/core/src/test/resources/sql/misc.oq
----------------------------------------------------------------------
diff --git a/core/src/test/resources/sql/misc.oq b/core/src/test/resources/sql/misc.oq
index bcc90b1..aa55654 100644
--- a/core/src/test/resources/sql/misc.oq
+++ b/core/src/test/resources/sql/misc.oq
@@ -1089,4 +1089,23 @@ group by deptno;
!ok
+# [CALCITE-922] Value of INTERVAL literal
+select deptno * interval '2' day as d2,
+ deptno * interval -'3' hour as h3,
+ deptno * interval -'-4' hour as h4,
+ deptno * interval -'4:30' hour to minute as h4_5,
+ deptno * interval -'-1-3' year to month as y1_25
+from "scott".dept;
++-----+------+------+---------+--------+
+| D2 | H3 | H4 | H4_5 | Y1_25 |
++-----+------+------+---------+--------+
+| +20 | -30 | +40 | -45:00 | +12-06 |
+| +40 | -60 | +80 | -90:00 | +25-00 |
+| +60 | -90 | +120 | -135:00 | +37-06 |
+| +80 | -120 | +160 | -180:00 | +50-00 |
++-----+------+------+---------+--------+
+(4 rows)
+
+!ok
+
# End misc.oq