mkleen opened a new issue, #25374:
URL: https://github.com/apache/datafusion/issues/25374

   ### Is your feature request related to a problem or challenge?
   
   #25288 adds `AggregateUDFImpl::distinct_handling` 
(`datafusion/expr/src/udaf.rs:958`), which lets an
   aggregate declare whether `DISTINCT` can change its result, and 
`EliminateAggregateDistinct` uses that
   to drop the modifier from duplicate-insensitive functions.
   
   `ForeignAggregateUDF` (`datafusion/ffi/src/udaf/mod.rs:471`) does not 
forward the new method, and
   `FFI_AggregateUDF` (`datafusion/ffi/src/udaf/mod.rs:59`) has no field to 
carry it, so every UDAF loaded
   over FFI falls back to the default `DistinctHandling::Sensitive`.
   
   The effect is that the new API silently does nothing across the FFI 
boundary. A third-party `min`-like
   or set-valued aggregate that declares `DistinctHandling::Insensitive` still 
gets the full
   `SingleDistinctToGroupBy` treatment — a per-group hash set and an extra 
grouping stage that only
   deduplicates input the function was going to ignore — while the identical 
function registered
   in-process does not. Results stay correct either way; the optimization is 
just unreachable.
   
   ### Describe the solution you'd like
   
   Carry the tag through the vtable the way `order_sensitivity` already does:
   
   1. Add `FFI_DistinctHandling` (`#[repr(C)]`) with `From` impls in both 
directions, alongside
      `FFI_AggregateOrderSensitivity` at `datafusion/ffi/src/udaf/mod.rs:628`.
   2. Add a `distinct_handling` fn pointer to `FFI_AggregateUDF` and a 
`distinct_handling_fn_wrapper`,
      mirroring `order_sensitivity_fn_wrapper` 
(`datafusion/ffi/src/udaf/mod.rs:328`).
   3. Implement `distinct_handling` on `ForeignAggregateUDF` as
      `unsafe { (self.udaf.distinct_handling)(&self.udaf).into() }`.
   4. Add a round-trip test over every variant, like 
`test_round_trip_all_order_sensitivities`
      (`datafusion/ffi/src/udaf/mod.rs:864`), plus a `ForeignAggregateUDF` test 
asserting a foreign UDAF
      that declares `Insensitive` reports `Insensitive`.
   
   One wrinkle worth deciding: `DistinctHandling` is `#[non_exhaustive]`, so 
the `From<FFI_DistinctHandling>`
   conversion needs a policy for a variant added by a newer library on the 
other side of the boundary.
   Mapping anything unrecognized to `Sensitive` keeps it conservative — that is 
the default, and it only
   ever costs an optimization, never correctness.
   
   ### Describe alternatives you've considered
   
   Leaving it as is. FFI aggregates keep working and return correct results; 
they just never benefit from
   `EliminateAggregateDistinct`. The cost is that the two registration paths 
behave differently for the
   same function, which is surprising and hard to notice.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to