From c7724b46dfab279fcc8281d491e85c778163dfb1 Mon Sep 17 00:00:00 2001 From: ClownXC Date: Sat, 4 Jan 2025 19:31:30 +0800 Subject: [PATCH] [CALCITE-6699] Invalid unparse for Varchar in StarRocksDialect --- .../sql/dialect/StarRocksSqlDialect.java | 30 +++++++++++++++++ .../rel/rel2sql/RelToSqlConverterTest.java | 33 +++++++++++++++++++ 2 files changed, 63 insertions(+) diff --git a/core/src/main/java/org/apache/calcite/sql/dialect/StarRocksSqlDialect.java b/core/src/main/java/org/apache/calcite/sql/dialect/StarRocksSqlDialect.java index ded2bbf96e44..e22b63b13d43 100644 --- a/core/src/main/java/org/apache/calcite/sql/dialect/StarRocksSqlDialect.java +++ b/core/src/main/java/org/apache/calcite/sql/dialect/StarRocksSqlDialect.java @@ -19,6 +19,8 @@ import org.apache.calcite.avatica.util.TimeUnitRange; import org.apache.calcite.config.NullCollation; import org.apache.calcite.rel.type.RelDataType; +import org.apache.calcite.rel.type.RelDataTypeSystem; +import org.apache.calcite.rel.type.RelDataTypeSystemImpl; import org.apache.calcite.sql.SqlAbstractDateTimeLiteral; import org.apache.calcite.sql.SqlAlienSystemTypeNameSpec; import org.apache.calcite.sql.SqlBasicTypeNameSpec; @@ -41,9 +43,33 @@ */ public class StarRocksSqlDialect extends MysqlSqlDialect { + /** StarRocks type system. */ + public static final RelDataTypeSystem STARROCKS_TYPE_SYSTEM = + new RelDataTypeSystemImpl() { + @Override public int getMaxPrecision(SqlTypeName typeName) { + switch (typeName) { + case CHAR: + return 255; + case VARCHAR: + return 65533; + case VARBINARY: + return 1048576; + default: + return super.getMaxPrecision(typeName); + } + } + @Override public int getDefaultPrecision(SqlTypeName typeName) { + if (typeName == SqlTypeName.CHAR) { + return RelDataType.PRECISION_NOT_SPECIFIED; + } + return super.getDefaultPrecision(typeName); + } + }; + public static final SqlDialect.Context DEFAULT_CONTEXT = SqlDialect.EMPTY_CONTEXT .withDatabaseProduct(SqlDialect.DatabaseProduct.STARROCKS) .withIdentifierQuoteString("`") + .withDataTypeSystem(STARROCKS_TYPE_SYSTEM) .withNullCollation(NullCollation.LOW); public static final SqlDialect DEFAULT = new StarRocksSqlDialect(DEFAULT_CONTEXT); @@ -128,6 +154,10 @@ public StarRocksSqlDialect(Context context) { type.getSqlTypeName(), SqlParserPos.ZERO), SqlParserPos.ZERO); + case VARCHAR: + return new SqlDataTypeSpec( + new SqlBasicTypeNameSpec(SqlTypeName.VARCHAR, type.getPrecision(), SqlParserPos.ZERO), + SqlParserPos.ZERO); default: return super.getCastSpec(type); } 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 628d29db79c0..d757deec68f3 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 @@ -3771,6 +3771,39 @@ private SqlDialect nonOrdinalDialect() { sql(query).dialect(mySqlDialect(NullCollation.LAST)).ok(expected); } + /** Test case for + * [CALCITE-6699] + * Invalid unparse for Varchar in StarRocksDialect . */ + @Test void testStarRocksCastToVarcharWithLessThanMaxPrecision() { + final String query = "select cast(\"product_id\" as varchar(50)), \"product_id\" " + + "from \"product\" "; + final String expected = "SELECT CAST(`product_id` AS VARCHAR(50)), `product_id`\n" + + "FROM `foodmart`.`product`"; + sql(query).withStarRocks().ok(expected); + } + + /** Test case for + * [CALCITE-6699] + * Invalid unparse for Varchar in StarRocksDialect . */ + @Test void testStarRocksCastToVarcharWithGreaterThanMaxPrecision() { + final String query = "select cast(\"product_id\" as varchar(150000)), \"product_id\" " + + "from \"product\" "; + final String expected = "SELECT CAST(`product_id` AS VARCHAR(65533)), `product_id`\n" + + "FROM `foodmart`.`product`"; + sql(query).withStarRocks().ok(expected); + } + + /** Test case for + * [CALCITE-6699] + * Invalid unparse for Varchar in StarRocksDialect . */ + @Test void testStarRocksCastToVarcharWithDefaultPrecision() { + final String query = "select cast(\"product_id\" as varchar), \"product_id\" " + + "from \"product\" "; + final String expected = "SELECT CAST(`product_id` AS VARCHAR), `product_id`\n" + + "FROM `foodmart`.`product`"; + sql(query).withStarRocks().ok(expected); + } + /** Test case for * [CALCITE-6419] * Invalid unparse for VARCHAR without precision in HiveSqlDialect And SparkSqlDialect. */