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 115b66fa215f..d0ccab7dfd2f 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 @@ -561,7 +561,7 @@ private static void assertBasic(SqlTypeName typeName) { } } - if (type.getSqlTypeName() == resultType.getSqlTypeName() + if (type.getSqlTypeName().getFamily() == resultType.getSqlTypeName().getFamily() && type.getSqlTypeName().allowsPrec() && type.getPrecision() != resultType.getPrecision()) { final int precision = 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 8f5e5e4018db..f0ff190d28c7 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 @@ -33,6 +33,7 @@ import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.hasToString; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -172,6 +173,30 @@ class SqlTypeFactoryTest { assertThat(leastRestrictive.getPrecision(), is(3)); } + /** + * Test case for + * + * LeastRetrictiveSqlType for TIMESTAMP, TIMESTAMP_LTZ might ignore precision. */ + @Test void testLeastRestrictiveForTimestampAndTimestampLtz() { + SqlTypeFixture f = new SqlTypeFixture(); + RelDataType ltz0 = + f.typeFactory.createSqlType(SqlTypeName.TIMESTAMP_WITH_LOCAL_TIME_ZONE, 0); + RelDataType leastRestrictive = + f.typeFactory.leastRestrictive(Lists.newArrayList(ltz0, f.sqlTimestampPrec3)); + assertThat(leastRestrictive, is(notNullValue())); + assertThat(leastRestrictive.getPrecision(), is(3)); + } + + @Test void testLeastRestrictiveForTimestampLtzAndTimestamp() { + SqlTypeFixture f = new SqlTypeFixture(); + RelDataType ltz0 = + f.typeFactory.createSqlType(SqlTypeName.TIMESTAMP_WITH_LOCAL_TIME_ZONE, 0); + RelDataType leastRestrictive = + f.typeFactory.leastRestrictive(Lists.newArrayList(f.sqlTimestampPrec3, ltz0)); + assertThat(leastRestrictive, is(notNullValue())); + assertThat(leastRestrictive.getPrecision(), is(3)); + } + @Test void testLeastRestrictiveForTimestampAndDate() { SqlTypeFixture f = new SqlTypeFixture(); RelDataType leastRestrictive =