Yu Tang created CALCITE-6727:
--------------------------------

             Summary: Column uniqueness constrain should only apply to inner 
join
                 Key: CALCITE-6727
                 URL: https://issues.apache.org/jira/browse/CALCITE-6727
             Project: Calcite
          Issue Type: Bug
          Components: core
    Affects Versions: 1.38.0
            Reporter: Yu Tang


When joining with a singleton relation, the keys from the other side are 
considered to be "associative unique".
{code:java}
// RelMdColumnUniqueness.areColumnsUnique(Join rel, RelMetadataQuery mq ...

final Double rightMaxRowCount = mq.getMaxRowCount(right);
if (rightMaxRowCount != null && rightMaxRowCount <= 1.0) {
  leftColumns = leftColumns.union(joinInfo.leftSet());
}
final Double leftMaxRowCount = mq.getMaxRowCount(left);
if (leftMaxRowCount != null && leftMaxRowCount <= 1.0) {
  rightColumns = rightColumns.union(joinInfo.rightSet());
} {code}
In the case
{code:java}
@Test void testColumnUniquenessForJoinOnLimit1() {
  final String sql = ""
      + "select *\n"
      + "from emp A\n"
      + "join (\n"
      + "  select * from emp\n"
      + "  limit 1) B\n"
      + "on A.empno = B.empno";
  sql(sql)
      .assertThatAreColumnsUnique(bitSetOf(0), is(true))
      .assertThatAreColumnsUnique(bitSetOf(1), is(true))
      .assertThatAreColumnsUnique(bitSetOf(9), is(true))
      .assertThatAreColumnsUnique(bitSetOf(10), is(true))
      .assertThatAreColumnsUnique(bitSetOf(), is(true))
      .assertThatUniqueKeysAre(bitSetOf());
} {code}
the join result {{A.ENAME}} is considered to be unique because {{A.EMPNO}} is 
the unique key. The test still passes when we change it to left join, in which 
case {{A.ENAME}} is not guaranteed to be unique. 



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to