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