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("''"));

Reply via email to