You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by vl...@apache.org on 2018/08/01 11:22:32 UTC

calcite git commit: [CALCITE-2416] Assertion error when determining monotonicity (Alina Ipatina)

Repository: calcite
Updated Branches:
  refs/heads/master a0983768d -> 0bb924989


[CALCITE-2416] Assertion error when determining monotonicity (Alina Ipatina)

closes #766


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

Branch: refs/heads/master
Commit: 0bb92498900a6314e93805c5d2238a5179577e61
Parents: a098376
Author: Alina Ipatina <ip...@gmail.com>
Authored: Thu Jul 19 19:02:34 2018 +0300
Committer: Vladimir Sitnikov <si...@gmail.com>
Committed: Wed Aug 1 14:20:49 2018 +0300

----------------------------------------------------------------------
 .../main/java/org/apache/calcite/sql/SqlLiteral.java |  4 +++-
 .../calcite/sql/fun/SqlMonotonicBinaryOperator.java  |  6 ++++--
 .../apache/calcite/sql/test/SqlOperatorBaseTest.java | 15 +++++++++++++++
 3 files changed, 22 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/calcite/blob/0bb92498/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 815bf91..114f916 100644
--- a/core/src/main/java/org/apache/calcite/sql/SqlLiteral.java
+++ b/core/src/main/java/org/apache/calcite/sql/SqlLiteral.java
@@ -481,6 +481,8 @@ public class SqlLiteral extends SqlNode {
   /**
    * Converts a chained string literals into regular literals; returns regular
    * literals unchanged.
+   * @throws IllegalArgumentException if {@code node} is not a string literal
+   * and cannot be unchained.
    */
   public static SqlLiteral unchain(SqlNode node) {
     if (node instanceof SqlLiteral) {
@@ -493,7 +495,7 @@ public class SqlLiteral extends SqlNode {
           new SqlIntervalLiteral.IntervalValue(q, 1, q.toString()),
           q.typeName(), q.pos);
     } else {
-      throw new AssertionError("invalid literal: " + node);
+      throw new IllegalArgumentException("invalid literal: " + node);
     }
   }
 

http://git-wip-us.apache.org/repos/asf/calcite/blob/0bb92498/core/src/main/java/org/apache/calcite/sql/fun/SqlMonotonicBinaryOperator.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlMonotonicBinaryOperator.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlMonotonicBinaryOperator.java
index 968f2ae..2da5698 100644
--- a/core/src/main/java/org/apache/calcite/sql/fun/SqlMonotonicBinaryOperator.java
+++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlMonotonicBinaryOperator.java
@@ -73,7 +73,8 @@ public class SqlMonotonicBinaryOperator extends SqlBinaryOperator {
         return mono0;
       }
       assert getName().equals("*");
-      switch (call.getOperandLiteralValue(1, BigDecimal.class).signum()) {
+      BigDecimal value = call.getOperandLiteralValue(1, BigDecimal.class);
+      switch (value == null ? 1 : value.signum()) {
       case -1:
         // mono0 * negative constant --> reverse mono0
         return mono0.reverse();
@@ -100,7 +101,8 @@ public class SqlMonotonicBinaryOperator extends SqlBinaryOperator {
       }
       assert getName().equals("*");
       if (!call.isOperandNull(0, true)) {
-        switch (call.getOperandLiteralValue(0, BigDecimal.class).signum()) {
+        BigDecimal value = call.getOperandLiteralValue(0, BigDecimal.class);
+        switch (value == null ? 1 : value.signum()) {
         case -1:
           // negative constant * mono1 --> reverse mono1
           return mono1.reverse();

http://git-wip-us.apache.org/repos/asf/calcite/blob/0bb92498/core/src/test/java/org/apache/calcite/sql/test/SqlOperatorBaseTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/sql/test/SqlOperatorBaseTest.java b/core/src/test/java/org/apache/calcite/sql/test/SqlOperatorBaseTest.java
index c518768..778715c 100644
--- a/core/src/test/java/org/apache/calcite/sql/test/SqlOperatorBaseTest.java
+++ b/core/src/test/java/org/apache/calcite/sql/test/SqlOperatorBaseTest.java
@@ -2003,6 +2003,21 @@ public abstract class SqlOperatorBaseTest {
     tester.checkBoolean("x''\n'ab' = x'ab'", Boolean.TRUE);
   }
 
+  @Test public void testComplexLiteral() {
+    tester.check("select 2 * 2 * x from (select 2 as x)",
+        new SqlTests.StringTypeChecker("INTEGER NOT NULL"),
+        "8",
+        0);
+    tester.check("select 1 * 2 * 3 * x from (select 2 as x)",
+        new SqlTests.StringTypeChecker("INTEGER NOT NULL"),
+        "12",
+        0);
+    tester.check("select 1 + 2 + 3 + 4 + x from (select 2 as x)",
+        new SqlTests.StringTypeChecker("INTEGER NOT NULL"),
+        "12",
+        0);
+  }
+
   @Test public void testRow() {
     tester.setFor(SqlStdOperatorTable.ROW, VM_FENNEL);
   }