Skip to content

[SPARK-59325][SQL] Add an optional maximum nesting depth for variant values - #58607

Open
HyukjinKwon wants to merge 1 commit into
apache:masterfrom
HyukjinKwon:SPARK-59325-variant-max-depth
Open

[SPARK-59325][SQL] Add an optional maximum nesting depth for variant values#58607
HyukjinKwon wants to merge 1 commit into
apache:masterfrom
HyukjinKwon:SPARK-59325-variant-max-depth

Conversation

@HyukjinKwon

Copy link
Copy Markdown
Member

What changes were proposed in this pull request?

Add an opt-in spark.sql.variant.maxNestingDepth (internal, default -1 = unlimited = unchanged).
When set to a positive value, rendering a variant value whose nesting exceeds it fails instead of
recursing without bound. The limit is threaded as a parameter into the recursive variant read
paths so common/variant does not need SQLConf access:

  • Variant.toJson / toJsonImpl and VariantVal.toJson gain overloads carrying the limit; the
    existing signatures delegate with -1 (unchanged).
  • The SQL cast/variant_get-to-string path, the Parquet variant shredding read, and
    to_json obtain the limit once (per expression / per task), not per row.

Why are the changes needed?

Variant.toJsonImpl recursed per nested element with no bound, so a deeply nested variant could
exhaust the stack when rendered. The existing size limit does not prevent this (a small-per-level
variant can nest very deeply within the size cap). This adds an optional bound.

Does this PR introduce any user-facing change?

No by default. When spark.sql.variant.maxNestingDepth is set to a positive value, variant values
nested more deeply than the limit raise an error when rendered.

How was this patch tested?

New VariantExpressionSuite case: a deeply nested variant renders fully when the limit is unset or
generous and is rejected when the limit is smaller than its depth.

Was this patch authored or co-authored using generative AI tooling?

Generated-by: Isaac

This pull request and its description were written by Isaac.

Co-authored-by: Isaac no-reply@databricks.com

@HyukjinKwon
HyukjinKwon force-pushed the SPARK-59325-variant-max-depth branch 2 times, most recently from a7061fa to 26b96a0 Compare September 8, 2026 22:32
…values

### What changes were proposed in this pull request?

Add an opt-in `spark.sql.variant.maxNestingDepth` (internal, default `-1` = unlimited = unchanged).
When set to a positive value, rendering a variant value whose nesting exceeds it fails instead of
recursing without bound. The limit is threaded as a parameter into the recursive variant read
paths so `common/variant` does not need `SQLConf` access:
- `Variant.toJson` / `toJsonImpl` and `VariantVal.toJson` gain overloads carrying the limit; the
  existing signatures delegate with `-1` (unchanged).
- The SQL cast/`variant_get`-to-string path, the Parquet variant shredding read, and
  `to_json` obtain the limit once (per expression / per task), not per row.

### Why are the changes needed?

`Variant.toJsonImpl` recursed per nested element with no bound, so a deeply nested variant could
exhaust the stack when rendered. The existing size limit does not prevent this (a small-per-level
variant can nest very deeply within the size cap). This adds an optional bound.

### Does this PR introduce _any_ user-facing change?

No by default. When `spark.sql.variant.maxNestingDepth` is set to a positive value, variant values
nested more deeply than the limit raise an error when rendered.

### How was this patch tested?

New `VariantExpressionSuite` case: a deeply nested variant renders fully when the limit is unset or
generous and is rejected when the limit is smaller than its depth.

### Was this patch authored or co-authored using generative AI tooling?

Generated-by: Isaac

This pull request and its description were written by Isaac.

Co-authored-by: Isaac <no-reply@databricks.com>
@HyukjinKwon
HyukjinKwon force-pushed the SPARK-59325-variant-max-depth branch from 26b96a0 to d784c05 Compare September 9, 2026 11:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant