Skip to content

fix(extensions): add signatures with distribution enum arg for std_dev and variance#1011

Merged
vbarua merged 9 commits into
substrait-io:mainfrom
nielspardon:par-stddev-dist
Mar 24, 2026
Merged

fix(extensions): add signatures with distribution enum arg for std_dev and variance#1011
vbarua merged 9 commits into
substrait-io:mainfrom
nielspardon:par-stddev-dist

Conversation

@nielspardon

@nielspardon nielspardon commented Mar 17, 2026

Copy link
Copy Markdown
Member

Given the recent clarification around function options vs enum arguments I do believe the std_dev and variance function definitions should change the distribution function to be an enum argument.

The distribution parameter changes the semantic behavior of these functions which is why SQL systems typically model the different distribution values as distinct functions e.g. STDDEV_SAMP and STDDEV_POP. Providing the distribution parameter thus is not optional but required.

This PR deprecates the existing function signatures for std_dev and variance and adds new signatures that use a distribution enum argument instead of a function option.

This PR depends on #1010 whose changes are included in this PR since it uses the new enum argument syntax in the test cases I generated using AI for the two functions.

The main changes for this PR are in the second commit 8ec63ae.

@github-actions

This comment was marked as resolved.

@nielspardon nielspardon changed the title fix(extensions)!: change distribution option to enum arg for std_dev and variance fix(extensions)!: change distribution option to enum arg for std_dev and variance Mar 17, 2026
@nielspardon nielspardon changed the title fix(extensions)!: change distribution option to enum arg for std_dev and variance fix(extensions): change distribution option to enum arg for std_dev and variance Mar 17, 2026
@benbellick

Copy link
Copy Markdown
Member

I'm in support of this change, but think we should wait until #1005 lands to make sure we all agree on the meaning of options / enums.

Comment thread extensions/functions_arithmetic.yaml
@nielspardon

Copy link
Copy Markdown
Member Author

Rebased, resolved conflicts, used the new deprecation syntax.

@nielspardon
nielspardon requested a review from yongchul March 20, 2026 20:01

@yongchul yongchul left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1 thank you for incorporating the deprecation path and making this non-breaking change! 😄

@nielspardon

Copy link
Copy Markdown
Member Author

I merged #1010 and rebased this PR

@nielspardon nielspardon changed the title fix(extensions): change distribution option to enum arg for std_dev and variance fix(extensions): add signatures with distribution enum arg for std_dev and variance Mar 23, 2026
@nielspardon nielspardon added the PMC Ready PRs ready for review by PMCs label Mar 23, 2026
…and variance

BREAKING CHANGE: changes the function signature of existing functions std_dev and variance

Signed-off-by: Niels Pardon <par@zurich.ibm.com>
Signed-off-by: Niels Pardon <par@zurich.ibm.com>
Signed-off-by: Niels Pardon <par@zurich.ibm.com>
Signed-off-by: Niels Pardon <par@zurich.ibm.com>
Signed-off-by: Niels Pardon <par@zurich.ibm.com>
Signed-off-by: Niels Pardon <par@zurich.ibm.com>
Signed-off-by: Niels Pardon <par@zurich.ibm.com>
@nielspardon

This comment was marked as outdated.

Signed-off-by: Niels Pardon <par@zurich.ibm.com>
@nielspardon

Copy link
Copy Markdown
Member Author

removed the deprecation of the old function signatures per conversation on Slack

Comment thread extensions/functions_arithmetic.yaml
Comment thread extensions/functions_arithmetic.yaml
Comment thread extensions/functions_arithmetic.yaml
Comment thread extensions/functions_arithmetic.yaml

@vbarua vbarua left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Left a minor suggestions about argument ordering. Want to hear what you think about it, but other than that this looks good to me.

Signed-off-by: Niels Pardon <par@zurich.ibm.com>

@vbarua vbarua left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changes look good. Thanks for updating thee argument order.

@vbarua
vbarua merged commit 00bc3c2 into substrait-io:main Mar 24, 2026
13 checks passed
@nielspardon
nielspardon deleted the par-stddev-dist branch April 15, 2026 08:50
andrew-coleman pushed a commit to substrait-io/substrait-java that referenced this pull request Jul 15, 2026
This PR implements the bidirectional conversion between Calcite and
Substrait for the
statistical aggregate functions standard deviation and variance
(`STDDEV_POP`,
`STDDEV_SAMP`, `VAR_POP`, `VAR_SAMP`).

### Problem

Substrait uses a single function name for both the population and sample
variants:

- `std_dev` for both `STDDEV_POP` and `STDDEV_SAMP`
- `variance` for both `VAR_POP` and `VAR_SAMP`

The population (n denominator) vs. sample (n-1 denominator) distinction
is captured by a
`distribution` value (`POPULATION` or `SAMPLE`). Previously these
functions were not mapped,
so the existing TPC-DS test cases using them were silently mis-mapped to
`AVG` (Calcite
represents these statistical functions with `SqlAvgAggFunction`).

### Solution

This uses the **non-deprecated** signatures introduced in
substrait-io/substrait#1011
(Substrait v0.87.0), which carry the distinction as an **enum function
argument** (the
leading `distribution` argument, e.g. `std_dev:req_fp64`), rather than
the deprecated
function-option form (substrait-io/substrait#1019). 

Resolves #803
Resolves #807 

Since the input arguments are cast to `FP64` when necessary, the
integer-based signatures
proposed in substrait-io/substrait#1012 are not required.

**Calcite → Substrait:**

- Added function mappings in `FunctionMappings` for all four statistical
operators.
- `AggregateFunctionConverter` synthesizes the leading `distribution`
enum operand based on
the Calcite `SqlKind`, so the generic function matcher resolves the
enum-arg variant and
  builds the `EnumArg` automatically (no bespoke option plumbing).
- Statistical inputs are cast to `FP64` where necessary.

**Substrait → Calcite:**

- `FunctionConverter.getSqlOperatorFromSubstraitFunc` disambiguates the
population/sample
  operator from the `distribution` enum argument.
- `SubstraitRelNodeConverter` and `PreCalciteAggregateValidator` skip
the non-value enum
  argument when building Calcite aggregate operands.

**DSL & shared enum:**

- A shared `StatisticalDistribution` enum (in `:core`) is the single
source of truth for the
`SAMPLE` / `POPULATION` values used by both the DSL builder and isthmus.
- `SubstraitBuilder` gains `stddevPopulation`, `stddevSample`,
`variancePopulation`, and
  `varianceSample` convenience methods.

### Non-floating-point inputs

`std_dev` / `variance` only define `fp32` / `fp64` signatures, so a
statistical aggregate
over an integer (or other non-fp) column is rewritten in
`SubstraitRelVisitor` to cast the
argument to `fp64` (appending a cast column so other aggregates over the
same column are
unaffected) and cast the result back to the type Calcite inferred. The
rewrite is
idempotent, so the converted plan is stable under further round trips.

### Testing

- `AggregationFunctionsTest` exercises full round trips (POJO ⇄ proto
and Substrait ⇄
  Calcite) for all four functions, with and without grouping.
- `StatisticalFunctionTest` verifies the SQL round trip, asserts that
each SQL operator
maps to the enum-arg signature (`std_dev:req_fp64` etc.) with the
correct `distribution`
`EnumArg` and no function options, and covers non-fp (integer) inputs —
including a
  column shared with a non-statistical aggregate, and with grouping.

🤖 Generated with AI

---------

Signed-off-by: Niels Pardon <par@zurich.ibm.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

PMC Ready PRs ready for review by PMCs

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants