You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by za...@apache.org on 2021/07/16 10:58:18 UTC
[calcite] branch master updated: [CALCITE-4692] Redshift does not
support DOUBLE/TINYINT datatypes (Narayanan Venkateswaran)
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 <vn...@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"