[CALCITE-2688] Improve diagnosability when validator cannot infer a return type (Zoltan Haindrich)
Close apache/calcite#930 Project: http://git-wip-us.apache.org/repos/asf/calcite/repo Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/e274f1ba Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/e274f1ba Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/e274f1ba Branch: refs/heads/master Commit: e274f1ba28494a037fd6e06d7a7b8d762661484f Parents: 5ebf458 Author: Zoltan Haindrich <[email protected]> Authored: Tue Nov 20 09:28:20 2018 +0100 Committer: Julian Hyde <[email protected]> Committed: Mon Dec 3 10:56:02 2018 -0800 ---------------------------------------------------------------------- .../main/java/org/apache/calcite/sql/SqlOperator.java | 8 +++++++- .../main/java/org/apache/calcite/tools/RelBuilder.java | 5 ----- .../java/org/apache/calcite/test/RelBuilderTest.java | 8 ++++---- .../java/org/apache/calcite/test/RelMetadataTest.java | 1 - .../java/org/apache/calcite/test/RexProgramTest.java | 12 ++++++++++++ 5 files changed, 23 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/calcite/blob/e274f1ba/core/src/main/java/org/apache/calcite/sql/SqlOperator.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/calcite/sql/SqlOperator.java b/core/src/main/java/org/apache/calcite/sql/SqlOperator.java index c4c092e..eeee2c3 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlOperator.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlOperator.java @@ -467,7 +467,13 @@ public abstract class SqlOperator { public RelDataType inferReturnType( SqlOperatorBinding opBinding) { if (returnTypeInference != null) { - return returnTypeInference.inferReturnType(opBinding); + RelDataType returnType = returnTypeInference.inferReturnType(opBinding); + if (returnType == null) { + throw new IllegalArgumentException("Cannot infer return type for " + + opBinding.getOperator() + "; operand types: " + + opBinding.collectOperandTypes()); + } + return returnType; } // Derived type should have overridden this method, since it didn't http://git-wip-us.apache.org/repos/asf/calcite/blob/e274f1ba/core/src/main/java/org/apache/calcite/tools/RelBuilder.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/calcite/tools/RelBuilder.java b/core/src/main/java/org/apache/calcite/tools/RelBuilder.java index 9b7a6e9..0465286 100644 --- a/core/src/main/java/org/apache/calcite/tools/RelBuilder.java +++ b/core/src/main/java/org/apache/calcite/tools/RelBuilder.java @@ -556,11 +556,6 @@ public class RelBuilder { private RexNode call(SqlOperator operator, List<RexNode> operandList) { final RexBuilder builder = cluster.getRexBuilder(); final RelDataType type = builder.deriveReturnType(operator, operandList); - if (type == null) { - throw new IllegalArgumentException("cannot derive type: " + operator - + "; operands: " - + Lists.transform(operandList, e -> e + ": " + e.getType())); - } return builder.makeCall(type, operator, operandList); } http://git-wip-us.apache.org/repos/asf/calcite/blob/e274f1ba/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java b/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java index ff3f861..77a91f7 100644 --- a/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java +++ b/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java @@ -401,8 +401,8 @@ public class RelBuilderTest { fail("expected error, got " + call); } catch (IllegalArgumentException e) { assertThat(e.getMessage(), - is("cannot derive type: +; " - + "operands: [$1: VARCHAR(10), $3: SMALLINT]")); + is("Cannot infer return type for +; " + + "operand types: [VARCHAR(10), SMALLINT]")); } } @@ -2057,7 +2057,7 @@ public class RelBuilderTest { builder.call(SqlStdOperatorTable.PLUS, Lists.newArrayList(arg0, arg1)); fail("Invalid combination of parameter types"); } catch (IllegalArgumentException e) { - assertThat(e.getMessage(), containsString("cannot derive type")); + assertThat(e.getMessage(), containsString("Cannot infer return type")); } // test for b) call(operator, RexNode...) @@ -2065,7 +2065,7 @@ public class RelBuilderTest { builder.call(SqlStdOperatorTable.PLUS, arg0, arg1); fail("Invalid combination of parameter types"); } catch (IllegalArgumentException e) { - assertThat(e.getMessage(), containsString("cannot derive type")); + assertThat(e.getMessage(), containsString("Cannot infer return type")); } } http://git-wip-us.apache.org/repos/asf/calcite/blob/e274f1ba/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java b/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java index 4628875..0706782 100644 --- a/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java +++ b/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java @@ -87,7 +87,6 @@ import org.apache.calcite.sql.type.SqlTypeName; import org.apache.calcite.tools.FrameworkConfig; import org.apache.calcite.tools.Frameworks; import org.apache.calcite.tools.RelBuilder; -import org.apache.calcite.tools.RelBuilder.AggCall; import org.apache.calcite.util.BuiltInMethod; import org.apache.calcite.util.ImmutableBitSet; import org.apache.calcite.util.ImmutableIntList; http://git-wip-us.apache.org/repos/asf/calcite/blob/e274f1ba/core/src/test/java/org/apache/calcite/test/RexProgramTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/calcite/test/RexProgramTest.java b/core/src/test/java/org/apache/calcite/test/RexProgramTest.java index b52937f..0c5f549 100644 --- a/core/src/test/java/org/apache/calcite/test/RexProgramTest.java +++ b/core/src/test/java/org/apache/calcite/test/RexProgramTest.java @@ -74,6 +74,7 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertThat; +import static org.junit.Assert.fail; /** * Unit tests for {@link RexProgram} and @@ -748,6 +749,17 @@ public class RexProgramTest extends RexProgramBuilderBase { checkSimplifyUnchanged(cast(cast(vVarchar(), tInt()), tVarchar())); } + @Test public void testNoCommonReturnTypeFails() { + try { + final RexNode node = coalesce(vVarchar(1), vInt(2)); + fail("expected exception, got " + node); + } catch (IllegalArgumentException e) { + final String expected = "Cannot infer return type for COALESCE;" + + " operand types: [VARCHAR, INTEGER]"; + assertThat(e.getMessage(), is(expected)); + } + } + /** Unit test for {@link org.apache.calcite.rex.RexUtil#toCnf}. */ @Test public void testCnf() { final RelDataType booleanType =
