You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@calcite.apache.org by "Julian Hyde (Jira)" <ji...@apache.org> on 2021/12/02 22:23:00 UTC
[jira] [Updated] (CALCITE-4904) For dialects such as BigQuery, JDBC adapter translates a correlated UNNEST query to invalid SQL
[ https://issues.apache.org/jira/browse/CALCITE-4904?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Julian Hyde updated CALCITE-4904:
---------------------------------
Summary: For dialects such as BigQuery, JDBC adapter translates a correlated UNNEST query to invalid SQL (was: Unnest correlate broken in some SqlDialects)
> For dialects such as BigQuery, JDBC adapter translates a correlated UNNEST query to invalid SQL
> -----------------------------------------------------------------------------------------------
>
> Key: CALCITE-4904
> URL: https://issues.apache.org/jira/browse/CALCITE-4904
> Project: Calcite
> Issue Type: Bug
> Components: core, jdbc-adapter
> Affects Versions: 1.28.0
> Reporter: Daniel Ståhl
> Priority: Minor
>
> There seems to be a bug when generating SQL in the JDBC adapter and doing unnest in some SqlDialects.
> Some SQL dialects throw UnsupportedOperationException via @see SqlImplementor.Context#getAliasContext(RexCorrelVariable)
> Here is a PR that illustrates the bug. [https://github.com/bergman/calcite/pull/2]
> {code}
> @Test void testUnnestCorrelateBrokenInSomeDialects() {
> final String sql = "SELECT did + 1\n"
> + "FROM \"department\", UNNEST(array[\"department_id\", 1]) as t(did)";
> final String expected = "SELECT \"$cor0\".\"DID\" + 1\n"
> + "FROM (SELECT \"department_id\", \"department_description\", ARRAY[\"department_id\", 1] AS \"$f2\"\n"
> + "FROM \"foodmart\".\"department\") AS \"$cor0\",\n"
> + "LATERAL (SELECT \"col_0\" AS \"DID\"\n"
> + "FROM UNNEST (SELECT \"$cor0\".\"$f2\"\n"
> + "FROM (VALUES (0)) AS \"t\" (\"ZERO\")) AS \"t1\" (\"col_0\")) AS \"t2\"";
> sql(sql).ok(expected);
> for (DatabaseProduct databaseProduct : DatabaseProduct.values()) {
> final SqlDialect sqlDialect = databaseProduct.getDialect();
> try {
> sql(sql).dialect(sqlDialect).exec();
> } catch (UnsupportedOperationException e) {
> System.out.println("sqlDialect throws: " + sqlDialect.getClass().getSimpleName());
> e.printStackTrace();
> }
> }
> }
> {code}
> Here is the start of the stacktrace.
> {noformat}
> java.lang.UnsupportedOperationException
> at org.apache.calcite.rel.rel2sql.SqlImplementor$Context.getAliasContext(SqlImplementor.java:950)
> at org.apache.calcite.rel.rel2sql.SqlImplementor$Context.toSql(SqlImplementor.java:628)
> at org.apache.calcite.rel.rel2sql.RelToSqlConverter.visit(RelToSqlConverter.java:440)
> at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
> at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> at java.base/java.lang.reflect.Method.invoke(Method.java:566)
> at org.apache.calcite.util.ReflectUtil$2.invoke(ReflectUtil.java:531)
> at org.apache.calcite.rel.rel2sql.RelToSqlConverter.dispatch(RelToSqlConverter.java:139)
> at org.apache.calcite.rel.rel2sql.RelToSqlConverter.visitInput(RelToSqlConverter.java:147)
> {noformat}
> We discovered that it is related to public boolean supportsAliasedValues() in SqlDialect. For those dialects that it returns false it fails.
> For BigQueryDialect, if you return true it will success but the generated SQL is not compatible with BigQuery. One issue is that LATERAL is not understood.
--
This message was sent by Atlassian Jira
(v8.20.1#820001)