You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@ignite.apache.org by "Isaac Zhu (Jira)" <ji...@apache.org> on 2020/09/13 04:58:00 UTC

[jira] [Created] (IGNITE-13443) distributed left joins errored with "java.lang.ClassCastException"

Isaac Zhu created IGNITE-13443:
----------------------------------

             Summary: distributed left joins errored with "java.lang.ClassCastException"
                 Key: IGNITE-13443
                 URL: https://issues.apache.org/jira/browse/IGNITE-13443
             Project: Ignite
          Issue Type: Bug
          Components: h2-limitation
    Affects Versions: 2.8.1
            Reporter: Isaac Zhu
         Attachments: JoinBatch.java

This is actually an H2 1.4.197 Bug

When using *distributed joins*, SQL like this (table A and table B are not collocated, so distributed join is used here):

     select * from table A left join table B on A.id = B.id left join table C on B.id = C.id where ...

has chance to error out at the second left join with a "java.lang.ClassCastException" when the first left join had an EmptyCursor

 

This is because, for distributed join, H2 JoinBatch is used - it seems JoinBatch is not used for collocated join.

In JoinBatch line 292:

[https://github.com/h2database/h2database/blob/c8a861bb1a3f04967ec40cb5e3336535c43af5fb/h2/src/main/org/h2/table/JoinBatch.java#L292]

It increases the filter ID to let the next fetchCurrent call resolve the "EMPTY_CURSOR" to a NullRow when a "JoinFilter.find" is not called.

Then, in the "find" call, the resolved NullRow will be updated to some cursor from the future - because only EmptyCursor is skipped in the find(), a NullRow will be updated again and the bitwise state goes wrong

This then causes the exception in "fetchCurrent" line:  358

[https://github.com/h2database/h2database/blob/c8a861bb1a3f04967ec40cb5e3336535c43af5fb/h2/src/main/org/h2/table/JoinBatch.java#L358]

The "x" is a Future, so it can't be cast to a Cursor - the state is wrong, the "isFuture" returns false while it is a Future.

 

I did a local fix in our server as a workaround in org.h2.table.JoinBatch, the changed code is attached.

 



--
This message was sent by Atlassian Jira
(v8.3.4#803005)