[CALCITE-4409] Improve exception when RelBuilder tries to create a field on a non-struct expression
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 @@
@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 @@
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 =