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"