[
https://issues.apache.org/jira/browse/IGNITE-26048?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Vladimir Steshin reassigned IGNITE-26048:
-----------------------------------------
Assignee: Vladimir Steshin
> Calcite. Incorrect processing of IS NOT DISTINCT condition in MergeJoin.
> ------------------------------------------------------------------------
>
> Key: IGNITE-26048
> URL: https://issues.apache.org/jira/browse/IGNITE-26048
> Project: Ignite
> Issue Type: Bug
> Affects Versions: 2.17
> Reporter: Vladimir Steshin
> Assignee: Vladimir Steshin
> Priority: Major
> Labels: calcite, ignite-2, ise
> Time Spent: 20m
> Remaining Estimate: 0h
>
> *Reproducer:*
> {code:java}
> @RunWith(Parameterized.class) public class JoinIntegrationTest extends
> AbstractBasicIntegrationTransactionalTest {
> @Test public void testIsNotDistinctFrom() {
> assertQuery("select t1.c1, t2.c1, t2.c2 from t1 join t2 on t1.c2 is not
> distinct from t2.c2 and t1.c1 = t2.c3 - 1")
> .returns(2, 3, null)
> .check();
> }
> }
> {code}
> *Error:*
> {code:java}
> Test failed
> [test=JoinIntegrationTest#testIsNotDistinctFrom[sqlTxMode=ALL,joinType=MERGE],
> duration=117]
> java.lang.AssertionError: Collections sizes are not equal:
> Expected: [[2, 3, null]] Actual: []
> expected:<1> but was:<0> {code}
> *Note:*
> Works for _NL_JOIN_ and {_}CNL_JOIN{_}.
>
> *Suppose:*
> We incorrectly parse join condition in `{_}MergeJoinConverterRule{_}`:
> {code:java}
> @Override public boolean matchesJoin(RelOptRuleCall call) {
> LogicalJoin logicalJoin = call.rel(0);
> return !F.isEmpty(logicalJoin.analyzeCondition().pairs()) &&
> logicalJoin.analyzeCondition().isEqui();
> } {code}
> and when creating the comparator in
> `{_}LogicalRelImplementor#visit(IgniteMergeJoin rel){_}`:
> {code:java}
> Comparator<Row> comp = expressionFactory.comparator(
> rel.leftCollation().getFieldCollations().subList(0, pairsCnt),
> rel.rightCollation().getFieldCollations().subList(0, pairsCnt),
> rel.getCondition().getKind() == IS_NOT_DISTINCT_FROM ||
> rel.getCondition().getKind() == IS_DISTINCT_FROM
> );
> Node<Row> node = MergeJoinNode.create(ctx, outType, leftType, rightType,
> joinType, comp, hasExchange(rel)); {code}
> We assume that there is only one pair or all of the pairs are of _equi_
> condition or of {_}distinct/is not distinct{_}. But only one of several the
> conditions might be {_}is not distinct{_}.
>
> *Suggestions:*
> # Disable _MergeJoin_ for this case for a while.
> # Use more intelligent join condition analysis like
> `{_}RelOptUtil#splitJoinCondition(){_}` and use separated comparators in
> merge join node for join pair entries.
>
--
This message was sent by Atlassian Jira
(v8.20.10#820010)