This is an automated email from the ASF dual-hosted git repository. rubenql pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/calcite.git
The following commit(s) were added to refs/heads/master by this push: new fc912eb [CALCITE-4409] Improve exception when RelBuilder tries to create a field on a non-struct expression fc912eb is described below commit fc912eb19d9ebbaee843dc1e9d3b4175e757cb53 Author: rubenada <rube...@gmail.com> AuthorDate: Thu Nov 19 16:04:18 2020 +0000 [CALCITE-4409] Improve exception when RelBuilder tries to create a field on a non-struct expression --- .../java/org/apache/calcite/rel/type/RelDataTypeImpl.java | 4 ++++ .../test/java/org/apache/calcite/test/RelBuilderTest.java | 15 +++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/core/src/main/java/org/apache/calcite/rel/type/RelDataTypeImpl.java b/core/src/main/java/org/apache/calcite/rel/type/RelDataTypeImpl.java index 512b0e6..b7333c1 100644 --- a/core/src/main/java/org/apache/calcite/rel/type/RelDataTypeImpl.java +++ b/core/src/main/java/org/apache/calcite/rel/type/RelDataTypeImpl.java @@ -79,6 +79,10 @@ public abstract class RelDataTypeImpl @Override public RelDataTypeField getField(String fieldName, boolean caseSensitive, boolean elideRecord) { + if (fieldList == null) { + throw new IllegalStateException("Trying to access field " + fieldName + + " in a type with no fields: " + this); + } for (RelDataTypeField field : fieldList) { if (Util.matches(caseSensitive, field.getName(), fieldName)) { return field; 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 836a826..f1eaadb 100644 --- a/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java +++ b/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java @@ -2597,6 +2597,21 @@ public class RelBuilderTest { assertThat(ex.getMessage(), allOf(containsString("Expression"), containsString("not found"))); } + /** Test case for + * <a href="https://issues.apache.org/jira/browse/CALCITE-4409">[CALCITE-4409] + * Improve exception when RelBuilder tries to create a field on a non-struct expression</a>. */ + @Test void testFieldOnNonStructExpression() { + final RelBuilder builder = RelBuilder.create(config().build()); + IllegalStateException ex = assertThrows(IllegalStateException.class, () -> { + builder.scan("EMP") + .project( + builder.field(builder.field("EMPNO"), "abc")) + .build(); + }, "Field should fail since we are trying access a field on expression with non-struct type"); + assertThat(ex.getMessage(), + is("Trying to access field abc in a type with no fields: SMALLINT")); + } + @Test void testMultiLevelAlias() { final RelBuilder builder = RelBuilder.create(config().build()); RelNode root =