You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by hy...@apache.org on 2019/10/03 17:21:33 UTC

[calcite] 01/01: [CALCITE-3381] When using BigQuery dialect, Rel2SQL converter converts SQL types to BigQuery types (Rui Wang)

This is an automated email from the ASF dual-hosted git repository.

hyuan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/calcite.git

commit 30a0dd0a2edebdc08292b7d59988c60ccf754bed
Author: amaliujia <am...@163.com>
AuthorDate: Wed Oct 2 11:01:43 2019 -0700

    [CALCITE-3381] When using BigQuery dialect, Rel2SQL converter converts SQL types to BigQuery types (Rui Wang)
    
    VARCHAR -> STRING
    VARBINARY -> BYTES
    BIGINT -> INT64
    DECIMAL -> NUMERIC
    DOUBLE -> FLOAT64
    BOOLEAN -> BOOL
    DATE -> DATE
    TIME -> TIME
    TIMESTAMP -> TIMESTAMP
    
    Close #1482
---
 .../calcite/sql/dialect/BigQuerySqlDialect.java    | 42 ++++++++++++++++++++++
 .../calcite/rel/rel2sql/RelToSqlConverterTest.java | 22 ++++++++++++
 2 files changed, 64 insertions(+)

diff --git a/core/src/main/java/org/apache/calcite/sql/dialect/BigQuerySqlDialect.java b/core/src/main/java/org/apache/calcite/sql/dialect/BigQuerySqlDialect.java
index 8581c68..7917e69 100644
--- a/core/src/main/java/org/apache/calcite/sql/dialect/BigQuerySqlDialect.java
+++ b/core/src/main/java/org/apache/calcite/sql/dialect/BigQuerySqlDialect.java
@@ -18,14 +18,20 @@ package org.apache.calcite.sql.dialect;
 
 import org.apache.calcite.avatica.util.Casing;
 import org.apache.calcite.config.NullCollation;
+import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.sql.SqlCall;
+import org.apache.calcite.sql.SqlDataTypeSpec;
 import org.apache.calcite.sql.SqlDialect;
+import org.apache.calcite.sql.SqlIdentifier;
 import org.apache.calcite.sql.SqlKind;
 import org.apache.calcite.sql.SqlNode;
 import org.apache.calcite.sql.SqlOperator;
 import org.apache.calcite.sql.SqlSetOperator;
 import org.apache.calcite.sql.SqlSyntax;
+import org.apache.calcite.sql.SqlUserDefinedTypeNameSpec;
 import org.apache.calcite.sql.SqlWriter;
+import org.apache.calcite.sql.parser.SqlParserPos;
+import org.apache.calcite.sql.type.BasicSqlType;
 
 import com.google.common.collect.ImmutableList;
 
@@ -132,6 +138,42 @@ public class BigQuerySqlDialect extends SqlDialect {
     }
   }
 
+  /** BigQuery data type reference:
+   * <a href="https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types">
+   * Bigquery Standard SQL Data Types</a>
+   */
+  @Override public SqlNode getCastSpec(final RelDataType type) {
+    if (type instanceof BasicSqlType) {
+      switch (type.getSqlTypeName()) {
+      case BIGINT:
+        return createSqlDataTypeSpecByName("INT64");
+      case DOUBLE:
+        return createSqlDataTypeSpecByName("FLOAT64");
+      case DECIMAL:
+        return createSqlDataTypeSpecByName("NUMERIC");
+      case BOOLEAN:
+        return createSqlDataTypeSpecByName("BOOL");
+      case VARCHAR:
+        return createSqlDataTypeSpecByName("STRING");
+      case VARBINARY:
+        return createSqlDataTypeSpecByName("BYTES");
+      case DATE:
+        return createSqlDataTypeSpecByName("DATE");
+      case TIME:
+        return createSqlDataTypeSpecByName("TIME");
+      case TIMESTAMP:
+        return createSqlDataTypeSpecByName("TIMESTAMP");
+      }
+    }
+    return super.getCastSpec(type);
+  }
+
+  private SqlDataTypeSpec createSqlDataTypeSpecByName(String identifierName) {
+    SqlUserDefinedTypeNameSpec typeNameSpec = new SqlUserDefinedTypeNameSpec(
+            new SqlIdentifier(identifierName, SqlParserPos.ZERO), SqlParserPos.ZERO);
+    return new SqlDataTypeSpec(typeNameSpec, SqlParserPos.ZERO);
+  }
+
   /**
    * List of BigQuery Specific Operators needed to form Syntactically Correct SQL.
    */
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 a4185b2..6a137ac 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
@@ -816,6 +816,28 @@ public class RelToSqlConverterTest {
     sql(query).withHive().ok(expected);
   }
 
+  @Test public void testBigQueryCast() {
+    String query = "select cast(cast(\"employee_id\" as varchar) as bigint), "
+            + "cast(cast(\"employee_id\" as varchar) as varbinary), "
+            + "cast(cast(\"employee_id\" as varchar) as timestamp), "
+            + "cast(cast(\"employee_id\" as varchar) as double), "
+            + "cast(cast(\"employee_id\" as varchar) as decimal), "
+            + "cast(cast(\"employee_id\" as varchar) as date), "
+            + "cast(cast(\"employee_id\" as varchar) as time), "
+            + "cast(cast(\"employee_id\" as varchar) as boolean) "
+            + "from \"foodmart\".\"reserve_employee\" ";
+    final String expected = "SELECT CAST(CAST(employee_id AS STRING) AS INT64), "
+            + "CAST(CAST(employee_id AS STRING) AS BYTES), "
+            + "CAST(CAST(employee_id AS STRING) AS TIMESTAMP), "
+            + "CAST(CAST(employee_id AS STRING) AS FLOAT64), "
+            + "CAST(CAST(employee_id AS STRING) AS NUMERIC), "
+            + "CAST(CAST(employee_id AS STRING) AS DATE), "
+            + "CAST(CAST(employee_id AS STRING) AS TIME), "
+            + "CAST(CAST(employee_id AS STRING) AS BOOL)\n"
+            + "FROM foodmart.reserve_employee";
+    sql(query).withBigQuery().ok(expected);
+  }
+
   /** Test case for
    * <a href="https://issues.apache.org/jira/browse/CALCITE-3220">[CALCITE-3220]
    * HiveSqlDialect should transform the SQL-standard TRIM function to TRIM,