[
https://issues.apache.org/jira/browse/CALCITE-5282?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17603425#comment-17603425
]
Stamatis Zampetakis commented on CALCITE-5282:
----------------------------------------------
In a similar situation in HIVE-26524, when there is a left/right join with
empty values it seems possible to remove the join and values branch altogether.
I am guessing that if the empty values disappears from the plan maybe the
problem reported here (for Postgres and other DBMS) may also go away.
[~kramerul] please have a look in the PR for HIVE-26524 and share your
thoughts; at some point there is also some code to introduce typed nulls as you
propose here.
> JdbcValues should add CAST on NULL values
> -----------------------------------------
>
> Key: CALCITE-5282
> URL: https://issues.apache.org/jira/browse/CALCITE-5282
> Project: Calcite
> Issue Type: Bug
> Environment: Calcite 1.13.1 on Mac
> Reporter: Ulrich Kramer
> Priority: Major
>
> The following unit test in {{JdbcAdapterTest.java}} is working fine
> {code:java}
> @Test void testNullValuesPlan() {
> final String sql = "select empno, ename, e.deptno, dname\n"
> + "from scott.emp e left outer join (select * from scott.dept where 0
> = 1) d\n"
> + "on e.deptno = d.deptno";
> final String explain = "PLAN=JdbcToEnumerableConverter\n" +
> " JdbcProject(EMPNO=[$0], ENAME=[$1], DEPTNO=[$2], DNAME=[$4])\n" +
> " JdbcJoin(condition=[=($2, $3)], joinType=[left])\n" +
> " JdbcProject(EMPNO=[$0], ENAME=[$1], DEPTNO=[$7])\n" +
> " JdbcTableScan(table=[[SCOTT, EMP]])\n" +
> " JdbcValues(tuples=[[]])\n\n";
> final String jdbcSql = "SELECT \"t\".\"EMPNO\", \"t\".\"ENAME\",
> \"t\".\"DEPTNO\", \"t0\".\"DNAME\"\n" +
> "FROM (SELECT \"EMPNO\", \"ENAME\", \"DEPTNO\"\n" +
> "FROM \"SCOTT\".\"EMP\") AS \"t\"\n" +
> "LEFT JOIN (SELECT *\n" +
> "FROM (VALUES (NULL, NULL)) AS \"t\" (\"DEPTNO\", \"DNAME\")\n" +
> "WHERE 1 = 0) AS \"t0\" ON \"t\".\"DEPTNO\" = \"t0\".\"DEPTNO\"";
> CalciteAssert.model(JdbcTest.SCOTT_MODEL)
> .query(sql)
> .explainContains(explain)
> .runs();
> }
> {code}
> The problem is that {{JdbcValues}} is loosing the type information for each
> {{NULL}} column
> and postgres complains about that. Inside the join condition {{t.DEPTNO =
> to.DEPTNO}}. postgres doesn't know the type of {{t.DEPTNO}}, assumes it's of
> type {{TEXT}} and raises an error like {{ERROR: operator does not exist: text
> = integer, Hint: No operator matches the given name and argument types. You
> might need to add explicit type casts.}}
> Would it be possible to add a {{CAST}} in case of {{NULL}} values in
> {{JdbcValues}}.
> Changing {{VALUES (NULL, NULL)}} to {{VALUES (CAST(NULL AS ...), CAST(NULL
> AS ...))}} in the resulting SQL statement.
> If it is appreciated, we could provide a PR.
> If you are asking yourself, why we are doing something strange like {{WHERE 1
> = 0}}: We are applying row level access policies as WHERE condition. In this
> case the user has no access to the table at all.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)