By join analysis, I assume you are referring to
https://github.com/apache/calcite/blob/main/core/src/main/java/org/apache/calcite/rel/metadata/RelMdColumnUniqueness.java#L336

The thing is, a join as the potential to make a unique column no longer
unique, as it could be an expanding join. e.g. joining these two tables on
b = c. Column a is unique on its own, but d is not.

a b      c   d
1 1      1   1
2 1      1   1

a b c  d
1 1 1 1
1 1 1 1
2 1 1 1
2 1 1 1

After the join, the key (a, d) is not unique. So the rule is not too
conservative.

On Fri, Mar 7, 2025 at 12:57 PM Ian Bertolacci
<ian.bertola...@workday.com.invalid> wrote:

> Two comments:
> First: on our side, we’d like to know if *removing* the use of this
> predicate pullup information would have *negative* consequences for
> correctness.
> If it does not impact correctness: we can override the behavior to not
> consider this information, and move forwards.
>
> Second: a colleague pointed out that join’s notion of unique may also be
> too conservative, depending on what RelMdColumnUniqueness.areColumnsUnique
> is really supposed to be doing.
> If the intention is to check if the bitset of columns forms a unique key,
> then the join analysis is too conservative, since if there are unique
> columns from one side, and non-unique from the other, the whole key is
> considered not unique, even though the presence of *any* unique column
> makes the overall key unique. (Its worth pointing out that this is how
> Statisitcs.isKey works, which is how areColumnsUnique(TableScan) works if
> that RelOptTable does not provide a special uniqueness handler).
> If the intention is to check if *any* column in the bitset is itself
> unique, then the join analysis is also too conservative, for the same
> reasons.
> If the intention is to check if *all* column in the bitset is itself
> unique, then the join analysis is fine but the TableScan’s default analysis
> is incorrect (for reasons mentioned above).
>
> So there’s more than just this predicate pullup at play here.
>

Reply via email to