This is an automated email from the ASF dual-hosted git repository. jhyde pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/calcite.git
commit d64fd60477b7c9a15473d89b350fc80c2151ee6e Author: Liu Enze <[email protected]> AuthorDate: Wed Aug 11 13:50:25 2021 +0800 [CALCITE-4724] In JDBC adapter for ClickHouse, implement Values by generating SELECT without FROM (Liu Enze) Fix by making SqlDialect.supportsAliasedValues return false in the ClickHouse dialect, similar to MySQL. Close apache/calcite#2480 --- .../calcite/sql/dialect/ClickHouseSqlDialect.java | 4 ++++ .../calcite/rel/rel2sql/RelToSqlConverterTest.java | 20 ++++++++++++++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/org/apache/calcite/sql/dialect/ClickHouseSqlDialect.java b/core/src/main/java/org/apache/calcite/sql/dialect/ClickHouseSqlDialect.java index 14f93c2..6674310 100644 --- a/core/src/main/java/org/apache/calcite/sql/dialect/ClickHouseSqlDialect.java +++ b/core/src/main/java/org/apache/calcite/sql/dialect/ClickHouseSqlDialect.java @@ -68,6 +68,10 @@ public class ClickHouseSqlDialect extends SqlDialect { return false; } + @Override public boolean supportsAliasedValues() { + return false; + } + @Override public CalendarPolicy getCalendarPolicy() { return CalendarPolicy.SHIFT; } 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 98f75c9..3539c31 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 @@ -4817,6 +4817,10 @@ class RelToSqlConverterTest { @Test void testValues() { final String sql = "select \"a\"\n" + "from (values (1, 'x'), (2, 'yy')) as t(\"a\", \"b\")"; + final String expectedClickHouse = "SELECT `a`\n" + + "FROM (SELECT 1 AS `a`, 'x ' AS `b`\n" + + "UNION ALL\n" + + "SELECT 2 AS `a`, 'yy' AS `b`)"; // almost the same as MySQL final String expectedHsqldb = "SELECT a\n" + "FROM (VALUES (1, 'x '),\n" + "(2, 'yy')) AS t (a, b)"; @@ -4844,6 +4848,7 @@ class RelToSqlConverterTest { final String expectedSnowflake = expectedPostgresql; final String expectedRedshift = expectedPostgresql; sql(sql) + .withClickHouse().ok(expectedClickHouse) .withBigQuery().ok(expectedBigQuery) .withHive().ok(expectedHive) .withHsqldb().ok(expectedHsqldb) @@ -4869,24 +4874,33 @@ class RelToSqlConverterTest { final String expectedPostgresql = "SELECT *\n" + "FROM (VALUES (NULL, NULL)) AS \"t\" (\"X\", \"Y\")\n" + "WHERE 1 = 0"; + final String expectedClickHouse = expectedMysql; sql(sql) .optimize(rules, null) + .withClickHouse().ok(expectedClickHouse) .withMysql().ok(expectedMysql) .withOracle().ok(expectedOracle) .withPostgresql().ok(expectedPostgresql); } /** Tests SELECT without FROM clause; effectively the same as a VALUES - * query. */ + * query. + * + * <p>Test case for + * <a href="https://issues.apache.org/jira/browse/CALCITE-4724">[CALCITE-4724] + * In JDBC adapter for ClickHouse, implement Values by generating SELECT + * without FROM</a>. */ @Test void testSelectWithoutFrom() { final String query = "select 2 + 2"; final String expectedBigQuery = "SELECT 2 + 2"; + final String expectedClickHouse = expectedBigQuery; final String expectedHive = expectedBigQuery; - final String expectedMysql = "SELECT 2 + 2"; + final String expectedMysql = expectedBigQuery; final String expectedPostgresql = "SELECT 2 + 2\n" + "FROM (VALUES (0)) AS \"t\" (\"ZERO\")"; sql(query) .withBigQuery().ok(expectedBigQuery) + .withClickHouse().ok(expectedClickHouse) .withHive().ok(expectedHive) .withMysql().ok(expectedMysql) .withPostgresql().ok(expectedPostgresql); @@ -4895,12 +4909,14 @@ class RelToSqlConverterTest { @Test void testSelectOne() { final String query = "select 1"; final String expectedBigQuery = "SELECT 1"; + final String expectedClickHouse = expectedBigQuery; final String expectedHive = expectedBigQuery; final String expectedMysql = expectedBigQuery; final String expectedPostgresql = "SELECT *\n" + "FROM (VALUES (1)) AS \"t\" (\"EXPR$0\")"; sql(query) .withBigQuery().ok(expectedBigQuery) + .withClickHouse().ok(expectedClickHouse) .withHive().ok(expectedHive) .withMysql().ok(expectedMysql) .withPostgresql().ok(expectedPostgresql);
