[CALCITE-2720] RelMetadataQuery.getTableOrigin throws IndexOutOfBoundsException if RelNode has no columns (Zoltan Haindrich)
An example is an Aggregate with empty groupKey an no aggregate functions. Occurs during LoptOptimizeJoinRule. Close apache/calcite#949 An unrelated PR that we wish to close: Close apache/calcite#949 Project: http://git-wip-us.apache.org/repos/asf/calcite/repo Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/e8093446 Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/e8093446 Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/e8093446 Branch: refs/heads/master Commit: e80934465cee318fd306159489ee3e5c768dcb68 Parents: 7f8556e Author: Zoltan Haindrich <[email protected]> Authored: Tue Nov 20 09:28:20 2018 +0100 Committer: Julian Hyde <[email protected]> Committed: Fri Nov 30 21:11:49 2018 -0800 ---------------------------------------------------------------------- core/src/main/java/org/apache/calcite/sql/SqlOperator.java | 7 ++++++- core/src/main/java/org/apache/calcite/tools/RelBuilder.java | 5 ----- .../test/java/org/apache/calcite/test/RelBuilderTest.java | 8 ++++---- .../test/java/org/apache/calcite/test/RelMetadataTest.java | 1 - .../test/java/org/apache/calcite/test/RexProgramTest.java | 5 +++++ 5 files changed, 15 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/calcite/blob/e8093446/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..80f9c9f 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,12 @@ 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/e8093446/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/e8093446/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/e8093446/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/e8093446/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..829024b 100644 --- a/core/src/test/java/org/apache/calcite/test/RexProgramTest.java +++ b/core/src/test/java/org/apache/calcite/test/RexProgramTest.java @@ -748,6 +748,11 @@ public class RexProgramTest extends RexProgramBuilderBase { checkSimplifyUnchanged(cast(cast(vVarchar(), tInt()), tVarchar())); } + @Test(expected = IllegalArgumentException.class) + public void checkNoCommonReturnTypeException() { + coalesce(vVarchar(1), vInt(2)); + } + /** Unit test for {@link org.apache.calcite.rex.RexUtil#toCnf}. */ @Test public void testCnf() { final RelDataType booleanType =
