You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@datafusion.apache.org by gi...@apache.org on 2026/05/06 21:08:22 UTC
(datafusion) 01/01: fix: `median` returns Float64 for integer inputs to avoid truncation (#21988)
This is an automated email from the ASF dual-hosted git repository.
github-merge-queue[bot] pushed a commit to branch gh-readonly-queue/main/pr-21988-8d9ec685d669b2f5f98c1d0d3a358fd2d22d3186
in repository https://gitbox.apache.org/repos/asf/datafusion.git
commit 2a14a93842bb44c31d07471afa1e886f158c7d6d
Author: Yu-Chuan Hung <86...@users.noreply.github.com>
AuthorDate: Thu May 7 05:07:56 2026 +0800
fix: `median` returns Float64 for integer inputs to avoid truncation (#21988)
## Which issue does this PR close?
- Closes #19536.
## Rationale for this change
`MEDIAN` over integer columns previously returned the input integer
type, which truncates the `.5` produced when averaging the two middle
values of an even-length input.
For example:
```sql
SELECT median(v) FROM (VALUES (arrow_cast(-128, 'Int8')),
(arrow_cast(127, 'Int8'))) AS t(v);
-- Old: 0 (truncated from -0.5)
-- New: -0.5
```
## What changes are included in this PR?
- Replace Median's Signature::numeric with Signature::one_of containing
three coercible arms:
- Decimal → preserved exactly
- Float → preserved exactly
- Integer → coerced implicitly to Float64
- Update SLT and insta snapshot expectations affected by the new return
type (column type indicators I → R, previously truncated values such as
-17 → -17.5).
## Are these changes tested?
Yes. Includes:
- Existing SLT cases for median over Int8/16/32/64 and UInt8/16/32/64
- Boundary cases that previously truncated.
- insta snapshot tests.
## Are there any user-facing changes?
Yes — this is a breaking change for median(<integer_column>): Return
type changes from the input integer type to Float64.
---
datafusion/core/tests/dataframe/describe.rs | 2 +-
datafusion/core/tests/dataframe/mod.rs | 40 +++----
datafusion/core/tests/sql/aggregates/dict_nulls.rs | 28 ++---
datafusion/functions-aggregate/src/median.rs | 25 +++-
datafusion/sqllogictest/test_files/aggregate.slt | 126 ++++++++++-----------
.../test_files/aggregate_skip_partial.slt | 22 ++--
.../test_files/clickbench_extended.slt | 2 +-
7 files changed, 132 insertions(+), 113 deletions(-)
diff --git a/datafusion/core/tests/dataframe/describe.rs b/datafusion/core/tests/dataframe/describe.rs
index c61fe4fed1..9aa8a49c97 100644
--- a/datafusion/core/tests/dataframe/describe.rs
+++ b/datafusion/core/tests/dataframe/describe.rs
@@ -44,7 +44,7 @@ async fn describe() -> Result<()> {
| std | 2107.472815166704 | null | 2.8724780750809518 | 2.8724780750809518 | 2.8724780750809518 | 28.724780750809533 | 3.1597258182544645 | 29.012028558317645 | null | null | null | 0.5000342500942125 | 3.44808750051728 |
| min | 0.0 | null | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 01/01/09 | 0 | 2008-12-31T23:00:00 | 2009.0 | 1.0 |
| max | 7299.0 | null | 9.0 | 9.0 | 9.0 | 90.0 | 9.899999618530273 | 90.89999999999999 | 12/31/10 | 9 | 2010-12-31T04:09:13.860 | 2010.0 | 12.0 |
- | median | 3649.0 | null | 4.0 | 4.0 | 4.0 | 45.0 | 4.949999809265137 | 45.45 | null | null | null | 2009.0 | 7.0 |
+ | median | 3649.5 | null | 4.5 | 4.5 | 4.5 | 45.0 | 4.949999809265137 | 45.45 | null | null | null | 2009.5 | 7.0 |
+------------+-------------------+----------+--------------------+--------------------+--------------------+--------------------+--------------------+--------------------+-----------------+------------+-------------------------+--------------------+-------------------+
");
Ok(())
diff --git a/datafusion/core/tests/dataframe/mod.rs b/datafusion/core/tests/dataframe/mod.rs
index e083075439..1418dcad11 100644
--- a/datafusion/core/tests/dataframe/mod.rs
+++ b/datafusion/core/tests/dataframe/mod.rs
@@ -1204,26 +1204,26 @@ async fn window_using_aggregates() -> Result<()> {
| first_value | last_val | approx_distinct | approx_median | median | max | min | c2 | c3 |
+-------------+----------+-----------------+---------------+--------+-----+------+----+------+
| | | | | | | | 1 | -85 |
- | -85 | -101 | 14 | -12.0 | -12 | 83 | -101 | 4 | -54 |
- | -85 | -101 | 17 | -25.0 | -25 | 83 | -101 | 5 | -31 |
- | -85 | -12 | 10 | -32.75 | -34 | 83 | -85 | 3 | 13 |
- | -85 | -25 | 3 | -56.0 | -56 | -25 | -85 | 1 | -5 |
- | -85 | -31 | 18 | -29.75 | -28 | 83 | -101 | 5 | 36 |
- | -85 | -38 | 16 | -25.0 | -25 | 83 | -101 | 4 | 65 |
- | -85 | -43 | 7 | -43.0 | -43 | 83 | -85 | 2 | 45 |
- | -85 | -48 | 6 | -35.75 | -36 | 83 | -85 | 2 | -43 |
- | -85 | -5 | 4 | -37.75 | -40 | -5 | -85 | 1 | 83 |
- | -85 | -54 | 15 | -17.0 | -18 | 83 | -101 | 4 | -38 |
- | -85 | -56 | 2 | -70.5 | -70 | -56 | -85 | 1 | -25 |
- | -85 | -72 | 9 | -43.0 | -43 | 83 | -85 | 3 | -12 |
- | -85 | -85 | 1 | -85.0 | -85 | -85 | -85 | 1 | -56 |
- | -85 | 13 | 11 | -17.0 | -18 | 83 | -85 | 3 | 14 |
- | -85 | 13 | 11 | -25.0 | -25 | 83 | -85 | 3 | 13 |
- | -85 | 14 | 12 | -12.0 | -12 | 83 | -85 | 3 | 17 |
- | -85 | 17 | 13 | -11.25 | -8 | 83 | -85 | 4 | -101 |
- | -85 | 45 | 8 | -34.5 | -34 | 83 | -85 | 3 | -72 |
- | -85 | 65 | 17 | -17.0 | -18 | 83 | -101 | 5 | -101 |
- | -85 | 83 | 5 | -25.0 | -25 | 83 | -85 | 2 | -48 |
+ | -85 | -101 | 14 | -12.0 | -12.0 | 83 | -101 | 4 | -54 |
+ | -85 | -101 | 17 | -25.0 | -25.0 | 83 | -101 | 5 | -31 |
+ | -85 | -12 | 10 | -32.75 | -34.0 | 83 | -85 | 3 | 13 |
+ | -85 | -25 | 3 | -56.0 | -56.0 | -25 | -85 | 1 | -5 |
+ | -85 | -31 | 18 | -29.75 | -28.0 | 83 | -101 | 5 | 36 |
+ | -85 | -38 | 16 | -25.0 | -25.0 | 83 | -101 | 4 | 65 |
+ | -85 | -43 | 7 | -43.0 | -43.0 | 83 | -85 | 2 | 45 |
+ | -85 | -48 | 6 | -35.75 | -36.5 | 83 | -85 | 2 | -43 |
+ | -85 | -5 | 4 | -37.75 | -40.5 | -5 | -85 | 1 | 83 |
+ | -85 | -54 | 15 | -17.0 | -18.5 | 83 | -101 | 4 | -38 |
+ | -85 | -56 | 2 | -70.5 | -70.5 | -56 | -85 | 1 | -25 |
+ | -85 | -72 | 9 | -43.0 | -43.0 | 83 | -85 | 3 | -12 |
+ | -85 | -85 | 1 | -85.0 | -85.0 | -85 | -85 | 1 | -56 |
+ | -85 | 13 | 11 | -17.0 | -18.5 | 83 | -85 | 3 | 14 |
+ | -85 | 13 | 11 | -25.0 | -25.0 | 83 | -85 | 3 | 13 |
+ | -85 | 14 | 12 | -12.0 | -12.0 | 83 | -85 | 3 | 17 |
+ | -85 | 17 | 13 | -11.25 | -8.5 | 83 | -85 | 4 | -101 |
+ | -85 | 45 | 8 | -34.5 | -34.0 | 83 | -85 | 3 | -72 |
+ | -85 | 65 | 17 | -17.0 | -18.5 | 83 | -101 | 5 | -101 |
+ | -85 | 83 | 5 | -25.0 | -25.0 | 83 | -85 | 2 | -48 |
+-------------+----------+-----------------+---------------+--------+-----+------+----+------+
"
);
diff --git a/datafusion/core/tests/sql/aggregates/dict_nulls.rs b/datafusion/core/tests/sql/aggregates/dict_nulls.rs
index f9e15a71a2..8733b9e87b 100644
--- a/datafusion/core/tests/sql/aggregates/dict_nulls.rs
+++ b/datafusion/core/tests/sql/aggregates/dict_nulls.rs
@@ -91,10 +91,10 @@ async fn test_aggregates_null_handling_comprehensive() -> Result<()> {
+----------------+--------------+
| dict_null_vals | median_value |
+----------------+--------------+
- | | 3 |
- | group_x | 1 |
- | group_y | 5 |
- | group_z | 7 |
+ | | 3.0 |
+ | group_x | 1.0 |
+ | group_y | 5.0 |
+ | group_z | 7.0 |
+----------------+--------------+
");
@@ -437,16 +437,16 @@ async fn test_median_distinct_with_fuzz_table_dict_nulls() -> Result<()> {
assert_snapshot!(
batches_to_string(&results),
@r"
- +--------+---------------------+------+------+------+--------+--------+
- | u8_low | dictionary_utf8_low | col1 | col2 | col3 | col4 | col5 |
- +--------+---------------------+------+------+------+--------+--------+
- | 50 | | | 30 | | 987.65 | 400000 |
- | 50 | group_three | 5000 | 50 | 5000 | 555.55 | 500000 |
- | 75 | | 4000 | | 4000 | | 450000 |
- | 100 | group_one | 1100 | 11 | 1000 | 123.45 | 110000 |
- | 100 | group_two | 1500 | 15 | 1500 | 111.11 | 150000 |
- | 200 | | 2500 | 22 | 2500 | 506.11 | 250000 |
- +--------+---------------------+------+------+------+--------+--------+
+ +--------+---------------------+--------+------+--------+--------+----------+
+ | u8_low | dictionary_utf8_low | col1 | col2 | col3 | col4 | col5 |
+ +--------+---------------------+--------+------+--------+--------+----------+
+ | 50 | | | 30.0 | | 987.65 | 400000.0 |
+ | 50 | group_three | 5000.0 | 50.0 | 5000.0 | 555.55 | 500000.0 |
+ | 75 | | 4000.0 | | 4000.0 | | 450000.0 |
+ | 100 | group_one | 1100.0 | 11.0 | 1000.0 | 123.45 | 110000.0 |
+ | 100 | group_two | 1500.0 | 15.0 | 1500.0 | 111.11 | 150000.0 |
+ | 200 | | 2500.0 | 22.5 | 2500.0 | 506.11 | 250000.0 |
+ +--------+---------------------+--------+------+--------+--------+----------+
"
);
diff --git a/datafusion/functions-aggregate/src/median.rs b/datafusion/functions-aggregate/src/median.rs
index 74473e2f28..02a49ab6dc 100644
--- a/datafusion/functions-aggregate/src/median.rs
+++ b/datafusion/functions-aggregate/src/median.rs
@@ -39,14 +39,15 @@ use arrow::datatypes::{
ArrowNativeType, ArrowPrimitiveType, Decimal32Type, Decimal64Type, FieldRef,
};
+use datafusion_common::types::{NativeType, logical_float64};
use datafusion_common::{
DataFusionError, Result, ScalarValue, assert_eq_or_internal_err,
internal_datafusion_err,
};
use datafusion_expr::function::StateFieldsArgs;
use datafusion_expr::{
- Accumulator, AggregateUDFImpl, Documentation, Signature, Volatility,
- function::AccumulatorArgs, utils::format_state_name,
+ Accumulator, AggregateUDFImpl, Coercion, Documentation, Signature, TypeSignature,
+ TypeSignatureClass, Volatility, function::AccumulatorArgs, utils::format_state_name,
};
use datafusion_expr::{EmitTo, GroupsAccumulator};
use datafusion_functions_aggregate_common::aggregate::groups_accumulator::accumulate::accumulate;
@@ -99,7 +100,25 @@ impl Default for Median {
impl Median {
pub fn new() -> Self {
Self {
- signature: Signature::numeric(1, Volatility::Immutable),
+ // Integer inputs are coerced to Float64 so the average of the two
+ // middle values is not truncated. This matches DuckDB / PostgreSQL / Spark.
+ // Float and Decimal inputs preserve their type.
+ signature: Signature::one_of(
+ vec![
+ TypeSignature::Coercible(vec![Coercion::new_exact(
+ TypeSignatureClass::Decimal,
+ )]),
+ TypeSignature::Coercible(vec![Coercion::new_exact(
+ TypeSignatureClass::Float,
+ )]),
+ TypeSignature::Coercible(vec![Coercion::new_implicit(
+ TypeSignatureClass::Native(logical_float64()),
+ vec![TypeSignatureClass::Integer],
+ NativeType::Float64,
+ )]),
+ ],
+ Volatility::Immutable,
+ ),
}
}
}
diff --git a/datafusion/sqllogictest/test_files/aggregate.slt b/datafusion/sqllogictest/test_files/aggregate.slt
index 00ca0482a3..70acff3cb7 100644
--- a/datafusion/sqllogictest/test_files/aggregate.slt
+++ b/datafusion/sqllogictest/test_files/aggregate.slt
@@ -965,16 +965,16 @@ statement error
SELECT approx_median(c1) FROM aggregate_test_100
# csv_query_median_1
-query I
+query R
SELECT median(c2) FROM aggregate_test_100
----
3
# csv_query_median_2
-query I
+query R
SELECT median(c6) FROM aggregate_test_100
----
-1125553990140691277
+1125553990140691200
# csv_query_median_3
query R
@@ -983,18 +983,18 @@ SELECT median(c12) FROM aggregate_test_100
0.551390054439
# median_i8
-query I
+query R
SELECT median(col_i8) FROM median_table
----
-14
# distinct_median_i8
-query I
+query R
SELECT median(distinct col_i8) FROM median_table
----
100
-query II
+query RR
SELECT median(col_i8), median(distinct col_i8) FROM median_table
----
-14 100
@@ -1016,43 +1016,43 @@ query error DataFusion error: Error during planning: \[IGNORE \| RESPECT\] NULLS
SELECT median(c2) RESPECT NULLS FROM aggregate_test_100
# median_i16
-query I
+query R
SELECT median(col_i16) FROM median_table
----
-16334
# median_i32
-query I
+query R
SELECT median(col_i32) FROM median_table
----
-1073741774
# median_i64
-query I
+query R
SELECT median(col_i64) FROM median_table
----
--4611686018427387854
+-4611686018427388000
# median_u8
-query I
+query R
SELECT median(col_u8) FROM median_table
----
50
# median_u16
-query I
+query R
SELECT median(col_u16) FROM median_table
----
50
# median_u32
-query I
+query R
SELECT median(col_u32) FROM median_table
----
50
# median_u64
-query I
+query R
SELECT median(col_u64) FROM median_table
----
50
@@ -1083,56 +1083,56 @@ NaN
# median_i8_overflow_negative
-query I
+query R
SELECT median(v) FROM (VALUES (arrow_cast(-85, 'Int8')), (arrow_cast(-56, 'Int8'))) AS t(v);
----
--70
+-70.5
# median_i8_overflow_positive
# Test overflow with positive values: 100 + 120 = 220 > 127 (max i8)
-query I
+query R
SELECT median(v) FROM (VALUES (arrow_cast(100, 'Int8')), (arrow_cast(120, 'Int8'))) AS t(v);
----
110
# median_u8_overflow
# Test unsigned overflow: 200 + 250 = 450 > 255 (max u8)
-query I
+query R
SELECT median(v) FROM (VALUES (arrow_cast(200, 'UInt8')), (arrow_cast(250, 'UInt8'))) AS t(v);
----
225
# median_i8_no_overflow_normal_case
# Normal case that doesn't overflow for comparison
-query I
+query R
SELECT median(v) FROM (VALUES (arrow_cast(4, 'Int8')), (arrow_cast(5, 'Int8'))) AS t(v);
----
-4
+4.5
# median_i8_max_values
# Test with both i8::MAX values: 127 + 127 = 254 > 127, overflow
-query I
+query R
SELECT median(v) FROM (VALUES (arrow_cast(127, 'Int8')), (arrow_cast(127, 'Int8'))) AS t(v);
----
127
# median_i8_min_values
# Test with both i8::MIN values: -128 + -128 = -256 < -128, underflow
-query I
+query R
SELECT median(v) FROM (VALUES (arrow_cast(-128, 'Int8')), (arrow_cast(-128, 'Int8'))) AS t(v);
----
-128
# median_i8_min_max_values
# Test with i8::MIN and i8::MAX: -128 + 127 = -1, no overflow, median = 0 (truncated from -0.5)
-query I
+query R
SELECT median(v) FROM (VALUES (arrow_cast(-128, 'Int8')), (arrow_cast(127, 'Int8'))) AS t(v);
----
-0
+-0.5
# median_u8_max_values
# Test with both u8::MAX values: 255 + 255 = 510 > 255, overflow
-query I
+query R
SELECT median(v) FROM (VALUES (arrow_cast(255, 'UInt8')), (arrow_cast(255, 'UInt8'))) AS t(v);
----
255
@@ -1431,7 +1431,7 @@ drop table t;
statement ok
create table t(c int) as values (1), (2), (3), (4), (5);
-query I
+query R
select median(c) from t;
----
3
@@ -1443,10 +1443,10 @@ drop table t;
statement ok
create table t(c int) as values (1), (2), (3), (4), (5), (6);
-query I
+query R
select median(c) from t;
----
-3
+3.5
statement ok
drop table t;
@@ -1455,10 +1455,10 @@ drop table t;
statement ok
create table t(c int) as values (1), (null), (3), (4), (5);
-query I
+query R
select median(c) from t;
----
-3
+3.5
statement ok
drop table t;
@@ -1467,7 +1467,7 @@ drop table t;
statement ok
create table t(c int) as values (null), (null), (null);
-query I
+query R
select median(c) from t;
----
NULL
@@ -1479,7 +1479,7 @@ drop table t;
statement ok
create table t(c int unsigned) as values (1), (2), (3), (4), (5);
-query I
+query R
select median(c) from t;
----
3
@@ -1527,7 +1527,7 @@ drop table t;
statement ok
create table t(c int) as values (2), (1), (1), (2), (1), (3);
-query I
+query R
select median(distinct c) from t;
----
2
@@ -1539,7 +1539,7 @@ drop table t;
statement ok
create table t(c int) as values (1), (1), (3), (1), (1);
-query I
+query R
select median(distinct c) from t;
----
2
@@ -1551,7 +1551,7 @@ drop table t;
statement ok
create table t(c int) as values (1), (null), (1), (1), (3);
-query I
+query R
select median(distinct c) from t;
----
2
@@ -1563,7 +1563,7 @@ drop table t;
statement ok
create table t(c int unsigned) as values (1), (1), (2), (1), (3);
-query I
+query R
select median(distinct c) from t;
----
2
@@ -1575,7 +1575,7 @@ drop table t;
statement ok
create table t(c int unsigned) as values (1), (1), (1), (1), (3), (3);
-query I
+query R
select median(distinct c) from t;
----
2
@@ -1635,7 +1635,7 @@ drop table t;
statement ok
create table t(c int) as values (1), (1), (1), (1), (2), (2), (3), (3);
-query I
+query R
select median(distinct c) from t;
----
2
@@ -1653,7 +1653,7 @@ explain select median(distinct c) from t;
logical_plan
01)Projection: median(alias1) AS median(DISTINCT t.c)
02)--Aggregate: groupBy=[[]], aggr=[[median(alias1)]]
-03)----Aggregate: groupBy=[[t.c AS alias1]], aggr=[[]]
+03)----Aggregate: groupBy=[[CAST(t.c AS Float64) AS alias1]], aggr=[[]]
04)------TableScan: t projection=[c]
physical_plan
01)ProjectionExec: expr=[median(alias1)@0 as median(DISTINCT t.c)]
@@ -1662,7 +1662,7 @@ physical_plan
04)------AggregateExec: mode=Partial, gby=[], aggr=[median(alias1)]
05)--------AggregateExec: mode=FinalPartitioned, gby=[alias1@0 as alias1], aggr=[]
06)----------RepartitionExec: partitioning=Hash([alias1@0], 4), input_partitions=1
-07)------------AggregateExec: mode=Partial, gby=[c@0 as alias1], aggr=[]
+07)------------AggregateExec: mode=Partial, gby=[CAST(c@0 AS Float64) as alias1], aggr=[]
08)--------------DataSourceExec: partitions=1, partition_sizes=[1]
statement ok
@@ -3959,7 +3959,7 @@ SELECT percentile_cont(0.75) WITHIN GROUP (ORDER BY c2) FROM aggregate_test_100
4
# Test that percentile_cont(0.5) equals median
-query I
+query R
SELECT median(c2) FROM aggregate_test_100
----
3
@@ -5979,7 +5979,7 @@ statement ok
drop table t;
-query I
+query R
select median(a) from (select 1 as a where 1=0);
----
NULL
@@ -8095,56 +8095,56 @@ drop table t;
#######
# group median i8 non-nullable
-query TI rowsort
+query TR rowsort
SELECT col_group, median(col_i8) FROM group_median_table_non_nullable GROUP BY col_group
----
group0 -14
group1 100
# group median i16 non-nullable
-query TI rowsort
+query TR rowsort
SELECT col_group, median(col_i16) FROM group_median_table_non_nullable GROUP BY col_group
----
group0 -16334
group1 100
# group median i32 non-nullable
-query TI rowsort
+query TR rowsort
SELECT col_group, median(col_i32) FROM group_median_table_non_nullable GROUP BY col_group
----
group0 -1073741774
group1 100
# group median i64 non-nullable
-query TI rowsort
+query TR rowsort
SELECT col_group, median(col_i64) FROM group_median_table_non_nullable GROUP BY col_group
----
-group0 -4611686018427387854
+group0 -4611686018427388000
group1 100
# group median u8 non-nullable
-query TI rowsort
+query TR rowsort
SELECT col_group, median(col_u8) FROM group_median_table_non_nullable GROUP BY col_group
----
group0 50
group1 100
# group median u16 non-nullable
-query TI rowsort
+query TR rowsort
SELECT col_group, median(col_u16) FROM group_median_table_non_nullable GROUP BY col_group
----
group0 50
group1 100
# group median u32 non-nullable
-query TI rowsort
+query TR rowsort
SELECT col_group, median(col_u32) FROM group_median_table_non_nullable GROUP BY col_group
----
group0 50
group1 100
# group median u64 non-nullable
-query TI rowsort
+query TR rowsort
SELECT col_group, median(col_u64) FROM group_median_table_non_nullable GROUP BY col_group
----
group0 50
@@ -8186,56 +8186,56 @@ group0 0.0002
group1 0.0003
# group median i8 nullable
-query TI rowsort
+query TR rowsort
SELECT col_group, median(col_i8) FROM group_median_table_nullable GROUP BY col_group
----
group0 -14
group1 100
# group median i16 nullable
-query TI rowsort
+query TR rowsort
SELECT col_group, median(col_i16) FROM group_median_table_nullable GROUP BY col_group
----
group0 -16334
group1 100
# group median i32 nullable
-query TI rowsort
+query TR rowsort
SELECT col_group, median(col_i32) FROM group_median_table_nullable GROUP BY col_group
----
group0 -1073741774
group1 100
# group median i64 nullable
-query TI rowsort
+query TR rowsort
SELECT col_group, median(col_i64) FROM group_median_table_nullable GROUP BY col_group
----
-group0 -4611686018427387854
+group0 -4611686018427388000
group1 100
# group median u8 nullable
-query TI rowsort
+query TR rowsort
SELECT col_group, median(col_u8) FROM group_median_table_nullable GROUP BY col_group
----
group0 50
group1 100
# group median u16 nullable
-query TI rowsort
+query TR rowsort
SELECT col_group, median(col_u16) FROM group_median_table_nullable GROUP BY col_group
----
group0 50
group1 100
# group median u32 nullable
-query TI rowsort
+query TR rowsort
SELECT col_group, median(col_u32) FROM group_median_table_nullable GROUP BY col_group
----
group0 50
group1 100
# group median u64 nullable
-query TI rowsort
+query TR rowsort
SELECT col_group, median(col_u64) FROM group_median_table_nullable GROUP BY col_group
----
group0 50
@@ -8289,11 +8289,11 @@ create table group_median_all_nulls(
( 'group1', NULL),
( 'group1', NULL)
-query TIT rowsort
+query TRT rowsort
SELECT a, median(b), arrow_typeof(median(b)) FROM group_median_all_nulls GROUP BY a
----
-group0 NULL Int32
-group1 NULL Int32
+group0 NULL Float64
+group1 NULL Float64
statement ok
create table t_decimal (c decimal(10, 4)) as values (100.00), (125.00), (175.00), (200.00), (200.00), (300.00), (null), (null);
diff --git a/datafusion/sqllogictest/test_files/aggregate_skip_partial.slt b/datafusion/sqllogictest/test_files/aggregate_skip_partial.slt
index cd95426a9b..a10417f232 100644
--- a/datafusion/sqllogictest/test_files/aggregate_skip_partial.slt
+++ b/datafusion/sqllogictest/test_files/aggregate_skip_partial.slt
@@ -130,7 +130,7 @@ GROUP BY 1, 2 ORDER BY 1 LIMIT 5;
-2117946883 d -2117946883 NULL NULL NULL
-2098805236 c -2098805236 NULL NULL NULL
-query ITIIII
+query ITRRRR
SELECT c5, c1,
MEDIAN(c5),
MEDIAN(CASE WHEN c1 = 'a' THEN c5 ELSE NULL END),
@@ -308,7 +308,7 @@ SELECT c2, sum(c5), sum(c11) FROM aggregate_test_100 GROUP BY c2 ORDER BY c2;
5 6449337880 7.074412226677
# Test median for int / float
-query IIR
+query IRR
SELECT c2, median(c5), median(c11) FROM aggregate_test_100 GROUP BY c2 ORDER BY c2;
----
1 23971150 0.5922606
@@ -389,14 +389,14 @@ SELECT c2, sum(c3), sum(c11) FROM aggregate_test_100 GROUP BY c2 ORDER BY c2;
5 -194 7.074412226677
# Test median with nullable fields
-query IIR
+query IRR
SELECT c2, median(c3), median(c11) FROM aggregate_test_100_null GROUP BY c2 ORDER BY c2;
----
1 12 0.6067944
2 1 0.46076488
3 14 0.40154034
-4 -17 0.48515016
-5 -35 0.5536642
+4 -17.5 0.48515016
+5 -35.5 0.5536642
# Test approx_median with nullable fields
query IRR
@@ -502,7 +502,7 @@ FROM aggregate_test_100 GROUP BY c2 ORDER BY c2;
5 5 0
# Test median with filter
-query III
+query IRR
SELECT
c2,
median(c3) FILTER (WHERE c3 > 0),
@@ -637,7 +637,7 @@ FROM aggregate_test_100_null GROUP BY c2 ORDER BY c2;
5 6
# Test median with nullable fields and filter
-query IIR
+query IRR
SELECT c2,
median(c3) FILTER (WHERE c5 > 0),
median(c11) FILTER (WHERE c5 < 0)
@@ -645,21 +645,21 @@ FROM aggregate_test_100_null GROUP BY c2 ORDER BY c2;
----
1 -5 0.6623719
2 15 0.52930677
-3 13 0.32792538
+3 13.5 0.32792538
4 -38 0.49774808
5 -18 0.49842384
# Test min / max with nullable fields and nullable filter
-query II
+query IR
SELECT c2,
median(c3) FILTER (WHERE c11 > 0.5)
FROM aggregate_test_100_null GROUP BY c2 ORDER BY c2;
----
-1 33
+1 33.5
2 -29
3 22
4 -90
-5 -22
+5 -22.5
# Test approx_median with nullable fields and filter
query IRR
diff --git a/datafusion/sqllogictest/test_files/clickbench_extended.slt b/datafusion/sqllogictest/test_files/clickbench_extended.slt
index 6b0d78cdba..c410c98fe8 100644
--- a/datafusion/sqllogictest/test_files/clickbench_extended.slt
+++ b/datafusion/sqllogictest/test_files/clickbench_extended.slt
@@ -48,7 +48,7 @@ SELECT "SocialSourceNetworkID", "RegionID", COUNT(*), AVG("Age"), AVG("ParamPric
0 839 6 0 0 0 0
0 197 2 0 0 0 0
-query IIIIII
+query IIIIRI
SELECT "ClientIP", "WatchID", COUNT(*) c, MIN("ResponseStartTiming") tmin, MEDIAN("ResponseStartTiming") tmed, MAX("ResponseStartTiming") tmax FROM hits WHERE "JavaEnable" = 0 GROUP BY "ClientIP", "WatchID" HAVING c > 1 ORDER BY tmed DESC LIMIT 10;
----
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@datafusion.apache.org
For additional commands, e-mail: commits-help@datafusion.apache.org