This is an automated email from the ASF dual-hosted git repository.
mbudiu pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/calcite.git
The following commit(s) were added to refs/heads/main by this push:
new 7b97c4e458 [CALCITE-6149] Unparse for CAST Nullable with
ClickHouseSqlDialect
7b97c4e458 is described below
commit 7b97c4e4581094cc405d0f0fa4c16f462ef1166d
Author: chen768959 <[email protected]>
AuthorDate: Fri Dec 8 17:08:54 2023 +0800
[CALCITE-6149] Unparse for CAST Nullable with ClickHouseSqlDialect
---
.../calcite/sql/dialect/ClickHouseSqlDialect.java | 26 +++++++++++++---------
.../calcite/rel/rel2sql/RelToSqlConverterTest.java | 15 +++++++++++++
2 files changed, 30 insertions(+), 11 deletions(-)
diff --git
a/core/src/main/java/org/apache/calcite/sql/dialect/ClickHouseSqlDialect.java
b/core/src/main/java/org/apache/calcite/sql/dialect/ClickHouseSqlDialect.java
index b6616d0c94..9fc3618924 100644
---
a/core/src/main/java/org/apache/calcite/sql/dialect/ClickHouseSqlDialect.java
+++
b/core/src/main/java/org/apache/calcite/sql/dialect/ClickHouseSqlDialect.java
@@ -79,25 +79,25 @@ public class ClickHouseSqlDialect extends SqlDialect {
SqlTypeName typeName = type.getSqlTypeName();
switch (typeName) {
case VARCHAR:
- return createSqlDataTypeSpecByName("String", typeName);
+ return createSqlDataTypeSpecByName("String", typeName,
type.isNullable());
case TINYINT:
- return createSqlDataTypeSpecByName("Int8", typeName);
+ return createSqlDataTypeSpecByName("Int8", typeName,
type.isNullable());
case SMALLINT:
- return createSqlDataTypeSpecByName("Int16", typeName);
+ return createSqlDataTypeSpecByName("Int16", typeName,
type.isNullable());
case INTEGER:
- return createSqlDataTypeSpecByName("Int32", typeName);
+ return createSqlDataTypeSpecByName("Int32", typeName,
type.isNullable());
case BIGINT:
- return createSqlDataTypeSpecByName("Int64", typeName);
+ return createSqlDataTypeSpecByName("Int64", typeName,
type.isNullable());
case REAL:
- return createSqlDataTypeSpecByName("Float32", typeName);
+ return createSqlDataTypeSpecByName("Float32", typeName,
type.isNullable());
case FLOAT:
case DOUBLE:
- return createSqlDataTypeSpecByName("Float64", typeName);
+ return createSqlDataTypeSpecByName("Float64", typeName,
type.isNullable());
case DATE:
- return createSqlDataTypeSpecByName("Date", typeName);
+ return createSqlDataTypeSpecByName("Date", typeName,
type.isNullable());
case TIMESTAMP:
case TIMESTAMP_WITH_LOCAL_TIME_ZONE:
- return createSqlDataTypeSpecByName("DateTime", typeName);
+ return createSqlDataTypeSpecByName("DateTime", typeName,
type.isNullable());
default:
break;
}
@@ -107,11 +107,15 @@ public class ClickHouseSqlDialect extends SqlDialect {
}
private static SqlDataTypeSpec createSqlDataTypeSpecByName(String typeAlias,
- SqlTypeName typeName) {
+ SqlTypeName typeName, boolean isNullable) {
+ if (isNullable) {
+ typeAlias = "Nullable(" + typeAlias + ")";
+ }
+ String finalTypeAlias = typeAlias;
SqlBasicTypeNameSpec spec = new SqlBasicTypeNameSpec(typeName,
SqlParserPos.ZERO) {
@Override public void unparse(SqlWriter writer, int leftPrec, int
rightPrec) {
// unparse as an identifier to ensure that type names are cased
correctly
- writer.identifier(typeAlias, true);
+ writer.identifier(finalTypeAlias, true);
}
};
return new SqlDataTypeSpec(spec, SqlParserPos.ZERO);
diff --git
a/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java
b/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java
index aedc4bdc37..3a4c480aa3 100644
---
a/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java
+++
b/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java
@@ -7120,6 +7120,21 @@ class RelToSqlConverterTest {
.withBigQuery().ok(expectedBiqquery);
}
+ /** Test case for
+ * <a
href="https://issues.apache.org/jira/browse/CALCITE-6149">[CALCITE-6149]
+ * Unparse for CAST Nullable with ClickHouseSqlDialect</a>. */
+ @Test void testCastToNullableInClickhouse() {
+ final String query = ""
+ + "SELECT CASE WHEN \"product_id\" IS NULL "
+ + "THEN CAST(\"product_id\" AS TINYINT) END, CAST(\"product_id\" AS
TINYINT)\n"
+ + "FROM \"foodmart\".\"product\"";
+ final String expectedSql = ""
+ + "SELECT CAST(NULL AS `Nullable(Int8)`), CAST(`product_id` AS
`Int8`)\n"
+ + "FROM `foodmart`.`product`";
+
+ sql(query).withClickHouse().ok(expectedSql);
+ }
+
@Test void testDialectQuoteStringLiteral() {
dialects().forEach((dialect, databaseProduct) -> {
assertThat(dialect.quoteStringLiteral(""), is("''"));