You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by jc...@apache.org on 2017/01/18 10:01:07 UTC

calcite git commit: [CALCITE-1575] Literals may loose precision during expression reduction (Ashutosh Chauhan)

Repository: calcite
Updated Branches:
  refs/heads/master 0bd4f86b6 -> bb80d98df


[CALCITE-1575] Literals may loose precision during expression reduction (Ashutosh Chauhan)


Project: http://git-wip-us.apache.org/repos/asf/calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/bb80d98d
Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/bb80d98d
Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/bb80d98d

Branch: refs/heads/master
Commit: bb80d98df631d1be534c15d46690de30c59480f8
Parents: 0bd4f86
Author: Ashutosh Chauhan <ha...@apache.org>
Authored: Wed Jan 18 09:44:57 2017 +0000
Committer: Jesus Camacho Rodriguez <jc...@apache.org>
Committed: Wed Jan 18 09:44:57 2017 +0000

----------------------------------------------------------------------
 .../java/org/apache/calcite/rex/RexUtil.java     |  5 ++++-
 .../org/apache/calcite/test/RelOptRulesTest.java | 12 ++++++++++++
 .../org/apache/calcite/test/RelOptRulesTest.xml  | 19 +++++++++++++++++++
 3 files changed, 35 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/calcite/blob/bb80d98d/core/src/main/java/org/apache/calcite/rex/RexUtil.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rex/RexUtil.java b/core/src/main/java/org/apache/calcite/rex/RexUtil.java
index 5fc194c..093a5d1 100644
--- a/core/src/main/java/org/apache/calcite/rex/RexUtil.java
+++ b/core/src/main/java/org/apache/calcite/rex/RexUtil.java
@@ -395,7 +395,10 @@ public class RexUtil {
       right = operands.get(1);
     } else {
       left = operands.get(0);
-      right = rexBuilder.makeNullLiteral(left.getType().getSqlTypeName());
+      SqlTypeName typeName = left.getType().getSqlTypeName();
+      right = typeName.allowsPrec()
+          ? rexBuilder.makeNullLiteral(typeName, left.getType().getPrecision())
+          : rexBuilder.makeNullLiteral(typeName);
     }
     // Note that literals are immutable too, and they can only be compared
     // through values.

http://git-wip-us.apache.org/repos/asf/calcite/blob/bb80d98d/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
index 112ceb9..db7d27c 100644
--- a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
@@ -226,6 +226,18 @@ public class RelOptRulesTest extends RelOptTestBase {
     sql(sql).with(hepPlanner).check();
   }
 
+  @Test public void testReduceNullableCase2() {
+    HepProgramBuilder builder = new HepProgramBuilder();
+    builder.addRuleClass(ReduceExpressionsRule.class);
+    HepPlanner hepPlanner = new HepPlanner(builder.build());
+    hepPlanner.addRule(ReduceExpressionsRule.PROJECT_INSTANCE);
+
+    final String sql = "SELECT deptno, ename, CASE WHEN 1=2 "
+      + "THEN substring(ename, 1, cast(2 as int)) ELSE NULL end from emp"
+      + " group by deptno, ename, case when 1=2 then substring(ename,1, cast(2 as int))  else null end";
+    sql(sql).with(hepPlanner).check();
+  }
+
   @Test public void testProjectToWindowRuleForMultipleWindows() {
     HepProgram preProgram = new HepProgramBuilder()
         .build();

http://git-wip-us.apache.org/repos/asf/calcite/blob/bb80d98d/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
----------------------------------------------------------------------
diff --git a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
index 866da2e..2f74e37 100644
--- a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
@@ -5449,6 +5449,25 @@ LogicalProject(NAME=[$3], SUM_SAL=[$1], C=[$2])
 ]]>
         </Resource>
     </TestCase>
+    <TestCase name="testReduceNullableCase2">
+        <Resource name="sql">
+            <![CDATA[SELECT deptno, ename, CASE WHEN 1=2 THEN substring(ename, 1, cast(2 as int)) ELSE NULL end from emp group by deptno, ename, case when 1=2 then substring(ename,1, cast(2 as int))  else null end]]>
+        </Resource>
+        <Resource name="planBefore">
+            <![CDATA[
+LogicalAggregate(group=[{0, 1, 2}])
+  LogicalProject(DEPTNO=[$7], ENAME=[$1], EXPR$2=[CASE(=(1, 2), CAST(SUBSTRING($1, 1, 2)):VARCHAR(20) CHARACTER SET "ISO-8859-1" COLLATE "ISO-8859-1$en_US$primary", null)])
+    LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+]]>
+        </Resource>
+        <Resource name="planAfter">
+            <![CDATA[
+LogicalAggregate(group=[{0, 1, 2}])
+  LogicalProject(DEPTNO=[$7], ENAME=[$1], EXPR$2=[null])
+    LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+]]>
+        </Resource>
+    </TestCase>
     <TestCase name="testSemiJoinRule">
         <Resource name="sql">
             <![CDATA[select dept.* from dept join (