This is an automated email from the ASF dual-hosted git repository. zabetak 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 3c4dd30 [CALCITE-4692] Redshift does not support DOUBLE/TINYINT datatypes (Narayanan Venkateswaran) 3c4dd30 is described below commit 3c4dd308fe8f836ef63592bdb9045af0d0400ddf Author: Narayanan Venkateswaran <vnh...@gmail.com> AuthorDate: Tue Jul 13 12:31:16 2021 +0530 [CALCITE-4692] Redshift does not support DOUBLE/TINYINT datatypes (Narayanan Venkateswaran) Close apache/calcite#2459 --- .../calcite/sql/dialect/RedshiftSqlDialect.java | 31 ++++++++++++++++++++++ .../calcite/rel/rel2sql/RelToSqlConverterTest.java | 18 +++++++++++++ 2 files changed, 49 insertions(+) diff --git a/core/src/main/java/org/apache/calcite/sql/dialect/RedshiftSqlDialect.java b/core/src/main/java/org/apache/calcite/sql/dialect/RedshiftSqlDialect.java index 243a6f6..5785520 100644 --- a/core/src/main/java/org/apache/calcite/sql/dialect/RedshiftSqlDialect.java +++ b/core/src/main/java/org/apache/calcite/sql/dialect/RedshiftSqlDialect.java @@ -17,9 +17,13 @@ package org.apache.calcite.sql.dialect; import org.apache.calcite.avatica.util.Casing; +import org.apache.calcite.rel.type.RelDataType; +import org.apache.calcite.sql.SqlDataTypeSpec; import org.apache.calcite.sql.SqlDialect; import org.apache.calcite.sql.SqlNode; +import org.apache.calcite.sql.SqlUserDefinedTypeNameSpec; import org.apache.calcite.sql.SqlWriter; +import org.apache.calcite.sql.parser.SqlParserPos; import org.checkerframework.checker.nullness.qual.Nullable; @@ -49,4 +53,31 @@ public class RedshiftSqlDialect extends SqlDialect { @Override public boolean supportsCharSet() { return false; } + + @Override public @Nullable SqlNode getCastSpec(RelDataType type) { + String castSpec; + switch (type.getSqlTypeName()) { + case TINYINT: + // Redshift has no tinyint (1 byte), so instead cast to smallint or int2 (2 bytes). + // smallint does not work when enclosed in quotes (i.e.) as "smallint". + // int2 however works within quotes (i.e.) as "int2". + // Hence using int2. + castSpec = "int2"; + break; + case DOUBLE: + // Redshift has a double type but it is named differently. It is named as double precision or + // float8. + // double precision does not work when enclosed in quotes (i.e.) as "double precision". + // float8 however works within quotes (i.e.) as "float8". + // Hence using float8. + castSpec = "float8"; + break; + default: + return super.getCastSpec(type); + } + + return new SqlDataTypeSpec( + new SqlUserDefinedTypeNameSpec(castSpec, SqlParserPos.ZERO), + 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 c48931b..3db6777 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 @@ -5441,6 +5441,24 @@ class RelToSqlConverterTest { .ok(expected); } + @Test void testRedshiftCastToTinyint() { + String query = "SELECT CAST(\"department_id\" AS tinyint) FROM \"employee\""; + String expected = "SELECT CAST(\"department_id\" AS \"int2\")\n" + + "FROM \"foodmart\".\"employee\""; + sql(query) + .withRedshift() + .ok(expected); + } + + @Test void testRedshiftCastToDouble() { + String query = "SELECT CAST(\"department_id\" AS double) FROM \"employee\""; + String expected = "SELECT CAST(\"department_id\" AS \"float8\")\n" + + "FROM \"foodmart\".\"employee\""; + sql(query) + .withRedshift() + .ok(expected); + } + @Test void testDateLiteralOracle() { String query = "SELECT DATE '1978-05-02' FROM \"employee\""; String expected = "SELECT TO_DATE('1978-05-02', 'YYYY-MM-DD')\n"