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 <[email protected]> Authored: Thu Jul 19 19:02:34 2018 +0300 Committer: Vladimir Sitnikov <[email protected]> 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); }
