[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
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 @@
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 @@
@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 @@
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 @@
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 @@
@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);