qiang.wang created CALCITE-5927: ----------------------------------- Summary: LoptOptimizeJoinRule has wrong condition when finding out if Self-Join keys are unique Key: CALCITE-5927 URL: https://issues.apache.org/jira/browse/CALCITE-5927 Project: Calcite Issue Type: Bug Components: core Affects Versions: 1.35.0, 1.34.0, 1.33.0 Reporter: qiang.wang
There's wrong condition in function _areSelfJoinKeysUnique._ {code:java} // Make sure each key on the left maps to the same simple column as the // corresponding key on the right for (IntPair pair : joinInfo.pairs()) { final RelColumnOrigin leftOrigin = mq.getColumnOrigin(leftRel, pair.source); if (leftOrigin == null || !leftOrigin.isDerived()) { return false; } final RelColumnOrigin rightOrigin = mq.getColumnOrigin(rightRel, pair.target); if (rightOrigin == null || !rightOrigin.isDerived()) { return false; } if (leftOrigin.getOriginColumnOrdinal() != rightOrigin.getOriginColumnOrdinal()) { return false; } } {code} The wrong conditions are '{_}if (leftOrigin == null || !leftOrigin.isDerived()){_}' and '{_}if (rightOrigin == null || !rightOrigin.isDerived()){_}'. This function wants to find out if the self-join keys are unique. so for each self-join key, find _leftOrigin_ and _rightOrigin_ first, then will return false if any of them is null. But why it returns false when any of them is not _Derived?_ I think exactly the opposite is right. I think this is a bug comes from CALCITE-4251 Before that PR, this function will return false only when _leftOrigin_ or _rightOrigin_ is null, and the function _RelMetadataQuery#getColumnOrigin_ will return null if column is derived, so the logic is : 'this function will return null when _leftOrigin_ or _rightOrigin_ is null or is derived', but now is : 'this function will return null when _leftOrigin_ or _rightOrigin_ is null or is not derived'. -- This message was sent by Atlassian Jira (v8.20.10#820010)