You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by li...@apache.org on 2022/03/16 01:35:31 UTC

[calcite] branch master updated: [CALCITE-5040] SqlTypeFactoryTest.testUnknownCreateWithNullabilityTypeConsistency fails

This is an automated email from the ASF dual-hosted git repository.

liyafan 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 692b8f0  [CALCITE-5040] SqlTypeFactoryTest.testUnknownCreateWithNullabilityTypeConsistency fails
692b8f0 is described below

commit 692b8f0886a25538e010d1a8ae5efe89f80d89e9
Author: Julian Hyde <jh...@apache.org>
AuthorDate: Mon Mar 14 20:54:04 2022 -0700

    [CALCITE-5040] SqlTypeFactoryTest.testUnknownCreateWithNullabilityTypeConsistency fails
    
    [CALCITE-4872] added an UNKNOWN type that was implemented in some
    places by class SqlTypeFactoryImpl.UnknownSqlType, but in others
    by BasicSqlType. This would cause
    SqlTypeFactoryTest.testUnknownCreateWithNullabilityTypeConsistency
    to succeed or fail non-deterministically, depending on which of the
    above had made it into the map of canonical type instances.
    
    This commit solves the problem by removing class
    SqlTypeFactoryImpl.UnknownSqlType and always using BasicSqlType.
---
 .../calcite/sql/type/SqlTypeFactoryImpl.java       | 27 +------------------
 .../calcite/sql/type/SqlTypeFactoryTest.java       | 31 +++++++++++++++-------
 2 files changed, 22 insertions(+), 36 deletions(-)

diff --git a/core/src/main/java/org/apache/calcite/sql/type/SqlTypeFactoryImpl.java b/core/src/main/java/org/apache/calcite/sql/type/SqlTypeFactoryImpl.java
index 532ccfe..8521c841 100644
--- a/core/src/main/java/org/apache/calcite/sql/type/SqlTypeFactoryImpl.java
+++ b/core/src/main/java/org/apache/calcite/sql/type/SqlTypeFactoryImpl.java
@@ -93,7 +93,7 @@ public class SqlTypeFactoryImpl extends RelDataTypeFactoryImpl {
   }
 
   @Override public RelDataType createUnknownType() {
-    return canonize(new UnknownSqlType(this));
+    return createSqlType(SqlTypeName.UNKNOWN);
   }
 
   @Override public RelDataType createMultisetType(
@@ -550,7 +550,6 @@ public class SqlTypeFactoryImpl extends RelDataTypeFactoryImpl {
     return new MapSqlType(keyType, valueType, nullable);
   }
 
-  // override RelDataTypeFactoryImpl
   @Override protected RelDataType canonize(RelDataType type) {
     type = super.canonize(type);
     if (!(type instanceof ObjectSqlType)) {
@@ -567,28 +566,4 @@ public class SqlTypeFactoryImpl extends RelDataTypeFactoryImpl {
     }
     return type;
   }
-
-  /** The unknown type. Similar to the NULL type, but is only equal to
-   * itself. */
-  static class UnknownSqlType extends BasicSqlType {
-    UnknownSqlType(RelDataTypeFactory typeFactory) {
-      this(typeFactory.getTypeSystem(), false);
-    }
-
-    private UnknownSqlType(RelDataTypeSystem typeSystem, boolean nullable) {
-      super(typeSystem, SqlTypeName.UNKNOWN, nullable);
-    }
-
-    @Override BasicSqlType createWithNullability(boolean nullable) {
-      if (nullable == this.isNullable) {
-        return this;
-      }
-      return new UnknownSqlType(this.typeSystem, nullable);
-    }
-
-    @Override protected void generateTypeString(StringBuilder sb,
-        boolean withDetail) {
-      sb.append("UNKNOWN");
-    }
-  }
 }
diff --git a/core/src/test/java/org/apache/calcite/sql/type/SqlTypeFactoryTest.java b/core/src/test/java/org/apache/calcite/sql/type/SqlTypeFactoryTest.java
index fa07a31..9f7ec0a 100644
--- a/core/src/test/java/org/apache/calcite/sql/type/SqlTypeFactoryTest.java
+++ b/core/src/test/java/org/apache/calcite/sql/type/SqlTypeFactoryTest.java
@@ -21,7 +21,6 @@ import org.apache.calcite.rel.type.RelDataTypeFactory;
 import org.apache.calcite.rel.type.RelDataTypeField;
 import org.apache.calcite.rel.type.RelDataTypeFieldImpl;
 import org.apache.calcite.rel.type.RelRecordType;
-import org.apache.calcite.sql.type.SqlTypeFactoryImpl.UnknownSqlType;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
@@ -288,18 +287,30 @@ class SqlTypeFactoryTest {
     assertThat(tsWithPrecision3 == tsWithPrecision8, is(true));
   }
 
-  /** Test that the {code UNKNOWN} type does not does not change class when nullified. */
+  /** Test that the {@code UNKNOWN} type is a {@link BasicSqlType} and remains
+   * so when nullified. */
   @Test void testUnknownCreateWithNullabilityTypeConsistency() {
-    SqlTypeFixture f = new SqlTypeFixture();
+    final SqlTypeFixture f = new SqlTypeFixture();
 
-    RelDataType unknownType  = f.typeFactory.createUnknownType();
-    assertThat(unknownType, isA(UnknownSqlType.class));
+    final RelDataType unknownType = f.typeFactory.createUnknownType();
+    assertThat(unknownType, isA(BasicSqlType.class));
     assertThat(unknownType.getSqlTypeName(), is(SqlTypeName.UNKNOWN));
     assertFalse(unknownType.isNullable());
-
-    RelDataType nullableRelDataType = f.typeFactory.createTypeWithNullability(unknownType, true);
-    assertThat(nullableRelDataType, isA(UnknownSqlType.class));
-    assertThat(nullableRelDataType.getSqlTypeName(), is(SqlTypeName.UNKNOWN));
-    assertTrue(nullableRelDataType.isNullable());
+    assertThat(unknownType.getFullTypeString(), is("UNKNOWN NOT NULL"));
+
+    final RelDataType nullableType =
+        f.typeFactory.createTypeWithNullability(unknownType, true);
+    assertThat(nullableType, isA(BasicSqlType.class));
+    assertThat(nullableType.getSqlTypeName(), is(SqlTypeName.UNKNOWN));
+    assertTrue(nullableType.isNullable());
+    assertThat(nullableType.getFullTypeString(), is("UNKNOWN"));
+
+    final RelDataType unknownType2 =
+        f.typeFactory.createTypeWithNullability(nullableType, false);
+    assertThat(unknownType2, is(unknownType));
+    assertThat(unknownType2, isA(BasicSqlType.class));
+    assertThat(unknownType2.getSqlTypeName(), is(SqlTypeName.UNKNOWN));
+    assertFalse(unknownType2.isNullable());
+    assertThat(unknownType2.getFullTypeString(), is("UNKNOWN NOT NULL"));
   }
 }