Skip to content

fix(arrow-json): validate map value nullability - #10475

Merged
Jefffrey merged 1 commit into
apache:mainfrom
subotac:fix/json-map-nullability
Jul 30, 2026
Merged

fix(arrow-json): validate map value nullability#10475
Jefffrey merged 1 commit into
apache:mainfrom
subotac:fix/json-map-nullability

Conversation

@subotac

@subotac subotac commented Jul 29, 2026

Copy link
Copy Markdown
Contributor

AI disclosure: Codex assisted with issue analysis and running local test

Which issue does this PR close?

Rationale for this change

The JSON map decoder constructed map entries with an unchecked StructArray constructor. This bypassed child field nullability validation and allowed a null value even when the map value field was non-nullable.

What changes are included in this PR?

  • Construct map entries with StructArray::try_new_with_length so existing schema validation rejects unmasked nulls.
  • Add a regression test for a null JSON map value with a non-nullable value field.

Are these changes tested?

Yes:

  • cargo +stable fmt --all -- --check
  • cargo test -p arrow-json --all-features
  • cargo clippy --workspace --all-targets --all-features -- -D warnings
  • git diff --check

Are there any user-facing changes?

Yes. Reading a null JSON map value against a non-nullable value field now returns an error instead of producing an array that violates its schema. There are no public API changes.

@github-actions github-actions Bot added the arrow Changes to the arrow crate label Jul 29, 2026
@Jefffrey Jefffrey added the bug label Jul 29, 2026
@Jefffrey
Jefffrey merged commit 1d44370 into apache:main Jul 30, 2026
32 of 34 checks passed
@Jefffrey

Copy link
Copy Markdown
Contributor

thanks @subotac

Jefffrey pushed a commit that referenced this pull request Aug 2, 2026
… arrow spec (#10297)" (#10506)

# Which issue does this PR close?

N/A

cc @Jefffrey and @rluvaton 

# Rationale for this change

#10297 changed the default map field names from `keys`/`values` to
`key`/`value` to match the Arrow spec. This is a good change to align
with the spec, but it is a breaking change: it broke the DataFusion
upgrade (apache/datafusion#24030) because data
produced elsewhere (e.g. by other Arrow implementations) uses the old
`keys`/`values` field names, causing schema mismatches such as:

```
InvalidArgumentError("Incorrect datatype for StructArray field \"metadata\", expected Map(\"entries\": non-null Struct(\"keys\": non-null Utf8, \"values\": Utf8), unsorted) got Map(\"entries\": non-null Struct(\"key\": non-null Utf8, \"value\": Utf8), unsorted)")
```

See discussion on #10297:
#10297 (comment)

We should hold the field name change for the next breaking release to
minimize downstream churn on a minor release, rather than ship it in a
minor release.

# What changes are included in this PR?

- Reverts b963ecf (#10297), restoring
the default map field names to `keys`/`values` (plural).
- Updates a test added by #10475 after #10297 merged 

# Are these changes tested?

Existing tests.

# Are there any user-facing changes?

Yes: this reverts the default `MapFieldNames` back to `keys`/`values`
(as it was prior to #10297), rather than `key`/`value`. The intent is to
reapply #10297 as part of the next breaking release.
MassivePizza pushed a commit to massive-com/arrow-rs that referenced this pull request Aug 5, 2026
> AI disclosure: Codex assisted with issue analysis and running local
test

# Which issue does this PR close?

- Closes apache#6391.

# Rationale for this change

The JSON map decoder constructed map entries with an unchecked
`StructArray` constructor. This bypassed child field nullability
validation and allowed a null value even when the map value field was
non-nullable.

# What changes are included in this PR?

- Construct map entries with `StructArray::try_new_with_length` so
existing schema validation rejects unmasked nulls.
- Add a regression test for a null JSON map value with a non-nullable
value field.

# Are these changes tested?

Yes:

- `cargo +stable fmt --all -- --check`
- `cargo test -p arrow-json --all-features`
- `cargo clippy --workspace --all-targets --all-features -- -D warnings`
- `git diff --check`

# Are there any user-facing changes?

Yes. Reading a null JSON map value against a non-nullable value field
now returns an error instead of producing an array that violates its
schema. There are no public API changes.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

arrow Changes to the arrow crate bug

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Reading json map with non-nullable value schema doesn't error if values are actually null

2 participants