Null-aware hash join loses `NOT IN` semantics when converted to `SymmetricHashJoinExec`

Aberta
#27,225 0 comentários 0 reações 0 responsáveis Ver no GitHub

Mantenedores costumam responder em até 1 dia

Ninguém assumiu esta issue ainda.

  • #27226 de @shehabgamin — fechado sem integrar

Avaliação

Dificuldade
2/5
Tempo estimado
1-3 horas
Facilidade para iniciantes
35/100
Tipo de issue
Bug
Clareza
Claramente especificada
Status de atividade
Estagnada
Stack de tecnologia
rust
Domínio
databases

Direção de pesquisa

Start by reading JoinSelection and SymmetricHashJoinExec in DataFusion’s Rust source, then trace the null_aware handling for HashJoinExec. Add or use a regression test that builds the null-aware LeftAnti join described in the issue and runs JoinSelection. Done means optimization keeps it as HashJoinExec; an open linked pull request already addresses this issue.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

bug
Describe the bug

JoinSelection turns a HashJoinExec into a SymmetricHashJoinExec when both inputs are unbounded. It does this without checking null_aware. SymmetricHashJoinExec has no null-aware mode, so the flag is dropped and a NOT IN join becomes a plain anti join. A NULL in the subquery, or a NULL outer value, no longer gives SQL NOT IN semantics, so the query can return rows it should not.

To Reproduce

Build a null-aware LeftAnti HashJoinExec over two unbounded inputs and run JoinSelection on it. The result is a SymmetricHashJoinExec, and the null-aware behavior is gone.

let join = HashJoinExec::try_new(
    left, right, on, None, &JoinType::LeftAnti, None,
    PartitionMode::CollectLeft, NullEquality::NullEqualsNothing,
    true, // null_aware
)?;
let optimized = JoinSelection::new().optimize(Arc::new(join), &ConfigOptions::new())?;
// optimized is a SymmetricHashJoinExec
Expected behavior

A null-aware join stays a HashJoinExec, the only join that implements null-aware semantics for this case.

Additional context

No response

Willingness to contribute

I plan to contribute a fix for this bug independently

Linguagem predominante
Rust
Estrelas
9.6k
Forks
2.6k
Merge médio
3d 4h
PRs com merge (30d)
345

Preparar o ambiente

Abrir no Codespaces

Inicia o contêiner de desenvolvimento do projeto no navegador, com a sua própria conta do GitHub.

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de apache/datafusion

Todas as issues de apache/datafusion

Issues semelhantes

Mais issues de Rust

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.