[
https://issues.apache.org/jira/browse/CALCITE-5032?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Haisheng Yuan resolved CALCITE-5032.
------------------------------------
Fix Version/s: 1.30.0
Resolution: Fixed
Fixed in
https://github.com/apache/calcite/commit/fe9766aaa5739f59f757206c57c1b9cc071cd6f6,
thanks for your work, [~libenchao]!
> The unexpected behavior on method RelOptUtil#splitJoinCondition
> ---------------------------------------------------------------
>
> Key: CALCITE-5032
> URL: https://issues.apache.org/jira/browse/CALCITE-5032
> Project: Calcite
> Issue Type: Bug
> Components: core
> Reporter: luoyuxia
> Assignee: Benchao Li
> Priority: Major
> Labels: pull-request-available
> Fix For: 1.30.0
>
> Time Spent: 1h 20m
> Remaining Estimate: 0h
>
> When I call the method
> {code:java}
> RexNode splitJoinCondition(
> List<RelDataTypeField> sysFieldList,
> List<RelNode> inputs,
> RexNode condition,
> List<List<RexNode>> joinKeys,
> @Nullable List<Integer> filterNulls,
> @Nullable List<SqlOperator> rangeOp)
> {code}
> , and the passed `joinKeys` is list with size 2, `condition` is like "1 =
> 1", then I found the `joinKeys` passed dosen't change as expected.
> For the `joinKeys`, the first list will contain two RexNodes, and the second
> list contains no RexNode. I think the expected behavior should be the first
> list contain one RexNode, and the second contain one RexNode too.
> After I dive into the code, I found such code will be invoked:
> {code:java}
> if ((rangeOp == null)
> && ((leftKey == null) || (rightKey == null))) {
> // no equality join keys found yet:
> // try transforming the condition to
> // equality "join" conditions, e.g.
> // f(LHS) > 0 ===> ( f(LHS) > 0 ) = TRUE,
> // and make the RHS produce TRUE, but only if we're strictly
> // looking for equi-joins
> final ImmutableBitSet projRefs = InputFinder.bits(condition);
> leftKey = null;
> rightKey = null;
> boolean foundInput = false;
> for (int i = 0; i < inputs.size() && !foundInput; i++) {
> if (inputsRange[i].contains(projRefs)) {
> leftInput = i;
> leftFields = inputs.get(leftInput).getRowType().getFieldList();
> leftKey = condition.accept(
> new RelOptUtil.RexInputConverter(
> rexBuilder,
> leftFields,
> leftFields,
> adjustments));
> rightKey = rexBuilder.makeLiteral(true);
> // effectively performing an equality comparison
> kind = SqlKind.EQUALS;
> foundInput = true;
> }
> }
> }
> {code}
> It'll set `leftKey` and `righeKey`, but it won't set `rightInput`. So
> `rightInput` will be 0.
> Then it'll try to add `leftKey` and `righeKey` to `joinKeys`,
> {code:java}
> addJoinKey(
> joinKeys.get(leftInput),
> leftKey,
> (rangeOp != null) && !rangeOp.isEmpty());
> addJoinKey(
> joinKeys.get(rightInput),
> rightKey,
> (rangeOp != null) && !rangeOp.isEmpty());
> {code}
> But the `rightInput` is 0, so the first list of `joinKeys` will be also add
> `righeKey`.
> Could anyone please help me? Is it a bug or I misunderstand something? Thanks
> very much.
--
This message was sent by Atlassian Jira
(v8.20.1#820001)