Skip to content

intersect_metadata_for_union fails to typecheck when rkyv is in scope on rustc 1.91.1 #22488

@Emsu

Description

@Emsu

What

`datafusion/expr/src/expr.rs:638` on `main` (also in the released `datafusion-expr 53.1.0` at `:520`):

```rust
intersected.retain(|k, v| metadata.get(k) == Some(v));
```

`HashMap::retain` binds `v: &mut V`, so `Some(v)` is `Option<&mut String>`. The right-hand side is `Option<&String>` from `metadata.get(k)`. The standard `Option: PartialEq` impl resolves cleanly when nothing else is in scope — but when a transitive dep brings rkyv 0.7's blanket `PartialEq` impls into scope, rustc 1.91.1 stops disambiguating and fails the comparison.

Repro

```toml

Cargo.toml

[package]
name = "df-repro"
version = "0.1.0"
edition = "2024"

[dependencies]
datafusion-expr = "53.1.0"
chrono = { version = "0.4", features = ["rkyv-64"] } # pulls rkyv 0.7 transitively
```

```
$ rustc --version
rustc 1.91.1 (ed61e7d7e 2025-11-07)

$ cargo build
error[E0277]: can't compare `Option<&std::string::String>` with `Option<&mut std::string::String>`
--> datafusion-expr-53.1.0/src/expr.rs:520:51
|
520 | intersected.retain(|k, v| metadata.get(k) == Some(v));
| ^^ no implementation for ...
|
= help: the following other types implement trait `PartialEq`:
`Option` implements `PartialEq`
`Option` implements `PartialEq<rkyv::option::ArchivedOption>`
```

Removing the `chrono` dep (or its `rkyv-64` feature) and the same code builds. Dropping `edition = "2024"` from the consumer also makes it build.

Suggested fix

```diff

  • intersected.retain(|k, v| metadata.get(k) == Some(v));
  • intersected.retain(|k, v| metadata.get(k) == Some(&*v));
    ```

`&*v` reborrows `&mut String` as `&String`, eliminating the ambiguity for the standard `PartialEq` impl regardless of what other impls are in scope. Verified locally: patching the registry copy of `datafusion-expr 53.1.0`'s `expr.rs:520` to `Some(&*v)` makes the repro project build clean.

Happy to send a PR.

Environment

  • `rustc 1.91.1 (ed61e7d7e 2025-11-07)` on aarch64-apple-darwin
  • `datafusion-expr 53.1.0` (latest released; same code on `main` at `:638`)
  • `rkyv 0.7.46` (resolved by chrono's `rkyv-64` feature)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions